mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Work on using icon themes
This commit is contained in:
parent
a0e6bbe2bf
commit
d377eedf52
23
resources/icon-themes/calibre-default-dark/index.theme
Normal file
23
resources/icon-themes/calibre-default-dark/index.theme
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[Icon Theme]
|
||||||
|
Name=calibre default light icons
|
||||||
|
Comment=icons for calibre in light mode
|
||||||
|
|
||||||
|
[base]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
||||||
|
|
||||||
|
[base/devices]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
||||||
|
|
||||||
|
[base/plugins]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
||||||
|
|
||||||
|
[base/mimetypes]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
23
resources/icon-themes/calibre-default-light/index.theme
Normal file
23
resources/icon-themes/calibre-default-light/index.theme
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[Icon Theme]
|
||||||
|
Name=calibre default light icons
|
||||||
|
Comment=icons for calibre in light mode
|
||||||
|
|
||||||
|
[base]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
||||||
|
|
||||||
|
[base/devices]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
||||||
|
|
||||||
|
[base/plugins]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
||||||
|
|
||||||
|
[base/mimetypes]
|
||||||
|
Size=128
|
||||||
|
MinSize=16
|
||||||
|
MaxSize=256
|
@ -47,13 +47,37 @@ except AttributeError:
|
|||||||
NO_URL_FORMATTING = getattr(QUrl, 'None')
|
NO_URL_FORMATTING = getattr(QUrl, 'None')
|
||||||
|
|
||||||
|
|
||||||
|
icons_subdirs = ('devices', 'plugins', 'mimetypes')
|
||||||
|
|
||||||
|
|
||||||
|
def set_icon_paths():
|
||||||
|
paths = []
|
||||||
|
for main_dir in (os.path.join(config_dir, 'resources', 'images'), os.path.dirname(I(icons_subdirs[0], allow_user_override=False))):
|
||||||
|
if os.path.exists(main_dir):
|
||||||
|
paths.append(main_dir)
|
||||||
|
for subdir in icons_subdirs:
|
||||||
|
q = os.path.join(main_dir, subdir)
|
||||||
|
if os.path.exists(q):
|
||||||
|
paths.append(q)
|
||||||
|
QIcon.setFallbackSearchPaths(paths + list(QIcon.fallbackSearchPaths()))
|
||||||
|
default_theme_path = P('icon-themes', allow_user_override=False)
|
||||||
|
paths = [default_theme_path]
|
||||||
|
user_theme_path = P('icon-themes')
|
||||||
|
if user_theme_path != default_theme_path:
|
||||||
|
paths.insert(0, user_theme_path)
|
||||||
|
QIcon.setThemeSearchPaths(paths)
|
||||||
|
|
||||||
|
|
||||||
def load_qicon(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 not os.path.isabs(name):
|
if not os.path.isabs(name):
|
||||||
name = I(name)
|
parts = name.split('/')
|
||||||
|
if len(parts) == 2 and parts[0] in icons_subdirs:
|
||||||
|
name = parts[1]
|
||||||
|
return QIcon.fromTheme(os.path.splitext(name)[0])
|
||||||
return QIcon(name)
|
return QIcon(name)
|
||||||
|
|
||||||
|
|
||||||
@ -947,6 +971,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()
|
||||||
sh = self.styleHints()
|
sh = self.styleHints()
|
||||||
if hasattr(sh, 'setShowShortcutsInContextMenus'):
|
if hasattr(sh, 'setShowShortcutsInContextMenus'):
|
||||||
sh.setShowShortcutsInContextMenus(True)
|
sh.setShowShortcutsInContextMenus(True)
|
||||||
@ -1149,15 +1174,19 @@ class Application(QApplication):
|
|||||||
if self.is_dark_theme:
|
if self.is_dark_theme:
|
||||||
ss += 'QMenu { border: 1px solid palette(shadow); }'
|
ss += 'QMenu { border: 1px solid palette(shadow); }'
|
||||||
self.setStyleSheet(ss)
|
self.setStyleSheet(ss)
|
||||||
|
self.update_icon_theme()
|
||||||
self.palette_changed.emit()
|
self.palette_changed.emit()
|
||||||
|
|
||||||
|
def update_icon_theme(self):
|
||||||
|
name = 'calibre-default-' + ('dark' if self.is_dark_theme else 'light')
|
||||||
|
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 }' % (
|
||||||
'#FF2400' if is_error else '#50c878')
|
'#FF2400' if is_error else '#50c878')
|
||||||
|
|
||||||
def load_calibre_style(self):
|
def load_calibre_style(self):
|
||||||
icon_map = self.__icon_map_memory_ = {}
|
icon_map = self.__icon_map_memory_ = {}
|
||||||
pcache = {}
|
|
||||||
for k, v in {
|
for k, v in {
|
||||||
'DialogYesButton': 'ok.png',
|
'DialogYesButton': 'ok.png',
|
||||||
'DialogNoButton': 'window-close.png',
|
'DialogNoButton': 'window-close.png',
|
||||||
@ -1178,16 +1207,11 @@ class Application(QApplication):
|
|||||||
'ToolBarHorizontalExtensionButton': 'v-ellipsis.png',
|
'ToolBarHorizontalExtensionButton': 'v-ellipsis.png',
|
||||||
'ToolBarVerticalExtensionButton': 'h-ellipsis.png',
|
'ToolBarVerticalExtensionButton': 'h-ellipsis.png',
|
||||||
}.items():
|
}.items():
|
||||||
if v not in pcache:
|
icon_map[getattr(QStyle.StandardPixmap, 'SP_'+k).value] = v.rpartition('.')[0]
|
||||||
pcache[v] = I(v)
|
|
||||||
# if not os.path.exists(pcache[v]): raise ValueError(pcache[v])
|
|
||||||
icon_map[getattr(QStyle.StandardPixmap, 'SP_'+k).value] = pcache[v]
|
|
||||||
transient_scroller = 0
|
transient_scroller = 0
|
||||||
if ismacos:
|
if ismacos:
|
||||||
from calibre_extensions.cocoa import transient_scroller
|
from calibre_extensions.cocoa import transient_scroller
|
||||||
transient_scroller = transient_scroller()
|
transient_scroller = transient_scroller()
|
||||||
icon_map[(QStyle.StandardPixmap.SP_CustomBase.value & 0xf0000000) + 1] = I('close-for-light-theme.png')
|
|
||||||
icon_map[(QStyle.StandardPixmap.SP_CustomBase.value & 0xf0000000) + 2] = I('close-for-dark-theme.png')
|
|
||||||
self.calibre_style = style = self.pi.CalibreStyle(transient_scroller)
|
self.calibre_style = style = self.pi.CalibreStyle(transient_scroller)
|
||||||
style.set_icon_map(icon_map)
|
style.set_icon_map(icon_map)
|
||||||
self.setStyle(style)
|
self.setStyle(style)
|
||||||
|
@ -157,11 +157,7 @@ int CalibreStyle::styleHint(StyleHint hint, const QStyleOption *option, const QW
|
|||||||
}
|
}
|
||||||
|
|
||||||
QIcon CalibreStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption * option, const QWidget * widget) const {
|
QIcon CalibreStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption * option, const QWidget * widget) const {
|
||||||
if (standardIcon == QStyle::SP_DialogCloseButton) {
|
if (icon_map.contains(standardIcon)) return QIcon::fromTheme(icon_map.value(standardIcon));
|
||||||
bool is_dark_theme = QApplication::instance()->property("is_dark_theme").toBool();
|
|
||||||
return QIcon(icon_map.value(QStyle::SP_CustomBase + (is_dark_theme ? 2 : 1)));
|
|
||||||
}
|
|
||||||
if (icon_map.contains(standardIcon)) return QIcon(icon_map.value(standardIcon));
|
|
||||||
return QProxyStyle::standardIcon(standardIcon, option, widget);
|
return QProxyStyle::standardIcon(standardIcon, option, widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user