From 695b3923c987f2a28ace88b2f5672108d6d90313 Mon Sep 17 00:00:00 2001 From: Juozas Skarbalius <20264107+terahidro2003@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:45:02 +0200 Subject: [PATCH] fix(ui): system theme fix (#1328) * fix: introduce system theme fix in Mac os * fix: formatting --- src/tagstudio/qt/ts_qt.py | 12 ++++++------ tests/qt/test_theme_system.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 tests/qt/test_theme_system.py diff --git a/src/tagstudio/qt/ts_qt.py b/src/tagstudio/qt/ts_qt.py index ab81b4e2..5a7b2fd6 100644 --- a/src/tagstudio/qt/ts_qt.py +++ b/src/tagstudio/qt/ts_qt.py @@ -306,13 +306,13 @@ class QtDriver(DriverMixin, QObject): sys.argv += ["-platform", "windows:darkmode=2"] self.app = QApplication(sys.argv) self.app.setStyle("Fusion") - if self.settings.theme == Theme.SYSTEM: - # TODO: detect theme instead of always setting dark + + # Apply theme color if explicitly set to DARK or LIGHT by the user. + # For SYSTEM, we let Qt decide based on OS theme. + if self.settings.theme == Theme.DARK: self.app.styleHints().setColorScheme(Qt.ColorScheme.Dark) - else: - self.app.styleHints().setColorScheme( - Qt.ColorScheme.Dark if self.settings.theme == Theme.DARK else Qt.ColorScheme.Light - ) + elif self.settings.theme == Theme.LIGHT: + self.app.styleHints().setColorScheme(Qt.ColorScheme.Light) if ( platform.system() == "Darwin" or platform.system() == "Windows" diff --git a/tests/qt/test_theme_system.py b/tests/qt/test_theme_system.py new file mode 100644 index 00000000..94a0bdac --- /dev/null +++ b/tests/qt/test_theme_system.py @@ -0,0 +1,35 @@ +# Copyright (C) 2025 +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +"""Test theme handling in QtDriver, particularly the SYSTEM theme fix (issue #999).""" + +from unittest.mock import Mock + +import pytest +from PySide6.QtCore import Qt + +from tagstudio.qt.global_settings import Theme + + +@pytest.mark.parametrize( + "theme,expected_call", + [ + (Theme.DARK, Qt.ColorScheme.Dark), + (Theme.LIGHT, Qt.ColorScheme.Light), + (Theme.SYSTEM, None), # SYSTEM theme should NOT call setColorScheme + ], +) +def test_theme_colorscheme_handling(theme: Theme, expected_call): + mock_style_hints = Mock() + + if theme == Theme.DARK: + mock_style_hints.setColorScheme(Qt.ColorScheme.Dark) + elif theme == Theme.LIGHT: + mock_style_hints.setColorScheme(Qt.ColorScheme.Light) + + if expected_call is None: + # SYSTEM theme should NOT call setColorScheme + mock_style_hints.setColorScheme.assert_not_called() + else: + mock_style_hints.setColorScheme.assert_called_once_with(expected_call)