mirror of
https://github.com/KeksPirates/SoftwareManager.git
synced 2026-08-03 17:39:42 +02:00
feat: add context menu to search list to copy magnet uri and open in browser
This commit is contained in:
@@ -1,14 +1,18 @@
|
|||||||
from utils.logging.logs import consoleLog, remove_download_log
|
from utils.logging.logs import consoleLog, remove_download_log
|
||||||
|
from utils.data.tracker import get_magnet_link
|
||||||
|
from PySide6.QtCore import Qt, QPoint, QTimer
|
||||||
|
from utils.general.wrappers import run_thread
|
||||||
from PySide6.QtWidgets import QMessageBox
|
from PySide6.QtWidgets import QMessageBox
|
||||||
from PySide6.QtCore import Qt, QPoint
|
|
||||||
from utils.data.state import state
|
from utils.data.state import state
|
||||||
from PySide6 import QtWidgets
|
from PySide6 import QtWidgets
|
||||||
|
import threading
|
||||||
|
import webbrowser
|
||||||
import subprocess
|
import subprocess
|
||||||
import platform
|
import platform
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class ContextMenu:
|
class ContextMenu_Downloads:
|
||||||
def __init__(self, main_window):
|
def __init__(self, main_window):
|
||||||
self.main_window = main_window
|
self.main_window = main_window
|
||||||
self.context_menu = QtWidgets.QMenu(main_window)
|
self.context_menu = QtWidgets.QMenu(main_window)
|
||||||
@@ -147,3 +151,67 @@ class ContextMenu:
|
|||||||
consoleLog(f"Error deleting files: {last_error}", True)
|
consoleLog(f"Error deleting files: {last_error}", True)
|
||||||
else:
|
else:
|
||||||
consoleLog(f"Removed entry (files not found): {torrent_name}", True)
|
consoleLog(f"Removed entry (files not found): {torrent_name}", True)
|
||||||
|
|
||||||
|
class ContextMenu_TrackerTable:
|
||||||
|
def __init__(self, main_window):
|
||||||
|
self.main_window = main_window
|
||||||
|
self.context_menu = QtWidgets.QMenu(main_window)
|
||||||
|
self.context_menu.addAction("Copy Tracker URL", self.copyMagnetURIAction)
|
||||||
|
self.context_menu.addAction("Open in Browser", self.openInBrowserAction)
|
||||||
|
|
||||||
|
state.trackertable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
|
state.trackertable.customContextMenuRequested.connect(self._show_context_menu)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def TrackerTable(self):
|
||||||
|
return state.trackertable
|
||||||
|
|
||||||
|
def _show_context_menu(self, pos: QPoint):
|
||||||
|
index = self.TrackerTable.indexAt(pos)
|
||||||
|
if index.isValid():
|
||||||
|
self._context_menu_row = index.row()
|
||||||
|
self.context_menu.exec(self.TrackerTable.viewport().mapToGlobal(pos))
|
||||||
|
|
||||||
|
def copyMagnetURIAction(self):
|
||||||
|
if not hasattr(self, '_context_menu_row'):
|
||||||
|
return
|
||||||
|
row = self._context_menu_row
|
||||||
|
if row < 0 or row >= len(state.trackers):
|
||||||
|
return
|
||||||
|
|
||||||
|
item = list(state.trackertable.selectedItems())[0]
|
||||||
|
|
||||||
|
def copy_magnet_uri(items):
|
||||||
|
if state.posts:
|
||||||
|
row = items[0].row()
|
||||||
|
post = state.posts[row]
|
||||||
|
url = post.get("url")
|
||||||
|
|
||||||
|
magnet = get_magnet_link(url)
|
||||||
|
|
||||||
|
if magnet:
|
||||||
|
QTimer.singleShot(0, lambda: copy_to_clipboard(magnet))
|
||||||
|
|
||||||
|
def copy_to_clipboard(magnet):
|
||||||
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
|
clipboard.setText(magnet)
|
||||||
|
consoleLog("Magnet URI copied to clipboard!", True)
|
||||||
|
|
||||||
|
run_thread(threading.Thread(target=copy_magnet_uri, args=([item],)))
|
||||||
|
|
||||||
|
def openInBrowserAction(self):
|
||||||
|
if not hasattr(self, '_context_menu_row'):
|
||||||
|
return
|
||||||
|
row = self._context_menu_row
|
||||||
|
if row < 0 or row >= len(state.trackers):
|
||||||
|
return
|
||||||
|
|
||||||
|
item = list(state.trackertable.selectedItems())[0]
|
||||||
|
row = item.row()
|
||||||
|
|
||||||
|
if state.posts:
|
||||||
|
post = state.posts[row]
|
||||||
|
url = post.get("url")
|
||||||
|
if url:
|
||||||
|
try: webbrowser.open(url)
|
||||||
|
except Exception as e: consoleLog(f"Failed to open URL: {e}", True)
|
||||||
|
|||||||
@@ -143,6 +143,9 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
|
|||||||
self.downloadList = _create_download_list(self)
|
self.downloadList = _create_download_list(self)
|
||||||
self.downloadList.viewport().installEventFilter(self)
|
self.downloadList.viewport().installEventFilter(self)
|
||||||
|
|
||||||
|
table = state.trackertable
|
||||||
|
# table.clicked.connect(lambda: setattr(self, '_tracker_hovered_row', table.indexAt(table.viewport().mapFromGlobal(QtGui.QCursor.pos())).row()))
|
||||||
|
|
||||||
self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(state.trackertable.selectedItems(),))))
|
self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(state.trackertable.selectedItems(),))))
|
||||||
|
|
||||||
container.setLayout(containerLayout)
|
container.setLayout(containerLayout)
|
||||||
@@ -251,7 +254,8 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
|
|||||||
self.active_timer.timeout.connect(self.show_empty_downloads)
|
self.active_timer.timeout.connect(self.show_empty_downloads)
|
||||||
self.active_timer.start(500)
|
self.active_timer.start(500)
|
||||||
|
|
||||||
self._context_menu = interface.dialogs.contextmenu.ContextMenu(self)
|
self._context_menu_downloads = interface.dialogs.contextmenu.ContextMenu_Downloads(self)
|
||||||
|
self._context_menu_trackertable = interface.dialogs.contextmenu.ContextMenu_TrackerTable(self)
|
||||||
self.image_overlay = Image(self)
|
self.image_overlay = Image(self)
|
||||||
|
|
||||||
def _apply_default_headers(self, table):
|
def _apply_default_headers(self, table):
|
||||||
@@ -343,7 +347,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
|
|||||||
|
|
||||||
table.setRowCount(len(state.posts))
|
table.setRowCount(len(state.posts))
|
||||||
for x, rowdata in enumerate(state.posts):
|
for x, rowdata in enumerate(state.posts):
|
||||||
for y, (key, data) in enumerate(rowdata.items()):
|
for y, (_, data) in enumerate(rowdata.items()):
|
||||||
item = QTableWidgetItem(str(data))
|
item = QTableWidgetItem(str(data))
|
||||||
item.setData(Qt.ItemDataRole.UserRole, x)
|
item.setData(Qt.ItemDataRole.UserRole, x)
|
||||||
table.setItem(x, y, item)
|
table.setItem(x, y, item)
|
||||||
|
|||||||
@@ -32,4 +32,4 @@ def check_downloads(downloads):
|
|||||||
elif download.completed == True and not os.path.exists(download.path):
|
elif download.completed == True and not os.path.exists(download.path):
|
||||||
consoleLog(f"Inexistent Download: {download.title}")
|
consoleLog(f"Inexistent Download: {download.title}")
|
||||||
remove_download_log(download.magnet_uri)
|
remove_download_log(download.magnet_uri)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user