aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2024-05-03 14:45:48 +0000
committersaturneric <[email protected]>2024-05-03 14:46:40 +0000
commit526170b9676e7c04f5a6d7d2ba461b3f42cea32c (patch)
tree095e4448588f4202d5bd930cf83e90dbd37cb224
parentfix: reset module settings object in a proper way (diff)
downloadGpgFrontend-526170b9676e7c04f5a6d7d2ba461b3f42cea32c.tar.gz
GpgFrontend-526170b9676e7c04f5a6d7d2ba461b3f42cea32c.zip
feat: support theme changing by user
-rw-r--r--src/ui/GpgFrontendUIInit.cpp25
-rw-r--r--src/ui/dialog/settings/SettingsAppearance.cpp52
-rw-r--r--src/ui/dialog/settings/SettingsAppearance.h2
-rw-r--r--src/ui/dialog/settings/SettingsDialog.cpp40
-rw-r--r--src/ui/dialog/settings/SettingsDialog.h19
-rw-r--r--src/ui/dialog/settings/SettingsGeneral.cpp16
-rw-r--r--src/ui/dialog/settings/SettingsGeneral.h12
-rw-r--r--ui/AppearanceSettings.ui166
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>