From 2ad02435a113a188dce261ab0411fc5f9230f00d Mon Sep 17 00:00:00 2001 From: Vxrtrauter <101264710+Vxrtrauter@users.noreply.github.com> Date: Sun, 5 Apr 2026 05:22:24 +0200 Subject: [PATCH] feat/fix: "wallpaper" transparency handling Introduce dynamic wallpaper transparency support for the image overlay. Adds QStackedWidget import and a new _set_wallpaper_transparency method that toggles WA_TranslucentBackground on the main window and key child widgets, updates stylesheets (with originals preserved/restored), and uses darkdetect to adapt combo popup background. Adds state fields (_wallpaper_active, _original_stylesheets), sets overlay opacity from state, and calls the transparency toggler when loading/hiding the overlay to avoid redundant updates. --- src/interface/dialogs/image.py | 90 +++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/src/interface/dialogs/image.py b/src/interface/dialogs/image.py index a81e514..3edb46b 100644 --- a/src/interface/dialogs/image.py +++ b/src/interface/dialogs/image.py @@ -1,7 +1,8 @@ -from PySide6.QtWidgets import QLabel, QGraphicsOpacityEffect +from PySide6.QtWidgets import QLabel, QGraphicsOpacityEffect, QStackedWidget from PySide6.QtCore import Qt, QSize, QEvent, QObject from PySide6.QtGui import QImage, QPixmap from utils.data.state import state +import darkdetect import os @@ -16,6 +17,8 @@ class Image(QObject): self.overlay_label.setGraphicsEffect(self.opacity_effect) self._current_image_path = None + self._wallpaper_active = False + self._original_stylesheets = {} parent.installEventFilter(self) state.image_changed.connect(self.update_image_overlay) @@ -28,9 +31,90 @@ class Image(QObject): self._load_and_display(self._current_image_path) return False + def _set_wallpaper_transparency(self, enabled): + if self._wallpaper_active == enabled: + return + self._wallpaper_active = enabled + parent = self.application + + central = parent.centralWidget() + if central: + central.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + for attr in ['tab_wrapper', 'corner_widget', 'titlebar']: + w = getattr(parent, attr, None) + if w: + w.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + if hasattr(parent, 'tabs'): + tabs = parent.tabs + tabs.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + for i in range(tabs.count()): + page = tabs.widget(i) + if page: + page.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + stack = tabs.findChild(QStackedWidget) + if stack: + stack.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + tab_bar = tabs.tabBar() + if tab_bar: + tab_bar.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + if 'tabs' not in self._original_stylesheets: + self._original_stylesheets['tabs'] = tabs.styleSheet() + if enabled: + tabs.setStyleSheet( + self._original_stylesheets['tabs'] + + "\nQTabWidget::pane { background: transparent; }" + + "\nQTabBar { background: transparent; }" + + "\nQTabBar::tab { background: transparent; }" + ) + else: + tabs.setStyleSheet(self._original_stylesheets['tabs']) + + # Searchbar + if hasattr(parent, 'searchbar'): + if 'searchbar' not in self._original_stylesheets: + self._original_stylesheets['searchbar'] = parent.searchbar.styleSheet() + if enabled: + parent.searchbar.setStyleSheet("QLineEdit { background-color: transparent; }") + else: + parent.searchbar.setStyleSheet(self._original_stylesheets['searchbar']) + + # Download button + if hasattr(parent, 'dlbutton'): + if 'dlbutton' not in self._original_stylesheets: + self._original_stylesheets['dlbutton'] = parent.dlbutton.styleSheet() + if enabled: + parent.dlbutton.setStyleSheet("QPushButton { background-color: transparent; }") + else: + parent.dlbutton.setStyleSheet(self._original_stylesheets['dlbutton']) + + # Labels + for attr in ['emptyResults', 'emptyDownload']: + w = getattr(parent, attr, None) + if w: + w.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, enabled) + + if hasattr(parent, 'tracker_list'): + if 'tracker_list' not in self._original_stylesheets: + self._original_stylesheets['tracker_list'] = parent.tracker_list.styleSheet() + if enabled: + popup_bg = '#1e1e1e' if darkdetect.isDark() else '#ffffff' + parent.tracker_list.setStyleSheet( + "QComboBox { background-color: transparent; }" + f" QComboBox QAbstractItemView {{ background-color: {popup_bg}; }}" + ) + else: + parent.tracker_list.setStyleSheet(self._original_stylesheets['tracker_list']) + def _load_and_display(self, image_path): if state.image_enabled is not True: self.overlay_label.hide() + self._set_wallpaper_transparency(False) return self._current_image_path = image_path parent = self.application @@ -56,7 +140,11 @@ class Image(QObject): self.overlay_label.setGeometry(0, 0, parent.width(), parent.height()) self.overlay_label.lower() + self.opacity_effect.setOpacity(state.image_opacity / 100) + self._set_wallpaper_transparency(True) + else: + self._set_wallpaper_transparency(False) scaled_image = image.scaledToWidth( state.image_width, Qt.TransformationMode.SmoothTransformation )