diff --git a/src/librssguard/gui/settings/settingsgui.cpp b/src/librssguard/gui/settings/settingsgui.cpp index 38eb5102d..98400135d 100644 --- a/src/librssguard/gui/settings/settingsgui.cpp +++ b/src/librssguard/gui/settings/settingsgui.cpp @@ -2,6 +2,7 @@ #include "gui/settings/settingsgui.h" +#include "3rd-party/boolinq/boolinq.h" #include "core/feedsmodel.h" #include "gui/dialogs/formmain.h" #include "gui/feedmessageviewer.h" @@ -27,12 +28,9 @@ SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(se m_ui->m_editorFeedsToolbar->activeItemsWidget()->viewport()->installEventFilter(this); m_ui->m_editorMessagesToolbar->availableItemsWidget()->viewport()->installEventFilter(this); m_ui->m_editorFeedsToolbar->availableItemsWidget()->viewport()->installEventFilter(this); - m_ui->m_treeSkins->setColumnCount(3); + m_ui->m_treeSkins->setColumnCount(5); m_ui->m_treeSkins->setHeaderHidden(false); - m_ui->m_treeSkins->setHeaderLabels(QStringList() - << /*: Skin list name column. */ tr("Name") - << /*: Version column of skin list. */ tr("Version") - << tr("Author")); + m_ui->m_treeSkins->setHeaderLabels({ tr("Name"), tr("Version"), tr("Author"), tr("Forced styles"), tr("Forced alternative palette") }); m_ui->m_tabUi->setTabVisible(m_ui->m_tabUi->indexOf(m_ui->m_tabTaskBar), #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) @@ -48,20 +46,21 @@ SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(se m_ui->m_treeSkins->header()->setSectionResizeMode(0, QHeaderView::ResizeMode::ResizeToContents); m_ui->m_treeSkins->header()->setSectionResizeMode(1, QHeaderView::ResizeMode::ResizeToContents); m_ui->m_treeSkins->header()->setSectionResizeMode(2, QHeaderView::ResizeMode::ResizeToContents); + m_ui->m_treeSkins->header()->setSectionResizeMode(3, QHeaderView::ResizeMode::ResizeToContents); + m_ui->m_treeSkins->header()->setSectionResizeMode(4, QHeaderView::ResizeMode::ResizeToContents); - connect(m_ui->m_cmbStyles, &QComboBox::currentTextChanged, this, [this](const QString& txt) { - m_ui->m_checkForceDarkFusion->setVisible(qApp->skins()->isStyleGoodForDarkVariant(txt)); - }); + connect(m_ui->m_cmbStyles, &QComboBox::currentTextChanged, this, &SettingsGui::updateSkinOptions); connect(m_ui->m_cmbIconTheme, static_cast(&QComboBox::currentIndexChanged), this, &SettingsGui::requireRestart); connect(m_ui->m_cmbIconTheme, static_cast(&QComboBox::currentIndexChanged), this, &SettingsGui::dirtifySettings); connect(m_ui->m_treeSkins, &QTreeWidget::currentItemChanged, this, &SettingsGui::dirtifySettings); + connect(m_ui->m_treeSkins, &QTreeWidget::currentItemChanged, this, &SettingsGui::updateSkinOptions); connect(m_ui->m_grpTray, &QGroupBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_checkHidden, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); - connect(m_ui->m_checkForceDarkFusion, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); - connect(m_ui->m_checkForceDarkFusion, &QCheckBox::toggled, this, &SettingsGui::requireRestart); + connect(m_ui->m_checkForceAlternativePalette, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); + connect(m_ui->m_checkForceAlternativePalette, &QCheckBox::toggled, this, &SettingsGui::requireRestart); connect(m_ui->m_checkMonochromeIcons, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_checkCountUnreadMessages, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_checkHideWhenMinimized, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); @@ -116,6 +115,24 @@ bool SettingsGui::eventFilter(QObject* obj, QEvent* e) { return false; } +void SettingsGui::updateSkinOptions() { + auto* it = m_ui->m_treeSkins->currentItem(); + + if (it == nullptr) { + return; + } + + const Skin skin = it->data(0, Qt::ItemDataRole::UserRole).value(); + const bool skin_has_palette = !skin.m_stylePalette.isEmpty(); + const bool skin_forces_palette = skin.m_forcedStylePalette; + const bool skin_forces_style = skin.m_forcedStyles.isEmpty(); + + m_ui->m_cmbStyles->setEnabled(!qApp->skins()->styleIsFrozen() && skin_forces_style); + m_ui->m_checkForceAlternativePalette->setEnabled(skin_has_palette + ? !skin_forces_palette + : qApp->skins()->isStyleGoodForAlternativeStylePalette(m_ui->m_cmbStyles->currentText())); +} + void SettingsGui::loadSettings() { onBeginLoadSettings(); @@ -130,9 +147,6 @@ void SettingsGui::loadSettings() { m_ui->m_checkHidden->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::MainWindowStartsHidden)).toBool()); m_ui->m_checkHideWhenMinimized->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool()); - m_ui->m_checkForceDarkFusion->setChecked(settings()->value(GROUP(GUI), - SETTING(GUI::ForceDarkFusion)).toBool()); - // Load settings of icon theme. const QString current_theme = qApp->icons()->currentIconTheme(); auto icons = qApp->icons()->installedIconThemes(); @@ -159,7 +173,7 @@ void SettingsGui::loadSettings() { m_ui->m_displayUnreadMessageCountOnTaskBar->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UnreadNumbersOnTaskBar)).toBool()); #endif - // Mark active theme. + // Mark active icon theme. if (current_theme == QL1S(APP_NO_THEME)) { // Because "no icon theme" lies at the index 0. m_ui->m_cmbIconTheme->setCurrentIndex(0); @@ -168,15 +182,32 @@ void SettingsGui::loadSettings() { m_ui->m_cmbIconTheme->setCurrentText(current_theme); } + // Load styles. + auto styles = QStyleFactory::keys(); + + for (const QString& style_name : qAsConst(styles)) { + m_ui->m_cmbStyles->addItem(style_name); + } + + int item_style = m_ui->m_cmbStyles->findText(qApp->skins()->currentStyle(), Qt::MatchFlag::MatchFixedString); + + if (item_style >= 0) { + m_ui->m_cmbStyles->setCurrentIndex(item_style); + } + + m_ui->m_checkForceAlternativePalette->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::ForceDarkFusion)).toBool()); + // Load skin. const QString selected_skin = qApp->skins()->selectedSkinName(); auto skins = qApp->skins()->installedSkins(); for (const Skin& skin : qAsConst(skins)) { - QTreeWidgetItem* new_item = new QTreeWidgetItem(QStringList() << - skin.m_visibleName << - skin.m_version << - skin.m_author); + QTreeWidgetItem* new_item = new QTreeWidgetItem({ + skin.m_visibleName, + skin.m_version, + skin.m_author, + skin.m_forcedStyles.isEmpty() ? QChar(10007) : skin.m_forcedStyles.join(QSL(", ")), + skin.m_forcedStylePalette ? QChar(10003) : QChar(10007) }); new_item->setData(0, Qt::UserRole, QVariant::fromValue(skin)); @@ -195,25 +226,6 @@ void SettingsGui::loadSettings() { m_ui->m_treeSkins->setCurrentItem(m_ui->m_treeSkins->topLevelItem(0)); } - // Load styles. - auto styles = QStyleFactory::keys(); - - for (const QString& style_name : qAsConst(styles)) { - m_ui->m_cmbStyles->addItem(style_name); - } - - int item_style = m_ui->m_cmbStyles->findText(qApp->skins()->currentStyle(), Qt::MatchFlag::MatchFixedString); - - if (item_style >= 0) { - m_ui->m_cmbStyles->setCurrentIndex(item_style); - } - - if (qApp->skins()->styleIsFrozen()) { - m_ui->m_cmbStyles->setEnabled(false); - m_ui->m_cmbStyles->setToolTip(tr("You cannot change style because it was explicitly selected in your OS settings.\n" - "Perhaps it is set with 'QT_STYLE_OVERRIDE' environment variable?")); - } - // Load tab settings. m_ui->m_checkCloseTabsMiddleClick->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabCloseMiddleClick)).toBool()); m_ui->m_checkCloseTabsDoubleClick->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabCloseDoubleClick)).toBool()); @@ -336,8 +348,6 @@ void SettingsGui::saveSettings() { settings()->setValue(GROUP(GUI), GUI::MainWindowStartsHidden, m_ui->m_checkHidden->isChecked()); settings()->setValue(GROUP(GUI), GUI::HideMainWindowWhenMinimized, m_ui->m_checkHideWhenMinimized->isChecked()); - settings()->setValue(GROUP(GUI), GUI::ForceDarkFusion, m_ui->m_checkForceDarkFusion->isChecked()); - #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) settings()->setValue(GROUP(GUI), GUI::UnreadNumbersOnTaskBar, m_ui->m_displayUnreadMessageCountOnTaskBar->isChecked()); #endif @@ -378,6 +388,10 @@ void SettingsGui::saveSettings() { qApp->settings()->setValue(GROUP(GUI), GUI::Style, new_style); } + if (m_ui->m_checkForceAlternativePalette->isEnabled()) { + settings()->setValue(GROUP(GUI), GUI::ForceDarkFusion, m_ui->m_checkForceAlternativePalette->isChecked()); + } + // Save tab settings. settings()->setValue(GROUP(GUI), GUI::TabCloseMiddleClick, m_ui->m_checkCloseTabsMiddleClick->isChecked()); settings()->setValue(GROUP(GUI), GUI::TabCloseDoubleClick, m_ui->m_checkCloseTabsDoubleClick->isChecked()); diff --git a/src/librssguard/gui/settings/settingsgui.h b/src/librssguard/gui/settings/settingsgui.h index fabce3322..9d0aa88ed 100644 --- a/src/librssguard/gui/settings/settingsgui.h +++ b/src/librssguard/gui/settings/settingsgui.h @@ -24,6 +24,7 @@ class SettingsGui : public SettingsPanel { bool eventFilter(QObject* obj, QEvent* e); private slots: + void updateSkinOptions(); void resetCustomSkinColor(); private: diff --git a/src/librssguard/gui/settings/settingsgui.ui b/src/librssguard/gui/settings/settingsgui.ui index 044da1d98..ce152974e 100644 --- a/src/librssguard/gui/settings/settingsgui.ui +++ b/src/librssguard/gui/settings/settingsgui.ui @@ -101,9 +101,9 @@ - + - Force dark look (Fusion only) + Force alternative color palette defined in skin @@ -458,7 +458,7 @@ m_cmbSelectToolBar m_cmbIconTheme m_cmbStyles - m_checkForceDarkFusion + m_checkForceAlternativePalette m_treeSkins m_gbCustomSkinColors diff --git a/src/librssguard/miscellaneous/skinfactory.cpp b/src/librssguard/miscellaneous/skinfactory.cpp index 9e6a798ae..ed7c10701 100644 --- a/src/librssguard/miscellaneous/skinfactory.cpp +++ b/src/librssguard/miscellaneous/skinfactory.cpp @@ -42,7 +42,7 @@ void SkinFactory::loadCurrentSkin() { qCriticalNN << LOGSEC_GUI << "Failed to load selected or default skin. Quitting!"; } -bool SkinFactory::isStyleGoodForDarkVariant(const QString& style_name) const { +bool SkinFactory::isStyleGoodForAlternativeStylePalette(const QString& style_name) const { static QRegularExpression re = QRegularExpression("^(fusion)|(qt[56]ct-style)$"); return re.match(style_name.toLower()).hasMatch(); @@ -55,13 +55,26 @@ void SkinFactory::loadSkinFromData(const Skin& skin) { const QString cli_forced_style = qApp->cmdParser()->value(QSL(CLI_STYLE_SHORT)); if (env_forced_style.isEmpty() && cli_forced_style.isEmpty()) { - qApp->setStyle(style_name); m_styleIsFrozen = false; - qDebugNN << LOGSEC_GUI << "Setting style:" << QUOTE_W_SPACE_DOT(style_name); + if (!skin.m_forcedStyles.isEmpty()) { + qDebugNN << LOGSEC_GUI << "Forcing one of skin's declared styles:" + << QUOTE_W_SPACE_DOT(skin.m_forcedStyles); + + for (const QString& skin_forced_style : skin.m_forcedStyles) { + if (qApp->setStyle(skin_forced_style) != nullptr) { + break; + } + } + } + else { + qDebugNN << LOGSEC_GUI << "Setting style:" << QUOTE_W_SPACE_DOT(style_name); + qApp->setStyle(style_name); + } } else { m_styleIsFrozen = true; + qWarningNN << LOGSEC_GUI << "Respecting forced style(s):\n" << " QT_STYLE_OVERRIDE: " QUOTE_NO_SPACE(env_forced_style) << "\n" << " CLI (-style): " QUOTE_NO_SPACE(cli_forced_style); @@ -71,86 +84,97 @@ void SkinFactory::loadSkinFromData(const Skin& skin) { // they specifically set object name to style name. m_currentStyle = qApp->style()->objectName(); - if (isStyleGoodForDarkVariant(m_currentStyle) && - qApp->settings()->value(GROUP(GUI), SETTING(GUI::ForceDarkFusion)).toBool()) { - qDebugNN << LOGSEC_GUI << "Activating dark palette for Fusion style."; + if (isStyleGoodForAlternativeStylePalette(m_currentStyle) && - QPalette fusion_palette = qApp->palette(); - QColor clr_maibg(QSL("#2D2F32")); - QColor clr_basbg(QSL("#373A3D")); - QColor clr_altbg(QSL("#323437")); - QColor clr_selbg(QSL("#8291AD")); - QColor clr_selfg(QSL("#FFFFFF")); - QColor clr_btnfg(QSL("#E7E7E7")); - QColor clr_dibfg(QSL("#A7A7A7")); - QColor clr_winfg(QSL("#D8D8D8")); - QColor clr_diwfg(QSL("#999999")); - QColor clr_brdbg(QSL("#202224")); // Use colour picker on dark brdr under list header for this one - QColor clr_wlink(QSL("#a1acc1")); + /* Skin has alternative style palette and forces its usage. */ + ((!skin.m_stylePalette.isEmpty() && skin.m_forcedStylePalette) || - // - // Normal state. - // + /* User wants alternative style palette anyway. */ + qApp->settings()->value(GROUP(GUI), SETTING(GUI::ForceDarkFusion)).toBool())) { + qDebugNN << LOGSEC_GUI << "Activating alternative palette."; - // Backgrounds & bases. - fusion_palette.setColor(QPalette::ColorRole::Window, clr_maibg); - fusion_palette.setColor(QPalette::ColorRole::Base, clr_basbg); - fusion_palette.setColor(QPalette::ColorRole::Dark, clr_brdbg); - fusion_palette.setColor(QPalette::ColorRole::AlternateBase, clr_altbg); - fusion_palette.setColor(QPalette::ColorRole::Button, clr_altbg); - fusion_palette.setColor(QPalette::ColorRole::Light, clr_altbg); - fusion_palette.setColor(QPalette::ColorRole::Highlight, clr_selbg); + QPalette pal; - // Texts. - fusion_palette.setColor(QPalette::ColorRole::ButtonText, clr_btnfg); - fusion_palette.setColor(QPalette::ColorRole::WindowText, clr_winfg); - fusion_palette.setColor(QPalette::ColorRole::BrightText, clr_basbg); - fusion_palette.setColor(QPalette::ColorRole::Text, clr_winfg); - fusion_palette.setColor(QPalette::ColorRole::PlaceholderText, clr_dibfg); - fusion_palette.setColor(QPalette::ColorRole::Link, clr_wlink); - fusion_palette.setColor(QPalette::ColorRole::LinkVisited, clr_wlink); - fusion_palette.setColor(QPalette::ColorRole::HighlightedText, clr_selfg); + if (skin.m_stylePalette.isEmpty()) { + QColor clr_maibg(QSL("#2D2F32")); + QColor clr_basbg(QSL("#373A3D")); + QColor clr_altbg(QSL("#323437")); + QColor clr_selbg(QSL("#8291AD")); + QColor clr_selfg(QSL("#FFFFFF")); + QColor clr_btnfg(QSL("#E7E7E7")); + QColor clr_dibfg(QSL("#A7A7A7")); + QColor clr_winfg(QSL("#D8D8D8")); + QColor clr_diwfg(QSL("#999999")); + QColor clr_brdbg(QSL("#202224")); // Use color picker on dark brdr under list header for this one + QColor clr_wlink(QSL("#a1acc1")); - // - // Inactive state. - // + // + // Normal state. + // - // Backgrounds & bases. + // Backgrounds & bases. + pal.setColor(QPalette::ColorRole::Window, clr_maibg); + pal.setColor(QPalette::ColorRole::Base, clr_basbg); + pal.setColor(QPalette::ColorRole::Dark, clr_brdbg); + pal.setColor(QPalette::ColorRole::AlternateBase, clr_altbg); + pal.setColor(QPalette::ColorRole::Button, clr_altbg); + pal.setColor(QPalette::ColorRole::Light, clr_altbg); + pal.setColor(QPalette::ColorRole::Highlight, clr_selbg); - // Texts. + // Texts. + pal.setColor(QPalette::ColorRole::ButtonText, clr_btnfg); + pal.setColor(QPalette::ColorRole::WindowText, clr_winfg); + pal.setColor(QPalette::ColorRole::BrightText, clr_basbg); + pal.setColor(QPalette::ColorRole::Text, clr_winfg); + pal.setColor(QPalette::ColorRole::PlaceholderText, clr_dibfg); + pal.setColor(QPalette::ColorRole::Link, clr_wlink); + pal.setColor(QPalette::ColorRole::LinkVisited, clr_wlink); + pal.setColor(QPalette::ColorRole::HighlightedText, clr_selfg); - // - // Disabled state. - // + // + // Inactive state. + // - // Backgrounds & bases. - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Window, clr_maibg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Base, clr_basbg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Dark, clr_brdbg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::AlternateBase, clr_altbg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Button, clr_altbg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Light, clr_altbg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Highlight, clr_selbg); + // Backgrounds & bases. - // Texts. - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::ButtonText, clr_dibfg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::WindowText, clr_diwfg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::BrightText, clr_basbg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Text, clr_diwfg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::PlaceholderText, clr_dibfg); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Link, clr_wlink); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::LinkVisited, clr_wlink); - fusion_palette.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::HighlightedText, clr_selfg); + // Texts. - // - // Tooltips. - // + // + // Disabled state. + // - fusion_palette.setColor(QPalette::ColorGroup::All, QPalette::ColorRole::ToolTipBase, clr_maibg); - fusion_palette.setColor(QPalette::ColorGroup::All, QPalette::ColorRole::ToolTipText, clr_winfg); + // Backgrounds & bases. + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Window, clr_maibg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Base, clr_basbg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Dark, clr_brdbg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::AlternateBase, clr_altbg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Button, clr_altbg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Light, clr_altbg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Highlight, clr_selbg); - QToolTip::setPalette(fusion_palette); - qApp->setPalette(fusion_palette); + // Texts. + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::ButtonText, clr_dibfg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::WindowText, clr_diwfg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::BrightText, clr_basbg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Text, clr_diwfg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::PlaceholderText, clr_dibfg); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::Link, clr_wlink); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::LinkVisited, clr_wlink); + pal.setColor(QPalette::ColorGroup::Disabled, QPalette::ColorRole::HighlightedText, clr_selfg); + + // + // Tooltips. + // + + pal.setColor(QPalette::ColorGroup::All, QPalette::ColorRole::ToolTipBase, clr_maibg); + pal.setColor(QPalette::ColorGroup::All, QPalette::ColorRole::ToolTipText, clr_winfg); + } + else { + pal = skin.extractPalette(); + } + + QToolTip::setPalette(pal); + qApp->setPalette(pal); } if (!skin.m_rawData.isEmpty()) { @@ -271,6 +295,49 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const { skin.m_colorPalette = palette; + // Obtain alternative style palette. + skin.m_forcedStyles = skin_node + .namedItem(QSL("forced-styles")) + .toElement().text().split(',', +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SplitBehavior::SkipEmptyParts); +#endif + + skin.m_forcedStylePalette = skin_node.namedItem(QSL("forced-style-palette")).toElement().text() == + QVariant(true).toString(); + + QDomElement style_palette_root = skin_node.namedItem(QSL("style-palette")).toElement(); + + if (!style_palette_root.isNull()) { + const QMetaObject& mop = QPalette::staticMetaObject; + QMetaEnum enumerp = mop.enumerator(mop.indexOfEnumerator(QSL("ColorGroup").toLocal8Bit().constData())); + QMetaEnum enumerx = mop.enumerator(mop.indexOfEnumerator(QSL("ColorRole").toLocal8Bit().constData())); + + QMultiHash> groups; + + QDomNodeList groups_of_palette = style_palette_root.elementsByTagName(QSL("group")); + + for (int i = 0; i < groups_of_palette.size(); i++) { + const QDomNode& group_root_nd = groups_of_palette.at(i); + QPalette::ColorGroup group = QPalette::ColorGroup(enumerp.keyToValue(group_root_nd.toElement().attribute(QSL("id")).toLatin1())); + + QDomNodeList colors_of_group = group_root_nd.toElement().elementsByTagName(QSL("color")); + + for (int j = 0; j < colors_of_group.size(); j++) { + const QDomNode& color_nd = colors_of_group.at(j); + + QColor color(color_nd.toElement().text()); + QPalette::ColorRole role = QPalette::ColorRole(enumerx.keyToValue(color_nd.toElement().attribute(QSL("role")).toLatin1())); + + groups.insert(group, QPair(role, color)); + } + } + + skin.m_stylePalette = groups; + } + // Free resources. skin_file.close(); skin_file.deleteLater(); @@ -394,6 +461,27 @@ QVariant Skin::colorForModel(SkinEnums::PaletteColors type, bool ignore_custom_c : QVariant(); } +QPalette Skin::extractPalette() const { + QPalette pal; + QList groups = m_stylePalette.keys(); + + if (groups.contains(QPalette::ColorGroup::All)) { + + groups.removeAll(QPalette::ColorGroup::All); + groups.insert(0, QPalette::ColorGroup::All); + } + + for (QPalette::ColorGroup grp : groups) { + auto roles = m_stylePalette.values(grp); + + for (const auto& rl : roles) { + pal.setColor(grp, rl.first, rl.second); + } + } + + return pal; +} + QString SkinEnums::palleteColorText(PaletteColors col) { switch (col) { case SkinEnums::PaletteColors::FgInteresting: diff --git a/src/librssguard/miscellaneous/skinfactory.h b/src/librssguard/miscellaneous/skinfactory.h index 40c06a271..666d8900a 100644 --- a/src/librssguard/miscellaneous/skinfactory.h +++ b/src/librssguard/miscellaneous/skinfactory.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -49,8 +50,12 @@ struct RSSGUARD_DLLSPEC Skin { QString m_layoutMarkup; QString m_enclosureMarkup; QHash m_colorPalette; + QStringList m_forcedStyles; + bool m_forcedStylePalette; + QMultiHash> m_stylePalette; QVariant colorForModel(SkinEnums::PaletteColors type, bool ignore_custom_colors = false) const; + QPalette extractPalette() const; }; uint qHash(const SkinEnums::PaletteColors& key); @@ -68,7 +73,7 @@ class RSSGUARD_DLLSPEC SkinFactory : public QObject { void loadCurrentSkin(); Skin currentSkin() const; - bool isStyleGoodForDarkVariant(const QString& style_name) const; + bool isStyleGoodForAlternativeStylePalette(const QString& style_name) const; // Returns the name of the skin, that should be activated // after application restart.