src/settingseditor/settingseditor.cpp

Tue, 28 Jun 2022 12:29:38 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Tue, 28 Jun 2022 12:29:38 +0300
changeset 283
96b7eb68e9e6
parent 282
f2dc3bbecbfa
child 285
99af8bf63d10
permissions
-rw-r--r--

Make settings editor scrollable

#include <QSettings>
#include <QMdiArea>
#include <ui_settingseditor.h>
#include "src/settings.h"
#include "src/gl/common.h"
#include "src/settingseditor/keyboardshortcutseditor.h"
#include "src/settingseditor/settingseditor.h"

SettingsEditor::SettingsEditor(
	const uiutilities::KeySequenceMap& defaultKeyboardShortcuts,
	QWidget* parent
) :
	QDialog{parent},
	ui{*new Ui_SettingsEditor},
	libraries{this},
	librariesEditor{this},
	defaultKeyboardShortcuts{defaultKeyboardShortcuts}
{
	this->ui.setupUi(this);
	this->ui.keyboardShortcutsView->setModel(new KeyboardShortcutsEditor{parent, this});
	this->ui.viewModeButtonGroup->setId(this->ui.viewModeTabs, int{QMdiArea::TabbedView});
	this->ui.viewModeButtonGroup->setId(this->ui.viewModeSubWindows, int{QMdiArea::SubWindowView});
	this->loadLocales();
	this->loadSettings();
	this->setWindowTitle(tr("Settings"));
	this->librariesEditor.setModel(&libraries);
	QVBoxLayout* layout = new QVBoxLayout{this};
	layout->addWidget(&librariesEditor);
	this->ui.tabLdrawLibraries->setLayout(layout);
	connect(this->ui.buttonBox, &QDialogButtonBox::clicked,
		[&](QAbstractButton* button) {
			const auto role = this->ui.buttonBox->buttonRole(button);
			if (role == QDialogButtonBox::ApplyRole) {
				this->saveSettings();
			}
		});
}

SettingsEditor::~SettingsEditor()
{
	delete &this->ui;
}

void SettingsEditor::saveSettings()
{
	setSetting<Setting::Locale>(this->ui.language->currentData().toString());
	setSetting<Setting::MainColor>(this->ui.mainColorButton->color());
	setSetting<Setting::BackgroundColor>(this->ui.backgroundColorButton->color());
	setSetting<Setting::SelectedColor>(this->ui.selectedColorButton->color());
	setSetting<Setting::LineThickness>(static_cast<GLfloat>(this->ui.lineThickness->value()));
	setSetting<Setting::LineAntiAliasing>(this->ui.lineAntiAliasing->isChecked());
	setSetting<Setting::LogOpenGLDebugMessages>(this->ui.logOpenGLDebugMessages->isChecked());
	const int viewMode = this->ui.viewModeButtonGroup->checkedId();
	if (viewMode != -1) {
		setSetting<Setting::ViewMode>(static_cast<QMdiArea::ViewMode>(viewMode));
	}
	this->librariesEditor.saveSettings();
	Q_EMIT this->settingsChanged();
}

void SettingsEditor::loadLocales()
{
	this->ui.language->clear();
	QDir dir{":/locale"};
	// Collect translation files in built-in resources
	QVector<QString> localeCodes = {"en"}; // English is the default locale
	for (const QFileInfo& file : dir.entryInfoList(QDir::Files))
	{
		localeCodes.append(file.baseName());
	}
	std::sort(localeCodes.begin(), localeCodes.end());
	this->ui.language->addItem(tr("System language"), "system");
	for (const QString& localeCode : localeCodes)
	{
		const QLocale locale{localeCode};
		const QString languageName = QLocale::languageToString(locale.language());
		const QIcon flag{":/flags/" + localeCode + ".png"};
		this->ui.language->addItem(languageName, localeCode);
		this->ui.language->setItemIcon(this->ui.language->count() - 1, flag);
	}
}

void SettingsEditor::loadSettings()
{
	this->libraries.restoreFromSettings();
	this->setCurrentLanguage(setting<Setting::Locale>());
	this->ui.mainColorButton->setColor(setting<Setting::MainColor>());
	this->ui.backgroundColorButton->setColor(setting<Setting::BackgroundColor>());
	this->ui.selectedColorButton->setColor(setting<Setting::SelectedColor>());
	this->ui.lineThickness->setValue(double_cast(setting<Setting::LineThickness>()));
	this->ui.lineAntiAliasing->setChecked(setting<Setting::LineAntiAliasing>());
	this->ui.logOpenGLDebugMessages->setChecked(setting<Setting::LogOpenGLDebugMessages>());
	auto* const viewModeButton = this->ui.viewModeButtonGroup->button(setting<Setting::ViewMode>());
	if (viewModeButton != nullptr) {
		viewModeButton->setChecked(true);
	}
}

void SettingsEditor::setCurrentLanguage(const QString& localeCode)
{
	for (int i = 0; i < this->ui.language->count(); i += 1)
	{
		if (this->ui.language->itemData(i) == localeCode)
		{
			this->ui.language->setCurrentIndex(i);
			break;
		}
	}
}

mercurial