fosKeyMan
Loading...
Searching...
No Matches
tableoperator.py
Go to the documentation of this file.
1import fnmatch
2from datetime import datetime
3
4from PySide6.QtCore import QDate
5from PySide6.QtGui import Qt
6from PySide6.QtWidgets import QMessageBox, QComboBox, QLineEdit, QDateEdit
7from frontend.keystatus import ActivationStatus
8
9
11 r"""
12 Class to handle operations on the table, such as adding or deleting rows, filtering rows based on different criteria,
13 and handling checkbox selection (check all/uncheck all).
14 This class only make UI-level changes.
15 """
16
17 def __init__(self, table_widget):
18 r"""
19 Initialize the TableOperator with the table widget.
20
21 \param table_widget (QTableWidget): The table widget to operate on.
22 """
23 self.table_widget = table_widget
24
25 def add_new_row(self):
26 r"""
27 Add a new row to the table widget.
28 """
29 row_position = self.table_widget.rowCount()
30 self.table_widget.insertRow(row_position)
31
32 def delete_row(self):
33 r"""
34 Delete the currently selected row from the table widget.
35 """
36 selected_row = self.table_widget.currentRow()
37 if selected_row != -1:
38 self.table_widget.removeRow(selected_row)
39 else:
40 QMessageBox.warning(None, "Warning", "Please select a line first")
41
42 def check_all_boxes(self):
43 r"""
44 Check or uncheck all checkboxes in the first column of the table. If all boxes are checked, it unchecks them,
45 otherwise, it checks all of them.
46 """
47 all_checked = True
48
49 for row in range(self.table_widget.rowCount()):
50 if not self.table_widget.isRowHidden(row):
51 checkbox = self.table_widget.item(row, 0)
52 if checkbox is not None:
53 if checkbox.checkState() != Qt.CheckState.Checked:
54 all_checked = False
55 break
56
57 new_state = Qt.CheckState.Unchecked if all_checked else Qt.CheckState.Checked
58
59 for row in range(self.table_widget.rowCount()):
60 if not self.table_widget.isRowHidden(row):
61 checkbox = self.table_widget.item(row, 0)
62 if checkbox is not None:
63 checkbox.setCheckState(new_state)
64
65 def filter_table(self, filter_inputs):
66 r"""
67 Filter the table rows based on user input from various filter fields.
68 Rows that do not match the criteria will be hidden.
69
70 \param filter_inputs (dict[str, QWidget]): A dictionary mapping filter label text (also the table column header) to the corresponding input widget (QLineEdit or QComboBox).
71 """
72
73 label_to_index = {}
74 for i in range(self.table_widget.columnCount()):
75 header_item = self.table_widget.horizontalHeaderItem(i)
76 if header_item:
77 internal_key = header_item.data(Qt.ItemDataRole.UserRole)
78 if internal_key:
79 label_to_index[internal_key] = i
80 else:
81 label_to_index[header_item.text()] = i
82
83 for row in range(self.table_widget.rowCount()):
84 match = True
85
86 for label_text, widget in filter_inputs.items():
87 if label_text in ["start", "end"]:
88 continue
89
90 if label_text in label_to_index:
91 col_index = label_to_index[label_text]
92 else:
93 match = False
94 break
95
96 item = self.table_widget.item(row, col_index)
97 if item is None:
98 match = False
99 break
100
101 filter_text = widget.currentText() if isinstance(widget, QComboBox) else widget.text().strip()
102
103 if not filter_text or filter_text == "All" or filter_text == "Alle":
104 continue
105
106 if label_text == "status":
107 status_value = item.data(Qt.ItemDataRole.UserRole + 1)
108
109 status_mapping = {
110 "Activated": ActivationStatus.ACTIVATED,
111 "Deactivated": ActivationStatus.DEACTIVATED,
112 "Aktiviert": ActivationStatus.ACTIVATED,
113 "Deaktiviert": ActivationStatus.DEACTIVATED
114 }
115
116 expected_status = status_mapping.get(filter_text, None)
117
118 if expected_status is None or status_value != expected_status:
119 match = False
120 else:
121 if not fnmatch.fnmatch(item.text(), filter_text):
122 match = False
123
124 start_widget = filter_inputs.get("start")
125 end_widget = filter_inputs.get("end")
126
127 start_date = start_widget.date() if start_widget else None
128 end_date = end_widget.date() if end_widget else None
129 col_index = label_to_index["last_edit_date"]
130 item = self.table_widget.item(row, col_index)
131 if item and item.text():
132 cell_date = datetime.strptime(item.text(), "%Y-%m-%d").date()
133
134 if start_date and cell_date < start_date:
135 match = False
136 if end_date and cell_date > end_date:
137 match = False
138 else:
139 match = False
140
141 self.table_widget.setRowHidden(row, not match)
142
143 def reset_filter(self, filter_inputs):
144 r"""
145 Reset the filters by clearing all input fields and showing all rows in the table
146
147 \param filter_inputs (dict[str, QWidget]): A dictionary mapping filter label text (also the table column header) to the corresponding input widget (QLineEdit or QComboBox).
148 """
149 for label_text, widget in filter_inputs.items():
150 if isinstance(widget, QLineEdit):
151 widget.clear()
152 elif isinstance(widget, QComboBox):
153 widget.setCurrentIndex(0)
154 elif isinstance(widget, QDateEdit):
155 if label_text == "Start":
156 widget.setDate(QDate(2000, 1, 1))
157 elif label_text == "End":
158 widget.setDate(QDate.currentDate())
159 for row in range(self.table_widget.rowCount()):
160 self.table_widget.setRowHidden(row, False)
Class to handle operations on the table, such as adding or deleting rows, filtering rows based on dif...
add_new_row(self)
Add a new row to the table widget.
reset_filter(self, filter_inputs)
Reset the filters by clearing all input fields and showing all rows in the table.
delete_row(self)
Delete the currently selected row from the table widget.
__init__(self, table_widget)
Initialize the TableOperator with the table widget.
check_all_boxes(self)
Check or uncheck all checkboxes in the first column of the table.
filter_table(self, filter_inputs)
Filter the table rows based on user input from various filter fields.