Tue, 28 Jun 2022 13:03:21 +0300
Don't create more than one settings editor
#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 ) : QMdiSubWindow{parent}, ui{*new Ui_SettingsEditor}, libraries{this}, librariesEditor{this}, defaultKeyboardShortcuts{defaultKeyboardShortcuts} { QWidget* widget = new QWidget{this}; this->ui.setupUi(widget); this->setWidget(widget); 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->setWindowIcon(QIcon{":/icons/settings-outline.png"}); 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; } } }