mirror of
https://github.com/KeksPirates/SoftwareManager.git
synced 2026-08-03 17:39:42 +02:00
feat: implement SVG icon handling and update button styles in settings dialog
This commit is contained in:
@@ -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 = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 6c0-1.1.9-2 2-2h5l2 2h7c1.1 0 2 .9 2 2v10c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6z" fill="{color}"/></svg>'
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
@@ -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 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="6,3 20,12 6,21" fill="{color}"/></svg>'
|
||||
SVG_PAUSE = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><rect x="5" y="3" width="4" height="18" rx="1" fill="{color}"/><rect x="15" y="3" width="4" height="18" rx="1" fill="{color}"/></svg>'
|
||||
SVG_FOLDER = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 6c0-1.1.9-2 2-2h5l2 2h7c1.1 0 2 .9 2 2v10c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6z" fill="{color}"/></svg>'
|
||||
|
||||
|
||||
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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user