]> git.lyx.org Git - features.git/commitdiff
Implement ui style selection dialog 12832
authorEugene Chornyi <yu_jin@lyx.org>
Wed, 11 Oct 2023 18:06:52 +0000 (20:06 +0200)
committerEugene Chornyi <yu_jin@lyx.org>
Wed, 11 Oct 2023 18:06:52 +0000 (20:06 +0200)
lib/RELEASE-NOTES
src/LyX.cpp
src/LyXRC.cpp
src/LyXRC.h
src/frontends/qt/GuiApplication.cpp
src/frontends/qt/GuiPrefs.cpp
src/frontends/qt/ui/PrefUi.ui

index 9b939b736d1ba1f94d0a5e3f2c7a3ea516d921b9..d8af79b0b6a28f2aa92e272197b6d1c00c8846cb 100644 (file)
 
 * 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
 
index 04c1dd4f257e49e962cba22f24452b0f94dd96da..923062b549770217b29df5f9944f068ae0fa7815 100644 (file)
@@ -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();
 
index fa50d4a51d8aa2832ac8781bc93b5c85e6b947dd..1c52ef11548cd6d95d0b077d5bbe317a0feb2ee2 100644 (file)
@@ -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:
index c196d579f13f5776062d4ee8c8606d60d14bfc12..d091e68ffa392f1c8920edc5fd86f28c59e2ac42 100644 (file)
@@ -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
index b7abd4297fca1e6b3cfa917f7265892ebda35599..d74c87801981e44f9499d1a5fe8276fb3ee91853 100644 (file)
@@ -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.
index 9836086a9282db067dd1f2b2d11376ab698c5910..00c81679677d103f2574dc5c12653cbfea80ecf9 100644 (file)
@@ -63,6 +63,7 @@
 #include <QPushButton>
 #include <QSpinBox>
 #include <QString>
+#include <QStyleFactory>
 #include <QTreeWidget>
 #include <QTreeWidgetItem>
 #include <QValidator>
@@ -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);
index d7551cbb3d55d362aafd8cc758a067665da64573..7a2c8d4711f188803f4d0abd7e08991f9850e828 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>556</width>
-    <height>476</height>
+    <height>502</height>
    </rect>
   </property>
   <property name="sizePolicy">
       </item>
       <item row="0" column="0">
        <layout class="QGridLayout" name="gridLayout" columnstretch="0,1,0">
+        <item row="1" column="2">
+         <layout class="QHBoxLayout" name="horizontalLayout"/>
+        </item>
+        <item row="0" column="2">
+         <widget class="QPushButton" name="uiFilePB">
+          <property name="text">
+           <string>Bro&amp;wse...</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QComboBox" name="iconSetCO">
+          <property name="toolTip">
+           <string>The icon set to use. Warning: normal size of icons may be wrong until you save the preferences and restart LyX.</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="iconSetLA">
+          <property name="text">
+           <string>&amp;Icon set:</string>
+          </property>
+          <property name="buddy">
+           <cstring>iconSetCO</cstring>
+          </property>
+         </widget>
+        </item>
         <item row="0" column="0">
          <widget class="QLabel" name="uiFileLA">
           <property name="text">
         <item row="0" column="1">
          <widget class="QLineEdit" name="uiFileED"/>
         </item>
-        <item row="0" column="2">
-         <widget class="QPushButton" name="uiFilePB">
+        <item row="2" column="0">
+         <widget class="QLabel" name="uiStyleLA">
           <property name="text">
-           <string>Bro&amp;wse...</string>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="iconSetLA">
-          <property name="text">
-           <string>&amp;Icon set:</string>
+           <string>User interface &amp;style:</string>
           </property>
           <property name="buddy">
-           <cstring>iconSetCO</cstring>
+           <cstring>uiStyleCO</cstring>
           </property>
          </widget>
         </item>
-        <item row="1" column="1">
-         <widget class="QComboBox" name="iconSetCO">
+        <item row="2" column="1">
+         <widget class="QComboBox" name="uiStyleCO">
           <property name="toolTip">
-           <string>The icon set to use. Warning: normal size of icons may be wrong until you save the preferences and restart LyX.</string>
+           <string>Only certain styles may support dark mode, e.g. fusion on Windows</string>
           </property>
          </widget>
         </item>
-        <item row="1" column="2">
-         <layout class="QHBoxLayout" name="horizontalLayout"/>
+        <item row="2" column="2">
+         <layout class="QHBoxLayout" name="horizontalLayout_2"/>
         </item>
        </layout>
       </item>