Fixes for system dark theme

This commit is contained in:
Miguel Jacq 2025-11-12 10:18:36 +11:00
parent 1527937f8b
commit b6e603b2bf
Signed by: mig5
GPG key ID: 59B3F0C24135C6A9
3 changed files with 49 additions and 27 deletions

View file

@ -1,6 +1,7 @@
# 0.2.1.7 # 0.2.1.7
* Fix being able to set bold, italic and strikethrough at the same time. * Fix being able to set bold, italic and strikethrough at the same time.
* Fixes for system dark theme
* Add AppImage * Add AppImage
# 0.2.1.6 # 0.2.1.6

View file

@ -119,7 +119,7 @@ class SettingsDialog(QDialog):
self.save_key_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.save_key_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
# make it look secondary # make it look secondary
pal = self.save_key_label.palette() pal = self.save_key_label.palette()
pal.setColor(self.save_key_label.foregroundRole(), pal.color(QPalette.Mid)) self.save_key_label.setForegroundRole(QPalette.PlaceholderText)
self.save_key_label.setPalette(pal) self.save_key_label.setPalette(pal)
exp_row = QHBoxLayout() exp_row = QHBoxLayout()
@ -165,7 +165,7 @@ class SettingsDialog(QDialog):
self.idle_spin_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.idle_spin_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
# make it look secondary # make it look secondary
spal = self.idle_spin_label.palette() spal = self.idle_spin_label.palette()
spal.setColor(self.idle_spin_label.foregroundRole(), spal.color(QPalette.Mid)) self.idle_spin_label.setForegroundRole(QPalette.PlaceholderText)
self.idle_spin_label.setPalette(spal) self.idle_spin_label.setPalette(spal)
spin_row = QHBoxLayout() spin_row = QHBoxLayout()
@ -195,7 +195,7 @@ class SettingsDialog(QDialog):
self.compact_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.compact_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
# make it look secondary # make it look secondary
cpal = self.compact_label.palette() cpal = self.compact_label.palette()
cpal.setColor(self.compact_label.foregroundRole(), cpal.color(QPalette.Mid)) self.compact_label.setForegroundRole(QPalette.PlaceholderText)
self.compact_label.setPalette(cpal) self.compact_label.setPalette(cpal)
maint_row = QHBoxLayout() maint_row = QHBoxLayout()

View file

@ -35,6 +35,11 @@ class ThemeManager(QObject):
and self.apply(self._cfg.theme) and self.apply(self._cfg.theme)
) )
def _is_system_dark(self) -> bool:
pal = QGuiApplication.palette()
# Heuristic: dark windows/backgrounds mean dark system theme
return pal.color(QPalette.Window).lightness() < 128
def current(self) -> Theme: def current(self) -> Theme:
return self._cfg.theme return self._cfg.theme
@ -43,27 +48,21 @@ class ThemeManager(QObject):
self.apply(theme) self.apply(theme)
def apply(self, theme: Theme): def apply(self, theme: Theme):
# Resolve "system" # Resolve "system" into a concrete theme
resolved = theme
if theme == Theme.SYSTEM: if theme == Theme.SYSTEM:
hints = QGuiApplication.styleHints() resolved = Theme.DARK if self._is_system_dark() else Theme.LIGHT
scheme = getattr(hints, "colorScheme", None)
if callable(scheme):
scheme = hints.colorScheme()
# 0=Light, 1=Dark; fall back to Light
theme = Theme.DARK if scheme == 1 else Theme.LIGHT
# Always use Fusion so palette applies consistently cross-platform if resolved == Theme.DARK:
self._app.setStyle("Fusion")
if theme == Theme.DARK:
pal = self._dark_palette() pal = self._dark_palette()
self._app.setPalette(pal)
self._app.setStyleSheet("")
else: else:
pal = self._light_palette() pal = self._light_palette()
self._app.setPalette(pal)
self._app.setStyleSheet("")
# Always use Fusion so palette applies consistently cross-platform
QApplication.setStyle("Fusion")
self._app.setPalette(pal)
self._current = resolved
self.themeChanged.emit(theme) self.themeChanged.emit(theme)
# ----- Palettes ----- # ----- Palettes -----
@ -75,17 +74,24 @@ class ThemeManager(QObject):
disabled = QColor(127, 127, 127) disabled = QColor(127, 127, 127)
focus = QColor(42, 130, 218) focus = QColor(42, 130, 218)
# Base surfaces
pal.setColor(QPalette.Window, window) pal.setColor(QPalette.Window, window)
pal.setColor(QPalette.WindowText, text)
pal.setColor(QPalette.Base, base) pal.setColor(QPalette.Base, base)
pal.setColor(QPalette.AlternateBase, window) pal.setColor(QPalette.AlternateBase, window)
# Text
pal.setColor(QPalette.WindowText, text)
pal.setColor(QPalette.ToolTipBase, window) pal.setColor(QPalette.ToolTipBase, window)
pal.setColor(QPalette.ToolTipText, text) pal.setColor(QPalette.ToolTipText, text)
pal.setColor(QPalette.Text, text) pal.setColor(QPalette.Text, text)
pal.setColor(QPalette.PlaceholderText, disabled) pal.setColor(QPalette.PlaceholderText, disabled)
pal.setColor(QPalette.Button, window)
pal.setColor(QPalette.ButtonText, text) pal.setColor(QPalette.ButtonText, text)
# Buttons/frames
pal.setColor(QPalette.Button, window)
pal.setColor(QPalette.BrightText, QColor(255, 84, 84)) pal.setColor(QPalette.BrightText, QColor(255, 84, 84))
# Links / selection
pal.setColor(QPalette.Highlight, focus) pal.setColor(QPalette.Highlight, focus)
pal.setColor(QPalette.HighlightedText, QColor(0, 0, 0)) pal.setColor(QPalette.HighlightedText, QColor(0, 0, 0))
pal.setColor(QPalette.Link, QColor(Theme.ORANGE_ANCHOR.value)) pal.setColor(QPalette.Link, QColor(Theme.ORANGE_ANCHOR.value))
@ -94,11 +100,26 @@ class ThemeManager(QObject):
return pal return pal
def _light_palette(self) -> QPalette: def _light_palette(self) -> QPalette:
# Let Qt provide its default light palette, but nudge a couple roles pal = QPalette()
pal = self._app.style().standardPalette()
pal.setColor(QPalette.Highlight, QColor(0, 120, 215)) # Base surfaces
pal.setColor(QPalette.HighlightedText, QColor(255, 255, 255)) pal.setColor(QPalette.Window, QColor("#ffffff"))
pal.setColor( pal.setColor(QPalette.Base, QColor("#ffffff"))
QPalette.Link, QColor("#1a73e8") pal.setColor(QPalette.AlternateBase, QColor("#f5f5f5"))
) # Light blue for links in light mode
# Text
pal.setColor(QPalette.WindowText, QColor("#000000"))
pal.setColor(QPalette.Text, QColor("#000000"))
pal.setColor(QPalette.ButtonText, QColor("#000000"))
# Buttons/frames
pal.setColor(QPalette.Button, QColor("#f0f0f0"))
pal.setColor(QPalette.Mid, QColor("#9e9e9e"))
# Links / selection
pal.setColor(QPalette.Highlight, QColor("#1a73e8"))
pal.setColor(QPalette.HighlightedText, QColor("#ffffff"))
pal.setColor(QPalette.Link, QColor("#1a73e8"))
pal.setColor(QPalette.LinkVisited, QColor("#6b4ca5"))
return pal return pal