Feat: add delete edition dialog with fuzzy search
This commit is contained in:
@@ -14,10 +14,12 @@ __all__ = [
|
||||
"DocumentPrintDialog",
|
||||
"NewEditionDialog",
|
||||
"Settings",
|
||||
"DeleteDialog",
|
||||
]
|
||||
from .about import About
|
||||
from .app_ext import ApparatExtendDialog
|
||||
from .bookdata import BookDataUI
|
||||
from .deletedialog import DeleteDialog
|
||||
from .docuprint import DocumentPrintDialog
|
||||
from .elsa_add_entry import ElsaAddEntry
|
||||
from .elsa_gen_confirm import ElsaGenConfirm
|
||||
|
||||
129
src/ui/dialogs/deletedialog.py
Normal file
129
src/ui/dialogs/deletedialog.py
Normal file
@@ -0,0 +1,129 @@
|
||||
from typing import Any
|
||||
|
||||
from PySide6 import QtCore, QtWidgets
|
||||
|
||||
from src import Icon
|
||||
from src.backend.database import Database
|
||||
|
||||
from .dialog_sources.deletedialog_ui import Ui_Dialog
|
||||
|
||||
|
||||
class DeleteDialog(QtWidgets.QDialog, Ui_Dialog):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setupUi(self)
|
||||
self.setWindowTitle("Medien löschen")
|
||||
self.setWindowIcon(Icon("trash").icon)
|
||||
self.reset_btn.clicked.connect(self.reset_selection)
|
||||
self.cancel_btn.clicked.connect(self.close)
|
||||
self.delete_btn.clicked.connect(self.delete_selected)
|
||||
|
||||
self.db = Database()
|
||||
self.books = self.setBooks()
|
||||
self.lineEdit.textChanged.connect(self.populate_books)
|
||||
self.populate_books()
|
||||
|
||||
def delete_selected(self):
|
||||
to_delete = []
|
||||
for row in range(self.tableWidget.rowCount()):
|
||||
checkbox = self.tableWidget.cellWidget(row, 0)
|
||||
if checkbox is not None and checkbox.isChecked():
|
||||
book_id_item = self.tableWidget.item(row, 6)
|
||||
if book_id_item is not None:
|
||||
book_id = int(book_id_item.text())
|
||||
to_delete.append(book_id)
|
||||
if to_delete:
|
||||
self.db.deleteBooks(to_delete)
|
||||
self.accept()
|
||||
|
||||
def reset_selection(self):
|
||||
for row in range(self.tableWidget.rowCount()):
|
||||
checkbox = self.tableWidget.cellWidget(row, 0)
|
||||
if checkbox is not None:
|
||||
checkbox.setChecked(False)
|
||||
|
||||
def setBooks(self) -> list[dict[str, Any]]:
|
||||
result: list[dict[str, Any]] = []
|
||||
books = self.db.getAllBooks()
|
||||
for book in books:
|
||||
title = book["bookdata"].title
|
||||
signature = book["bookdata"].signature
|
||||
edition = book["bookdata"].edition
|
||||
appnr = self.db.getApparatNrByBookId(book["id"])
|
||||
result.append(
|
||||
{
|
||||
"id": book["id"],
|
||||
"appnr": appnr,
|
||||
"title": title,
|
||||
"signature": signature,
|
||||
"edition": edition,
|
||||
}
|
||||
)
|
||||
return result
|
||||
|
||||
def populate_books(self):
|
||||
searchterm = self.lineEdit.text().lower()
|
||||
self.tableWidget.setRowCount(0)
|
||||
for book in self.books:
|
||||
checkbox = QtWidgets.QCheckBox()
|
||||
app_nr = book["appnr"]
|
||||
title = book["title"]
|
||||
signature = book["signature"]
|
||||
edition = book["edition"] if book["edition"] else ""
|
||||
|
||||
if searchterm in title.lower() or searchterm in signature.lower():
|
||||
self.tableWidget.insertRow(self.tableWidget.rowCount())
|
||||
self.tableWidget.setCellWidget(
|
||||
self.tableWidget.rowCount() - 1, 0, checkbox
|
||||
)
|
||||
self.tableWidget.setItem(
|
||||
self.tableWidget.rowCount() - 1,
|
||||
1,
|
||||
QtWidgets.QTableWidgetItem(str(app_nr)),
|
||||
)
|
||||
self.tableWidget.setItem(
|
||||
self.tableWidget.rowCount() - 1,
|
||||
2,
|
||||
QtWidgets.QTableWidgetItem(signature),
|
||||
)
|
||||
self.tableWidget.setItem(
|
||||
self.tableWidget.rowCount() - 1,
|
||||
3,
|
||||
QtWidgets.QTableWidgetItem(title),
|
||||
)
|
||||
self.tableWidget.setItem(
|
||||
self.tableWidget.rowCount() - 1,
|
||||
4,
|
||||
QtWidgets.QTableWidgetItem(edition),
|
||||
)
|
||||
self.tableWidget.setItem(
|
||||
self.tableWidget.rowCount() - 1,
|
||||
5,
|
||||
QtWidgets.QTableWidgetItem(""),
|
||||
)
|
||||
self.tableWidget.setItem(
|
||||
self.tableWidget.rowCount() - 1,
|
||||
6,
|
||||
QtWidgets.QTableWidgetItem(str(book["id"])),
|
||||
)
|
||||
else:
|
||||
continue
|
||||
# set column signature to be 10px wider than the longest entry
|
||||
self.tableWidget.setColumnWidth(1, 100)
|
||||
self.tableWidget.setColumnWidth(2, 150)
|
||||
self.tableWidget.setColumnWidth(3, 150)
|
||||
self.tableWidget.setColumnWidth(4, 100)
|
||||
|
||||
self.tableWidget.setColumnWidth(0, 50)
|
||||
# horizontal header 0 should be centered
|
||||
self.tableWidget.horizontalHeader().setDefaultAlignment(
|
||||
QtCore.Qt.AlignmentFlag.AlignCenter
|
||||
)
|
||||
|
||||
|
||||
def launch():
|
||||
app = QtWidgets.QApplication.instance()
|
||||
if app is None:
|
||||
app = QtWidgets.QApplication([])
|
||||
dialog = DeleteDialog()
|
||||
dialog.exec()
|
||||
138
src/ui/dialogs/dialog_sources/deletedialog.ui
Normal file
138
src/ui/dialogs/dialog_sources/deletedialog.ui
Normal file
@@ -0,0 +1,138 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Dialog</class>
|
||||
<widget class="QDialog" name="Dialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1001</width>
|
||||
<height>649</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Medium suchen</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit">
|
||||
<property name="placeholderText">
|
||||
<string>Titel/Signatursuche</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTableWidget" name="tableWidget">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="horizontalHeaderStretchLastSection">
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Apparat</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Signatur</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Titel</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Auflage</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>ISBN</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>ID</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="reset_btn">
|
||||
<property name="text">
|
||||
<string>Zurücksetzen</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="delete_btn">
|
||||
<property name="text">
|
||||
<string>Löschen</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="cancel_btn">
|
||||
<property name="text">
|
||||
<string>Abbrechen</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
122
src/ui/dialogs/dialog_sources/deletedialog_ui.py
Normal file
122
src/ui/dialogs/dialog_sources/deletedialog_ui.py
Normal file
@@ -0,0 +1,122 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'deletedialog.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.9.2
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
|
||||
QMetaObject, QObject, QPoint, QRect,
|
||||
QSize, QTime, QUrl, Qt)
|
||||
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
|
||||
QFont, QFontDatabase, QGradient, QIcon,
|
||||
QImage, QKeySequence, QLinearGradient, QPainter,
|
||||
QPalette, QPixmap, QRadialGradient, QTransform)
|
||||
from PySide6.QtWidgets import (QApplication, QDialog, QHBoxLayout, QHeaderView,
|
||||
QLabel, QLineEdit, QPushButton, QSizePolicy,
|
||||
QSpacerItem, QTableWidget, QTableWidgetItem, QVBoxLayout,
|
||||
QWidget)
|
||||
|
||||
class Ui_Dialog(object):
|
||||
def setupUi(self, Dialog):
|
||||
if not Dialog.objectName():
|
||||
Dialog.setObjectName(u"Dialog")
|
||||
Dialog.resize(1001, 649)
|
||||
self.verticalLayout = QVBoxLayout(Dialog)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.horizontalLayout = QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||
self.label = QLabel(Dialog)
|
||||
self.label.setObjectName(u"label")
|
||||
|
||||
self.horizontalLayout.addWidget(self.label)
|
||||
|
||||
self.lineEdit = QLineEdit(Dialog)
|
||||
self.lineEdit.setObjectName(u"lineEdit")
|
||||
|
||||
self.horizontalLayout.addWidget(self.lineEdit)
|
||||
|
||||
|
||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
|
||||
self.tableWidget = QTableWidget(Dialog)
|
||||
if (self.tableWidget.columnCount() < 7):
|
||||
self.tableWidget.setColumnCount(7)
|
||||
__qtablewidgetitem = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
|
||||
__qtablewidgetitem1 = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
|
||||
__qtablewidgetitem2 = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2)
|
||||
__qtablewidgetitem3 = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3)
|
||||
__qtablewidgetitem4 = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4)
|
||||
__qtablewidgetitem5 = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(5, __qtablewidgetitem5)
|
||||
__qtablewidgetitem6 = QTableWidgetItem()
|
||||
self.tableWidget.setHorizontalHeaderItem(6, __qtablewidgetitem6)
|
||||
self.tableWidget.setObjectName(u"tableWidget")
|
||||
self.tableWidget.setAlternatingRowColors(True)
|
||||
self.tableWidget.horizontalHeader().setStretchLastSection(True)
|
||||
|
||||
self.verticalLayout.addWidget(self.tableWidget)
|
||||
|
||||
self.horizontalLayout_2 = QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
||||
self.horizontalSpacer_2 = QSpacerItem(20, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||
|
||||
self.horizontalLayout_2.addItem(self.horizontalSpacer_2)
|
||||
|
||||
self.reset_btn = QPushButton(Dialog)
|
||||
self.reset_btn.setObjectName(u"reset_btn")
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.reset_btn)
|
||||
|
||||
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||
|
||||
self.horizontalLayout_2.addItem(self.horizontalSpacer)
|
||||
|
||||
self.delete_btn = QPushButton(Dialog)
|
||||
self.delete_btn.setObjectName(u"delete_btn")
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.delete_btn)
|
||||
|
||||
self.cancel_btn = QPushButton(Dialog)
|
||||
self.cancel_btn.setObjectName(u"cancel_btn")
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.cancel_btn)
|
||||
|
||||
|
||||
self.verticalLayout.addLayout(self.horizontalLayout_2)
|
||||
|
||||
|
||||
self.retranslateUi(Dialog)
|
||||
|
||||
QMetaObject.connectSlotsByName(Dialog)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, Dialog):
|
||||
Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))
|
||||
self.label.setText(QCoreApplication.translate("Dialog", u"Medium suchen", None))
|
||||
self.lineEdit.setPlaceholderText(QCoreApplication.translate("Dialog", u"Titel/Signatursuche", None))
|
||||
___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(1)
|
||||
___qtablewidgetitem.setText(QCoreApplication.translate("Dialog", u"Apparat", None));
|
||||
___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(2)
|
||||
___qtablewidgetitem1.setText(QCoreApplication.translate("Dialog", u"Signatur", None));
|
||||
___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(3)
|
||||
___qtablewidgetitem2.setText(QCoreApplication.translate("Dialog", u"Titel", None));
|
||||
___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(4)
|
||||
___qtablewidgetitem3.setText(QCoreApplication.translate("Dialog", u"Auflage", None));
|
||||
___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(5)
|
||||
___qtablewidgetitem4.setText(QCoreApplication.translate("Dialog", u"ISBN", None));
|
||||
___qtablewidgetitem5 = self.tableWidget.horizontalHeaderItem(6)
|
||||
___qtablewidgetitem5.setText(QCoreApplication.translate("Dialog", u"ID", None));
|
||||
self.reset_btn.setText(QCoreApplication.translate("Dialog", u"Zur\u00fccksetzen", None))
|
||||
self.delete_btn.setText(QCoreApplication.translate("Dialog", u"L\u00f6schen", None))
|
||||
self.cancel_btn.setText(QCoreApplication.translate("Dialog", u"Abbrechen", None))
|
||||
# retranslateUi
|
||||
|
||||
Reference in New Issue
Block a user