From 214d9a0e234ac2a1b0ea9aba3e5c1ea375d099b4 Mon Sep 17 00:00:00 2001 From: Vxrtrauter <101264710+Vxrtrauter@users.noreply.github.com> Date: Mon, 9 Mar 2026 18:09:17 +0100 Subject: [PATCH] feat: implement SVG icon handling and update button styles in settings dialog --- src/core/interface/dialogs/settings.py | 32 ++++++++++++++++++-- src/core/interface/gui.py | 38 ++++++------------------ src/core/interface/utils/svghelper.py | 30 +++++++++++++++++++ src/core/utils/network/update_checker.py | 14 ++++----- 4 files changed, 74 insertions(+), 40 deletions(-) create mode 100644 src/core/interface/utils/svghelper.py diff --git a/src/core/interface/dialogs/settings.py b/src/core/interface/dialogs/settings.py index 24ed670..6d311f5 100644 --- a/src/core/interface/dialogs/settings.py +++ b/src/core/interface/dialogs/settings.py @@ -4,8 +4,9 @@ from core.utils.logging.logs import consoleLog from core.interface.utils.tabhelper import general_tab from core.interface.utils.tabhelper import paths_tab from core.interface.utils.tabhelper import network_tab +from core.interface.utils.svghelper import svg_icon from PySide6 import QtWidgets -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, QSize from PySide6.QtWidgets import ( QLineEdit, QPushButton, @@ -22,6 +23,8 @@ from PySide6.QtWidgets import ( ) import platform +SVG_FOLDER = '' + def settings_dialog(self): @@ -113,7 +116,19 @@ def settings_dialog(self): if dir_path: download_path.setText(dir_path) - browse_button = QPushButton("📁") + browse_button = QPushButton() + browse_button.setFixedSize(36, 36) + browse_button.setIconSize(QSize(24, 24)) + browse_button.setIcon(svg_icon(SVG_FOLDER, 24)) + browse_button.setCursor(Qt.CursorShape.PointingHandCursor) + browse_button.setStyleSheet(""" + QPushButton { + border: none; + background: transparent; + padding: 0px; + } + """) + download_path_layout.addWidget(browse_button) browse_button.clicked.connect(browse_download_path) @@ -136,7 +151,18 @@ def settings_dialog(self): if file_path: image_path.setText(file_path) - browse_button = QPushButton("📁") + browse_button = QPushButton() + browse_button.setFixedSize(36, 36) + browse_button.setIconSize(QSize(24, 24)) + browse_button.setIcon(svg_icon(SVG_FOLDER, 24)) + browse_button.setCursor(Qt.CursorShape.PointingHandCursor) + browse_button.setStyleSheet(""" + QPushButton { + border: none; + background: transparent; + padding: 0px; + } + """) image_path_layout.addWidget(browse_button) browse_button.clicked.connect(browse_image_path) diff --git a/src/core/interface/gui.py b/src/core/interface/gui.py index 539f9af..a940a07 100644 --- a/src/core/interface/gui.py +++ b/src/core/interface/gui.py @@ -19,7 +19,6 @@ from PySide6.QtWidgets import ( ) from PySide6.QtGui import QIcon, QCloseEvent, QImage, QPixmap, QContextMenuEvent, QGuiApplication, QColor, QBrush -from PySide6.QtSvg import QSvgRenderer import darkdetect import threading import platform @@ -34,9 +33,10 @@ from core.utils.logging.logs import consoleLog, remove_download_log, flush_log_b from core.utils.general.wrappers import run_thread from core.utils.data.state import state from core.utils.network.download import download_selected -from core.utils.network.update_checker import check_for_updates +from core.utils.network.update_checker import get_updates from core.interface.utils.tabhelper import create_tab from core.interface.utils.searchhelper import return_pressed +from core.interface.utils.svghelper import svg_icon from core.interface.dialogs.settings import settings_dialog from core.interface.assets.base64_icons import settings_black_base64 from core.interface.assets.base64_icons import settings_white_base64 @@ -117,32 +117,12 @@ def _table_stylesheet(view_type="QTableWidget"): """ -def _svg_icon(svg_str, size=20): - app = QtWidgets.QApplication.instance() - if app: - if _is_dark_mode(): - color = "white" - else: - color = "#555555" - else: - color = "white" - svg = svg_str.replace("{color}", color) - renderer = QSvgRenderer(QByteArray(svg.encode())) - pixmap = QPixmap(size, size) - pixmap.fill(Qt.GlobalColor.transparent) - from PySide6.QtGui import QPainter - painter = QPainter(pixmap) - renderer.render(painter) - painter.end() - return QIcon(pixmap) - - SVG_PLAY = '' SVG_PAUSE = '' SVG_FOLDER = '' -def download_update(latest_version): +def _download_update(latest_version): import tempfile import time @@ -220,7 +200,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): # Check for updates on Windows if state.ignore_updates is False and platform.system() == "Windows": - result = check_for_updates() + result = get_updates() if result != (None, None): assets, latest_version = result @@ -234,7 +214,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): response = msg.exec_() if response == QMessageBox.StandardButton.Ok: - download_update(latest_version) + _download_update(latest_version) self.setWindowTitle("Software Manager") self.setGeometry(100, 100, 800, 600) @@ -489,11 +469,11 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): if button: if status.state == lt.torrent_status.seeding: - button.setIcon(_svg_icon(SVG_FOLDER, 18)) + button.setIcon(svg_icon(SVG_FOLDER, 18)) button.setText("") else: is_user_paused = status.paused and not bool(magnetdl.flags() & lt.torrent_flags.auto_managed) - button.setIcon(_svg_icon(SVG_PLAY if is_user_paused else SVG_PAUSE, 18)) + button.setIcon(svg_icon(SVG_PLAY if is_user_paused else SVG_PAUSE, 18)) button.setText("") def createEditor(self, parent, option, index): @@ -507,11 +487,11 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): layout.setContentsMargins(0, 0, 0, 0) if status.state == lt.torrent_status.seeding: btnPause = QtWidgets.QPushButton() - btnPause.setIcon(_svg_icon(SVG_FOLDER, 18)) + btnPause.setIcon(svg_icon(SVG_FOLDER, 18)) else: btnPause = QtWidgets.QPushButton() is_user_paused = status.paused and not bool(magnetdl.flags() & lt.torrent_flags.auto_managed) - btnPause.setIcon(_svg_icon(SVG_PLAY if is_user_paused else SVG_PAUSE, 18)) + btnPause.setIcon(svg_icon(SVG_PLAY if is_user_paused else SVG_PAUSE, 18)) btnPause.setIconSize(QSize(18, 18)) btnPause.setFixedSize(30, 30) btnPause.setCursor(Qt.CursorShape.PointingHandCursor) diff --git a/src/core/interface/utils/svghelper.py b/src/core/interface/utils/svghelper.py new file mode 100644 index 0000000..393b321 --- /dev/null +++ b/src/core/interface/utils/svghelper.py @@ -0,0 +1,30 @@ + + +from PySide6 import QtWidgets +from PySide6.QtCore import Qt, QByteArray +from PySide6.QtGui import QIcon, QPixmap, QPainter +from PySide6.QtSvg import QSvgRenderer +import darkdetect + + +def _is_dark_mode(): + return darkdetect.isDark() + + +def svg_icon(svg_str, size=20): + app = QtWidgets.QApplication.instance() + if app: + if _is_dark_mode(): + color = "white" + else: + color = "#555555" + else: + color = "white" + svg = svg_str.replace("{color}", color) + renderer = QSvgRenderer(QByteArray(svg.encode())) + pixmap = QPixmap(size, size) + pixmap.fill(Qt.GlobalColor.transparent) + painter = QPainter(pixmap) + renderer.render(painter) + painter.end() + return QIcon(pixmap) \ No newline at end of file diff --git a/src/core/utils/network/update_checker.py b/src/core/utils/network/update_checker.py index a250884..af5852a 100644 --- a/src/core/utils/network/update_checker.py +++ b/src/core/utils/network/update_checker.py @@ -2,27 +2,25 @@ import requests from core.utils.data.state import state from core.utils.logging.logs import consoleLog -def check_for_updates(): - url = f"https://api.github.com/repos/KeksPirates/SoftwareManager/releases" +def get_updates(): + url = f"https://api.github.com/repos/KeksPirates/SoftwareManager/releases/latest" response = requests.get(url, timeout=15) if response.status_code != 200: consoleLog(f"Failed to fetch releases: {response.status_code}") return None, None - releases = response.json() - releases.sort(key=lambda r: r["published_at"], reverse=True) + release = response.json() - latest_release = releases[0] - latest_version = latest_release["name"] - assets = latest_release["assets"] + latest_version = release["name"] + assets = release["assets"] if latest_version != state.version: consoleLog(f"New release available: {latest_version}") if assets: consoleLog("Assets:") for asset in assets: - consoleLog(f" - {asset['name']}: {asset['browser_download_url']}") + consoleLog(f" - {asset['name']}: {asset['browser_download_url']} - {asset['digest']}") return assets, latest_version else: return None, None