From 3290ff3fac8872f79df4ae29b1495afc5a9b12a3 Mon Sep 17 00:00:00 2001 From: KeksNino Date: Sun, 19 Oct 2025 02:55:32 +0200 Subject: [PATCH] switch to spreadsheet view in softwareList QTableWidget --- core/interface/gui.py | 32 +++++++++++++--------- core/interface/utils/searchhelper.py | 40 +++++++++++++++++----------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/core/interface/gui.py b/core/interface/gui.py index fad8f0b..e2a010c 100644 --- a/core/interface/gui.py +++ b/core/interface/gui.py @@ -15,6 +15,8 @@ from PySide6.QtWidgets import ( QProgressBar, QHeaderView, QMessageBox, + QTableWidget, + QTableWidgetItem, ) from PySide6.QtGui import QIcon, QAction, QCloseEvent import darkdetect @@ -56,7 +58,6 @@ def download_update(latest_version): class MainWindow(QtWidgets.QMainWindow, QWidget): def __init__(self): super().__init__() - searchresults = [] # Check for updates on Windows if platform.system() == "Windows": @@ -89,8 +90,6 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.searchbar.returnPressed.connect(lambda: run_thread(threading.Thread(target=return_pressed, args=(self,)))) # Triggers data function thread on enter self.dlbutton = QtWidgets.QPushButton("Download") - self.softwareList = QListWidget() - self.post_author_list = QListWidget() self.libraryList = QListWidget() self.emptyResults = QLabel("No Results") @@ -103,14 +102,22 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.emptyLibrary = QLabel("No items in library.") self.emptyDownload = QLabel("No items in downloads.") self.progressbar = QProgressBar() + self.qtablewidget = QTableWidget() + + self.qtablewidget.setColumnCount(2) + self.qtablewidget.setRowCount(100) + self.qtablewidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) + self.qtablewidget.verticalHeader().setVisible(False) + self.qtablewidget.setHorizontalHeaderLabels(["Post Title", "Author"]) + self.qtablewidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch) + header = self.qtablewidget.horizontalHeader() + header.setSectionResizeMode(1, QHeaderView.Fixed) + header.resizeSection(1, 500) container = QWidget() containerLayout = QVBoxLayout() containerLayout.addWidget(self.searchbar) - - containerLayout.addWidget(self.softwareList) - containerLayout.addWidget(self.post_author_list) - self.softwareList.addItems(searchresults) + containerLayout.addWidget(self.qtablewidget) class DownloadModel(QAbstractTableModel): def __init__(self): @@ -154,7 +161,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.downloadList.setSelectionBehavior(QTableView.SelectRows) # download button triggers - self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(self.softwareList.currentItem(), state.posts, state.post_titles)))) + self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(self.qtablewidget.currentItem(), state.posts, state.post_titles)))) container.setLayout(containerLayout) self.setCentralWidget(container) @@ -163,11 +170,10 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.tabs = QTabWidget() self.horizontal_layout = QHBoxLayout() - self.horizontal_layout.addWidget(self.softwareList, stretch=3) self.horizontal_layout.addWidget(self.emptyResults, stretch=3) - self.horizontal_layout.addWidget(self.post_author_list) + self.horizontal_layout.addWidget(self.qtablewidget) - self.tab1 = create_tab("Search", self.searchbar, self.softwareList, self.tabs, self.dlbutton, self.horizontal_layout) + self.tab1 = create_tab("Search", self.searchbar, self.qtablewidget, self.tabs, self.dlbutton, self.horizontal_layout) self.tab2 = create_tab("Library", self.emptyLibrary, self.libraryList, self.tabs, None, None) self.tab3 = create_tab("Downloads", self.emptyDownload, self.downloadList, self.tabs, None, None) @@ -223,8 +229,8 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): def show_empty_results(self, show: bool): if show: - self.softwareList.hide() + self.qtablewidget.hide() self.emptyResults.show() else: self.emptyResults.hide() - self.softwareList.show() + self.qtablewidget.show() diff --git a/core/interface/utils/searchhelper.py b/core/interface/utils/searchhelper.py index cf6f22a..c7aa082 100644 --- a/core/interface/utils/searchhelper.py +++ b/core/interface/utils/searchhelper.py @@ -1,3 +1,4 @@ +from PySide6.QtWidgets import QTableWidgetItem from core.data.scrapers.uztracker import scrape_uztracker from core.data.scrapers.rutracker import scrape_rutracker from core.data.scrapers.monkrus import scrape_monkrus_telegram @@ -17,20 +18,23 @@ def return_pressed(self): response = scrape_uztracker(search_text) if response: state.post_titles, state.post_urls = response - self.softwareList.clear() + self.qtablewidget.clear() if state.post_titles and len(state.post_titles) > 0: - self.softwareList.addItems(state.post_titles) + self.qtablewidget.setHorizontalHeaderLabels(["Post Title", "Author"]) + for i, author in enumerate(state.post_author): + self.qtablewidget.setItem(i, 1, QTableWidgetItem(author)) + for i, title in enumerate(state.post_titles): + self.qtablewidget.setItem(i, 0, QTableWidgetItem(title)) self.show_empty_results(False) - self.post_author_list.clear() else: if state.debug: print(f"No Results for {search_text}") - self.softwareList.clear() + self.qtablewidget.clear() self.show_empty_results(True) else: if state.debug: print(f"No response from uztracker") - self.softwareList.clear() + self.qtablewidget.clear() self.show_empty_results(True) elif state.tracker == "rutracker": @@ -40,21 +44,23 @@ def return_pressed(self): if state.posts == []: if state.debug: print(f"No Results for {search_text}") - self.softwareList.clear() + self.qtablewidget.clear() self.show_empty_results(True) else: state.post_titles, _, state.post_author = format_data(state.posts) self.show_empty_results(False) - self.post_author_list.clear() - self.post_author_list.addItems(state.post_author) - self.softwareList.clear() - self.softwareList.addItems(state.post_titles) + self.qtablewidget.clear() + self.qtablewidget.setHorizontalHeaderLabels(["Post Title", "Author"]) + for i, author in enumerate(state.post_author): + self.qtablewidget.setItem(i, 1, QTableWidgetItem(author)) + for i, title in enumerate(state.post_titles): + self.qtablewidget.setItem(i, 0, QTableWidgetItem(title)) if state.debug == True: print(f"Response Cached: {cached}") else: if state.debug: print(f"No response from rutracker") - self.softwareList.clear() + self.qtablewidget.clear() self.show_empty_results(True) elif state.tracker == "m0nkrus": @@ -63,12 +69,14 @@ def return_pressed(self): if state.posts == []: if state.debug: print(f"No Results for {search_text}") - self.softwareList.clear() + self.qtablewidget.clear() self.show_empty_results(True) else: state.post_titles, _, state.post_author = format_data(state.posts) self.show_empty_results(False) - self.post_author_list.clear() - self.post_author_list.addItems(state.post_author) - self.softwareList.clear() - self.softwareList.addItems(state.post_titles) + self.qtablewidget.clear() + self.qtablewidget.setHorizontalHeaderLabels(["Post Title", "Author"]) + for i, author in enumerate(state.post_author): + self.qtablewidget.setItem(i, 1, QTableWidgetItem(author)) + for i, title in enumerate(state.post_titles): + self.qtablewidget.setItem(i, 0, QTableWidgetItem(title))