fix: cant use copy magnet uri contextmenu widget more than once

This commit is contained in:
2026-04-09 02:15:36 +02:00
parent 810bed347b
commit dcba60c695
2 changed files with 77 additions and 10 deletions
+26 -8
View File
@@ -1,7 +1,7 @@
from PySide6.QtCore import Qt, QPoint, QObject, Signal, QRunnable, QThreadPool
from utils.logging.logs import consoleLog, remove_download_log from utils.logging.logs import consoleLog, remove_download_log
from utils.network.download import download_selected from utils.network.download import download_selected
from utils.data.tracker import get_magnet_link from utils.data.tracker import get_magnet_link
from PySide6.QtCore import Qt, QPoint, QTimer, QObject, Signal
from utils.general.wrappers import run_thread from utils.general.wrappers import run_thread
from PySide6.QtWidgets import QMessageBox from PySide6.QtWidgets import QMessageBox
from utils.data.state import state from utils.data.state import state
@@ -14,13 +14,21 @@ import platform
import time import time
import os import os
class Worker(QObject):
class WorkerSignals(QObject):
finished = Signal(str) finished = Signal(str)
def run(self, url):
magnet = get_magnet_link(url) class Worker(QRunnable):
def __init__(self, url):
super().__init__()
self.url = url
self.signals = WorkerSignals()
def run(self):
magnet = get_magnet_link(self.url)
if magnet: if magnet:
self.finished.emit(magnet) self.signals.finished.emit(magnet)
class ContextMenu_Downloads: class ContextMenu_Downloads:
def __init__(self, main_window): def __init__(self, main_window):
@@ -220,6 +228,8 @@ class ContextMenu_TrackerTable:
def copyMagnetURIAction(self): def copyMagnetURIAction(self):
if not hasattr(self, '_context_menu_row'): if not hasattr(self, '_context_menu_row'):
return return
if not hasattr(self, "_workers"):
self._workers = []
row = self._context_menu_row row = self._context_menu_row
if row < 0 or row >= len(state.trackers): if row < 0 or row >= len(state.trackers):
return return
@@ -243,10 +253,18 @@ class ContextMenu_TrackerTable:
clipboard.setText(magnet) clipboard.setText(magnet)
consoleLog("Magnet URI copied to clipboard!", True) consoleLog("Magnet URI copied to clipboard!", True)
self._magnet_worker = Worker()
self._magnet_worker.finished.connect(copy_to_clipboard)
run_thread(threading.Thread(target=self._magnet_worker.run, args=(url,))) def start_worker(url):
worker = Worker(url)
worker.signals.finished.connect(copy_to_clipboard)
self._workers.append(worker)
worker.signals.finished.connect(lambda _: self._workers.remove(worker))
QThreadPool.globalInstance().start(worker)
start_worker(url)
def openInBrowserAction(self): def openInBrowserAction(self):
if not hasattr(self, '_context_menu_row'): if not hasattr(self, '_context_menu_row'):
+51 -2
View File
@@ -1,6 +1,7 @@
from network.libtorrent_misc import send_notification, update_log, check_deleted_files from network.libtorrent_misc import send_notification, update_log, check_deleted_files
from utils.logging.loghandler import split_data, check_completed, check_downloads from utils.logging.loghandler import split_data, check_completed, check_downloads
from network.interface import list_interfaces, init_interfaces from network.interface import list_interfaces, init_interfaces
from PySide6.QtNetwork import QLocalServer, QLocalSocket
from utils.logging.logs import get_download_logs from utils.logging.logs import get_download_logs
from utils.logging.logs import set_main_window from utils.logging.logs import set_main_window
from network.libtorrent_int import check_space from network.libtorrent_int import check_space
@@ -10,12 +11,12 @@ from interface.assets.base64_icons import logo_base64
from PySide6.QtWidgets import QSystemTrayIcon, QMenu from PySide6.QtWidgets import QSystemTrayIcon, QMenu
from utils.general.shutdown import force_exit from utils.general.shutdown import force_exit
from utils.config.config import read_config from utils.config.config import read_config
from PySide6.QtGui import QAction, QPixmap
from utils.logging.logs import consoleLog from utils.logging.logs import consoleLog
from interface.gui import MainWindow from interface.gui import MainWindow
from PySide6.QtCore import Qt, QObject
from utils.data.state import state from utils.data.state import state
from PySide6.QtGui import QAction, QPixmap
from PySide6 import QtWidgets from PySide6 import QtWidgets
from PySide6.QtCore import Qt
import qdarktheme import qdarktheme
import threading import threading
import platform import platform
@@ -24,6 +25,40 @@ import signal
import time import time
import sys import sys
SERVER_NAME = "SoftwareManager_python"
class SingleInstance(QObject):
def __init__(self):
super().__init__()
self.server = QLocalServer()
socket = QLocalSocket()
socket.connectToServer(SERVER_NAME)
if socket.waitForConnected(100):
socket.write(b"raise")
socket.flush()
socket.waitForBytesWritten(100)
self.is_running = True
else:
QLocalServer.removeServer(SERVER_NAME)
self.server.listen(SERVER_NAME)
self.server.newConnection.connect(self.handle_connection)
self.is_running = False
self.is_running = False
def handle_connection(self):
socket = self.server.nextPendingConnection()
socket.readyRead.connect(lambda: self.read_socket(socket))
def read_socket(self, socket):
msg = socket.readAll().data()
if msg == b"raise":
self.on_raise()
def on_raise(self):
pass
def run_gui(app): def run_gui(app):
custom_colors = {} custom_colors = {}
if state.accent_color: if state.accent_color:
@@ -58,6 +93,20 @@ def run_gui(app):
tray.activated.connect(lambda reason: widget.show() if reason == QSystemTrayIcon.ActivationReason.Trigger else None) tray.activated.connect(lambda reason: widget.show() if reason == QSystemTrayIcon.ActivationReason.Trigger else None)
tray.setContextMenu(menu) tray.setContextMenu(menu)
def show_from_tray():
widget.show()
widget.raise_()
widget.activateWindow()
single = SingleInstance()
if single.is_running:
consoleLog("Another instance is already running. Exiting this instance.")
closehelper()
force_exit()
app._single_instance = single
single.on_raise = show_from_tray
set_main_window(widget) set_main_window(widget)
widget.show() widget.show()
signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL)