From 64ed28ba4f554958305cc9cf37da1a124ba2a99b Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 12 Jun 2026 11:34:39 +0200 Subject: [PATCH] refactor(notification_banner): remove defensive patterns --- .../notification_banner.py | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/bec_widgets/widgets/containers/main_window/addons/notification_center/notification_banner.py b/bec_widgets/widgets/containers/main_window/addons/notification_center/notification_banner.py index 1d27e7fa..b54de4b0 100644 --- a/bec_widgets/widgets/containers/main_window/addons/notification_center/notification_banner.py +++ b/bec_widgets/widgets/containers/main_window/addons/notification_center/notification_banner.py @@ -150,11 +150,14 @@ class NotificationToast(QFrame): body_lbl.setWordWrap(True) self.time_lbl = QtWidgets.QLabel() + self._showing_absolute = False self._update_relative_time() # enable absolute timestamp on hover self.time_lbl.setCursor(QtCore.Qt.PointingHandCursor) self.time_lbl.installEventFilter(self) - self._showing_absolute = False + + # shared ID assigned by NotificationCentre.add_notification + self.notification_id: str | None = None self.close_btn = QtWidgets.QPushButton("✕") self.close_btn.setObjectName("toastCloseBtn") @@ -247,15 +250,14 @@ class NotificationToast(QFrame): # lifetime progress animation self._lifetime = max(0, lifetime_ms) # 0 → never expire self._progress_anim: QtCore.QPropertyAnimation | None = None + # flag to indicate this toast has fully expired (progress bar finished) + self._expired = False if self._lifetime > 0: self._start_progress_animation() else: self.progress.hide() - # flag to indicate this toast has fully expired (progress bar finished) - self._expired = False - # ------------------------------------------------------------------ def _connect_to_theme_change(self): """Connect this toast to the global theme‑updated signal.""" @@ -337,9 +339,6 @@ class NotificationToast(QFrame): }} """) self.apply_theme(self._theme) - # keep injected gradient in sync - if getattr(self, "_hg_enabled", False): - self._hg_cols[0] = self._accent_color @SafeProperty(str) def traceback(self): @@ -456,7 +455,7 @@ class NotificationToast(QFrame): ######################################## def _update_relative_time(self) -> None: - if getattr(self, "_showing_absolute", False): + if self._showing_absolute: return # don't overwrite while user is viewing absolute time seconds = int((datetime.now() - self.created).total_seconds()) if seconds < 10: @@ -497,7 +496,7 @@ class NotificationToast(QFrame): Pause the countdown while the cursor is over the toast, and reset the elapsed time and progress bar to full width. """ - if getattr(self, "_expired", False): + if self._expired: return super().enterEvent(event) self._hover = True if self._progress_anim is not None: @@ -511,10 +510,10 @@ class NotificationToast(QFrame): Resume the countdown when the cursor leaves, continuing from the paused progress rather than restarting. """ - if getattr(self, "_expired", False): + if self._expired: return super().leaveEvent(event) self._hover = False - if self._lifetime > 0 and not self._expired: + if self._lifetime > 0: self._start_progress_animation() super().leaveEvent(event) @@ -530,13 +529,11 @@ class NotificationToast(QFrame): painter.fillPath(path, self._base_color) # accent gradient, fades to transparent - grad = QtGui.QLinearGradient( - 0, 0, self.width() * getattr(self, "_gradient_width_factor", 0.70), 0 - ) + grad = QtGui.QLinearGradient(0, 0, self.width() * self._gradient_width_factor, 0) accent = QtGui.QColor(self._accent_color) - if getattr(self, "_theme", "dark") == "light": + if self._theme == "light": accent = accent.darker(115) - accent.setAlpha(getattr(self, "_accent_alpha", 50)) + accent.setAlpha(self._accent_alpha) grad.setColorAt(0.0, accent) fade = QtGui.QColor(self._accent_color) fade.setAlpha(0) @@ -590,8 +587,7 @@ class NotificationCentre(QScrollArea): def __init__(self, parent=None, *, fixed_width: int = 420, margin: int = 16): super().__init__(parent=parent) self.setObjectName("NotificationCentre") - app = QApplication.instance() - self._theme = getattr(getattr(app, "theme", None), "theme", "dark").lower() + self._theme = get_theme_name() self.setWidgetResizable(True) # transparent background so only the toast cards are visible @@ -756,7 +752,7 @@ class NotificationCentre(QScrollArea): def remove_notification(self, notification_id: str) -> None: """Close a specific notification in this centre if present.""" for toast in list(self.toasts): - if getattr(toast, "notification_id", None) == notification_id: + if toast.notification_id == notification_id: self._hide_notification(toast) # ------------------------------------------------------------------