diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index d4acda93c..6519786d8 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -26,7 +26,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/resources/skins/dark/metadata.xml b/resources/skins/dark/metadata.xml index 59495e05c..e50a378d9 100644 --- a/resources/skins/dark/metadata.xml +++ b/resources/skins/dark/metadata.xml @@ -4,8 +4,10 @@ Martin Rotter - #7ae2ff - #f08f84 - #77dd77 + #3A4EE4 + #ff66cc + #4EE43A + #ff99ff + #00ff99 \ No newline at end of file diff --git a/resources/skins/nudus/metadata.xml b/resources/skins/nudus/metadata.xml index dd4b09043..7fd862261 100644 --- a/resources/skins/nudus/metadata.xml +++ b/resources/skins/nudus/metadata.xml @@ -1,11 +1,13 @@ - + Maki Blackwell - #3A4EE4 - #E43A4E - #4EE43A + #3A4EE4 + #ff66cc + #4EE43A + #ff99ff + #00ff99 - + \ No newline at end of file diff --git a/resources/skins/plain/metadata.xml b/resources/skins/plain/metadata.xml index fabb1788a..ced7b669f 100644 --- a/resources/skins/plain/metadata.xml +++ b/resources/skins/plain/metadata.xml @@ -10,8 +10,10 @@ Specifically, they are taken from enumeration "PaletteColors". --> - #00BFFF - #FF0000 - #32CD32 + #3A4EE4 + #ff66cc + #4EE43A + #ff99ff + #00ff99 \ No newline at end of file diff --git a/resources/skins/vergilius/metadata.xml b/resources/skins/vergilius/metadata.xml index 2b289cf13..78fb75561 100644 --- a/resources/skins/vergilius/metadata.xml +++ b/resources/skins/vergilius/metadata.xml @@ -4,8 +4,10 @@ Martin Rotter - #4861f0 - #d93636 - #77dd77 + #3A4EE4 + #ff66cc + #4EE43A + #ff99ff + #00ff99 \ No newline at end of file diff --git a/src/librssguard/core/messagesforfiltersmodel.cpp b/src/librssguard/core/messagesforfiltersmodel.cpp index ee9e1af99..f0c793ce2 100644 --- a/src/librssguard/core/messagesforfiltersmodel.cpp +++ b/src/librssguard/core/messagesforfiltersmodel.cpp @@ -39,11 +39,11 @@ QVariant MessagesForFiltersModel::data(const QModelIndex& index, int role) const if (m_filteringDecisions.contains(index.row())) { switch (m_filteringDecisions.value(index.row())) { case MessageObject::FilteringAction::Accept: - return qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Allright]; + return qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::Allright]; case MessageObject::FilteringAction::Ignore: case MessageObject::FilteringAction::Purge: - return qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Error]; + return qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::FgError]; default: break; diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index d457e50a5..0aaad9d2d 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -386,19 +386,28 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const { } case Qt::ItemDataRole::ForegroundRole: + case HIGHLIGHTED_FOREGROUND_TITLE_ROLE: switch (m_messageHighlighter) { case MessageHighlighter::HighlightImportant: { QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX); QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important) : QSqlQueryModel::data(idx_important); - return dta.toInt() == 1 ? qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight] : QVariant(); + return dta.toInt() == 1 + ? qApp->skins()->currentSkin().m_colorPalette[role == Qt::ItemDataRole::ForegroundRole + ? SkinEnums::PaletteColors::FgInteresting + : SkinEnums::PaletteColors::FgSelectedInteresting] + : QVariant(); } case MessageHighlighter::HighlightUnread: { QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX); QVariant dta = m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read); - return dta.toInt() == 0 ? qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight] : QVariant(); + return dta.toInt() == 0 + ? qApp->skins()->currentSkin().m_colorPalette[role == Qt::ItemDataRole::ForegroundRole + ? SkinEnums::PaletteColors::FgInteresting + : SkinEnums::PaletteColors::FgSelectedInteresting] + : QVariant(); } case MessageHighlighter::NoHighlighting: diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 149300c34..566306565 100644 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -46,6 +46,9 @@ #define MSG_SCORE_MAX 100.0 #define MSG_SCORE_MIN 0.0 +#define LOWER_TITLE_ROLE 64 +#define HIGHLIGHTED_FOREGROUND_TITLE_ROLE 128 + #define SOUNDS_BUILTIN_DIRECTORY ":/sounds" #define ARGUMENTS_LIST_SEPARATOR "\n" #define IS_IN_ARRAY(offset, array) ((offset >= 0) && (offset < array.count())) @@ -57,7 +60,6 @@ #define SCRIPT_SOURCE_TYPE_REGEXP "^.+#.*$" #define TEXT_TITLE_LIMIT 30 #define TEXT_TOOLTIP_LIMIT 50 -#define LOWER_TITLE_ROLE 64 #define RESELECT_MESSAGE_THRESSHOLD 500 #define ICON_SIZE_SETTINGS 16 #define TRAY_ICON_BUBBLE_TIMEOUT 20000 diff --git a/src/librssguard/gui/messagebrowser.cpp b/src/librssguard/gui/messagebrowser.cpp index 6eb333f4d..0295a50d6 100644 --- a/src/librssguard/gui/messagebrowser.cpp +++ b/src/librssguard/gui/messagebrowser.cpp @@ -169,7 +169,7 @@ QString MessageBrowser::prepareHtmlForMessage(const Message& message) { "" "%1" "").arg(html, - qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight].name()); + qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::FgInteresting].name()); } bool MessageBrowser::eventFilter(QObject* watched, QEvent* event) { diff --git a/src/librssguard/gui/reusable/styleditemdelegatewithoutfocus.cpp b/src/librssguard/gui/reusable/styleditemdelegatewithoutfocus.cpp index 1cbb39344..fb9f5cf92 100644 --- a/src/librssguard/gui/reusable/styleditemdelegatewithoutfocus.cpp +++ b/src/librssguard/gui/reusable/styleditemdelegatewithoutfocus.cpp @@ -19,7 +19,7 @@ void StyledItemDelegateWithoutFocus::paint(QPainter* painter, if ((item_option.state & QStyle::StateFlag::State_Selected) == QStyle::StateFlag::State_Selected && index.data(Qt::ItemDataRole::ForegroundRole).isValid()) { item_option.palette.setColor(QPalette::ColorRole::HighlightedText, - index.data(Qt::ItemDataRole::ForegroundRole).value()); + index.data(HIGHLIGHTED_FOREGROUND_TITLE_ROLE).value()); } QStyledItemDelegate::paint(painter, item_option, index); diff --git a/src/librssguard/miscellaneous/skinfactory.cpp b/src/librssguard/miscellaneous/skinfactory.cpp index 8e4286e4c..7efb9c321 100644 --- a/src/librssguard/miscellaneous/skinfactory.cpp +++ b/src/librssguard/miscellaneous/skinfactory.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -205,13 +207,15 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const { skin.m_baseName = skin_name; // Obtain color palette. - QHash palette; + QHash palette; QDomNodeList colors_of_palette = skin_node.namedItem(QSL("palette")).toElement().elementsByTagName(QSL("color")); + const QMetaObject& mo = SkinEnums::staticMetaObject; + QMetaEnum enumer = mo.enumerator(mo.indexOfEnumerator(QSL("PaletteColors").toLocal8Bit().constData())); for (int i = 0; i < colors_of_palette.size(); i++) { QDomElement elem_clr = colors_of_palette.item(i).toElement(); - - Skin::PaletteColors key = Skin::PaletteColors(elem_clr.attribute(QSL("key")).toInt()); + QString en_val = elem_clr.attribute(QSL("key")); + SkinEnums::PaletteColors key = SkinEnums::PaletteColors(enumer.keyToValue(en_val.toLatin1())); QColor value = elem_clr.text(); if (value.isValid()) { @@ -310,6 +314,6 @@ QList SkinFactory::installedSkins() const { return skins; } -uint qHash(const Skin::PaletteColors& key) { +uint qHash(const SkinEnums::PaletteColors& key) { return uint(key); } diff --git a/src/librssguard/miscellaneous/skinfactory.h b/src/librssguard/miscellaneous/skinfactory.h index d129f3e8f..882f018b1 100644 --- a/src/librssguard/miscellaneous/skinfactory.h +++ b/src/librssguard/miscellaneous/skinfactory.h @@ -10,21 +10,31 @@ #include #include +class SkinEnums : public QObject { + Q_OBJECT + + public: + enum class PaletteColors { + // Paint foreground of some interesting items (feeds with new articles, etc.). + FgInteresting = 1, + + // Paint foreground of some interesting items WHEN SELECTED (feeds with new articles, etc.). + FgSelectedInteresting = 2, + + // Paint foreground of some errored items (feeds with error, etc.). + FgError = 4, + + // Paint foreground of some errored items WHEN SELECTED (feeds with error, etc.). + FgSelectedError = 8, + + // OK-ish color (background of list with test results of article filter). + Allright = 16 + }; + + Q_ENUM(PaletteColors) +}; + struct RSSGUARD_DLLSPEC Skin { - enum class PaletteColors { - // Used to highlight foreground of some interesting articles. - Highlight = 1, - - // Foreground color of errorneous entries. - Error = 2, - - // OK-ish color. - Allright = 3, - - // Foreground color when item is highlighted/selected. - HighlightedError = 4 - }; - QString m_baseName; QString m_visibleName; QString m_author; @@ -35,10 +45,10 @@ struct RSSGUARD_DLLSPEC Skin { QString m_enclosureImageMarkup; QString m_layoutMarkup; QString m_enclosureMarkup; - QHash m_colorPalette; + QHash m_colorPalette; }; -uint qHash(const Skin::PaletteColors& key); +uint qHash(const SkinEnums::PaletteColors& key); Q_DECLARE_METATYPE(Skin) diff --git a/src/librssguard/services/abstract/feed.cpp b/src/librssguard/services/abstract/feed.cpp index 4effb4029..32ada58d0 100644 --- a/src/librssguard/services/abstract/feed.cpp +++ b/src/librssguard/services/abstract/feed.cpp @@ -53,16 +53,31 @@ QList Feed::undeletedMessages() const { QVariant Feed::data(int column, int role) const { switch (role) { - case Qt::ItemDataRole::ForegroundRole: + case HIGHLIGHTED_FOREGROUND_TITLE_ROLE: switch (status()) { case Status::NewMessages: - return qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight]; + return qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::FgSelectedInteresting]; case Status::NetworkError: case Status::ParsingError: case Status::AuthError: case Status::OtherError: - return qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Error]; + return qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::FgSelectedError]; + + default: + return QVariant(); + } + + case Qt::ItemDataRole::ForegroundRole: + switch (status()) { + case Status::NewMessages: + return qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::FgInteresting]; + + case Status::NetworkError: + case Status::ParsingError: + case Status::AuthError: + case Status::OtherError: + return qApp->skins()->currentSkin().m_colorPalette[SkinEnums::PaletteColors::FgError]; default: return QVariant();