From 072ba7bd2e1ac7514117fafee3143b0bfb8796eb Mon Sep 17 00:00:00 2001 From: Eugene Chornyi Date: Wed, 11 Oct 2023 20:06:52 +0200 Subject: [PATCH] Implement ui style selection dialog 12832 --- lib/RELEASE-NOTES | 4 +++ src/LyX.cpp | 10 +++--- src/LyXRC.cpp | 15 ++++++++ src/LyXRC.h | 3 ++ src/frontends/qt/GuiApplication.cpp | 3 ++ src/frontends/qt/GuiPrefs.cpp | 13 +++++++ src/frontends/qt/ui/PrefUi.ui | 54 ++++++++++++++++++++--------- 7 files changed, 81 insertions(+), 21 deletions(-) diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES index 9b939b736d..d8af79b0b6 100644 --- a/lib/RELEASE-NOTES +++ b/lib/RELEASE-NOTES @@ -53,6 +53,10 @@ * Edit > Paste operation now preserves newlines in text by default. +* Dark mode on Windows is possible now by choosing "fusion" user interface style + in user interface preferences dialog, your system style has to be set to dark + (bug 12832). + !!Documents compilation process and images conversion diff --git a/src/LyX.cpp b/src/LyX.cpp index 04c1dd4f25..923062b549 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -354,6 +354,12 @@ int LyX::exec(int & argc, char * argv[]) return app.exec(); } + // This one is edited through the preferences dialog. + // need to call this before createApplication + // because we need to know the Qt style for creating the Application + if (!readRcFile("preferences", true)) + return EXIT_FAILURE; + // Let the frontend parse and remove all arguments that it knows pimpl_->application_.reset(createApplication(argc, argv)); @@ -994,10 +1000,6 @@ bool LyX::init() pimpl_->system_movers_ = pimpl_->movers_; system_lcolor = lcolor; - // This one is edited through the preferences dialog. - if (!readRcFile("preferences", true)) - return false; - // The language may have been set to someting useful through prefs setLocale(); diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp index fa50d4a51d..1c52ef1154 100644 --- a/src/LyXRC.cpp +++ b/src/LyXRC.cpp @@ -197,6 +197,7 @@ LexerKeyword lyxrcTags[] = { { "\\texinputs_prefix", LyXRC::RC_TEXINPUTS_PREFIX }, { "\\thesaurusdir_path", LyXRC::RC_THESAURUSDIRPATH }, { "\\ui_file", LyXRC::RC_UIFILE }, + { "\\ui_style", LyXRC::RC_UI_STYLE }, { "\\use_converter_cache", LyXRC::RC_USE_CONVERTER_CACHE }, { "\\use_converter_needauth", LyXRC::RC_USE_CONVERTER_NEEDAUTH }, { "\\use_converter_needauth_forbidden", LyXRC::RC_USE_CONVERTER_NEEDAUTH_FORBIDDEN }, @@ -603,6 +604,10 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format) lexrc >> icon_set; break; + case RC_UI_STYLE: + lexrc >> ui_style; + break; + case RC_USE_SYSTEM_THEME_ICONS: lexrc >> use_system_theme_icons; break; @@ -1624,6 +1629,15 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c if (tag != RC_LAST) break; // fall through + case RC_UI_STYLE: + if (ignore_system_lyxrc || + ui_style != system_lyxrc.ui_style) { + os << "\\ui_style \"" << ui_style + << "\"\n"; + } + if (tag != RC_LAST) + break; + // fall through case RC_USE_SYSTEM_THEME_ICONS: if (ignore_system_lyxrc || use_system_theme_icons != system_lyxrc.use_system_theme_icons) { @@ -2950,6 +2964,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_GROUP_LAYOUTS: case LyXRC::RC_HUNSPELLDIR_PATH: case LyXRC::RC_ICON_SET: + case LyXRC::RC_UI_STYLE: case LyXRC::RC_INDEX_ALTERNATIVES: case LyXRC::RC_INDEX_COMMAND: case LyXRC::RC_JBIBTEX_COMMAND: diff --git a/src/LyXRC.h b/src/LyXRC.h index c196d579f1..d091e68ffa 100644 --- a/src/LyXRC.h +++ b/src/LyXRC.h @@ -173,6 +173,7 @@ public: RC_TEXINPUTS_PREFIX, RC_THESAURUSDIRPATH, RC_UIFILE, + RC_UI_STYLE, RC_USELASTFILEPOS, RC_USER_EMAIL, RC_USER_INITIALS, @@ -473,6 +474,8 @@ public: std::string user_initials; /// icon set name std::string icon_set; + /// ui style name + std::string ui_style; /// whether to use the icons from the theme bool use_system_theme_icons = false; /// True if the TeX engine cannot handle posix paths diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp index b7abd4297f..d74c878019 100644 --- a/src/frontends/qt/GuiApplication.cpp +++ b/src/frontends/qt/GuiApplication.cpp @@ -222,6 +222,9 @@ frontend::Application * createApplication(int & argc, char * argv[]) #endif #endif + if (!lyxrc.ui_style.empty()) + frontend::GuiApplication::setStyle(toqstr(lyxrc.ui_style)); + frontend::GuiApplication * guiApp = new frontend::GuiApplication(argc, argv); // I'd rather do that in the constructor, but I do not think that // the palette is accessible there. diff --git a/src/frontends/qt/GuiPrefs.cpp b/src/frontends/qt/GuiPrefs.cpp index 9836086a92..00c8167967 100644 --- a/src/frontends/qt/GuiPrefs.cpp +++ b/src/frontends/qt/GuiPrefs.cpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -2494,6 +2495,8 @@ PrefUserInterface::PrefUserInterface(GuiPreferences * form) this, SIGNAL(changed())); connect(iconSetCO, SIGNAL(activated(int)), this, SIGNAL(changed())); + connect(uiStyleCO, SIGNAL(activated(int)), + this, SIGNAL(changed())); connect(useSystemThemeIconsCB, SIGNAL(clicked()), this, SIGNAL(changed())); connect(lastfilesSB, SIGNAL(valueChanged(int)), @@ -2516,6 +2519,11 @@ PrefUserInterface::PrefUserInterface(GuiPreferences * form) iconSetCO->addItem(qt_("Classic"), "classic"); iconSetCO->addItem(qt_("Oxygen"), "oxygen"); + for (const auto& style : QStyleFactory::keys()) + { + uiStyleCO->addItem(style.toLower()); + } + if (guiApp->platformName() != "xcb" && !guiApp->platformName().contains("wayland")) useSystemThemeIconsCB->hide(); @@ -2527,6 +2535,9 @@ void PrefUserInterface::applyRC(LyXRC & rc) const rc.icon_set = fromqstr(iconSetCO->itemData( iconSetCO->currentIndex()).toString()); + frontend::GuiApplication::setStyle(uiStyleCO->currentText()); + rc.ui_style = fromqstr(uiStyleCO->currentText()); + rc.ui_file = internal_path(fromqstr(uiFileED->text())); rc.use_system_theme_icons = useSystemThemeIconsCB->isChecked(); rc.num_lastfiles = lastfilesSB->value(); @@ -2545,6 +2556,8 @@ void PrefUserInterface::updateRC(LyXRC const & rc) if (iconset < 0) iconset = 0; iconSetCO->setCurrentIndex(iconset); + uiStyleCO->setCurrentIndex(uiStyleCO->findText( + frontend::GuiApplication::style()->objectName().toLower())); useSystemThemeIconsCB->setChecked(rc.use_system_theme_icons); uiFileED->setText(toqstr(external_path(rc.ui_file))); lastfilesSB->setValue(rc.num_lastfiles); diff --git a/src/frontends/qt/ui/PrefUi.ui b/src/frontends/qt/ui/PrefUi.ui index d7551cbb3d..7a2c8d4711 100644 --- a/src/frontends/qt/ui/PrefUi.ui +++ b/src/frontends/qt/ui/PrefUi.ui @@ -7,7 +7,7 @@ 0 0 556 - 476 + 502 @@ -42,6 +42,33 @@ + + + + + + + Bro&wse... + + + + + + + The icon set to use. Warning: normal size of icons may be wrong until you save the preferences and restart LyX. + + + + + + + &Icon set: + + + iconSetCO + + + @@ -55,32 +82,25 @@ - - + + - Bro&wse... - - - - - - - &Icon set: + User interface &style: - iconSetCO + uiStyleCO - - + + - The icon set to use. Warning: normal size of icons may be wrong until you save the preferences and restart LyX. + Only certain styles may support dark mode, e.g. fusion on Windows - - + + -- 2.39.5