Implement ui style selection dialog 12832

This commit is contained in:
Eugene Chornyi 2023-10-11 20:06:52 +02:00
parent e97ebe93d3
commit 072ba7bd2e
7 changed files with 83 additions and 23 deletions

View File

@ -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

View 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();

View 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:

View 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

View 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.

View 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);

View 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">
@ -42,18 +42,8 @@
</item>
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1,0">
<item row="0" column="0">
<widget class="QLabel" name="uiFileLA">
<property name="text">
<string>&amp;User interface file:</string>
</property>
<property name="buddy">
<cstring>uiFileED</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="uiFileED"/>
<item row="1" column="2">
<layout class="QHBoxLayout" name="horizontalLayout"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="uiFilePB">
@ -62,6 +52,13 @@
</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">
@ -72,15 +69,38 @@
</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>
<item row="0" column="0">
<widget class="QLabel" name="uiFileLA">
<property name="text">
<string>&amp;User interface file:</string>
</property>
<property name="buddy">
<cstring>uiFileED</cstring>
</property>
</widget>
</item>
<item row="1" column="2">
<layout class="QHBoxLayout" name="horizontalLayout"/>
<item row="0" column="1">
<widget class="QLineEdit" name="uiFileED"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="uiStyleLA">
<property name="text">
<string>User interface &amp;style:</string>
</property>
<property name="buddy">
<cstring>uiStyleCO</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="uiStyleCO">
<property name="toolTip">
<string>Only certain styles may support dark mode, e.g. fusion on Windows</string>
</property>
</widget>
</item>
<item row="2" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_2"/>
</item>
</layout>
</item>