From 2beb00c65f05474ff999aed53cce5c8e7e020634 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sat, 28 Feb 2026 18:30:51 +0100 Subject: [PATCH] Add more custom colors to the side bar elements so we can theme selected items --- YACReaderLibrary/db/folder_model.cpp | 4 +- YACReaderLibrary/db/reading_list_item.cpp | 2 +- YACReaderLibrary/themes/theme.h | 23 +-- YACReaderLibrary/themes/theme_factory.cpp | 168 +++++++++++++----- YACReaderLibrary/yacreader_folders_view.cpp | 12 +- .../yacreader_reading_lists_view.cpp | 8 +- 6 files changed, 156 insertions(+), 61 deletions(-) diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index d659a19c..8a71c9c2 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -144,8 +144,8 @@ void FolderModel::applyTheme(const Theme &theme) folderIcon = QFileIconProvider().icon(QFileIconProvider::Folder); folderFinishedIcon = drawFinishedFolderIcon(sidebarIcons.folderReadOverlay); } else { - folderIcon = sidebarIcons.folderIcon; - folderFinishedIcon = sidebarIcons.folderFinishedIcon; + folderIcon = theme.treeView.folderIcon; + folderFinishedIcon = theme.treeView.folderFinishedIcon; } } diff --git a/YACReaderLibrary/db/reading_list_item.cpp b/YACReaderLibrary/db/reading_list_item.cpp index 98e3bf57..e403f2ed 100644 --- a/YACReaderLibrary/db/reading_list_item.cpp +++ b/YACReaderLibrary/db/reading_list_item.cpp @@ -153,7 +153,7 @@ QIcon ReadingListItem::getIcon() const else if (theme.sidebarIcons.useSystemFolderIcons) return QFileIconProvider().icon(QFileIconProvider::Folder); else - return theme.sidebarIcons.folderIcon; // sublist + return theme.treeView.folderIcon; // sublist } int ReadingListItem::childCount() const diff --git a/YACReaderLibrary/themes/theme.h b/YACReaderLibrary/themes/theme.h index 403394d8..a755d386 100644 --- a/YACReaderLibrary/themes/theme.h +++ b/YACReaderLibrary/themes/theme.h @@ -186,14 +186,24 @@ struct TreeViewThemeTemplates { "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }" "QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings {border-image: none;image: url('%6');}" - "QTreeView::branch:has-children:selected:!has-siblings:closed,QTreeView::branch:closed:selected:has-children:has-siblings {border-image: none;image: url('%6');}" + "QTreeView::branch:has-children:selected:!has-siblings:closed,QTreeView::branch:closed:selected:has-children:has-siblings {border-image: none;image: url('%8');}" "QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings {border-image: none;image: url('%7');}" - "QTreeView::branch:open:has-children:selected:!has-siblings,QTreeView::branch:open:has-children:selected:has-siblings {border-image: none;image: url('%7');}"; + "QTreeView::branch:open:has-children:selected:!has-siblings,QTreeView::branch:open:has-children:selected:has-siblings {border-image: none;image: url('%9');}"; }; struct TreeViewTheme { QString treeViewQSS; QColor folderIndicatorColor; // For incomplete folders and recently updated folders + + // Branch indicator icon paths (used by QSS url()) + QString branchClosedIconPath; + QString branchOpenIconPath; + QString branchClosedIconSelectedPath; + QString branchOpenIconSelectedPath; + + // Folder icons (normal and selected states, including finished/read tick variant) + QIcon folderIcon; + QIcon folderFinishedIcon; }; // QML view theme colors (used by GridComicsView, FolderContentView, InfoComicsView) @@ -266,14 +276,10 @@ struct ContentSplitterTheme { struct SidebarIconsTheme { // When true, use QFileIconProvider for folder icons and overlay folderReadOverlay for finished folders - // When false, use the themed folderIcon and folderFinishedIcon SVGs + // When false, use the themed folderIcon and folderFinishedIcon from TreeViewTheme bool useSystemFolderIcons; QPixmap folderReadOverlay; // Tick overlay drawn on system folder icons when useSystemFolderIcons is true - // Folder icons (for FolderModel, ReadingListItem) - QIcon folderIcon; - QIcon folderFinishedIcon; - // Library icon (for YACReaderLibraryItemWidget - unselected state) QIcon libraryIcon; @@ -288,9 +294,6 @@ struct SidebarIconsTheme { QIcon addLabelIcon; QIcon renameListIcon; - // Branch icons (for TreeView QSS) - QString branchClosedIconPath; - QString branchOpenIconPath; }; struct LibraryItemTheme { diff --git a/YACReaderLibrary/themes/theme_factory.cpp b/YACReaderLibrary/themes/theme_factory.cpp index 989aaf8d..1dc4c077 100644 --- a/YACReaderLibrary/themes/theme_factory.cpp +++ b/YACReaderLibrary/themes/theme_factory.cpp @@ -101,6 +101,18 @@ struct TreeViewParams { QColor scrollHandleColor; QColor selectedTextColor; QColor folderIndicatorColor; + + // Branch indicator icon colors (independent of sidebarIcons.iconColor) + QColor branchIndicatorColor; + QColor branchIndicatorSelectedColor; + + // Folder icon colors (own parameters, independent of sidebarIcons) + QColor folderIconColor; // Main color for unselected folder (#f0f) + QColor folderIconShadowColor; // Shadow color for unselected folder (#0ff) + QColor folderIconSelectedColor; // Main color for selected folder (#f0f) + QColor folderIconSelectedShadowColor; // Shadow color for selected folder (#0ff) + QColor folderReadOverlayColor; // Tick/checkmark color for unselected folder (#ff0 in folder_finished, #f0f in folder_read_overlay.svg) + QColor folderReadOverlaySelectedColor; // Tick/checkmark color for selected folder }; struct TableViewParams { @@ -179,11 +191,9 @@ struct SidebarIconsParams { // Icon colors - #f0f placeholder gets replaced with these QColor iconColor; // Main icon color (replaces #f0f) QColor shadowColor; // Shadow color (replaces #0ff) - QColor extraColor; // Extra info like ticks (replaces #ff0) // When true, use QFileIconProvider for folder icons and overlay a tick for finished folders bool useSystemFolderIcons; - QColor folderReadOverlayColor; // Color for the tick overlay (replaces #f0f in folder_read_overlay.svg) }; struct ServerConfigDialogThemeTemplates { @@ -225,18 +235,27 @@ struct SearchLineEditParams { struct ReadingListIconsParams { QMap labelColors; // Label colors by name (e.g., "red" -> #f67a7b) QColor labelShadowColor; // Shadow color for labels (replaces #0ff) + QColor labelShadowSelectedColor; // Shadow color for labels when selected/hovered // Special list icon colors QColor readingListMainColor; // default_0 main color (replaces #f0f) + QColor readingListMainSelectedColor; // default_0 main color when selected/hovered QColor favoritesMainColor; // default_1 main color (replaces #f0f) + QColor favoritesMainSelectedColor; // default_1 main color when selected/hovered QColor currentlyReadingMainColor; // default_2 main color (replaces #f0f) + QColor currentlyReadingMainSelectedColor; // default_2 main color when selected/hovered QColor currentlyReadingOuterColor; // default_2 outer circle (replaces #ff0) + QColor currentlyReadingOuterSelectedColor; // default_2 outer circle when selected/hovered QColor specialListShadowColor; // Shadow color for special lists (replaces #0ff) + QColor specialListShadowSelectedColor; // Shadow color for special lists when selected/hovered // List icon colors QColor listMainColor; // main color (replaces #f0f) + QColor listMainSelectedColor; // main color when selected/hovered QColor listShadowColor; // shadow color (replaces #0ff) + QColor listShadowSelectedColor; // shadow color when selected/hovered QColor listDetailColor; // detail/checkbox color (replaces #ff0) + QColor listDetailSelectedColor; // detail/checkbox color when selected/hovered }; struct DialogIconsParams { @@ -559,15 +578,6 @@ Theme makeTheme(const ThemeParams ¶ms) return icon; }; - // Helper for icons with extra color (three-color: #f0f main, #0ff shadow, #ff0 extra) - auto makeSidebarIconWithExtra = [&](const QString &basePath) { - const QString path = recoloredSvgToThemeFile(basePath, si.iconColor, si.shadowColor, si.extraColor, params.themeName); - QIcon icon; - icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); - icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); - return icon; - }; - // Helper for single-color icons (only #f0f main) auto makeSingleColorIcon = [&](const QString &basePath) { const QString path = recoloredSvgToThemeFile(basePath, si.iconColor, params.themeName); @@ -580,14 +590,10 @@ Theme makeTheme(const ThemeParams ¶ms) // System folder icons flag and overlay theme.sidebarIcons.useSystemFolderIcons = si.useSystemFolderIcons; if (si.useSystemFolderIcons) { - const QString overlayPath = recoloredSvgToThemeFile(":/images/sidebar/folder_read_overlay.svg", si.folderReadOverlayColor, params.themeName); + const QString overlayPath = recoloredSvgToThemeFile(":/images/sidebar/folder_read_overlay.svg", params.treeViewParams.folderReadOverlayColor, params.themeName); theme.sidebarIcons.folderReadOverlay = QPixmap(overlayPath); } - // Folder icons - theme.sidebarIcons.folderIcon = makeSidebarIcon(":/images/sidebar/folder.svg"); - theme.sidebarIcons.folderFinishedIcon = makeSidebarIconWithExtra(":/images/sidebar/folder_finished.svg"); - // Library icon (unselected state, two-color: #f0f main, #0ff shadow) { const auto &li = params.libraryItemParams; @@ -609,9 +615,6 @@ Theme makeTheme(const ThemeParams ¶ms) theme.sidebarIcons.addLabelIcon = makeSidebarIcon(":/images/sidebar/addLabelIcon.svg"); theme.sidebarIcons.renameListIcon = makeSidebarIcon(":/images/sidebar/renameListIcon.svg"); - // Branch icons (paths for QSS) - theme.sidebarIcons.branchClosedIconPath = recoloredSvgToThemeFile(":/images/sidebar/branch-closed.svg", si.iconColor, params.themeName); - theme.sidebarIcons.branchOpenIconPath = recoloredSvgToThemeFile(":/images/sidebar/branch-open.svg", si.iconColor, params.themeName); // end SidebarIcons // LibraryItem @@ -629,17 +632,42 @@ Theme makeTheme(const ThemeParams ¶ms) theme.libraryItem.libraryOptionsIcon = QIcon(libraryOptionsPath); // end LibraryItem - // TreeView (must come after SidebarIcons for branch icon paths) + // TreeView const auto &tv = params.treeViewParams; + + // Branch indicator icons — own colors, independent of the sidebar icon color + theme.treeView.branchClosedIconPath = recoloredSvgToThemeFile(":/images/sidebar/branch-closed.svg", tv.branchIndicatorColor, params.themeName); + theme.treeView.branchOpenIconPath = recoloredSvgToThemeFile(":/images/sidebar/branch-open.svg", tv.branchIndicatorColor, params.themeName); + theme.treeView.branchClosedIconSelectedPath = recoloredSvgToThemeFile(":/images/sidebar/branch-closed.svg", tv.branchIndicatorSelectedColor, params.themeName, { .suffix = "_selected" }); + theme.treeView.branchOpenIconSelectedPath = recoloredSvgToThemeFile(":/images/sidebar/branch-open.svg", tv.branchIndicatorSelectedColor, params.themeName, { .suffix = "_selected" }); + theme.treeView.treeViewQSS = tv.t.styledTreeViewQSS .arg(tv.textColor.name(), tv.selectionBackgroundColor.name(), tv.scrollBackgroundColor.name(), tv.scrollHandleColor.name(), tv.selectedTextColor.name(), - theme.sidebarIcons.branchClosedIconPath, - theme.sidebarIcons.branchOpenIconPath); + theme.treeView.branchClosedIconPath, + theme.treeView.branchOpenIconPath, + theme.treeView.branchClosedIconSelectedPath, + theme.treeView.branchOpenIconSelectedPath); theme.treeView.folderIndicatorColor = tv.folderIndicatorColor; + + // Folder icon — normal and selected states with independent colors + { + const QString normalPath = recoloredSvgToThemeFile(":/images/sidebar/folder.svg", tv.folderIconColor, tv.folderIconShadowColor, params.themeName); + const QString selectedPath = recoloredSvgToThemeFile(":/images/sidebar/folder.svg", tv.folderIconSelectedColor, tv.folderIconSelectedShadowColor, params.themeName, { .suffix = "_selected" }); + theme.treeView.folderIcon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + theme.treeView.folderIcon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + } + + // Folder finished icon — same but with tick (#ff0) recolored independently for each state + { + const QString normalPath = recoloredSvgToThemeFile(":/images/sidebar/folder_finished.svg", tv.folderIconColor, tv.folderIconShadowColor, tv.folderReadOverlayColor, params.themeName); + const QString selectedPath = recoloredSvgToThemeFile(":/images/sidebar/folder_finished.svg", tv.folderIconSelectedColor, tv.folderIconSelectedShadowColor, tv.folderReadOverlaySelectedColor, params.themeName, { .suffix = "_selected" }); + theme.treeView.folderFinishedIcon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + theme.treeView.folderFinishedIcon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + } // end TreeView // ContentSplitter @@ -664,10 +692,10 @@ Theme makeTheme(const ThemeParams ¶ms) return icon; }; - theme.comicsViewToolbar.toolbarQSS = cvt.t.toolbarQSS - .arg(cvt.backgroundColor.name()) - .arg(cvt.separatorColor.name()) - .arg(cvt.checkedBackgroundColor.name()); + theme.comicsViewToolbar.toolbarQSS = cvt.t.toolbarQSS.arg( + cvt.backgroundColor.name(), + cvt.separatorColor.name(), + cvt.checkedBackgroundColor.name()); theme.comicsViewToolbar.openInYACReaderIcon = makeComicsViewIcon(":/images/comics_view_toolbar/openInYACReader.svg"); theme.comicsViewToolbar.setAsReadIcon = makeComicsViewIcon(":/images/comics_view_toolbar/setReadButton.svg"); theme.comicsViewToolbar.setAsUnreadIcon = makeComicsViewIcon(":/images/comics_view_toolbar/setUnread.svg"); @@ -705,10 +733,11 @@ Theme makeTheme(const ThemeParams ¶ms) // Helper to create label icons from template (uses color name to generate label_.svg files) auto makeLabelIcon = [&](const QString &colorName, const QColor &mainColor) { - const QString path = recoloredSvgToThemeFile(":/images/lists/label_template.svg", mainColor, rli.labelShadowColor, params.themeName, { .fileName = "label_" + colorName }); + const QString normalPath = recoloredSvgToThemeFile(":/images/lists/label_template.svg", mainColor, rli.labelShadowColor, params.themeName, { .fileName = "label_" + colorName }); + const QString selectedPath = recoloredSvgToThemeFile(":/images/lists/label_template.svg", mainColor, rli.labelShadowSelectedColor, params.themeName, { .suffix = "_selected", .fileName = "label_" + colorName }); QIcon icon; - icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); - icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); return icon; }; @@ -717,32 +746,35 @@ Theme makeTheme(const ThemeParams ¶ms) } // Special list icons - auto makeSpecialIcon = [&](const QString &basePath, const QColor &mainColor) { - const QString path = recoloredSvgToThemeFile(basePath, mainColor, rli.specialListShadowColor, params.themeName); + auto makeSpecialIcon = [&](const QString &basePath, const QColor &mainColor, const QColor &mainSelectedColor) { + const QString normalPath = recoloredSvgToThemeFile(basePath, mainColor, rli.specialListShadowColor, params.themeName); + const QString selectedPath = recoloredSvgToThemeFile(basePath, mainSelectedColor, rli.specialListShadowSelectedColor, params.themeName, { .suffix = "_selected" }); QIcon icon; - icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); - icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); return icon; }; - theme.readingListIcons.readingListIcon = makeSpecialIcon(":/images/lists/default_0.svg", rli.readingListMainColor); - theme.readingListIcons.favoritesIcon = makeSpecialIcon(":/images/lists/default_1.svg", rli.favoritesMainColor); + theme.readingListIcons.readingListIcon = makeSpecialIcon(":/images/lists/default_0.svg", rli.readingListMainColor, rli.readingListMainSelectedColor); + theme.readingListIcons.favoritesIcon = makeSpecialIcon(":/images/lists/default_1.svg", rli.favoritesMainColor, rli.favoritesMainSelectedColor); // Currently reading has 3 colors { - const QString path = recoloredSvgToThemeFile(":/images/lists/default_2.svg", rli.currentlyReadingMainColor, rli.specialListShadowColor, rli.currentlyReadingOuterColor, params.themeName); + const QString normalPath = recoloredSvgToThemeFile(":/images/lists/default_2.svg", rli.currentlyReadingMainColor, rli.specialListShadowColor, rli.currentlyReadingOuterColor, params.themeName); + const QString selectedPath = recoloredSvgToThemeFile(":/images/lists/default_2.svg", rli.currentlyReadingMainSelectedColor, rli.specialListShadowSelectedColor, rli.currentlyReadingOuterSelectedColor, params.themeName, { .suffix = "_selected" }); QIcon icon; - icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); - icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); theme.readingListIcons.currentlyReadingIcon = icon; } // List icon (3 colors) { - const QString path = recoloredSvgToThemeFile(":/images/lists/list.svg", rli.listMainColor, rli.listShadowColor, rli.listDetailColor, params.themeName); + const QString normalPath = recoloredSvgToThemeFile(":/images/lists/list.svg", rli.listMainColor, rli.listShadowColor, rli.listDetailColor, params.themeName); + const QString selectedPath = recoloredSvgToThemeFile(":/images/lists/list.svg", rli.listMainSelectedColor, rli.listShadowSelectedColor, rli.listDetailSelectedColor, params.themeName, { .suffix = "_selected" }); QIcon icon; - icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); - icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); theme.readingListIcons.listIcon = icon; } // end ReadingListIcons @@ -944,6 +976,14 @@ ThemeParams classicThemeParams() tv.scrollHandleColor = QColor(0xDDDDDD); tv.selectedTextColor = Qt::white; tv.folderIndicatorColor = QColor(237, 197, 24); + tv.branchIndicatorColor = QColor(0xE0E0E0); + tv.branchIndicatorSelectedColor = QColor(0xFFFFFF); + tv.folderIconColor = QColor(0xE0E0E0); + tv.folderIconShadowColor = QColor(0xFF000000); + tv.folderIconSelectedColor = QColor(0xE0E0E0); + tv.folderIconSelectedShadowColor = QColor(0xFF000000); + tv.folderReadOverlayColor = QColor(0x464646); + tv.folderReadOverlaySelectedColor = QColor(0x464646); params.treeViewParams = tv; TableViewParams tav; @@ -1006,7 +1046,6 @@ ThemeParams classicThemeParams() SidebarIconsParams si; si.iconColor = QColor(0xE0E0E0); si.shadowColor = QColor(0xFF000000); - si.extraColor = QColor(0x464646); si.useSystemFolderIcons = false; params.sidebarIconsParams = si; @@ -1049,14 +1088,23 @@ ThemeParams classicThemeParams() { "dark", QColor(0xb7b7b7) } }; rli.labelShadowColor = Qt::black; + rli.labelShadowSelectedColor = Qt::black; rli.readingListMainColor = QColor(0xe7e7e7); + rli.readingListMainSelectedColor = QColor(0xe7e7e7); rli.favoritesMainColor = QColor(0xe15055); + rli.favoritesMainSelectedColor = QColor(0xe15055); rli.currentlyReadingMainColor = QColor(0xffcc00); + rli.currentlyReadingMainSelectedColor = QColor(0xffcc00); rli.currentlyReadingOuterColor = Qt::black; + rli.currentlyReadingOuterSelectedColor = Qt::black; rli.specialListShadowColor = Qt::black; + rli.specialListShadowSelectedColor = Qt::black; rli.listMainColor = QColor(0xe7e7e7); + rli.listMainSelectedColor = QColor(0xe7e7e7); rli.listShadowColor = Qt::black; + rli.listShadowSelectedColor = Qt::black; rli.listDetailColor = QColor(0x464646); + rli.listDetailSelectedColor = QColor(0x464646); params.readingListIconsParams = rli; MenuIconsParams mi; @@ -1196,6 +1244,14 @@ ThemeParams lightThemeParams() tv.scrollHandleColor = QColor(0x888888); tv.selectedTextColor = QColor(0x1A1A1A); tv.folderIndicatorColor = QColor(85, 95, 127); + tv.branchIndicatorColor = QColor(0x606060); + tv.branchIndicatorSelectedColor = QColor(0x1A1A1A); + tv.folderIconColor = QColor(0x606060); + tv.folderIconShadowColor = QColor(0xFFFFFF); + tv.folderIconSelectedColor = QColor(0x606060); + tv.folderIconSelectedShadowColor = QColor(0xFFFFFF); + tv.folderReadOverlayColor = QColor(0xFFFFFF); + tv.folderReadOverlaySelectedColor = QColor(0xFFFFFF); params.treeViewParams = tv; TableViewParams tav; @@ -1258,7 +1314,6 @@ ThemeParams lightThemeParams() SidebarIconsParams si; si.iconColor = QColor(0x606060); si.shadowColor = QColor(0xFFFFFF); - si.extraColor = QColor(0xFFFFFF); si.useSystemFolderIcons = false; params.sidebarIconsParams = si; @@ -1301,14 +1356,23 @@ ThemeParams lightThemeParams() { "dark", QColor(0xb7b7b7) } }; rli.labelShadowColor = QColor(0xa0a0a0); + rli.labelShadowSelectedColor = QColor(0xa0a0a0); rli.readingListMainColor = QColor(0x808080); + rli.readingListMainSelectedColor = QColor(0x808080); rli.favoritesMainColor = QColor(0xe15055); + rli.favoritesMainSelectedColor = QColor(0xe15055); rli.currentlyReadingMainColor = QColor(0xffcc00); + rli.currentlyReadingMainSelectedColor = QColor(0xffcc00); rli.currentlyReadingOuterColor = Qt::black; + rli.currentlyReadingOuterSelectedColor = Qt::black; rli.specialListShadowColor = QColor(0xa0a0a0); + rli.specialListShadowSelectedColor = QColor(0xa0a0a0); rli.listMainColor = QColor(0x808080); + rli.listMainSelectedColor = QColor(0x808080); rli.listShadowColor = QColor(0xc0c0c0); + rli.listShadowSelectedColor = QColor(0xc0c0c0); rli.listDetailColor = QColor(0xFFFFFF); + rli.listDetailSelectedColor = QColor(0xFFFFFF); params.readingListIconsParams = rli; MenuIconsParams mi; @@ -1448,6 +1512,14 @@ ThemeParams darkThemeParams() tv.scrollHandleColor = QColor(0xDDDDDD); tv.selectedTextColor = Qt::white; tv.folderIndicatorColor = QColor(237, 197, 24); + tv.branchIndicatorColor = QColor(0xE0E0E0); + tv.branchIndicatorSelectedColor = QColor(0xFFFFFF); + tv.folderIconColor = QColor(0xE0E0E0); + tv.folderIconShadowColor = QColor(0xFF000000); + tv.folderIconSelectedColor = QColor(0xE0E0E0); + tv.folderIconSelectedShadowColor = QColor(0xFF000000); + tv.folderReadOverlayColor = QColor(0x222222); + tv.folderReadOverlaySelectedColor = QColor(0x222222); params.treeViewParams = tv; TableViewParams tav; @@ -1510,7 +1582,6 @@ ThemeParams darkThemeParams() SidebarIconsParams si; si.iconColor = QColor(0xE0E0E0); si.shadowColor = QColor(0xFF000000); - si.extraColor = QColor(0x222222); si.useSystemFolderIcons = false; params.sidebarIconsParams = si; @@ -1553,14 +1624,23 @@ ThemeParams darkThemeParams() { "dark", QColor(0xb7b7b7) } }; rli.labelShadowColor = Qt::black; + rli.labelShadowSelectedColor = Qt::black; rli.readingListMainColor = QColor(0xe7e7e7); + rli.readingListMainSelectedColor = QColor(0xe7e7e7); rli.favoritesMainColor = QColor(0xe15055); + rli.favoritesMainSelectedColor = QColor(0xe15055); rli.currentlyReadingMainColor = QColor(0xffcc00); + rli.currentlyReadingMainSelectedColor = QColor(0xffcc00); rli.currentlyReadingOuterColor = Qt::black; + rli.currentlyReadingOuterSelectedColor = Qt::black; rli.specialListShadowColor = Qt::black; + rli.specialListShadowSelectedColor = Qt::black; rli.listMainColor = QColor(0xe7e7e7); + rli.listMainSelectedColor = QColor(0xe7e7e7); rli.listShadowColor = Qt::black; + rli.listShadowSelectedColor = Qt::black; rli.listDetailColor = QColor(0x464646); + rli.listDetailSelectedColor = QColor(0x464646); params.readingListIconsParams = rli; MenuIconsParams mi; diff --git a/YACReaderLibrary/yacreader_folders_view.cpp b/YACReaderLibrary/yacreader_folders_view.cpp index 57f6f5b8..ce116bf6 100644 --- a/YACReaderLibrary/yacreader_folders_view.cpp +++ b/YACReaderLibrary/yacreader_folders_view.cpp @@ -81,6 +81,12 @@ YACReaderFoldersViewItemDeletegate::YACReaderFoldersViewItemDeletegate(QObject * void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { + // Promote hover to selected so QIcon::Selected mode activates on mouse-over, + // matching the QSS which already uses the same background for hover and selected. + QStyleOptionViewItem opt = option; + if (opt.state & QStyle::State_MouseOver) + opt.state |= QStyle::State_Selected; + // Get indicator color from parent tree view QColor indicatorColor(237, 197, 24); // Default fallback if (auto treeView = qobject_cast(parent())) { @@ -91,11 +97,11 @@ void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOp painter->save(); painter->setBrush(QBrush(indicatorColor)); painter->setPen(QPen(QBrush(), 0)); - painter->drawRect(0, option.rect.y(), 2, option.rect.height()); + painter->drawRect(0, opt.rect.y(), 2, opt.rect.height()); painter->restore(); } - QStyledItemDelegate::paint(painter, option, index); + QStyledItemDelegate::paint(painter, opt, index); auto showRecent = index.data(FolderModel::ShowRecentRole).toBool(); @@ -110,7 +116,7 @@ void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOp painter->setRenderHint(QPainter::Antialiasing); painter->setBrush(QBrush(indicatorColor)); painter->setPen(QPen(QBrush(), 0)); - painter->drawEllipse(option.rect.x() + 13, option.rect.y() + 2, 7, 7); + painter->drawEllipse(opt.rect.x() + 13, opt.rect.y() + 2, 7, 7); painter->restore(); } } diff --git a/YACReaderLibrary/yacreader_reading_lists_view.cpp b/YACReaderLibrary/yacreader_reading_lists_view.cpp index 6d3d3b40..62b4aea2 100644 --- a/YACReaderLibrary/yacreader_reading_lists_view.cpp +++ b/YACReaderLibrary/yacreader_reading_lists_view.cpp @@ -50,7 +50,13 @@ void YACReaderReadingListsViewItemDeletegate::paint(QPainter *painter, const QSt return; } - QStyledItemDelegate::paint(painter, option, index); + // Promote hover to selected so QIcon::Selected mode activates on mouse-over, + // matching the QSS which already uses the same background for hover and selected. + QStyleOptionViewItem opt = option; + if (opt.state & QStyle::State_MouseOver) + opt.state |= QStyle::State_Selected; + + QStyledItemDelegate::paint(painter, opt, index); } QSize YACReaderReadingListsViewItemDeletegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const