update searchpage, add updater thread and emit signal for progress bar

add context menu and related actions
This commit is contained in:
2025-09-03 12:33:52 +02:00
parent b577a69dad
commit 373257864f
2 changed files with 184 additions and 217 deletions

View File

@@ -7,9 +7,10 @@ from PySide6.QtCore import Signal
from src import LOG_DIR
from src.backend import Database, Semester
from src.logic import Prof, custom_sort, sort_semesters_list
from src.logic import BookData, Prof, custom_sort, sort_semesters_list
from src.ui.dialogs import ApparatExtendDialog, Mail_Dialog, ReminderDialog
from src.ui.widgets import DataQtGraph, StatusWidget
from src.ui.widgets.signature_update import UpdaterThread
from .widget_sources.search_statistic_page_ui import Ui_Dialog
@@ -19,7 +20,6 @@ log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
class MyComboBox(QtWidgets.QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
@@ -30,6 +30,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
reloadSignal = Signal()
refreshSignal = Signal()
updateCalendar = Signal(int, list)
status_update = Signal(int, int)
def __init__(self):
log.info("SearchStatisticPage started")
@@ -72,8 +73,54 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
self.semester = Semester().value
self.search_by_signature.returnPressed.connect(self.search_book)
self.search_by_title.returnPressed.connect(self.search_book)
# add context menu to the book_search_result
self.book_search_result.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.book_search_result.customContextMenuRequested.connect(
self.book_search_result_context_menu
)
self.populate_tab()
def book_search_result_context_menu(self, position):
menu = QtWidgets.QMenu()
open_apparat_action = menu.addAction("Semesterapparat öffnen")
open_apparat_action.triggered.connect(self.open_selected_apparat)
update_books_action = menu.addAction("Bücher aktualisieren")
update_books_action.triggered.connect(self.update_books)
menu.exec(self.book_search_result.mapToGlobal(position))
def open_selected_apparat(self):
selected_rows = self.book_search_result.selectionModel().selectedRows()
if len(selected_rows) == 0:
return
row = selected_rows[0].row()
apparat_text = self.book_search_result.item(row, 2).text()
apparat_number = apparat_text.split(" (")[0]
self.apparat_open.emit(apparat_number)
def update_books(self):
# update all books in the book_search_result
self.updater = UpdaterThread()
books = []
for row in range(self.book_search_result.rowCount()):
signature = self.book_search_result.item(row, 1).text()
booksdata = self.db.query_db(
"SELECT id, bookdata from media WHERE bookdata LIKE ?",
(f'%"{signature}"%',),
one=True,
)
books.append(
{"id": booksdata[0], "bookdata": BookData().from_string(booksdata[1])}
)
self.updater.books = books # type: ignore
self.updater.currtot.connect(self.status_update_emit)
self.updater.finished.connect(self.updater.deleteLater)
self.updater.start()
def status_update_emit(self, current: int, total: int):
self.status_update.emit(current, total)
def mass_extend_apparats(self):
extend = ApparatExtendDialog()
extend.exec()
@@ -84,13 +131,13 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
if self.tableWidget.cellWidget(i, 0).isChecked():
app_name = self.tableWidget.item(i, 1).text()
app_id = self.db.getApparatId(app_name)
self.db.setNewSemesterDate(app_id, data["semester"], data["dauerapp"])
self.db.setNewSemesterDate(
app_id, data["semester"], data["dauerapp"]
)
# remove the row
self.tableWidget.removeRow(i)
self.refreshSignal.emit()
def restore_apparat(self):
selected_rows = self.tableWidget.selectionModel().selectedRows()
apparats = []
@@ -193,7 +240,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
2,
QtWidgets.QTableWidgetItem(
self.db.fetch_one(
"SELECT semesterapparat.appnr || ' (' || semesterapparat.name || ')' AS formatted_result from semesterapparat WHERE semesterapparat.appnr = ?",
"SELECT semesterapparat.appnr || ' (' || semesterapparat.name || ')' AS formatted_result from semesterapparat WHERE semesterapparat.id = ?",
(book[1],),
)[0],
),
@@ -510,7 +557,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
QtWidgets.QMessageBox.information(
self,
"Information",
f"Der Semesterapparat wurde bereits gelöscht und kann nicht angezeigt werden.",
"Der Semesterapparat wurde bereits gelöscht und kann nicht angezeigt werden.",
)
if parent_depth == 1:
# person selected case - open all apparats from this person in the tableWidget