diff options
author | saturneric <[email protected]> | 2024-05-03 14:45:48 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-05-03 14:46:40 +0000 |
commit | 526170b9676e7c04f5a6d7d2ba461b3f42cea32c (patch) | |
tree | 095e4448588f4202d5bd930cf83e90dbd37cb224 | |
parent | fix: reset module settings object in a proper way (diff) | |
download | GpgFrontend-526170b9676e7c04f5a6d7d2ba461b3f42cea32c.tar.gz GpgFrontend-526170b9676e7c04f5a6d7d2ba461b3f42cea32c.zip |
feat: support theme changing by user
-rw-r--r-- | src/ui/GpgFrontendUIInit.cpp | 25 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsAppearance.cpp | 52 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsAppearance.h | 2 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsDialog.cpp | 40 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsDialog.h | 19 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsGeneral.cpp | 16 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsGeneral.h | 12 | ||||
-rw-r--r-- | ui/AppearanceSettings.ui | 166 |
8 files changed, 179 insertions, 153 deletions
diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp index 32cbc968..7b18e78c 100644 --- a/src/ui/GpgFrontendUIInit.cpp +++ b/src/ui/GpgFrontendUIInit.cpp @@ -110,11 +110,22 @@ void InitGpgFrontendUI(QApplication* /*app*/) { // init locale InitUITranslations(); + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + auto theme = settings.value("appearance/theme").toString(); + #ifdef WINDOWS - // support dark mode on windows - QApplication::setStyle("fusion"); + if (theme.isEmpty()) { + // support dark mode on windows + QApplication::setStyle(QStyleFactory::create("Fusion")); + } #endif + auto available_styles = QStyleFactory::keys(); + for (QString& s : available_styles) s = s.toLower(); + if (!theme.isEmpty() && available_styles.contains(theme)) { + QApplication::setStyle(QStyleFactory::create(theme)); + } + // register meta types qRegisterMetaType<QSharedPointer<GpgPassphraseContext> >( "QSharedPointer<GpgPassphraseContext>"); @@ -125,10 +136,8 @@ void InitGpgFrontendUI(QApplication* /*app*/) { // init common utils CommonUtils::GetInstance(); - auto settings = GlobalSettingStation::GetInstance().GetSettings(); - // application proxy configure - bool proxy_enable = settings.value("proxy/enable", false).toBool(); + auto proxy_enable = settings.value("proxy/enable", false).toBool(); // if enable proxy for application if (proxy_enable) { @@ -138,9 +147,9 @@ void InitGpgFrontendUI(QApplication* /*app*/) { QString proxy_host = settings.value("proxy/proxy_host", QString{}).toString(); int proxy_port = settings.value("prox/port", 0).toInt(); - QString proxy_username = + QString const proxy_username = settings.value("proxy/username", QString{}).toString(); - QString proxy_password = + QString const proxy_password = settings.value("proxy/password", QString{}).toString(); GF_UI_LOG_DEBUG("proxy settings: type {}, host {}, port: {}", proxy_type, proxy_host, proxy_port); @@ -193,7 +202,7 @@ auto RunGpgFrontendUI(QApplication* app) -> int { // pre-check, if application need to restart if (CommonUtils::GetInstance()->isApplicationNeedRestart()) { - GF_UI_LOG_DEBUG("application need to restart, before mian window init"); + GF_UI_LOG_DEBUG("application need to restart, before main window init"); return kDeepRestartCode; } diff --git a/src/ui/dialog/settings/SettingsAppearance.cpp b/src/ui/dialog/settings/SettingsAppearance.cpp index b756ae05..299b30d9 100644 --- a/src/ui/dialog/settings/SettingsAppearance.cpp +++ b/src/ui/dialog/settings/SettingsAppearance.cpp @@ -28,6 +28,7 @@ #include "SettingsAppearance.h" +#include "core/function/GlobalSettingStation.h" #include "core/model/SettingsObject.h" #include "core/utils/MemoryUtils.h" #include "ui/struct/settings_object/AppearanceSO.h" @@ -39,26 +40,28 @@ AppearanceTab::AppearanceTab(QWidget* parent) : QWidget(parent), ui_(SecureCreateSharedObject<Ui_AppearanceSettings>()) { ui_->setupUi(this); - ui_->iconSizeBox->setTitle(tr("Icon Size")); + ui_->generalBox->setTitle(tr("General")); + + ui_->themaLabel->setText(tr("Theme")); + ui_->windowStateCheckBox->setText( + tr("Save window size and position on exit.")); + + ui_->toolbarIconBox->setTitle(tr("Toolbar Icon")); + + ui_->toolbarIconSizeLabel->setText(tr("Size")); ui_->smallRadioButton->setText(tr("small")); ui_->mediumRadioButton->setText(tr("medium")); ui_->largeRadioButton->setText(tr("large")); - ui_->iconStyleBox->setTitle(tr("Icon Style")); + ui_->toolbarIconStyleLabel->setText(tr("Style")); ui_->justTextRadioButton->setText(tr("just text")); ui_->justIconRadioButton->setText(tr("just icons")); ui_->textAndIconsRadioButton->setText(tr("text and icons")); - ui_->windowStateBox->setTitle(tr("Window State")); - ui_->windowStateCheckBox->setText( - tr("Save window size and position on exit.")); - - ui_->textEditorBox->setTitle(tr("Text Editor")); - ui_->fontSizeTextEditorLabel->setText(tr("Font Size in Text Editor")); + ui_->fontSizeBox->setTitle(tr("Font Size")); - ui_->informationBoardBox->setTitle(tr("Information Board")); - ui_->fontSizeInformationBoardLabel->setText( - tr("Font Size in Information Board")); + ui_->fontSizeTextEditorLabel->setText(tr("Text Editor")); + ui_->fontSizeInformationBoardLabel->setText(tr("Information Board")); icon_size_group_ = new QButtonGroup(this); icon_size_group_->addButton(ui_->smallRadioButton, 1); @@ -71,10 +74,13 @@ AppearanceTab::AppearanceTab(QWidget* parent) icon_style_group_->addButton(ui_->textAndIconsRadioButton, 3); SetSettings(); + + connect(ui_->themeComboBox, qOverload<int>(&QComboBox::currentIndexChanged), + this, &AppearanceTab::SignalRestartNeeded); } void AppearanceTab::SetSettings() { - AppearanceSO appearance(SettingsObject("general_settings_state")); + AppearanceSO const appearance(SettingsObject("general_settings_state")); auto icon_size = QSize(appearance.tool_bar_icon_width, appearance.tool_bar_icon_height); @@ -123,6 +129,25 @@ void AppearanceTab::SetSettings() { text_editor_info_font_size = 10; } ui_->fontSizeTextEditorLabelSpinBox->setValue(text_editor_info_font_size); + + // init available styles + for (const auto& s : QStyleFactory::keys()) { + ui_->themeComboBox->addItem(s.toLower()); + } + + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + auto theme = settings.value("appearance/theme").toString(); + + auto target_theme_index = ui_->themeComboBox->findText(theme); + if (theme.isEmpty() || target_theme_index == -1) { + GF_UI_LOG_DEBUG( + "There is not valid theme found from settings, using current theme: {}", + QApplication::style()->name()); + ui_->themeComboBox->setCurrentIndex( + ui_->themeComboBox->findText(QApplication::style()->name())); + } else { + ui_->themeComboBox->setCurrentIndex(target_theme_index); + } } void AppearanceTab::ApplySettings() { @@ -169,6 +194,9 @@ void AppearanceTab::ApplySettings() { ui_->fontSizeTextEditorLabelSpinBox->value(); general_settings_state.Store(appearance.ToJson()); + + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + settings.setValue("appearance/theme", ui_->themeComboBox->currentText()); } } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsAppearance.h b/src/ui/dialog/settings/SettingsAppearance.h index 6d426934..ca520ba7 100644 --- a/src/ui/dialog/settings/SettingsAppearance.h +++ b/src/ui/dialog/settings/SettingsAppearance.h @@ -70,7 +70,7 @@ class AppearanceTab : public QWidget { * * @param needed */ - void signalRestartNeeded(bool needed); + void SignalRestartNeeded(); }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsDialog.cpp b/src/ui/dialog/settings/SettingsDialog.cpp index cb17eb0d..3cf6b5ed 100644 --- a/src/ui/dialog/settings/SettingsDialog.cpp +++ b/src/ui/dialog/settings/SettingsDialog.cpp @@ -30,7 +30,6 @@ #include "core/GpgConstants.h" #include "core/GpgModel.h" -#include "core/function/GlobalSettingStation.h" #include "ui/dialog/settings/SettingsAppearance.h" #include "ui/dialog/settings/SettingsGeneral.h" #include "ui/dialog/settings/SettingsKeyServer.h" @@ -74,24 +73,17 @@ SettingsDialog::SettingsDialog(QWidget* parent) setLayout(main_layout); - // slots for handling the restart needed member - this->slot_set_restart_needed(0); - // restart ui connect(general_tab_, &GeneralTab::SignalRestartNeeded, this, - [=](bool needed) { - if (needed && restart_needed_ < kRestartCode) { - this->restart_needed_ = kRestartCode; - } - }); + &SettingsDialog::slot_declare_a_restart); // restart core and ui connect(general_tab_, &GeneralTab::SignalDeepRestartNeeded, this, - [=](bool needed) { - if (needed && restart_needed_ < kDeepRestartCode) { - this->restart_needed_ = kDeepRestartCode; - } - }); + &SettingsDialog::slot_declare_a_deep_restart); + + // restart core and ui + connect(appearance_tab_, &AppearanceTab::SignalRestartNeeded, this, + &SettingsDialog::slot_declare_a_restart); // announce main window connect(this, &SettingsDialog::SignalRestartNeeded, @@ -102,12 +94,16 @@ SettingsDialog::SettingsDialog(QWidget* parent) this->show(); } -auto SettingsDialog::get_restart_needed() const -> int { - return this->restart_needed_; +void SettingsDialog::slot_declare_a_restart() { + if (restart_needed_ < kRestartCode) { + this->restart_needed_ = kRestartCode; + } } -void SettingsDialog::slot_set_restart_needed(int mode) { - this->restart_needed_ = mode; +void SettingsDialog::slot_declare_a_deep_restart() { + if (restart_needed_ < kDeepRestartCode) { + this->restart_needed_ = kDeepRestartCode; + } } void SettingsDialog::SlotAccept() { @@ -116,9 +112,9 @@ void SettingsDialog::SlotAccept() { key_server_tab_->ApplySettings(); network_tab_->ApplySettings(); - GF_UI_LOG_DEBUG("restart needed: {}", get_restart_needed()); - if (get_restart_needed() != 0) { - emit SignalRestartNeeded(get_restart_needed()); + GF_UI_LOG_DEBUG("ui restart status: {}", restart_needed_); + if (restart_needed_ != kNonRestartCode) { + emit SignalRestartNeeded(restart_needed_); } close(); } @@ -127,7 +123,7 @@ auto SettingsDialog::ListLanguages() -> QHash<QString, QString> { QHash<QString, QString> languages; languages.insert(QString(), tr("System Default")); - QStringList filenames = QDir(QLatin1String(":/i18n")).entryList(); + auto filenames = QDir(QLatin1String(":/i18n")).entryList(); for (const auto& file : filenames) { GF_UI_LOG_DEBUG("get locale from locale directory: {}", file); diff --git a/src/ui/dialog/settings/SettingsDialog.h b/src/ui/dialog/settings/SettingsDialog.h index c99ac23c..3839f094 100644 --- a/src/ui/dialog/settings/SettingsDialog.h +++ b/src/ui/dialog/settings/SettingsDialog.h @@ -82,26 +82,23 @@ class SettingsDialog : public GeneralDialog { void SignalRestartNeeded(int); private: - QTabWidget* tab_widget_; ///< - QDialogButtonBox* button_box_; ///< - int restart_needed_{0}; ///< + QTabWidget* tab_widget_; ///< + QDialogButtonBox* button_box_; ///< + int restart_needed_{kNonRestartCode}; ///< + + private slots: /** - * @brief Get the Restart Needed object + * @brief * - * @return true - * @return false */ - int get_restart_needed() const; - - private slots: + void slot_declare_a_restart(); /** * @brief * - * @param needed */ - void slot_set_restart_needed(int); + void slot_declare_a_deep_restart(); }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsGeneral.cpp b/src/ui/dialog/settings/SettingsGeneral.cpp index bcf42867..9764b747 100644 --- a/src/ui/dialog/settings/SettingsGeneral.cpp +++ b/src/ui/dialog/settings/SettingsGeneral.cpp @@ -73,7 +73,7 @@ GeneralTab::GeneralTab(QWidget* parent) ui_->langSelectBox->addItem(l); } connect(ui_->langSelectBox, qOverload<int>(&QComboBox::currentIndexChanged), - this, &GeneralTab::slot_language_changed); + this, &GeneralTab::SignalRestartNeeded); connect(ui_->clearAllLogFilesButton, &QPushButton::clicked, this, [=]() { GlobalSettingStation::GetInstance().ClearAllLogFiles(); @@ -109,28 +109,28 @@ GeneralTab::GeneralTab(QWidget* parent) void GeneralTab::SetSettings() { auto settings = GlobalSettingStation::GetInstance().GetSettings(); - bool clear_gpg_password_cache = + auto clear_gpg_password_cache = settings.value("basic/clear_gpg_password_cache", true).toBool(); ui_->clearGpgPasswordCacheCheckBox->setCheckState( clear_gpg_password_cache ? Qt::Checked : Qt::Unchecked); - bool restore_text_editor_page = + auto restore_text_editor_page = settings.value("basic/restore_text_editor_page", true).toBool(); ui_->restoreTextEditorPageCheckBox->setCheckState( restore_text_editor_page ? Qt::Checked : Qt::Unchecked); - bool longer_expiration_date = + auto longer_expiration_date = settings.value("basic/longer_expiration_date", false).toBool(); ui_->longerKeyExpirationDateCheckBox->setCheckState( longer_expiration_date ? Qt::Checked : Qt::Unchecked); - bool confirm_import_keys = + auto confirm_import_keys = settings.value("basic/confirm_import_keys", false).toBool(); ui_->importConfirmationCheckBox->setCheckState( confirm_import_keys ? Qt::Checked : Qt::Unchecked); - QString lang_key = settings.value("basic/lang").toString(); - QString lang_value = lang_.value(lang_key); + auto lang_key = settings.value("basic/lang").toString(); + auto lang_value = lang_.value(lang_key); GF_UI_LOG_DEBUG("lang settings current: {}", lang_value); if (!lang_.empty()) { ui_->langSelectBox->setCurrentIndex( @@ -155,6 +155,4 @@ void GeneralTab::ApplySettings() { settings.setValue("basic/lang", lang_.key(ui_->langSelectBox->currentText())); } -void GeneralTab::slot_language_changed() { emit SignalRestartNeeded(true); } - } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsGeneral.h b/src/ui/dialog/settings/SettingsGeneral.h index 284843d4..d6e954de 100644 --- a/src/ui/dialog/settings/SettingsGeneral.h +++ b/src/ui/dialog/settings/SettingsGeneral.h @@ -69,27 +69,19 @@ class GeneralTab : public QWidget { * * @param needed */ - void SignalRestartNeeded(bool needed); + void SignalRestartNeeded(); /** * @brief * * @param needed */ - void SignalDeepRestartNeeded(bool needed); + void SignalDeepRestartNeeded(); private: std::shared_ptr<Ui_GeneralSettings> ui_; ///< QHash<QString, QString> lang_; ///< std::vector<QString> key_ids_list_; ///< KeyList* m_key_list_{}; ///< - - private slots: - - /** - * @brief - * - */ - void slot_language_changed(); }; } // namespace GpgFrontend::UI diff --git a/ui/AppearanceSettings.ui b/ui/AppearanceSettings.ui index e49772c7..aed30461 100644 --- a/ui/AppearanceSettings.ui +++ b/ui/AppearanceSettings.ui @@ -14,88 +14,87 @@ <string>Appearance Settings</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> + <item row="2" column="0"> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QGroupBox" name="iconSizeBox"> + <widget class="QGroupBox" name="generalBox"> <property name="title"> - <string>Icon Size</string> + <string>General</string> </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> - <widget class="QRadioButton" name="smallRadioButton"> + <widget class="QLabel" name="themaLabel"> <property name="text"> - <string>small</string> + <string>Theme</string> </property> </widget> </item> <item> - <widget class="QRadioButton" name="mediumRadioButton"> - <property name="text"> - <string>medium</string> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="largeRadioButton"> - <property name="text"> - <string>large</string> - </property> - </widget> + <widget class="QComboBox" name="themeComboBox"/> </item> </layout> </item> + <item> + <widget class="QCheckBox" name="windowStateCheckBox"> + <property name="text"> + <string>Save window size and position on exit.</string> + </property> + </widget> + </item> </layout> </widget> </item> <item> - <widget class="QGroupBox" name="iconStyleBox"> + <widget class="QGroupBox" name="fontSizeBox"> <property name="title"> - <string>Icon Style</string> + <string>Font Size</string> </property> - <layout class="QGridLayout" name="gridLayout_3"> + <layout class="QGridLayout" name="gridLayout_8"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> + <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> - <widget class="QRadioButton" name="justTextRadioButton"> + <widget class="QLabel" name="fontSizeTextEditorLabel"> <property name="text"> - <string>just text</string> + <string>Text Editor</string> </property> </widget> </item> <item> - <widget class="QRadioButton" name="justIconRadioButton"> - <property name="text"> - <string>just icons</string> + <widget class="QSpinBox" name="fontSizeTextEditorLabelSpinBox"> + <property name="minimum"> + <number>9</number> + </property> + <property name="maximum"> + <number>18</number> + </property> + <property name="value"> + <number>10</number> </property> </widget> </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> - <widget class="QRadioButton" name="textAndIconsRadioButton"> + <widget class="QLabel" name="fontSizeInformationBoardLabel"> <property name="text"> - <string>text and icons</string> + <string>Information Board</string> </property> </widget> </item> - </layout> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="windowStateBox"> - <property name="title"> - <string>Window State</string> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_4"> <item> - <widget class="QCheckBox" name="windowStateCheckBox"> - <property name="text"> - <string>Save window size and position on exit.</string> + <widget class="QSpinBox" name="fontSizeInformationBoardSpinBox"> + <property name="minimum"> + <number>9</number> + </property> + <property name="maximum"> + <number>18</number> + </property> + <property name="value"> + <number>10</number> </property> </widget> </item> @@ -105,63 +104,70 @@ </widget> </item> <item> - <widget class="QGroupBox" name="textEditorBox"> + <widget class="QGroupBox" name="toolbarIconBox"> <property name="title"> - <string>Text Editor</string> + <string>Toolbar Icon</string> </property> - <layout class="QGridLayout" name="gridLayout_8"> + <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_5"> + <layout class="QHBoxLayout" name="horizontalLayout"> <item> - <widget class="QLabel" name="fontSizeTextEditorLabel"> + <widget class="QLabel" name="toolbarIconSizeLabel"> <property name="text"> - <string>Font Size in Text Editor</string> + <string>Size</string> </property> </widget> </item> <item> - <widget class="QSpinBox" name="fontSizeTextEditorLabelSpinBox"> - <property name="minimum"> - <number>9</number> + <widget class="QRadioButton" name="smallRadioButton"> + <property name="text"> + <string>small</string> </property> - <property name="maximum"> - <number>18</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="mediumRadioButton"> + <property name="text"> + <string>medium</string> </property> - <property name="value"> - <number>10</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="largeRadioButton"> + <property name="text"> + <string>large</string> </property> </widget> </item> </layout> </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="informationBoardBox"> - <property name="title"> - <string>Information Board</string> - </property> - <layout class="QGridLayout" name="gridLayout_6"> - <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QLabel" name="fontSizeInformationBoardLabel"> + <widget class="QLabel" name="toolbarIconStyleLabel"> <property name="text"> - <string>Font Size in Information Board</string> + <string>Style</string> </property> </widget> </item> <item> - <widget class="QSpinBox" name="fontSizeInformationBoardSpinBox"> - <property name="minimum"> - <number>9</number> + <widget class="QRadioButton" name="justTextRadioButton"> + <property name="text"> + <string>just text</string> </property> - <property name="maximum"> - <number>18</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="justIconRadioButton"> + <property name="text"> + <string>just icons</string> </property> - <property name="value"> - <number>10</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="textAndIconsRadioButton"> + <property name="text"> + <string>text and icons</string> </property> </widget> </item> |