From a3110d98147295dcb1f9353f9aaf5461cba9232a Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Fri, 30 Aug 2024 10:42:13 +0200 Subject: [PATCH] fix(dark mode button): fixed dark mode button state for external updates, including auto --- bec_widgets/utils/colors.py | 13 +++++++++- .../dark_mode_button/dark_mode_button.py | 26 +++++++++++++++---- tests/unit_tests/test_dark_mode_button.py | 2 ++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/bec_widgets/utils/colors.py b/bec_widgets/utils/colors.py index 860c0fb3..46798750 100644 --- a/bec_widgets/utils/colors.py +++ b/bec_widgets/utils/colors.py @@ -8,7 +8,7 @@ import pyqtgraph as pg from bec_qthemes._os_appearance.listener import OSThemeSwitchListener from pydantic_core import PydanticCustomError from qtpy.QtGui import QColor -from qtpy.QtWidgets import QApplication +from qtpy.QtWidgets import QApplication, QPushButton, QToolButton def get_theme_palette(): @@ -56,6 +56,17 @@ def apply_theme(theme: Literal["dark", "light"]): for pg_widget in children: pg_widget.setBackground("k" if theme == "dark" else "w") + dark_mode_buttons = [ + button + for button in app.topLevelWidgets() + if hasattr(button, "dark_mode_enabled") + and hasattr(button, "mode_button") + and isinstance(button.mode_button, (QPushButton, QToolButton)) + ] + + for button in dark_mode_buttons: + button.dark_mode_enabled = theme == "dark" + button.update_mode_button() # now define stylesheet according to theme and apply it style = bec_qthemes.load_stylesheet(theme) app.setStyleSheet(style) diff --git a/bec_widgets/widgets/dark_mode_button/dark_mode_button.py b/bec_widgets/widgets/dark_mode_button/dark_mode_button.py index 1adb5ee0..ca9cead6 100644 --- a/bec_widgets/widgets/dark_mode_button/dark_mode_button.py +++ b/bec_widgets/widgets/dark_mode_button/dark_mode_button.py @@ -1,6 +1,6 @@ from bec_qthemes import material_icon from qtpy.QtCore import Property, Qt, Slot -from qtpy.QtWidgets import QHBoxLayout, QPushButton, QToolButton, QWidget +from qtpy.QtWidgets import QApplication, QHBoxLayout, QPushButton, QToolButton, QWidget from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.colors import set_theme @@ -27,17 +27,31 @@ class DarkModeButton(BECWidget, QWidget): self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setAlignment(Qt.AlignmentFlag.AlignVCenter) - icon = material_icon("dark_mode", size=(20, 20), convert_to_pixmap=False) if toolbar: - self.mode_button = QToolButton(icon=icon) + self.mode_button = QToolButton() else: - self.mode_button = QPushButton(icon=icon) + self.mode_button = QPushButton() + + self.dark_mode_enabled = self._get_qapp_dark_mode_state() self.update_mode_button() self.mode_button.clicked.connect(self.toggle_dark_mode) self.layout.addWidget(self.mode_button) self.setLayout(self.layout) self.setFixedSize(40, 40) + def _get_qapp_dark_mode_state(self) -> bool: + """ + Get the dark mode state from the QApplication. + + Returns: + bool: True if dark mode is enabled, False otherwise. + """ + qapp = QApplication.instance() + if hasattr(qapp, "theme") and qapp.theme["theme"] == "dark": + return True + + return False + @Property(bool) def dark_mode_enabled(self) -> bool: """ @@ -72,8 +86,10 @@ class DarkModeButton(BECWidget, QWidget): if __name__ == "__main__": from qtpy.QtWidgets import QApplication - app = QApplication([]) + from bec_widgets.utils.colors import set_theme + app = QApplication([]) + set_theme("auto") w = DarkModeButton() w.show() diff --git a/tests/unit_tests/test_dark_mode_button.py b/tests/unit_tests/test_dark_mode_button.py index 203aa65e..36f0f1ac 100644 --- a/tests/unit_tests/test_dark_mode_button.py +++ b/tests/unit_tests/test_dark_mode_button.py @@ -3,6 +3,7 @@ from unittest import mock import pytest from qtpy.QtCore import Qt +from bec_widgets.utils.colors import set_theme from bec_widgets.widgets.dark_mode_button.dark_mode_button import DarkModeButton # pylint: disable=unused-import @@ -19,6 +20,7 @@ def dark_mode_button(qtbot, mocked_client): button = DarkModeButton(client=mocked_client) qtbot.addWidget(button) qtbot.waitExposed(button) + set_theme("light") yield button