Move icon management into its own class

This commit is contained in:
Kovid Goyal 2022-01-11 12:39:52 +05:30
parent 2288a26612
commit eb0f405d9a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -8,7 +8,7 @@ import os
import signal import signal
import sys import sys
import threading import threading
from contextlib import contextmanager from contextlib import contextmanager, suppress
from functools import lru_cache from functools import lru_cache
from qt.core import ( from qt.core import (
QT_VERSION, QApplication, QBuffer, QByteArray, QColor, QDateTime, QT_VERSION, QApplication, QBuffer, QByteArray, QColor, QDateTime,
@ -49,32 +49,34 @@ except AttributeError:
NO_URL_FORMATTING = getattr(QUrl, 'None') NO_URL_FORMATTING = getattr(QUrl, 'None')
override_icon_path = None class IconResourceManager:
def __init__(self):
self.override_icon_path = None
self.initialized = False
def set_icon_paths(): def initialize(self):
global override_icon_path if self.initialized:
q = os.path.join(user_dir, 'images') return
override_icon_path = None self.initialized = True
try:
if os.listdir(q):
override_icon_path = q
except Exception:
pass
QResource.registerResource(P('icons.rcc', allow_user_override=False)) QResource.registerResource(P('icons.rcc', allow_user_override=False))
QIcon.setFallbackSearchPaths([]) QIcon.setFallbackSearchPaths([])
QIcon.setThemeSearchPaths([':/icons']) QIcon.setThemeSearchPaths([':/icons'])
self.override_icon_path = None
q = os.path.join(user_dir, 'images')
with suppress(Exception):
if os.listdir(q):
self.override_icon_path = q
def __call__(self, name):
def load_qicon(name):
if isinstance(name, QIcon): if isinstance(name, QIcon):
return name return name
if not name: if not name:
return QIcon() return QIcon()
if os.path.isabs(name): if os.path.isabs(name):
return QIcon(name) return QIcon(name)
if override_icon_path: if self.override_icon_path:
q = os.path.join(override_icon_path, name) q = os.path.join(self.override_icon_path, name)
if os.path.exists(q): if os.path.exists(q):
return QIcon(q) return QIcon(q)
parts = name.split('/') parts = name.split('/')
@ -82,8 +84,13 @@ def load_qicon(name):
name = parts[1] name = parts[1]
return QIcon.fromTheme(os.path.splitext(name)[0]) return QIcon.fromTheme(os.path.splitext(name)[0])
def set_theme(self, is_dark_theme):
name = 'calibre-default-' + ('dark' if is_dark_theme else 'light')
QIcon.setThemeName(name)
QIcon.ic = load_qicon
icon_resource_manager = IconResourceManager()
QIcon.ic = icon_resource_manager
# Setup gprefs {{{ # Setup gprefs {{{
@ -973,7 +980,7 @@ class Application(QApplication):
QApplication.setDesktopFileName(override_program_name) QApplication.setDesktopFileName(override_program_name)
QApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True) # needed for webengine QApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True) # needed for webengine
QApplication.__init__(self, qargs) QApplication.__init__(self, qargs)
set_icon_paths() icon_resource_manager.initialize()
sh = self.styleHints() sh = self.styleHints()
if hasattr(sh, 'setShowShortcutsInContextMenus'): if hasattr(sh, 'setShowShortcutsInContextMenus'):
sh.setShowShortcutsInContextMenus(True) sh.setShowShortcutsInContextMenus(True)
@ -1180,8 +1187,7 @@ class Application(QApplication):
self.palette_changed.emit() self.palette_changed.emit()
def update_icon_theme(self): def update_icon_theme(self):
name = 'calibre-default-' + ('dark' if self.is_dark_theme else 'light') icon_resource_manager.set_theme(self.is_dark_theme)
QIcon.setThemeName(name)
def stylesheet_for_line_edit(self, is_error=False): def stylesheet_for_line_edit(self, is_error=False):
return 'QLineEdit { border: 2px solid %s; border-radius: 3px }' % ( return 'QLineEdit { border: 2px solid %s; border-radius: 3px }' % (