mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
When using a fixed color palette and the system colors are of different type enforce the color palette
This commit is contained in:
parent
9d7424163f
commit
2584edd461
@ -7,7 +7,7 @@ from contextlib import contextmanager
|
|||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from qt.core import (
|
from qt.core import (
|
||||||
QAbstractNativeEventFilter, QApplication, QColor, QIcon, QPalette, QSettings,
|
QAbstractNativeEventFilter, QApplication, QColor, QIcon, QPalette, QSettings,
|
||||||
QStyle, Qt, QTimer, pyqtSlot, QObject
|
QStyle, Qt, QTimer, pyqtSlot, QObject, QDataStream, QByteArray, QIODeviceBase
|
||||||
)
|
)
|
||||||
|
|
||||||
from calibre.constants import DEBUG, dark_link_color, ismacos, iswindows
|
from calibre.constants import DEBUG, dark_link_color, ismacos, iswindows
|
||||||
@ -15,6 +15,9 @@ from calibre.constants import DEBUG, dark_link_color, ismacos, iswindows
|
|||||||
dark_link_color = QColor(dark_link_color)
|
dark_link_color = QColor(dark_link_color)
|
||||||
dark_color = QColor(45,45,45)
|
dark_color = QColor(45,45,45)
|
||||||
dark_text_color = QColor('#ddd')
|
dark_text_color = QColor('#ddd')
|
||||||
|
light_color = QColor(0xef, 0xef, 0xef)
|
||||||
|
light_text_color = QColor(0,0,0)
|
||||||
|
light_link_color = QColor(0, 0, 255)
|
||||||
|
|
||||||
|
|
||||||
if iswindows:
|
if iswindows:
|
||||||
@ -61,10 +64,39 @@ def linux_is_system_dark_mode_enabled():
|
|||||||
|
|
||||||
|
|
||||||
def palette_is_dark(self):
|
def palette_is_dark(self):
|
||||||
return self.color(QPalette.ColorRole.Window).lightnessF() < self.color(QPalette.ColorRole.WindowText).lightnessF()
|
col = self.color(QPalette.ColorRole.Window)
|
||||||
|
return max(col.getRgb()[:3]) < 115
|
||||||
|
|
||||||
|
|
||||||
|
def serialize_palette(self):
|
||||||
|
ba = QByteArray()
|
||||||
|
ds = QDataStream(ba, QIODeviceBase.OpenModeFlag.WriteOnly)
|
||||||
|
ds << self
|
||||||
|
return bytes(ba)
|
||||||
|
|
||||||
|
|
||||||
|
def unserialize_palette(self, data: bytes):
|
||||||
|
QDataStream(QByteArray(data)) >> self
|
||||||
|
|
||||||
|
|
||||||
|
def serialize_palette_as_python(self):
|
||||||
|
lines = []
|
||||||
|
for group in QPalette.ColorGroup:
|
||||||
|
if group in (QPalette.ColorGroup.All, QPalette.ColorGroup.NColorGroups):
|
||||||
|
continue
|
||||||
|
for role in QPalette.ColorRole:
|
||||||
|
if role == QPalette.ColorRole.NColorRoles:
|
||||||
|
continue
|
||||||
|
c = self.color(group, role)
|
||||||
|
lines.append(
|
||||||
|
f'self.setColor(QPalette.ColorGroup.{group.name}, QPalette.ColorRole.{role.name}, QColor({c.red()}, {c.green()}, {c.blue()}, {c.alpha()}))')
|
||||||
|
return '\n'.join(lines)
|
||||||
|
|
||||||
|
|
||||||
QPalette.is_dark_theme = palette_is_dark
|
QPalette.is_dark_theme = palette_is_dark
|
||||||
|
QPalette.serialize_as_bytes = serialize_palette
|
||||||
|
QPalette.serialize_as_python = serialize_palette_as_python
|
||||||
|
QPalette.unserialize_from_bytes = unserialize_palette
|
||||||
|
|
||||||
|
|
||||||
def fix_palette_colors(p):
|
def fix_palette_colors(p):
|
||||||
@ -103,6 +135,96 @@ def dark_palette():
|
|||||||
return p
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def light_palette():
|
||||||
|
# generated by serializing the light palette on my Linux system
|
||||||
|
self = QPalette()
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.WindowText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Button, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Light, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Midlight, QColor(202, 202, 202, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Dark, QColor(159, 159, 159, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Mid, QColor(184, 184, 184, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Text, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.BrightText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.ButtonText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Base, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Window, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Shadow, QColor(118, 118, 118, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Highlight, QColor(48, 140, 198, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.HighlightedText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.Link, QColor(0, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.LinkVisited, QColor(255, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.AlternateBase, QColor(247, 247, 247, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.ToolTipBase, QColor(255, 255, 220, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.ToolTipText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.PlaceholderText, QColor(0, 0, 0, 128))
|
||||||
|
self.setColor(QPalette.ColorGroup.Active, QPalette.ColorRole.NoRole, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText, QColor(190, 190, 190, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Button, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Light, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Midlight, QColor(202, 202, 202, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Dark, QColor(190, 190, 190, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Mid, QColor(184, 184, 184, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Text, QColor(190, 190, 190, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.BrightText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.ButtonText, QColor(190, 190, 190, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Base, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Window, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Shadow, QColor(177, 177, 177, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Highlight, QColor(145, 145, 145, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.HighlightedText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Link, QColor(0, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.LinkVisited, QColor(255, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.AlternateBase, QColor(247, 247, 247, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.ToolTipBase, QColor(255, 255, 220, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.ToolTipText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.PlaceholderText, QColor(0, 0, 0, 128))
|
||||||
|
self.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.NoRole, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.WindowText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Button, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Light, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Midlight, QColor(202, 202, 202, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Dark, QColor(159, 159, 159, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Mid, QColor(184, 184, 184, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Text, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.BrightText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.ButtonText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Base, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Window, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Shadow, QColor(118, 118, 118, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Highlight, QColor(48, 140, 198, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.HighlightedText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.Link, QColor(0, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.LinkVisited, QColor(255, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.AlternateBase, QColor(247, 247, 247, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.ToolTipBase, QColor(255, 255, 220, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.ToolTipText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.PlaceholderText, QColor(0, 0, 0, 128))
|
||||||
|
self.setColor(QPalette.ColorGroup.Inactive, QPalette.ColorRole.NoRole, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.WindowText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Button, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Light, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Midlight, QColor(202, 202, 202, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Dark, QColor(159, 159, 159, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Mid, QColor(184, 184, 184, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Text, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.BrightText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.ButtonText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Base, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Window, QColor(239, 239, 239, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Shadow, QColor(118, 118, 118, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Highlight, QColor(48, 140, 198, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.HighlightedText, QColor(255, 255, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.Link, QColor(0, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.LinkVisited, QColor(255, 0, 255, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.AlternateBase, QColor(247, 247, 247, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.ToolTipBase, QColor(255, 255, 220, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.ToolTipText, QColor(0, 0, 0, 255))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.PlaceholderText, QColor(0, 0, 0, 128))
|
||||||
|
self.setColor(QPalette.ColorGroup.Current, QPalette.ColorRole.NoRole, QColor(0, 0, 0, 255))
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
class PaletteManager(QObject):
|
class PaletteManager(QObject):
|
||||||
|
|
||||||
color_palette: str
|
color_palette: str
|
||||||
@ -167,6 +289,11 @@ class PaletteManager(QObject):
|
|||||||
self.set_dark_mode_palette()
|
self.set_dark_mode_palette()
|
||||||
elif self.original_palette_modified:
|
elif self.original_palette_modified:
|
||||||
self.set_palette(self.original_palette)
|
self.set_palette(self.original_palette)
|
||||||
|
if self.has_fixed_palette and (self.color_palette == 'dark') != QApplication.instance().palette().is_dark_theme():
|
||||||
|
if self.color_palette == 'dark':
|
||||||
|
self.set_dark_mode_palette()
|
||||||
|
else:
|
||||||
|
self.set_light_mode_palette()
|
||||||
|
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
print('Using calibre Qt style:', self.using_calibre_style, file=sys.stderr)
|
print('Using calibre Qt style:', self.using_calibre_style, file=sys.stderr)
|
||||||
@ -247,6 +374,9 @@ class PaletteManager(QObject):
|
|||||||
def set_dark_mode_palette(self):
|
def set_dark_mode_palette(self):
|
||||||
self.set_palette(dark_palette())
|
self.set_palette(dark_palette())
|
||||||
|
|
||||||
|
def set_light_mode_palette(self):
|
||||||
|
self.set_palette(light_palette())
|
||||||
|
|
||||||
if not iswindows and not ismacos:
|
if not iswindows and not ismacos:
|
||||||
@pyqtSlot(str, str, QDBusVariant)
|
@pyqtSlot(str, str, QDBusVariant)
|
||||||
def linux_desktop_setting_changed(self, namespace, key, val):
|
def linux_desktop_setting_changed(self, namespace, key, val):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user