From 8f416fe715d4290dec67fd2ab99ab7a12a76915d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 15 Jul 2022 21:43:07 +0530 Subject: [PATCH] Fix custom icon overrides not working for Qt builtin controls --- src/calibre/gui2/__init__.py | 15 ++++++++++++++- .../progress_indicator/QProgressIndicator.cpp | 2 ++ src/calibre/utils/resources.py | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index a72fdd4a5e..7713169633 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1332,7 +1332,20 @@ class Application(QApplication): '#FF2400' if is_error else '#50c878') def load_calibre_style(self): + from calibre.utils.resources import get_user_path icon_map = self.__icon_map_memory_ = {} + user_path = get_user_path() + if user_path: + user_path = os.path.join(user_path, 'images') + + @lru_cache(maxsize=64) + def check_for_custom_icon(v): + if user_path: + q = os.path.join(user_path, v) + if os.path.exists(q): + return q + return v.rpartition('.')[0] + for k, v in { 'DialogYesButton': 'ok.png', 'DialogNoButton': 'window-close.png', @@ -1353,7 +1366,7 @@ class Application(QApplication): 'ToolBarHorizontalExtensionButton': 'v-ellipsis.png', 'ToolBarVerticalExtensionButton': 'h-ellipsis.png', }.items(): - icon_map[getattr(QStyle.StandardPixmap, 'SP_'+k).value] = v.rpartition('.')[0] + icon_map[getattr(QStyle.StandardPixmap, 'SP_'+k).value] = check_for_custom_icon(v) transient_scroller = 0 if ismacos: from calibre_extensions.cocoa import transient_scroller diff --git a/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp b/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp index 5bbf02793d..4f427d5721 100644 --- a/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp +++ b/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp @@ -158,6 +158,8 @@ int CalibreStyle::styleHint(StyleHint hint, const QStyleOption *option, const QW QIcon CalibreStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption * option, const QWidget * widget) const { if (icon_map.contains(standardIcon)) { + QString q = icon_map.value(standardIcon); + if (q.contains('.')) return QIcon(q); QIcon ans = QIcon::fromTheme(icon_map.value(standardIcon)); if (ans.isNull() && QIcon::themeName().contains("user-any")) { const bool is_dark_theme = QApplication::instance()->property("is_dark_theme").toBool(); diff --git a/src/calibre/utils/resources.py b/src/calibre/utils/resources.py index 40737e3b83..d00343acc6 100644 --- a/src/calibre/utils/resources.py +++ b/src/calibre/utils/resources.py @@ -101,5 +101,9 @@ def set_data(path, data=None): return _resolver.set_data(path, data) +def get_user_path(): + return _resolver.user_path + + builtins.__dict__['P'] = get_path builtins.__dict__['I'] = get_image_path