mirror of
https://github.com/KeksPirates/SoftwareManager.git
synced 2026-08-03 17:39:42 +02:00
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.
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user