From 03015a72a6d34380c6f33ffbdbd7b8bba483156c Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Tue, 19 Aug 2025 10:50:56 +0200 Subject: [PATCH] fix(bec_widgets): adapt to bec_qthemes 1.0; themes can be only applied on living Qt objects --- bec_widgets/cli/server.py | 7 + .../jupyter_console/jupyter_console_window.py | 2 + bec_widgets/utils/bec_widget.py | 19 +-- bec_widgets/utils/colors.py | 121 +++--------------- bec_widgets/utils/compact_popup.py | 6 +- bec_widgets/utils/round_frame.py | 65 +++------- bec_widgets/utils/toolbars/actions.py | 2 + bec_widgets/utils/toolbars/toolbar.py | 4 +- .../advanced_dock_area/advanced_dock_area.py | 2 + .../widgets/containers/dock/dock_area.py | 4 +- .../containers/main_window/main_window.py | 15 ++- .../buttons/button_abort/button_abort.py | 3 - .../buttons/stop_button/stop_button.py | 4 +- .../positioner_box/positioner_box.py | 4 +- .../positioner_box_2d/positioner_box_2d.py | 4 +- .../device_combobox/device_combobox.py | 26 +--- .../device_line_edit/device_line_edit.py | 4 +- .../signal_combobox/signal_combobox.py | 4 +- .../signal_line_edit/signal_line_edit.py | 4 +- .../control/scan_control/scan_control.py | 13 +- .../dap/dap_combo_box/dap_combo_box.py | 4 +- .../widgets/editors/dict_backed_table.py | 4 +- .../editors/scan_metadata/scan_metadata.py | 4 +- bec_widgets/widgets/games/minesweeper.py | 4 +- .../widgets/plots/motor_map/motor_map.py | 4 +- bec_widgets/widgets/plots/plot_base.py | 4 +- .../scatter_waveform/scatter_waveform.py | 5 +- .../settings/curve_settings/curve_tree.py | 14 +- .../widgets/plots/waveform/waveform.py | 4 +- .../widgets/services/bec_queue/bec_queue.py | 11 +- .../services/bec_status_box/bec_status_box.py | 4 +- .../services/device_browser/device_browser.py | 4 +- .../device_item/device_config_dialog.py | 4 +- .../device_item/device_signal_display.py | 4 +- .../widgets/utility/logpanel/logpanel.py | 4 +- .../widgets/utility/spinner/spinner.py | 8 +- .../dark_mode_button/dark_mode_button.py | 6 +- .../SpinnerWidget/SpinnerWidget_darwin.png | Bin 9490 -> 10025 bytes .../SpinnerWidget/SpinnerWidget_linux.png | Bin 9490 -> 10387 bytes .../SpinnerWidget_started_darwin.png | Bin 14773 -> 14819 bytes tests/unit_tests/conftest.py | 7 + tests/unit_tests/test_abort_button.py | 4 - tests/unit_tests/test_color_utils.py | 13 ++ tests/unit_tests/test_round_frame.py | 12 -- 44 files changed, 164 insertions(+), 277 deletions(-) diff --git a/bec_widgets/cli/server.py b/bec_widgets/cli/server.py index ea45c61e..d27a74f7 100644 --- a/bec_widgets/cli/server.py +++ b/bec_widgets/cli/server.py @@ -7,8 +7,10 @@ import signal import sys from contextlib import redirect_stderr, redirect_stdout +import darkdetect from bec_lib.logger import bec_logger from bec_lib.service_config import ServiceConfig +from bec_qthemes import apply_theme from qtmonaco.pylsp_provider import pylsp_server from qtpy.QtCore import QSize, Qt from qtpy.QtGui import QIcon @@ -92,6 +94,11 @@ class GUIServer: Run the GUI server. """ self.app = QApplication(sys.argv) + if darkdetect.isDark(): + apply_theme("dark") + else: + apply_theme("light") + self.app.setApplicationName("BEC") self.app.gui_id = self.gui_id # type: ignore self.setup_bec_icon() diff --git a/bec_widgets/examples/jupyter_console/jupyter_console_window.py b/bec_widgets/examples/jupyter_console/jupyter_console_window.py index 88a7dc44..b5e92563 100644 --- a/bec_widgets/examples/jupyter_console/jupyter_console_window.py +++ b/bec_widgets/examples/jupyter_console/jupyter_console_window.py @@ -15,6 +15,7 @@ from qtpy.QtWidgets import ( ) from bec_widgets.utils import BECDispatcher +from bec_widgets.utils.colors import apply_theme from bec_widgets.utils.widget_io import WidgetHierarchy as wh from bec_widgets.widgets.containers.advanced_dock_area.advanced_dock_area import AdvancedDockArea from bec_widgets.widgets.containers.dock import BECDockArea @@ -168,6 +169,7 @@ if __name__ == "__main__": # pragma: no cover module_path = os.path.dirname(bec_widgets.__file__) app = QApplication(sys.argv) + apply_theme("dark") app.setApplicationName("Jupyter Console") app.setApplicationDisplayName("Jupyter Console") icon = material_icon("terminal", color=(255, 255, 255, 255), filled=True) diff --git a/bec_widgets/utils/bec_widget.py b/bec_widgets/utils/bec_widget.py index dccd82ff..67a4c5e9 100644 --- a/bec_widgets/utils/bec_widget.py +++ b/bec_widgets/utils/bec_widget.py @@ -3,7 +3,6 @@ from __future__ import annotations from datetime import datetime from typing import TYPE_CHECKING -import darkdetect import PySide6QtAds as QtAds import shiboken6 from bec_lib.logger import bec_logger @@ -12,7 +11,6 @@ from qtpy.QtWidgets import QApplication, QFileDialog, QWidget from bec_widgets.cli.rpc.rpc_register import RPCRegister from bec_widgets.utils.bec_connector import BECConnector, ConnectionConfig -from bec_widgets.utils.colors import set_theme from bec_widgets.utils.error_popups import SafeSlot from bec_widgets.utils.rpc_decorator import rpc_timeout from bec_widgets.utils.widget_io import WidgetHierarchy @@ -47,8 +45,7 @@ class BECWidget(BECConnector): >>> class MyWidget(BECWidget, QWidget): >>> def __init__(self, parent=None, client=None, config=None, gui_id=None): - >>> super().__init__(client=client, config=config, gui_id=gui_id) - >>> QWidget.__init__(self, parent=parent) + >>> super().__init__(parent=parent, client=client, config=config, gui_id=gui_id) Args: @@ -64,14 +61,6 @@ class BECWidget(BECConnector): ) if not isinstance(self, QObject): raise RuntimeError(f"{repr(self)} is not a subclass of QWidget") - app = QApplication.instance() - if not hasattr(app, "theme"): - # DO NOT SET THE THEME TO AUTO! Otherwise, the qwebengineview will segfault - # Instead, we will set the theme to the system setting on startup - if darkdetect.isDark(): - set_theme("dark") - else: - set_theme("light") if theme_update: logger.debug(f"Subscribing to theme updates for {self.__class__.__name__}") @@ -80,9 +69,11 @@ class BECWidget(BECConnector): def _connect_to_theme_change(self): """Connect to the theme change signal.""" qapp = QApplication.instance() - if hasattr(qapp, "theme_signal"): - qapp.theme_signal.theme_updated.connect(self._update_theme) + if hasattr(qapp, "theme"): + qapp.theme.theme_changed.connect(self._update_theme) + @SafeSlot(str, verify_sender=True) + @SafeSlot(verify_sender=True) def _update_theme(self, theme: str | None = None): """Update the theme.""" if theme is None: diff --git a/bec_widgets/utils/colors.py b/bec_widgets/utils/colors.py index 9aa40c3b..236cd157 100644 --- a/bec_widgets/utils/colors.py +++ b/bec_widgets/utils/colors.py @@ -1,19 +1,17 @@ from __future__ import annotations import re -from typing import TYPE_CHECKING, Literal +from typing import Literal -import bec_qthemes import numpy as np import pyqtgraph as pg -from bec_qthemes._os_appearance.listener import OSThemeSwitchListener +from bec_qthemes import apply_theme as apply_theme_global +from bec_qthemes._theme import AccentColors from pydantic_core import PydanticCustomError +from qtpy.QtCore import QEvent, QEventLoop from qtpy.QtGui import QColor from qtpy.QtWidgets import QApplication -if TYPE_CHECKING: # pragma: no cover - from bec_qthemes._main import AccentColors - def get_theme_name(): if QApplication.instance() is None or not hasattr(QApplication.instance(), "theme"): @@ -23,118 +21,35 @@ def get_theme_name(): def get_theme_palette(): - return bec_qthemes.load_palette(get_theme_name()) + # FIXME this is legacy code, should be removed in the future + app = QApplication.instance() + palette = app.palette() + return palette -def get_accent_colors() -> AccentColors | None: +def get_accent_colors() -> AccentColors: """ Get the accent colors for the current theme. These colors are extensions of the color palette and are used to highlight specific elements in the UI. """ if QApplication.instance() is None or not hasattr(QApplication.instance(), "theme"): - return None + accent_colors = AccentColors() + return accent_colors return QApplication.instance().theme.accent_colors -def _theme_update_callback(): - """ - Internal callback function to update the theme based on the system theme. - """ - app = QApplication.instance() - # pylint: disable=protected-access - app.theme.theme = app.os_listener._theme.lower() - app.theme_signal.theme_updated.emit(app.theme.theme) - apply_theme(app.os_listener._theme.lower()) - - -def set_theme(theme: Literal["dark", "light", "auto"]): - """ - Set the theme for the application. - - Args: - theme (Literal["dark", "light", "auto"]): The theme to set. "auto" will automatically switch between dark and light themes based on the system theme. - """ - app = QApplication.instance() - bec_qthemes.setup_theme(theme, install_event_filter=False) - - app.theme_signal.theme_updated.emit(theme) - apply_theme(theme) - - if theme != "auto": - return - - if not hasattr(app, "os_listener") or app.os_listener is None: - app.os_listener = OSThemeSwitchListener(_theme_update_callback) - app.installEventFilter(app.os_listener) +def process_all_deferred_deletes(qapp): + qapp.sendPostedEvents(None, QEvent.DeferredDelete) + qapp.processEvents(QEventLoop.AllEvents) def apply_theme(theme: Literal["dark", "light"]): """ - Apply the theme to all pyqtgraph widgets. Do not use this function directly. Use set_theme instead. + Apply the theme via the global theming API. This updates QSS, QPalette, and pyqtgraph globally. """ - app = QApplication.instance() - graphic_layouts = [ - child - for top in app.topLevelWidgets() - for child in top.findChildren(pg.GraphicsLayoutWidget) - ] - - plot_items = [ - item - for gl in graphic_layouts - for item in gl.ci.items.keys() # ci is internal pg.GraphicsLayout that hosts all items - if isinstance(item, pg.PlotItem) - ] - - histograms = [ - item - for gl in graphic_layouts - for item in gl.ci.items.keys() # ci is internal pg.GraphicsLayout that hosts all items - if isinstance(item, pg.HistogramLUTItem) - ] - - # Update background color based on the theme - if theme == "light": - background_color = "#e9ecef" # Subtle contrast for light mode - foreground_color = "#141414" - label_color = "#000000" - axis_color = "#666666" - else: - background_color = "#141414" # Dark mode - foreground_color = "#e9ecef" - label_color = "#FFFFFF" - axis_color = "#CCCCCC" - - # update GraphicsLayoutWidget - pg.setConfigOptions(foreground=foreground_color, background=background_color) - for pg_widget in graphic_layouts: - pg_widget.setBackground(background_color) - - # update PlotItems - for plot_item in plot_items: - for axis in ["left", "right", "top", "bottom"]: - plot_item.getAxis(axis).setPen(pg.mkPen(color=axis_color)) - plot_item.getAxis(axis).setTextPen(pg.mkPen(color=label_color)) - - # Change title color - plot_item.titleLabel.setText(plot_item.titleLabel.text, color=label_color) - - # Change legend color - if hasattr(plot_item, "legend") and plot_item.legend is not None: - plot_item.legend.setLabelTextColor(label_color) - # if legend is in plot item and theme is changed, has to be like that because of pg opt logic - for sample, label in plot_item.legend.items: - label_text = label.text - label.setText(label_text, color=label_color) - - # update HistogramLUTItem - for histogram in histograms: - histogram.axis.setPen(pg.mkPen(color=axis_color)) - histogram.axis.setTextPen(pg.mkPen(color=label_color)) - - # now define stylesheet according to theme and apply it - style = bec_qthemes.load_stylesheet(theme) - app.setStyleSheet(style) + process_all_deferred_deletes(QApplication.instance()) + apply_theme_global(theme) + process_all_deferred_deletes(QApplication.instance()) class Colors: diff --git a/bec_widgets/utils/compact_popup.py b/bec_widgets/utils/compact_popup.py index cb5203b8..8d4daef2 100644 --- a/bec_widgets/utils/compact_popup.py +++ b/bec_widgets/utils/compact_popup.py @@ -11,6 +11,7 @@ from qtpy.QtWidgets import ( QPushButton, QSizePolicy, QSpacerItem, + QToolButton, QVBoxLayout, QWidget, ) @@ -122,15 +123,14 @@ class CompactPopupWidget(QWidget): self.compact_view_widget = QWidget(self) self.compact_view_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) QHBoxLayout(self.compact_view_widget) - self.compact_view_widget.layout().setSpacing(0) + self.compact_view_widget.layout().setSpacing(5) self.compact_view_widget.layout().setContentsMargins(0, 0, 0, 0) self.compact_view_widget.layout().addSpacerItem( QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Fixed) ) self.compact_label = QLabel(self.compact_view_widget) self.compact_status = LedLabel(self.compact_view_widget) - self.compact_show_popup = QPushButton(self.compact_view_widget) - self.compact_show_popup.setFlat(True) + self.compact_show_popup = QToolButton(self.compact_view_widget) self.compact_show_popup.setIcon( material_icon(icon_name="expand_content", size=(10, 10), convert_to_pixmap=False) ) diff --git a/bec_widgets/utils/round_frame.py b/bec_widgets/utils/round_frame.py index 51ec3497..f8399d1b 100644 --- a/bec_widgets/utils/round_frame.py +++ b/bec_widgets/utils/round_frame.py @@ -1,11 +1,12 @@ import pyqtgraph as pg -from qtpy.QtCore import Property +from qtpy.QtCore import Property, Qt from qtpy.QtWidgets import QApplication, QFrame, QHBoxLayout, QVBoxLayout, QWidget from bec_widgets.widgets.utility.visual.dark_mode_button.dark_mode_button import DarkModeButton class RoundedFrame(QFrame): + # TODO this should be removed completely in favor of QSS styling, no time now """ A custom QFrame with rounded corners and optional theme updates. The frame can contain any QWidget, however it is mainly designed to wrap PlotWidgets to provide a consistent look and feel with other BEC Widgets. @@ -28,6 +29,9 @@ class RoundedFrame(QFrame): self.setProperty("skip_settings", True) self.setObjectName("roundedFrame") + # Ensure QSS can paint background/border on this widget + self.setAttribute(Qt.WA_StyledBackground, True) + # Create a layout for the frame if orientation == "vertical": self.layout = QVBoxLayout(self) @@ -45,22 +49,10 @@ class RoundedFrame(QFrame): # Automatically apply initial styles to the GraphicalLayoutWidget if applicable self.apply_plot_widget_style() + self.update_style() def apply_theme(self, theme: str): - """ - Apply the theme to the frame and its content if theme updates are enabled. - """ - if self.content_widget is not None and isinstance( - self.content_widget, pg.GraphicsLayoutWidget - ): - self.content_widget.setBackground(self.background_color) - - # Update background color based on the theme - if theme == "light": - self.background_color = "#e9ecef" # Subtle contrast for light mode - else: - self.background_color = "#141414" # Dark mode - + """Deprecated: RoundedFrame no longer handles theme; styling is QSS-driven.""" self.update_style() @Property(int) @@ -77,34 +69,21 @@ class RoundedFrame(QFrame): """ Update the style of the frame based on the background color. """ - if self.background_color: - self.setStyleSheet( - f""" + self.setStyleSheet( + f""" QFrame#roundedFrame {{ - background-color: {self.background_color}; - border-radius: {self._radius}; /* Rounded corners */ + border-radius: {self._radius}px; }} """ - ) + ) self.apply_plot_widget_style() def apply_plot_widget_style(self, border: str = "none"): """ - Automatically apply background, border, and axis styles to the PlotWidget. - - Args: - border (str): Border style (e.g., 'none', '1px solid red'). + Let QSS/pyqtgraph handle plot styling; avoid overriding here. """ if isinstance(self.content_widget, pg.GraphicsLayoutWidget): - # Apply border style via stylesheet - self.content_widget.setStyleSheet( - f""" - GraphicsLayoutWidget {{ - border: {border}; /* Explicitly set the border */ - }} - """ - ) - self.content_widget.setBackground(self.background_color) + self.content_widget.setStyleSheet("") class ExampleApp(QWidget): # pragma: no cover @@ -128,24 +107,14 @@ class ExampleApp(QWidget): # pragma: no cover plot_item_2.plot([1, 2, 4, 8, 16, 32], pen="r") plot2.plot_item = plot_item_2 - # Wrap PlotWidgets in RoundedFrame - rounded_plot1 = RoundedFrame(parent=self, content_widget=plot1) - rounded_plot2 = RoundedFrame(parent=self, content_widget=plot2) - - # Add to layout + # Add to layout (no RoundedFrame wrapper; QSS styles plots) layout.addWidget(dark_button) - layout.addWidget(rounded_plot1) - layout.addWidget(rounded_plot2) + layout.addWidget(plot1) + layout.addWidget(plot2) self.setLayout(layout) - from qtpy.QtCore import QTimer - - def change_theme(): - rounded_plot1.apply_theme("light") - rounded_plot2.apply_theme("dark") - - QTimer.singleShot(100, change_theme) + # Theme flip demo removed; global theming applies automatically if __name__ == "__main__": # pragma: no cover diff --git a/bec_widgets/utils/toolbars/actions.py b/bec_widgets/utils/toolbars/actions.py index 4e915cb8..4278877b 100644 --- a/bec_widgets/utils/toolbars/actions.py +++ b/bec_widgets/utils/toolbars/actions.py @@ -446,6 +446,8 @@ class ExpandableMenuAction(ToolBarAction): def add_to_toolbar(self, toolbar: QToolBar, target: QWidget): button = QToolButton(toolbar) + button.setObjectName("toolbarMenuButton") + button.setAutoRaise(True) if self.icon_path: button.setIcon(QIcon(self.icon_path)) button.setText(self.tooltip) diff --git a/bec_widgets/utils/toolbars/toolbar.py b/bec_widgets/utils/toolbars/toolbar.py index 21b3c710..c1b7b7f2 100644 --- a/bec_widgets/utils/toolbars/toolbar.py +++ b/bec_widgets/utils/toolbars/toolbar.py @@ -10,7 +10,7 @@ from qtpy.QtCore import QSize, Qt from qtpy.QtGui import QAction, QColor from qtpy.QtWidgets import QApplication, QLabel, QMainWindow, QMenu, QToolBar, QVBoxLayout, QWidget -from bec_widgets.utils.colors import get_theme_name, set_theme +from bec_widgets.utils.colors import apply_theme, get_theme_name from bec_widgets.utils.toolbars.actions import MaterialIconAction, ToolBarAction from bec_widgets.utils.toolbars.bundles import ToolbarBundle, ToolbarComponents from bec_widgets.utils.toolbars.connections import BundleConnection @@ -507,7 +507,7 @@ if __name__ == "__main__": # pragma: no cover self.test_label.setText("FPS Monitor Disabled") app = QApplication(sys.argv) - set_theme("light") + apply_theme("light") main_window = MainWindow() main_window.show() sys.exit(app.exec_()) diff --git a/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py b/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py index fda1613f..27a05299 100644 --- a/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py +++ b/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py @@ -171,6 +171,7 @@ class AdvancedDockArea(BECWidget, QWidget): # Init Dock Manager self.dock_manager = CDockManager(self) + self.dock_manager.setStyleSheet("") # Dock manager helper variables self._locked = False # Lock state of the workspace @@ -928,4 +929,5 @@ if __name__ == "__main__": window.setCentralWidget(ads) window.show() window.resize(800, 600) + sys.exit(app.exec()) diff --git a/bec_widgets/widgets/containers/dock/dock_area.py b/bec_widgets/widgets/containers/dock/dock_area.py index ca6a698b..50210b24 100644 --- a/bec_widgets/widgets/containers/dock/dock_area.py +++ b/bec_widgets/widgets/containers/dock/dock_area.py @@ -616,10 +616,10 @@ if __name__ == "__main__": # pragma: no cover import sys - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication([]) - set_theme("auto") + apply_theme("dark") dock_area = BECDockArea() dock_1 = dock_area.new(name="dock_0", widget="DarkModeButton") dock_1.new(widget="DarkModeButton") diff --git a/bec_widgets/widgets/containers/main_window/main_window.py b/bec_widgets/widgets/containers/main_window/main_window.py index 054e0bc9..cead68c1 100644 --- a/bec_widgets/widgets/containers/main_window/main_window.py +++ b/bec_widgets/widgets/containers/main_window/main_window.py @@ -19,7 +19,7 @@ from qtpy.QtWidgets import ( import bec_widgets from bec_widgets.utils import UILoader from bec_widgets.utils.bec_widget import BECWidget -from bec_widgets.utils.colors import apply_theme, set_theme +from bec_widgets.utils.colors import apply_theme from bec_widgets.utils.error_popups import SafeSlot from bec_widgets.utils.widget_io import WidgetHierarchy from bec_widgets.widgets.containers.main_window.addons.hover_widget import HoverWidget @@ -320,11 +320,12 @@ class BECMainWindow(BECWidget, QMainWindow): dark_theme_action.triggered.connect(lambda: self.change_theme("dark")) # Set the default theme - theme = self.app.theme.theme - if theme == "light": - light_theme_action.setChecked(True) - elif theme == "dark": - dark_theme_action.setChecked(True) + if hasattr(self.app, "theme") and self.app.theme: + theme_name = self.app.theme.theme.lower() + if "light" in theme_name: + light_theme_action.setChecked(True) + elif "dark" in theme_name: + dark_theme_action.setChecked(True) ######################################## # Help menu @@ -394,7 +395,7 @@ class BECMainWindow(BECWidget, QMainWindow): Args: theme(str): Either "light" or "dark". """ - set_theme(theme) # emits theme_updated and applies palette globally + apply_theme(theme) # emits theme_updated and applies palette globally def event(self, event): if event.type() == QEvent.Type.StatusTip: diff --git a/bec_widgets/widgets/control/buttons/button_abort/button_abort.py b/bec_widgets/widgets/control/buttons/button_abort/button_abort.py index c14bb062..7adc8d4c 100644 --- a/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +++ b/bec_widgets/widgets/control/buttons/button_abort/button_abort.py @@ -38,9 +38,6 @@ class AbortButton(BECWidget, QWidget): else: self.button = QPushButton() self.button.setText("Abort") - self.button.setStyleSheet( - "background-color: #666666; color: white; font-weight: bold; font-size: 12px;" - ) self.button.clicked.connect(self.abort_scan) self.layout.addWidget(self.button) diff --git a/bec_widgets/widgets/control/buttons/stop_button/stop_button.py b/bec_widgets/widgets/control/buttons/stop_button/stop_button.py index 7d0456ec..fdedf4f1 100644 --- a/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +++ b/bec_widgets/widgets/control/buttons/stop_button/stop_button.py @@ -31,9 +31,7 @@ class StopButton(BECWidget, QWidget): self.button = QPushButton() self.button.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) self.button.setText("Stop") - self.button.setStyleSheet( - f"background-color: #cc181e; color: white; font-weight: bold; font-size: 12px;" - ) + self.button.setProperty("variant", "danger") self.button.clicked.connect(self.stop_scan) self.layout.addWidget(self.button) diff --git a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py index 4a686d8c..a573623e 100644 --- a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +++ b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py @@ -12,7 +12,7 @@ from qtpy.QtGui import QDoubleValidator from qtpy.QtWidgets import QDoubleSpinBox from bec_widgets.utils import UILoader -from bec_widgets.utils.colors import get_accent_colors, set_theme +from bec_widgets.utils.colors import apply_theme, get_accent_colors from bec_widgets.utils.error_popups import SafeProperty, SafeSlot from bec_widgets.widgets.control.device_control.positioner_box._base import PositionerBoxBase from bec_widgets.widgets.control.device_control.positioner_box._base.positioner_box_base import ( @@ -259,7 +259,7 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication # pylint: disable=ungrouped-imports app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") widget = PositionerBox(device="bpm4i") widget.show() diff --git a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py index f0853e5b..298a2f07 100644 --- a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +++ b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py @@ -13,7 +13,7 @@ from qtpy.QtGui import QDoubleValidator from qtpy.QtWidgets import QDoubleSpinBox from bec_widgets.utils import UILoader -from bec_widgets.utils.colors import set_theme +from bec_widgets.utils.colors import apply_theme from bec_widgets.utils.error_popups import SafeProperty, SafeSlot from bec_widgets.widgets.control.device_control.positioner_box._base import PositionerBoxBase from bec_widgets.widgets.control.device_control.positioner_box._base.positioner_box_base import ( @@ -531,7 +531,7 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication # pylint: disable=ungrouped-imports app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") widget = PositionerBox2D() widget.show() diff --git a/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py b/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py index b80227be..f6bca8d4 100644 --- a/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +++ b/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py @@ -147,24 +147,6 @@ class DeviceComboBox(DeviceInputBase, QComboBox): dev_name = self.currentText() return self.get_device_object(dev_name) - def paintEvent(self, event: QPaintEvent) -> None: - """Extend the paint event to set the border color based on the validity of the input. - - Args: - event (PySide6.QtGui.QPaintEvent) : Paint event. - """ - # logger.info(f"Received paint event: {event} in {self.__class__}") - super().paintEvent(event) - - if self._is_valid_input is False and self.isEnabled() is True: - painter = QPainter(self) - pen = QPen() - pen.setWidth(2) - pen.setColor(self._accent_colors.emergency) - painter.setPen(pen) - painter.drawRect(self.rect().adjusted(1, 1, -1, -1)) - painter.end() - @Slot(str) def check_validity(self, input_text: str) -> None: """ @@ -173,10 +155,12 @@ class DeviceComboBox(DeviceInputBase, QComboBox): if self.validate_device(input_text) is True: self._is_valid_input = True self.device_selected.emit(input_text) + self.setStyleSheet("border: 1px solid transparent;") else: self._is_valid_input = False self.device_reset.emit() - self.update() + if self.isEnabled(): + self.setStyleSheet("border: 1px solid red;") def validate_device(self, device: str) -> bool: # type: ignore[override] """ @@ -202,10 +186,10 @@ if __name__ == "__main__": # pragma: no cover # pylint: disable=import-outside-toplevel from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication([]) - set_theme("dark") + apply_theme("dark") widget = QWidget() widget.setFixedSize(200, 200) layout = QVBoxLayout() diff --git a/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py b/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py index 3a0f1925..e9d523fd 100644 --- a/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +++ b/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py @@ -175,13 +175,13 @@ if __name__ == "__main__": # pragma: no cover # pylint: disable=import-outside-toplevel from qtpy.QtWidgets import QVBoxLayout, QWidget - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme from bec_widgets.widgets.control.device_input.signal_combobox.signal_combobox import ( SignalComboBox, ) app = QApplication([]) - set_theme("dark") + apply_theme("dark") widget = QWidget() widget.setFixedSize(200, 200) layout = QVBoxLayout() diff --git a/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py b/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py index 7c0bdadd..134bc836 100644 --- a/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +++ b/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py @@ -179,10 +179,10 @@ if __name__ == "__main__": # pragma: no cover # pylint: disable=import-outside-toplevel from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication([]) - set_theme("dark") + apply_theme("dark") widget = QWidget() widget.setFixedSize(200, 200) layout = QVBoxLayout() diff --git a/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py b/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py index 4c8ecb0d..759706a1 100644 --- a/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py +++ b/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py @@ -147,13 +147,13 @@ if __name__ == "__main__": # pragma: no cover # pylint: disable=import-outside-toplevel from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import ( DeviceComboBox, ) app = QApplication([]) - set_theme("dark") + apply_theme("dark") widget = QWidget() widget.setFixedSize(200, 200) layout = QVBoxLayout() diff --git a/bec_widgets/widgets/control/scan_control/scan_control.py b/bec_widgets/widgets/control/scan_control/scan_control.py index 27bad023..8948e4ef 100644 --- a/bec_widgets/widgets/control/scan_control/scan_control.py +++ b/bec_widgets/widgets/control/scan_control/scan_control.py @@ -20,7 +20,7 @@ from qtpy.QtWidgets import ( from bec_widgets.utils import ConnectionConfig from bec_widgets.utils.bec_widget import BECWidget -from bec_widgets.utils.colors import get_accent_colors +from bec_widgets.utils.colors import apply_theme, get_accent_colors from bec_widgets.utils.error_popups import SafeProperty, SafeSlot from bec_widgets.widgets.control.buttons.stop_button.stop_button import StopButton from bec_widgets.widgets.control.scan_control.scan_group_box import ScanGroupBox @@ -136,13 +136,8 @@ class ScanControl(BECWidget, QWidget): self.scan_control_group.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self.button_layout = QHBoxLayout(self.scan_control_group) self.button_run_scan = QPushButton("Start", self.scan_control_group) - self.button_run_scan.setStyleSheet( - f"background-color: {palette.success.name()}; color: white" - ) + self.button_run_scan.setProperty("variant", "success") self.button_stop_scan = StopButton(parent=self.scan_control_group) - self.button_stop_scan.setStyleSheet( - f"background-color: {palette.emergency.name()}; color: white" - ) self.button_layout.addWidget(self.button_run_scan) self.button_layout.addWidget(self.button_stop_scan) self.layout.addWidget(self.scan_control_group) @@ -547,12 +542,10 @@ class ScanControl(BECWidget, QWidget): # Application example if __name__ == "__main__": # pragma: no cover - from bec_widgets.utils.colors import set_theme - app = QApplication([]) scan_control = ScanControl() - set_theme("auto") + apply_theme("dark") window = scan_control window.show() app.exec() diff --git a/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py b/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py index c9892ba3..5931d672 100644 --- a/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +++ b/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py @@ -175,10 +175,10 @@ if __name__ == "__main__": # pragma: no cover # pylint: disable=import-outside-toplevel from qtpy.QtWidgets import QApplication - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication([]) - set_theme("dark") + apply_theme("dark") widget = QWidget() widget.setFixedSize(200, 200) layout = QVBoxLayout() diff --git a/bec_widgets/widgets/editors/dict_backed_table.py b/bec_widgets/widgets/editors/dict_backed_table.py index 3efe3887..a9fb0644 100644 --- a/bec_widgets/widgets/editors/dict_backed_table.py +++ b/bec_widgets/widgets/editors/dict_backed_table.py @@ -249,10 +249,10 @@ class DictBackedTable(QWidget): if __name__ == "__main__": # pragma: no cover - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication([]) - set_theme("dark") + apply_theme("dark") window = DictBackedTable(None, [["key1", "value1"], ["key2", "value2"], ["key3", "value3"]]) window.show() diff --git a/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py b/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py index 3cee7b06..bd75081d 100644 --- a/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +++ b/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py @@ -96,7 +96,7 @@ if __name__ == "__main__": # pragma: no cover from bec_lib.metadata_schema import BasicScanMetadata - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme class ExampleSchema1(BasicScanMetadata): abc: int = Field(gt=0, lt=2000, description="Heating temperature abc", title="A B C") @@ -140,7 +140,7 @@ if __name__ == "__main__": # pragma: no cover layout.addWidget(selection) layout.addWidget(scan_metadata) - set_theme("dark") + apply_theme("dark") window = w window.show() app.exec() diff --git a/bec_widgets/widgets/games/minesweeper.py b/bec_widgets/widgets/games/minesweeper.py index 607cde57..ad9e496f 100644 --- a/bec_widgets/widgets/games/minesweeper.py +++ b/bec_widgets/widgets/games/minesweeper.py @@ -407,10 +407,10 @@ class Minesweeper(BECWidget, QWidget): if __name__ == "__main__": - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication([]) - set_theme("light") + apply_theme("light") widget = Minesweeper() widget.show() diff --git a/bec_widgets/widgets/plots/motor_map/motor_map.py b/bec_widgets/widgets/plots/motor_map/motor_map.py index 0241ce10..61a4764c 100644 --- a/bec_widgets/widgets/plots/motor_map/motor_map.py +++ b/bec_widgets/widgets/plots/motor_map/motor_map.py @@ -11,7 +11,7 @@ from qtpy.QtGui import QColor from qtpy.QtWidgets import QHBoxLayout, QMainWindow, QWidget from bec_widgets.utils import Colors, ConnectionConfig -from bec_widgets.utils.colors import set_theme +from bec_widgets.utils.colors import apply_theme from bec_widgets.utils.error_popups import SafeProperty, SafeSlot from bec_widgets.utils.settings_dialog import SettingsDialog from bec_widgets.utils.toolbars.toolbar import MaterialIconAction @@ -790,7 +790,7 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") widget = DemoApp() widget.show() widget.resize(1400, 600) diff --git a/bec_widgets/widgets/plots/plot_base.py b/bec_widgets/widgets/plots/plot_base.py index ea8bcf07..823ac6de 100644 --- a/bec_widgets/widgets/plots/plot_base.py +++ b/bec_widgets/widgets/plots/plot_base.py @@ -179,7 +179,7 @@ class PlotBase(BECWidget, QWidget): self._init_ui() self._connect_to_theme_change() - self._update_theme() + self._update_theme(None) def apply_theme(self, theme: str): self.round_plot_widget.apply_theme(theme) @@ -187,6 +187,8 @@ class PlotBase(BECWidget, QWidget): def _init_ui(self): self.layout.addWidget(self.layout_manager) self.round_plot_widget = RoundedFrame(parent=self, content_widget=self.plot_widget) + self.round_plot_widget.setProperty("variant", "plot_background") + self.round_plot_widget.setProperty("frameless", True) self.layout_manager.add_widget(self.round_plot_widget) self.layout_manager.add_widget_relative(self.fps_label, self.round_plot_widget, "top") diff --git a/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py b/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py index 3ed5ea65..28ae9d7f 100644 --- a/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py +++ b/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py @@ -10,7 +10,6 @@ from qtpy.QtCore import QTimer, Signal from qtpy.QtWidgets import QHBoxLayout, QMainWindow, QWidget from bec_widgets.utils import Colors, ConnectionConfig -from bec_widgets.utils.colors import set_theme from bec_widgets.utils.error_popups import SafeProperty, SafeSlot from bec_widgets.utils.settings_dialog import SettingsDialog from bec_widgets.utils.toolbars.toolbar import MaterialIconAction @@ -504,8 +503,10 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication + from bec_widgets.utils.colors import apply_theme + app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") widget = DemoApp() widget.show() widget.resize(1400, 600) diff --git a/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py b/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py index a5951cf3..ac446979 100644 --- a/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py +++ b/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py @@ -6,6 +6,7 @@ from typing import TYPE_CHECKING from bec_lib.logger import bec_logger from bec_qthemes._icon.material_icons import material_icon from qtpy.QtGui import QValidator +from qtpy.QtWidgets import QApplication class ScanIndexValidator(QValidator): @@ -34,6 +35,7 @@ class ScanIndexValidator(QValidator): from qtpy.QtWidgets import ( + QApplication, QComboBox, QHBoxLayout, QHeaderView, @@ -97,6 +99,7 @@ class CurveRow(QTreeWidgetItem): # A top-level device row. super().__init__(tree) + self.app = QApplication.instance() self.tree = tree self.parent_item = parent_item self.curve_tree = tree.parent() # The CurveTree widget @@ -194,7 +197,16 @@ class CurveRow(QTreeWidgetItem): # If device row, add "Add DAP" button if self.source in ("device", "history"): - self.add_dap_button = QPushButton("DAP") + self.add_dap_button = QToolButton() + analysis_icon = material_icon( + "monitoring", + size=(20, 20), + convert_to_pixmap=False, + filled=False, + color=self.app.theme.colors["FG"].toTuple(), + ) + self.add_dap_button.setIcon(analysis_icon) + self.add_dap_button.setToolTip("Add DAP") self.add_dap_button.clicked.connect(lambda: self.add_dap_row()) actions_layout.addWidget(self.add_dap_button) diff --git a/bec_widgets/widgets/plots/waveform/waveform.py b/bec_widgets/widgets/plots/waveform/waveform.py index 3387320b..51223ebd 100644 --- a/bec_widgets/widgets/plots/waveform/waveform.py +++ b/bec_widgets/widgets/plots/waveform/waveform.py @@ -26,7 +26,7 @@ from qtpy.QtWidgets import ( from bec_widgets.utils import ConnectionConfig from bec_widgets.utils.bec_signal_proxy import BECSignalProxy -from bec_widgets.utils.colors import Colors, set_theme +from bec_widgets.utils.colors import Colors, apply_theme from bec_widgets.utils.container_utils import WidgetContainerUtils from bec_widgets.utils.error_popups import SafeProperty, SafeSlot from bec_widgets.utils.settings_dialog import SettingsDialog @@ -2384,7 +2384,7 @@ if __name__ == "__main__": # pragma: no cover import sys app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") widget = DemoApp() widget.show() widget.resize(1400, 600) diff --git a/bec_widgets/widgets/services/bec_queue/bec_queue.py b/bec_widgets/widgets/services/bec_queue/bec_queue.py index 473ed3ef..b2dff0d7 100644 --- a/bec_widgets/widgets/services/bec_queue/bec_queue.py +++ b/bec_widgets/widgets/services/bec_queue/bec_queue.py @@ -252,8 +252,15 @@ class BECQueue(BECWidget, CompactPopupWidget): abort_button.button.setIcon( material_icon("cancel", color="#cc181e", filled=True, convert_to_pixmap=False) ) - abort_button.button.setStyleSheet("background-color: rgba(0,0,0,0) ") - abort_button.button.setFlat(True) + abort_button.setStyleSheet( + """ + QPushButton { + background-color: transparent; + border: none; + } + """ + ) + return abort_button def delete_selected_row(self): diff --git a/bec_widgets/widgets/services/bec_status_box/bec_status_box.py b/bec_widgets/widgets/services/bec_status_box/bec_status_box.py index ca22a2f6..e1b8948d 100644 --- a/bec_widgets/widgets/services/bec_status_box/bec_status_box.py +++ b/bec_widgets/widgets/services/bec_status_box/bec_status_box.py @@ -315,10 +315,10 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") main_window = BECStatusBox() main_window.show() sys.exit(app.exec()) diff --git a/bec_widgets/widgets/services/device_browser/device_browser.py b/bec_widgets/widgets/services/device_browser/device_browser.py index 9b28607c..be9382ea 100644 --- a/bec_widgets/widgets/services/device_browser/device_browser.py +++ b/bec_widgets/widgets/services/device_browser/device_browser.py @@ -242,10 +242,10 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication(sys.argv) - set_theme("light") + apply_theme("light") widget = DeviceBrowser() widget.show() sys.exit(app.exec_()) diff --git a/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py b/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py index 1ffd8fbb..4df088a6 100644 --- a/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py +++ b/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py @@ -262,12 +262,12 @@ def main(): # pragma: no cover from qtpy.QtWidgets import QApplication, QLineEdit, QPushButton, QWidget - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme dialog = None app = QApplication(sys.argv) - set_theme("light") + apply_theme("light") widget = QWidget() widget.setLayout(QVBoxLayout()) diff --git a/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py b/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py index 30e53ad2..392c0a6d 100644 --- a/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py +++ b/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py @@ -110,10 +110,10 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication - from bec_widgets.utils.colors import set_theme + from bec_widgets.utils.colors import apply_theme app = QApplication(sys.argv) - set_theme("light") + apply_theme("light") widget = SignalDisplay(device="samx") widget.show() sys.exit(app.exec_()) diff --git a/bec_widgets/widgets/utility/logpanel/logpanel.py b/bec_widgets/widgets/utility/logpanel/logpanel.py index 76aca47d..ad5dee29 100644 --- a/bec_widgets/widgets/utility/logpanel/logpanel.py +++ b/bec_widgets/widgets/utility/logpanel/logpanel.py @@ -35,7 +35,7 @@ from qtpy.QtWidgets import ( ) from bec_widgets.utils.bec_connector import BECConnector -from bec_widgets.utils.colors import get_theme_palette, set_theme +from bec_widgets.utils.colors import apply_theme, get_theme_palette from bec_widgets.utils.error_popups import SafeSlot from bec_widgets.widgets.editors.text_box.text_box import TextBox from bec_widgets.widgets.services.bec_status_box.bec_status_box import BECServiceStatusMixin @@ -544,7 +544,7 @@ if __name__ == "__main__": # pragma: no cover from qtpy.QtWidgets import QApplication # pylint: disable=ungrouped-imports app = QApplication(sys.argv) - set_theme("dark") + apply_theme("dark") widget = LogPanel() widget.show() diff --git a/bec_widgets/widgets/utility/spinner/spinner.py b/bec_widgets/widgets/utility/spinner/spinner.py index 099804af..ab5dadd1 100644 --- a/bec_widgets/widgets/utility/spinner/spinner.py +++ b/bec_widgets/widgets/utility/spinner/spinner.py @@ -49,7 +49,7 @@ class SpinnerWidget(QWidget): def paintEvent(self, event): painter = QPainter(self) - painter.setRenderHint(QPainter.Antialiasing) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) size = min(self.width(), self.height()) rect = QRect(0, 0, size, size) @@ -63,14 +63,14 @@ class SpinnerWidget(QWidget): rect.adjust(line_width, line_width, -line_width, -line_width) # Background arc - painter.setPen(QPen(background_color, line_width, Qt.SolidLine)) + painter.setPen(QPen(background_color, line_width, Qt.PenStyle.SolidLine)) adjusted_rect = QRect(rect.left(), rect.top(), rect.width(), rect.height()) painter.drawArc(adjusted_rect, 0, 360 * 16) if self._started: # Foreground arc - pen = QPen(color, line_width, Qt.SolidLine) - pen.setCapStyle(Qt.RoundCap) + pen = QPen(color, line_width, Qt.PenStyle.SolidLine) + pen.setCapStyle(Qt.PenCapStyle.RoundCap) painter.setPen(pen) proportion = 1 / 4 angle_span = int(proportion * 360 * 16) diff --git a/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py b/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py index e8f352e8..6fdb1f15 100644 --- a/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +++ b/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py @@ -5,7 +5,7 @@ from qtpy.QtCore import Property, Qt, Slot 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 +from bec_widgets.utils.colors import apply_theme class DarkModeButton(BECWidget, QWidget): @@ -85,7 +85,7 @@ class DarkModeButton(BECWidget, QWidget): """ self.dark_mode_enabled = not self.dark_mode_enabled self.update_mode_button() - set_theme("dark" if self.dark_mode_enabled else "light") + apply_theme("dark" if self.dark_mode_enabled else "light") def update_mode_button(self): icon = material_icon( @@ -100,7 +100,7 @@ class DarkModeButton(BECWidget, QWidget): if __name__ == "__main__": app = QApplication([]) - set_theme("auto") + apply_theme("dark") w = DarkModeButton() w.show() diff --git a/tests/references/SpinnerWidget/SpinnerWidget_darwin.png b/tests/references/SpinnerWidget/SpinnerWidget_darwin.png index 2b75d66a8c62c33426eb1dab52a41e56486d9d5f..54bd8c5e39d495666dbbe18c914e24406b32b221 100644 GIT binary patch literal 10025 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 diff --git a/tests/references/SpinnerWidget/SpinnerWidget_linux.png b/tests/references/SpinnerWidget/SpinnerWidget_linux.png index 2b75d66a8c62c33426eb1dab52a41e56486d9d5f..462241215f9c6e6d6ff92da7046db012c8c9bea5 100644 GIT binary patch literal 10387 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 literal 9490 zcmXw9c|6m9{QqooW{#5OmZZXBW$vrUeU!?vSf-jIXWz^{CPnc@rACCJ$PsIy&U@d_wc|!<5dXm3xSU}cWG58?ZR-ZM-Z#NGq+rer}GEx zn1ZR~cVQ&h;myr3A%I@@=d~OFB)@UpfUrY|qr%ZLQH$GIBF36qx|_S17|qE2ROAe8 zM{b9xeizvm=N28!i`x%PzxS6oN*JcO5qIZR{MAfC{u#Jere=bmKE%u4)$h88UND5F zKZBoTtrAB=Ouh=ascu@(49}49CI>t*U#MG~ZDH9W{ih)9E|I@{m;@rLs*UHj%0@!~ zOLIGlj5oFaxqAR}6ecW6w_%UkEIR#6KGxT{OdLgb{0d3P70=bafw4bmZ6Hn&gQg#^ z^kWhHM&m;cy+0&Sfm!ZYW~Qm;C~y2-J-u|dYoO})ugsPUN5Ey5jAda;koNkx*8X{# z-P5aw5=%_J#UXEOn+o@CdW6ufzn`f=-Yr`x3$*Vt+MN%zKcdx4!`dGljn4YH9%I`k z{jpIH%lwOF1`p5R=R#<=vN+1T2$af{xaBRKM}()W^U_oB_m+01$A5 z^gvL{GCutC^ptcGaP01`=xe`>l?TXmRX;S4h`MiXpkcZ&vy;yu4%!PgGPTxkT>2LW$CL~S;ASzNFg(fq3x?7 zNbB0>GzPlEq=WNVT+$I(2d`%V}Y=3eb&|Csm=jsGH|u5bSAFwlMl_k-}co{eD4L3 z(GeON=`h)S$CQt)FWmCKv{h5Ru?=$JPsrhrZyWuqC?q$hb*D1E(k+*a9DS3 z^yON(0%t^wqmtaKFo#si#1R^$e$sM6iz3Y^VMtw_Tk+NU4x1Tfl(&F13I?fr<;LV7 zI~NUU!Rrs)LscMk>G_2LC9Q($F}Z0WwZn^A%hFHq8cUZN_w%v2;STdjlNw{~?f&Pj zJTaP=o7IiPW;20o2UZmU>*f<<|Cd_A`W~3gDd=hCh~^(5dHz$|W3^0`t-jvxub7?y zMAft8uDiNw3aeNSbGt0w#i(p9=Q#t#h*ujV{I`SP75`Ll~;ZlOHc2O^%PR8pdkn7J(D$ak%lRb zJe^C|qy3-f-mFCpSpu}L79ZV*(;uyj@Y4>^)jnX>$PR>z-A6bNrsLH*Qj;HaEsTIw ziIl(lZFQT&;Z$CHUsSTMnGdq{uT*nKVUbm{V0>@y-}SF5g*@IC{OowF6kb}HU#n`2 z_}oqtN>_wzk$gP&YhON~iq)fczrzGt0;4m7g`JL(@`SfW4F2u~TVV9p724D5yzDq1 z!EW91!+dNv>`e7n>g@Qq$(TU(aJp{yvrmouY?sm`8P&_A&0()>luXAXes-~$XBS*z z;ki#1rY27Z3DE}yEKr+0*1;BIB7(kB^|PdViGl0J+2I`;XbIf1R}P(7=FGWb?QX$)Qd8*?WKY#7xL@dnm8qs z`b>}C>yiE$kECR9Gs)s~&XSJ7^*=#H6|Rjx%vjV;&Lb_4{+jEyv#u=v8_5EFdB|cB z>WN$NaxSdY{#2L)y;-Nidn36s93r6H_NObyh@s_o{+g%ILArMeKARK0vvq4(rsUhg zxJ2a{VZB4-@T2K{^3c%!St){(kdxHF7*MRS_0X*BiytdLV%0ryMb0Qs>xG!9dx}xX z=r>6jd?1sMlaq5g{VgjD5Uvc!XpqcyH|f@FEuHCY^c~KIg)W=-dbssJAIon#5o_*N z=57)!MbAsU+Xv znHSqAd)eV>=k>zaf!uoT1(c%L_lAO=FXxdIdj|*87Kh{=cJtTY$|Q5ORfDV|>XQbF z3SKF8pl+KBoYZNfN%bk-!C`Uas6>0*>~T_$>5HPr4HQoYvDF(%RV2FZZ+Vh=^^t#r zZvuL$JFoQeV&C?g0MSuVW*mLiygA}p zbe#o>G|b7{B*x#)&Z>gMpMK8RKRkdMlB?@gXe`r|rrTah$)CU21w;CvV>8WU+O7OF zNSXOMIni6Lf==;8#4(E5ysCcAxE8_rfh|uUtBTRy{jdR?nj%}!qtq4sudjCjUrFN% z^!@y15Voa84JFbgO6YSj}Lli!)r zniADm;AfcZ_r^RJAJWSj;>sihu|H284A_B*Kfz1LApCBlimA_l(wWe<01P=foX7u7 z(WT|&5wtCqCEc#U`YNQ%TF>HnXX8aj zNjjtPZC-pWRR8AtQtHqr47CME@5I)E2VN6YGO)9?RkwATsLmZ4UsRO)tjbIKjuyrgDA-KS zt&|{XS*A!>1mI#roDE4mT^mz3m};n;+!MLibAMZ1;}PHtO*Z6F(d+Q`A|y!g7vK%- zL8qm5B|qmP9}qMoj%MDUcuR(}m%pi)+d-`@Q??%{bEWq^_CEAF!2TfE3-M&m>K`=k ze7Q5A)$t`sz}f&#KP-8_rqoALlu`HTG-QY{yuMYwH1JcM0>zMtThH$s=J*Ud*EK_* zrB!KyAwxMjhVUivND*(Y)K~Wd0$hPCO$Lu%Ru?_|6_Xx>Weyeha6)LUkPi(vzwtQF+#CN zEBq7Q^ZVG#-FtJx?B(s53ApU#QXsjz+Cud`Pk(OiiGz(cKTf{vU#(BoBGq5yQh!j* zMfr26|6K)NmEwcrHaUsJQFA8`&;(fz64+IKVvYJYH-Kc1>rZI(opYvvgTeb~8QPLP z;{zZ;)zp+CB^lcL5#syzkT&1%Z*^W@gJx?wr_}%;rp; zTfQjVJYj=)I5pzNdmdVw#zP7AnnPm%^C=&2{2l$Sw_HolTTh>^UkxeR^(1Ln3xB>c zZP`!uhQ8lk|D4uv06OcSJH}ML^Pw3HiFDk7@*)JoJqt{3$MZwAZ|Z)b+5oWli)1_* zKkBwZ3@|!C%Q!|-qm_W+P}&Z??EUG7Q`vu;Iq|AJAC4WE`?AcBHHkZNzfO`q)!LP| zgaUXU;W6Q;K9JF4bqDE;fmFxn7=_#B^1@+CB$nm~@zoZ$kV+f%=LMmNJ0GUkfw|2F zzvz-3P+zgucKMgNZhv3eb8!5o!^SjkAllTvKjmXqwlMqW#MxhJXY|FV?@eSJhk*y? z{hO^t$p3;Cv%NLSgXW#uEu1(r(Na=JEr2~&{NI0t?-o?YTYrL*(ik(sJ zS~?NyVs5h3GY*j+CEoaZ2zO3`nSHuVmWW$mbtAZ9=9f!fTN99aR}QWp?n6>>lQ z-b8mS#CJ!6?SBi%yf@JV`>!GY{|)Kk9WW1A_asS~dAxKf|F*Ss2GC0SbBKMaH4b;G2j6MaP z2|19tgOw$FpPT>|k!v9#$f*0``KIt8F*-JACypCOGC#O@ngUED19n}bU${_oh1}aO zJB&r=K!pff4KjG?evB^?NyXAV^Y()T1POB0;iD-9Gnuz(K*~!F`=v$~%`J~$^?iby zuUcoANj)^?(>x5(mzUJXw$s%hzOV!I%f4nmy44`k0cVukjbQpplE!*Wm>lc6SYUQB z36gzK@TD?4wpNVJu+xxw2wZ){S;wo8J1lrZR4#0W?qJph79NMHKR&WX_va3r;j$uG ze)7C{g~yPR37Oq%nZgPUOB8A|3hiESrMp(ZXD>|dwJdkbm$}o=l=2P^35lElX!8je&w5JIGBrvX=fi z^}7rmm=_f+A_hpT-Tw^J&e(4cf!Um>k$OMVZY;<6t~4n}vjku^#|6Ei}=l4l$RoeB!#8lF?{cqK?%Y^>K+^` ziA{7o{9{>+4g@?-epl~3sqjGqa)byOu>#}<)WjC*gkgb5kC!R4j-qwo;A*QljMzfV zImp)dd|@)eOoEQNk(mlQ+b|1F>)OUIDcZGiUkCxfJSq5X0?^oyX?dO{1H{yBuxgn|ZE z!9n0CDU-QV&+hOzAAep|&)UI?^Dw&a9)Ft6j5#YMq*k#s8kBGzB8b4)%sKv)9s1xNeF zVyNMh6Qt-ZgGGS_N9<6HB1!n@KHQ~mz>;Mg1`>I=I{$@+F|6*XfrWW+F~2nc{#Bh+ z*nABoH~#0$(6tLcri9AD{;1u^z{Q*p`-5q2)6LM(R4-Tjt!-^(Byn1g{GO zzF()XS$7&-c^tuGXOar-q}uTIox&1-CxpKgYXnlgSepCT+;VZ;SV8t=Qpr3>6TKgI z>DRpbup2}GN8&%%T!@%#uBnDr!Qm+WYLV0L9U$f{x4z&=hfG82Cc^v$*C_t=VV~OQ zP;s_~>e(Nx4q#`!)eE$yPi{B_-CG_5`AX#KYY9O<~J$r~9u@2WMxSwvRs6K7in1GlH%?dv~{qW9#=U*?Vsq;Un3 z@eI8yJ?QyJSrRdUr)#oPN@#MG{~0g_BvE-|Pnv7ANQt?1TiyORFvv3d z&owK>69RyO@;#y4D*b$Rp4kgaf4YW{WZO^Ve3*ynr`1t9BSI(ORJWNHjf5 zcd2V=c_H#XxF;ge;N(+_fTn=pLT2eqyU}e{GvqlQgZaGqC_h4$WMEOXOPU6%x6w%yG6NSx+sdLeqOwZ6OYLge1=O;?7OlwU4QCiMeaeQcSD6_5Dm((wXIROPH z`4ezB-rScq>uo(F{b)Iv*1oE@%}O!0*1~I-cK%do@qpXN0k0_DpW-E=m-U3EKVQ%K z-1euXpnN_;0`7Ym%Os9QM?V9d=VsJISb$NrV*T;8Kca97zxOt7X1`i^1Yq7$u5>5n zWCBm=az8e-SNeEbwp~G+T4w%(j5SCf^0$0aoJMGqG-Ni82iN1O_eHOLSt0>p4PHL| zETL5|Y^!83+xWf98yR2FlaeyK?r9`X-}jdoog7hS<&u*AF|z!GslA!Yq8=3!3UIb9qbIe;ByzmcyXUUzNI ztlc0YRe(U>enI3B$w(^l_7pUrG7v}!Ij4n)jlm?z*1lX#sJ;>v zte6Gf({0bemb_V-y1{ux$^~|R{M&c~`Cb_A+{GZ$#%pV9 z@3*M)5w(v=61}a%KN*2s0U$cjNu6C@dRp$CQRSBwF3aZYCYpCfdT9Favqg-bA#0v@ zd5SXVnXlCSOzjWiKlCmIqE+^>A6CfZo9Du86sI*TweWNo5F#-TQ5=wf+o&3>v@|Gq zRFwik@&`@r6%!ki-*6r4Mcbm+eMk2%xnP0#cUVi1mfual)-3z%(XIpWKUZwcFGEws zb*+)xR2~&UTw)_#?^T2f*n0Am2Ndc=LXXl_c&U#BT))tJdNL>`rKh!9%^DK`#EX2T zDo4+?7W)Wd=;|5y4}>CB+qz5L5EauP56|t6gXF~S&&B#(C%363mArxCdRfi<82Wbi zS(9-wA4&{h=XP1+24qz)r)%n&6r)$NJwQsXG518#bjw9sR@G_oweRbZ$&zJ7MZKY) zBte|ZgwKJHAW6;0_m*@*K%Kt-)w#(+wo!|049oXr^0QIFjzjCNJ_$T#8n&01MxS|) zUwxp=SQ`Z{P2V8*>?zstMt!gvgsVaYJzDUKbZ z#APPu=0EIFGGrheuN6b2Kief#>4+znl#bUTzEY9aeqANKaWL(>fx4eEW8>kDyv;A+ zGYwN@H;ygUgC)d9Rq4F<&Y0{a;6|r)4G+-CZhZku5dGQTsf~fo-Wx*1jKOTohYsGr zwZZf!BUetuy03QUEbDjqt>Z;kMCh>$c(5~i))|}AvuxYNPa+JS2ZRZM|6F(tk0aj9 z(AAv|vv8|ab9t8o2sznhrZ!TH2t>m@pfjc6PICqb&^G_o?GH!InqgZi%a-wpD+v17 z*CP+Jk^S+EoL?2(TzvsKasv#_FEyoE3`l0MVGGu&xhWOw8N692-J@Ip&4j=F$HS_X-wkgtxAumiEBfyFyP4rn10t7bviZ>|O`cZ@~3sdvqqJvZCbyb;JJZ#A^EE^X{a z_7}eQ3v?mfN#)4b^GCX10sp+%x5kTL8#s$&t(Vv!+U-lo>i5@#6>h`n>8CsoRn3qX3;WM>&hF@Fd0@+(8x`AQ&@6Ecq zs~=Y8T)_kx3i131#@J0a_8o8Kyg_b935H8Y1h zghKa;D^BXJcIiM!rveQ{ei>aqeM{Uc`;ij*)6*48Q&IPNYG^|`XM zM5GCnbv@I6S@*7ppShJ-k5h@SIVVZtVelG*&50eh{ zpb1zlt!w?S(CU*lrQR7ni3*Jak_(#9P)n`OC8;Oi+4Wj{LMAHdYQdW(7k>7yZOP_i zub=h(=I0y^cSk@&PsV9ZRr!_KT5-Y*4}MfP5|23jq>ecVlq04349}^xp8?9+eh*uX zx#`(p4i<^ZqI}J0jN2l!YIg?s*%}*!TdL_te;U$M1G(PvP(&bgS64q$ez}*f6JBcF zzv}!1xLO;bEWXqoIkVZ|J)Qqy&<2Hyg(iy9GZ~s4l`h|CO7~M{vma}bYJ|+|;ZQ%U#1L22*L|+K2wARy6A@XURW0<=O*MdLzf<&_eb$@heGd?49@Mq9t$eUyn*s~6ri7+riw59h;O8%=sI{Pu#`&aXw98OMIg}{5^)pDIU;tmjhT_ew;U8#F<*94X0$jxyD@{S#7UDcs>LktU72_*CjTS)8DQzv z%eU1t8_dLUx1_kmUuoX2upXXIz`Er-+SjFB4m;(;38A5hc7^QA2Tl2QIaaKym-EM; zmDqJWOe?G9bA2GNWe2Dy$^X-Eol~q)IJ1c|d7w`#s}OV>_OMfe$SRP+649v*Oh=Q+ zccU5`5(OFG6w(v diff --git a/tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png b/tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png index ff6827cd81d84d075748822840b020dcb8d80c20..85c5a24417cb0f5d767a098fd3595c2e81aee7bf 100644 GIT binary patch literal 14819 zcmW+-Wk6I-7rwi|(kb1b2+|=fA<_yGN;gP1(zT>?cegK%bccX+cO%{1`CUK$F*Enf zoPN%k*{y}GLW~`=np|SYm2Tr9=E#@FK29@>qmFK2F@T z*QC6N46c7;kg#Lm`W&XY{KM|!m#$`PCg!mgv8%)EyYGn{TszM^0InqPQo0N;)hUQu zb1FgGK(q9}!WRop11WC5T2!oyV;A~ zKZ~r&BHsPA9kOZ>jptO9EO%bpe|yD6cLQER`LB{7-?1QJ4-WA+rlD$A!5VkLT8;0^ z=9xw2Uhlv78(d;-SL3bgxC(H)Ws$bD6)o#hj%GG+!mnuH(Z~z?ljEPe#xD)#+-^JE z*8MQ;KXYo>O>!4VVt&bmHRw=c zlqGZb(xSpx9Rjt|S(WW6Z>xElnd#n?`G<#&0vasJ4N8tdA%pr9b}cXK%;twOpq~s9 zX51jlyppx7MnhN@W8-O5Qo1`?cq+WqqEyh~*^*Mw5uZ~uUTjRNr9Q6Q*$Dep_WG-! z%FCIlAV+TdB_6{=9-FJhlOKceS~M-mkV;;?EOEkG%{SrdoBETg1Ze(unGEo4W{* zkJ;RuLsb$EN{EiVa}r94sPbOA<|@vNwzfgubSHHjO^zM?nlfL6{N~KPBtj9#fsmVJ z9w|Aj5V5gw>u6ga{Abe>WJ6+b@pN>fe{}PAZDekjYE@464pa{po zm1Xkrgq$4Zt~|-1Jipq(LTH;hbsEYlgGSZYcQw*NRb3t?+Jd!??v7vAv7`fzd<+)Z z=U8-lr7#lj{MDK@ShVN}%XkP&dFH1U_MN_4 z?yVSZtD&X$o{PbqE%w=`oo|TxP0SX4$Lp9a_{RUaJG6S#AXnKOB;Fq8)51DXUX?;r zz(=&b@ofAkR3rVaW!B~VWfe zO7=**EC!ZbKW;KnB~e*fd1_cnbJ*28%>M?|i?Yqofu zuHt2%n3VKA%HhD&x!=@vwN=7RtlE6)r@^w)<(blY4ffE8#yu=Nd990M7%6s zjoTEPX@ZIeb=dqEaS&+z!CXYjb*r08>+Sfx@xUPs6SLicsmY!G5$ca#$_;Dv!lm4& zy9^ieU#IAk2Ayv~y z;0nE*rh4h&G*e8pd>L~ywONX9g}Jw$!PUWk%)n6}!zQ2*g0gy+8<*53wsaZ8;cUh< z^;L>$BaM4m$hBmLAcrSPdO^KB!gxES2RRODyc_2-obbCh)TMI0d8x*4-(}l)bR~h)Ly>Y3qAh#}|E;o*sH&Bc7vIMA;WxV^;7n6DY z@x94(Qs68QV8yP%G`QN|YfT&?EPKV7m!x#4#n&ffjp1jxF(x9|Cl|gnwKrpxAp-?eZ&E7fd~#dRJfWz8pQ=AT|CHRi~|L?tCiue8_Pj z#gk~dDYelw#`E@jr@bJ=if1Ndv0XWY`b_D z$7Hu1s5shg=fqgvbnmVo9Lv9WD~=EXN{7IrHe}(6Hp8WA4ykj`M~7g4 zS2ym|nEsFGN4#2>GZx1gt#d!jhPoeeAJSa?J=gnui?MxZso{QgUQP9nY-_)GOSUw4 zKT~dM2~DNH3vo#6Mab_ergGWt)z!|p2kZv%x8WT3v z!-U&;W~lGS>`H1u5i-YBc140$j@N04$J5dx8JV`hTG5-U8hRAgL*Og|VCBj0dVxMw z`dK~IX$xznoczG!+Gu+;yLw#o^x@p_nrI}Mjb*5Xp+(omaRTFh@YK>5xD^M8rgFX> zVP~)>mh=e?QYasKJmWhrLNM%6{;Wk#j%0A_JW^lpJ1i<}|1>$hL;Po8G2wz;-b1+0 z_r^y7tun~`E16sJ#KWV3t1Z8j9v{@#YmARv_|8%83nsd@uio4lLb5*qM2i{zjqYVh zmpNZEi(mYnWxU>+NR!E=cT?1O`lYpW_vOe!q_KO-k$zTH9#?z4+1e-KB^+J)&FSL8 zUV+H=QNLhTV&m>x8{Kf$7zVjAJa4xTk2i&jhk}7$8lN2-9s1RH0)4P(;ppG2!f(K6 z?I2kC8&CCfekJ~9cJ2E?kM~PlYzgNTiyTwKhue%AIZz5wU_0~hzm+yxuRF^l?(JQ} z^wbf(cClo2&6n1%yJ+@Cn}@!qJfwYUMCw{Eda_TVbG?djdp{=FI%V%j22bJyv- zBML%|XKTnQ5`c5R#j}#Cke=0Sv?0sUeEF+#5t&NDAGQ`1-8LCSRrZI?7>iO%p1+1j zoU`~5ZIS6LPpeEO(;W=u=v&tV1*%wWrLc?^-+y6Vp)T`OV||*{eaVu4vt`%!>|7MK zXumkb*{u>pt{S}3mh*IPR$SJ%+w=j}bgjLI zMTIjO3&{@wtf}(5K9mLsRAerdD zR-qeV$U8(^&6dhf+UI%^1@$05*IH{>3yB;^y=sqzjceGF6REt&7fR0BMxV>J?vbeB z3)K3dR3nPl&E)5v%Ta3!^s~Hav?b)8KJfplv`>q-yUL%<8|2Uk%HQ$a=1v%;aY2K4 zp!EbGlnXr`P+aB*1Lp``+9{I8FTH@qJs)x+Ukc&L+x5*5_W;~)h_)Yfo)xt31T8E| zMZUG&N!-^~nOP%M_mv6l{gK+tB)X+3Cyw)vpb4K6!1y@*5Kej?0 z(cF4&O|?rpUkF_+vlAnxkpeI{5>-{l5sAKa?CcH#9JRylil-yPnR;YUV1^JR z!d*ZI^e30hnil!{S}KnAbkBS)OTebZXHC6DJ>5C7!Jz7@tnRb(iL~+P2c+iYa2~<#&}3 zO?}R|(k(lwIlZzOCQ7?N@{OtJc8m-XVY%>r@nq_Drr9&Wg0BCf0jSls>$E)W^>}u^ zx&AEUwf(BK(+B>B&g-)IuG``1x`&9|Y{iL^HoJRneQCl z&7sGIh_qyvrBZy{5foQ0N*B@Daw=ZcB%r~~2FjLlhZ_deDr7&dEH6#^CC`eS|+7w;wYy8pr4ByME^;8lD z2_~Mxs^bgi0fCZ!&oxcfLpvO3G|DPV(#vjBXth1_GRv%`4;=ujz`)B z$E6OSjg8C*Ji4C_g`N>U0m~KIX*?5ZmxWiD?{=w8uD%wzOV~ytWm%b%b-6mrteoZ{ zTsv-SZDSq00Ckm4c$V@zvMxy3`ugYbv0R= zk#&gIYN9^__~9ap|H(HjX%*X0rwdHG-pER1I%kD_4s;~`b>+&t*_>OhbGV{+o*pP)*7vNB#*j=#)g<^{wAX)8`fkD) z55=>o|Iw{@yLBDokP4K9Vg|%!mQ_CU+s*iO0!bg4{A*92lPIM{m&#_>KpxlGYUK=$ zf!PY7`W`4PS-YlF;e;`1Ys&U#i2Tl%Y5fp>P69TIKEVS`0+;1V`SSy9- zW~_S-n0VXwk)EeDh2OzAiRnt45%_k4J|4xklEHpPIv&-F+O44kp?nAtWL5YXF?DCe zqGqOJ-=^QxAw-C?2B^p`-u#zT_vz!xx}@N>PSH*+L_FkMzk6Gm$79Ym3ztpWAtt`4 z8RI(8x-N0q>%nx-6^mv6WJ{9%+J_-Tb1gElK`MNd^XBjEw9T_5G*>*{0uZ@PxI3Mg z=XmHWY9@m(t-*B*K7EC1pT?bVCRsl-@CVw&Wo8XvDK8uyGNgZcFC zE7BP2ZhrY{PU11-_ls90rh|chlc>E|n1E>6gxhH9-PKV6W!s_NZ zKEvVXuhIliw9@=YCmH?%&y?%ArSn`P0wVmo=Xq?vP~OOZ`nH8!rHT#5aNELcEVZ8^ zWB+ToHeKs&*6Fl)Y1gg$&sQVlpYNc(e@jrGjK^%ejJ(d@chdPPl7j1O+*O2X#6PZ- zhu4{1Vq_ux)4yD0hK9k@9zPy2UG_WZO}F!+?&DV`_l)mRT<6dfIjCuHoWa)ZZ)d)n zS|S5)_e2cIlYVNrs*MVmLI$i&xD4R;tDA2Zfzif#I?Bf16dcqJ>@sicx)G-LhK$&u zDti#EOdO&mo1^*IN@{0atx`}w)tWfp>grc>CeuUL#!_GAjm&u7zwS7h$>UBn?=p-I{znMnjFgZa%Sc0<`Sz%ug9H@ znb%RRz}eP8@L3F-nZvTXPDD#%7>1-jf{SKpw|MzqeO zx*cVLOab?wUQ`@B$NgPak*s^pD++cj(GY6vwS@X-rK#MHukCmb<7Px?`ANbUU?(7e zBU&D-_40O%5X$4MM~32mFQeG$H{3GsVTt_XhM$eItVVVVOdmhyX6i z>daIAQCe}j;N2DKmH*#7HaKlEpO}ufZ!ON_LZU(WV^Jo_K=6>g^bw2UF(Edcn^9%IW?*N=gw+Zy83ey$m!fs7*@@lf%PZP~V)h9BVW>L$gy!oMW`*2=$pnqR^gFy{+Ud4+%r+_>6%ox~|7~zGD zBH8+}lx12Ovk8BuI7}0YzCglBs-o{N%&iI70r5Xs{Z9xD`l_x7n~L@D!|u{L2>-NX zo}efZaci{>U#`S1`iK75WME$;X4$MYNfPjy&@(QEJINKv8B_WluA?s`-yg z+SCVl5wAs2$^q!C)1)JI>fH8X52j+4kMly9GEyGp^_50;u}jfglQJRvvB??XDDr4c;&D33jxfOH@j8yYv(n(G7;p` z4^Rf0m&hR&Z8U z{)@APNPBgfeja$HI|$dAt4dzxC%LvNcR02IvY!JsF%{;dxOCKwg|B%~!#FWkL5Mh! zS+noOCOl91dBgoqn* zCeZ2_q56CD<}X` zffs=#2O|$=*)=yWUw1Ivg6u!6qLyBn->Gf);&!pYEA1xVpH2SKfIY8%hDpUJ>_Hy7 z#A=M>UcMP z*lLz?5g|K`fDvx<9BSIDQIrfOhu!mkB5=NtcAX6R1mm4uyW0MDq*7nR6R=GA#aq35 zeEstqp%su-ato`LB2u$xU?ir)Yp;8hcvVGc_Bzu3we3DGydsHDOrA2CWIZN=cL&me ze9}Mkd&cGLnd1=&hjm4ydnL_&>Su=#X20?i!cF1`Dm{~JB-vq@Abgh%uE75wYPh%a z2_{%}vsvXMjMJ}>f#7lr<2Lyv{3sL;t~mMZo2g~VveKTche*^e;w@>+%OG-#<35N} z&<2R@jAs9lG35Lq6o=R5QY%f=OiO-tYp>q=Ug%oh_>L+6X8G+hHWa1wSWcPKBINWy zMDBG5%4_(shfL~$Jk|aeY=b*=>T1bjw$DOeG=o|#Sp6tNDBDw={-Y-{YigUx>^)+G zN8Mk^%!^)c*Od$jCL`w7Lp+|DXrrg@%+I7vE}oiSAmZ5PUMK1f3%p3HXz9RV&;e$6 zTrd@@L>w;dK6yjLe@`jb{5|sVw*AZ=Lfl@Zt17t9b-tvCu+*2E^aKs^H!Rxx&nFoJ z1a~GQCIqAssCo+o*DaRD-dlTx@=o8V0so{pu+60LX1eA4(*lj3;tk;C6s(~cd+T|% zUn>7hdx}miHq0l6wG%J12zr(76Uhz&4cfmHd`@R|cMo>u>T4-502-pYE^l(f{T|Mt zgEDc^Cj^%#w9Dc7L7Q=*GS(+0dhd?_gGi!B9~nR<;^7|tOOFmUObm9S&1Tlt=_)1A z()8;IgWBHBId)rqGS&Ved^pZj=BEzTzWL;0e)6Ts1Ww}T-N9pI&@w{`fA^-qo2w_a z+Jt(y-zOosTI=ha#Q~eC!USNS;dQ@LcMfIsk=MZ74a=;mIY(KW)RSqfQ9& z8wYt9-JdTPx|XJQKSuy)d!v^1W`8T7zTI18GMvD=9KTOKWBL$s9`VWxBAVu&H!1sT znX7>c^%i4QiU@_i`0*yr+(a)k;!z&JVf4ETGA!nb1r-t5N(mDG1UZPmYAJJUYqZ64 zrh>HV5K-o121gF^R$+$$6xge6-dWtSIH8uCbDwGxhxZxeZG5K7fNzCIDfp}7@arwJx{_Y$}3UnA?=vK;%O8B{~p)^5; zU4W>4gc-N5g!Dca+dlBh=J*%_(C}L7x?a3b{>8Z)WU_*F;e+D~WK>Dt)0u?-d_V*2 z`IM{ltbhCHN1rj=6C19LBW`+j9A;B z^$s#tD=mwX?!3tUgpdRd?<_J_+fYly)m-LR7#FKmN@{uw|NZCQqaiOYzwUHXrCM0{ zdQisc0{01W1rfFGU+}kr0cvr#@A1k-HMMadC!UapLA=t(jSIVGIFKb*KvjmB^m)JY z4Q;U;q}lbSn~C<8iBoX!dczY6Fu!%fQTdVi{I8$|rht7`Ddgcy>97;*qAsa}Jl5_i z(nOH{t!Dp^Hf0{a{XD^3LrF715&&MyS1@m-Zz_RULjzAV6EW#GO^^e!mI}axR4H6d>#O04WVuwjJR|`B zq92?qb(#Z#JEguI?`@^L$+QSBZAu;y*I+Ueuqm7oY990dD_`f*k%TZuxU z&w_MvhH0*;y@ffSC43b0=+XuQD87$wZ)6E4%be5--2VL|N`*p4)^1ZWDxAi*7{9>= ze2#c;QR%$tSlsAJD0n9auO;J`;n$h?-7oL1*gb-aWN@>l(RW7`X(3Fm!ZuWyUNY|r+|W)Rq{&}?D=x5_45Q4YcNW#N{*kER)EZ;!@|3lH*Td zA{7jg2!KAXSJKsAv09&8#%rS1+V{TojD`9kpzFF)xA@WFgJA`ByY#?Ld^2)Q;cY@2L(U zG+Ard!>?mR_TyoI+9qNYd8*rO0!du_sQj+71XGWuEBmV@fFQa|&hw>~eS?@R#2Xd%rPFAh7S@9mHgfQ{HVgN^NK ztJUl2UlT<9{7{!U*kR}1`(|cv{!>&>T@)qeYw*w$O$k6 zWh`w7FI9`}q-fyr6+xPfL$7M6#uF2v0RCu{tW}bB6?eVV`*ujPTRa; zgK$VzRMCYJ*$OiXE}Gs7NnX)YGd_?7FS@I%#t60@@Ho__6P_z;!H21yDFJZkyza`b zW?Q;oH0`U{dhlI`fBLOYKPA{sV;=zvq_JGFi^GiIMVO}L^1s|21?W_L6+s+?u><%m zICq9ER0y=VV4uiLq+&(583o8%gAOODfN{MxxSP-cv zgXAk{eS!Qv1WF8qWZ7UJc3RyjgqaS)oh`UW;_ob=fC5VVon;R%{!3D>)w_h{I0%5& z!8?0L_!2i5Sk@^Xfvfw%;5o=AR|3ZExEOkm#mhgD*`NSJz3@^Ew&!I<&>zZ*)+5Ea zSWuC^=a{vF@Rtq9C2a4n_dD?30{B|b8S_855p5@-VAE(R^IPj)0gapErUU>W%~Tb$ zR|YOQaaDjSec za|3!x41^H?@f4fhOUz!Bdki)2P6^Qa#<~pWf3(uc_`id{xSMJ61sO32HWA?5AdbSl z0-UNx{tW45zyMl?vJqDg1kN08ga}1{B%m9wu9_y1#5OOq!h;MCfd9@$VH$@#BtH`? zv42JYa5u>8JrOu*c@SQMMxy57SUw2P)%GVa#Qt}%Ka{q42(!*uNhIt5Vm0z7`hOgO zqPj1Cf6tBpgVWCGQvLf}jIx~z%ek2GTIap`*Ijw49*(yFL(J}a+5xW1pTAlt5ihbGHc5me~{Jaa#Pkc4*odGP>2{zja?TBgm&eeSQSnL|6X6wy|VII9j< zJx@{f0EQ6poDMtA{fJ*`VL-$vUUeMjeU^}1QZZc3lbjypuB~uQ09{+SjNP!Sh9(JtBrwC;a62g3!Pi*Sa0tMVY$y%Dv)HMn5VzqFYCVjGvB^Qa zx8*Q^fmD~^E!V0v+xzn=WVnH%+g~mSc>{^0t%$)OL=ESXW)=zk54oZh_FD#wXE-as zfP}x|`m@_aI35tv$=g2uLrGi+ekp;Y+VJn_G&izYa|jVB+Xl*a#TD}Hk`#YbQIZ;tSs#;eh9f-L)%_pISt(cn0rLZiW5bvAmlROSgVAo zly@lroN4$-pnk{a=0cc`gbHGD=>ffDD_OEgDsMNRia?gNL%J2gvEo5kMO+M8iK+Qt zt3=CeGcXnylJ|@;X{vii{AY|X`}R_kBnc5gRQM)Pc||XD$Mg#Q*ka%}4?D0CV8h3K znL;Kmg$@}6rPC{7O(U*RrF&Cw$Y+X%38Zhhu`tvSl0R+v1%)LnyOLNUAc*SR!j$?@ zS5Yk9z&+zn@j;Q%gCkhf66zlz2W^DG0?fb;`HJXXaqauO>UzY(8Yx3E(3UD8%oE)_ zK}9M>#~usqtuW9IYR@sVTOovs6a9&8eLU>{_?tl0>cKZrgIqXM=cG}4>Na6?QLj7Aam7J z$Wfz5fc1Q=Qkyh7Fp8G{6zQaHo9l#ZZq>?N@*1rXECsy6gW_tZJMIZTS*FT>dj;FH z8$FU7qU%jmSBh*{>j9?d$BRMFh!s3(w3YLu?Q*KwbEq)5N<&%a9hbei6ceEeXa+56 z-jbBi**eQLCME#5d8^F~5}^Qj#Y{Pu21bJ?q)J3`74I8;?gi{CKz*>BV8&>*!-o+o zro`+ZKo;))NUsS{1s$I#S_QMNrYxunxanD`$bFy`^$5f=<@GkGvfYcsJCkZ=>`m8%a{N$GusJ=v7u`uu zIVg|=3a;x+DOx{>c+mQ6>x5Lygp{eAmk#Z(dX?QoBRmXhSr0!QX3E?LGzm1l<9A9b zyYXjbQaNvs;k|EH6s)%lH$`$#H{$9f@KzqB-);gpV{0a!?1*So?RTyYGmcuk`z$no zfAoI#EewjOSI(7x>;`+?0pv`(kLTUO<{2{`-CD0bBMiAvVK@fM8>%7~9T!9$h!y2r z--_v@qo44>m*QyI4l3iQ7HTu1Nlc>`C)KQH%E36 zSo1eCB70W~!+LsR(T0`#RL@h~3EenjU^@ws9t=7RhOO_J3D=i(zia77hP%h=MY}pO zX2U=rC-I0piY4-7W zv& zjB@+;#eZa9?F>M&-kFzUbiTcCQ_A8B(eB+&MP%9>CqowvW)&>_mlvoMI09pTif!6Nr zkPx(jw%#Val!gsH!n9A7IGEJ7vTs&W$eporM4|fyTT5S(9Ayw5-$3HF^3lm3BzzF( zh9~QA4jZ4GwgH7tg~bN--yygtdY$adADc#)lJ#gvMcK7xE?I;fcA;pDt1}7Ty2B0@ zd;`3%k^ZH}8)=$`?+|?~y>imf5K|z3#_8ps4qbe;lVT=*!kj`-9O4n{H|FKc17}MH zSpMwriA0M##+(zkaNNzw~Y$U47rM`dg4KM`)v^=hK`AkzZWYBOx^nJgq zY_#mo_}3;F3%DI09gS+aVGd}M6T-;`hFuxoL{s}g@b&f+9i&jcm?7CVUWOfiiCNE< zpo2HtkuTKNCOKn!V)l>(c|$W2A3BKUQ9bX2qETKY9I9(=cjxhap*=mV&$ctT>T9 zb9WL7vb^vKdOyz2zDwN!VavrreYAP<4>@~PU_ml<$nYmONY>M`RF zrjB<5whxB?9k@hZ@Q zx1`D>2W_lxl0S{-9XW0~j;Jv{iq^r_qA zA0|d=-MEx9^wo=wS1TmKstuT!_!0;wwfS0)ql#%Cq!?s2?{YrHbDDSKGsbre`uX%K z$#T1pDQPH5GZW^nypmOJfY}bqj}>-yyxjq48K-_uJMZ*XGxujG=JfNyC(?5~kF6$1 z2Hz0}=~cwRi@%4*VCsidgD_3}Mz5Eb5kqLB$iR*j&9^Bvm z7Q}ZLPvBwCe}&S~CVzU%68lyz_ClgpoC!X$b{bN^>*zkj_yQ9mgbO#;v_hdV_@(x4 zxS#9y>ktUDe?^JfJIZU%aXW@^7?jn;S|b)WvWI2hIf4YmCkSTiCQ_L5d!^u|=eyu> zQ)+ljaY0YGf60G4Yvl{TZ`wvsF~!XJi{c;rCX8?~M1ATboL?)vISgl$%fNM0^tSt{ z`Rz7>{!KRCayV1mHwco+LSLZxhlq7a@+*m12_bl@P)2nfb7(}os6MY}>T=|7yO-kr zB`clp%5U8zl`&Tgb&#=_3xV5>#$}yIo3&KNsA>ZaZ=Y8n=CS4YlGv8Z6kZh1NnTI_&+ z_nN5NZCdz}$aH5(ZI7~=pxXB!p{CU967Z~q43yfF3nokREL{w#Ls7*ckVU*6yO?0{ z37XEgLuz4+a#?b5N?^S0iHV8&rPVU$6GROctT+8L3;DjKU7~N>0L_U2j$G!X8>QZ9 zoBM3dI#up+=*p7%yoJ_R*=!UpBhGuJ!1G^b;X)RdOG}IJy60?9b;>(}w-CRuNwe3|j;2WT%VAQbqwC16vE{g zB^#u-KLA$g53U8jgCe$M(+lgM8j=7}Q6GRb9@I4kH{#sxN;KvcEk;@WP1z{T)}gKv z7LB5x6IXd?kZ;G~WEd2uX{XP*LgoX2VXhg+*uK2|EuH9yZUf8U zY!Chj!v!Y?HXCznA14}ks2k%vNHLw{syjr1J`(NZg0mkV$>O8CVQcGlA6e7rP!THld?HVQs`?0A#ktjMft zM~KO+7_rbYd4=Hm9zgciN+Omdkzhmi@bRF5f84CM6$oS*$oWK?Ptrnuf^-%Nu$Fpq z8xZFcw@fktNTLAp>m_OFLSw@u2{U}3{l;1=Ugy@JWm3_^k@NG6JAvqL;hO~KU$M4 zKJdN1KxrK7k6%h0gE+xgl#+F^P7e9rX>8DtNPu- ziJi+u*0QT!{!P&m8_^G7jV1XsPB=8;sGb;jjI=&0k6t_^hRXB@4Go7K%J=F}kn`sc zme8l0u?+$F%9=N9EZp$%_dw!{_(t=37Qd2RmXB4%M5tx^0uf97an~z0!+HAb`$)2g z5c2uM7Vl%6)WtYT*+O2!2rEG=cM=5#AdVc$chKbd=9L|y18)n?Z%HwD zmzVYqa_=q>=nLXXJ|ra9Zd>0KTY^6fGUrm5M_H}l*0iGMkdhn;!PY}9z@hM2G(3V+0P-JuJC{UM6BJrN2Aly96AyRMp-V7wzrqo4p@ zoZq%Ec~_ZgZ7{ujEkM2m`yCDh_6+>^!)`rN%_nyhj$xB7PYaV)@gcV5 zGDCn~@(2n(M$K*DVn1BSzK}t-H+=PjS#kVWm2|xpVINt}c`o??s`vrOmD4ZLI`&S# zEgi4gnCvrTix0pHREI^cKVtGlMD5ydPRiQjL##seU)RsOn~Tj-_N!OZNqv8k zS+!+>YHUcD?+LVzeNZdDb9YbQ2DSc0cc(_g6WRp}Jx z`IO$DJYMwWacbGy=E3MrmsFYSoK4J_v62+M6jc@Qp@l2LdOrexKWw4^K+esRh>eG3 Up{Sh9I{^HXk&qWJ6VvnkA4(fshyVZp literal 14773 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