Skip to content

Commit dd52c9b

Browse files
committed
optimized sorting and filtering
1 parent 83e77f4 commit dd52c9b

5 files changed

Lines changed: 99 additions & 42 deletions

File tree

app/UIHandling/editTitleWindow.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ def HandleSubmit(self):
185185
dlg.setIcon(QtWidgets.QMessageBox.Icon.Information)
186186
dlg.exec()
187187
self.close()
188+
super().accept()
188189
else:
189190
dlg.setText("Title Edition Failure!")
190191
dlg.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)

app/UIHandling/editUpdateWindow.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ def HandleSubmit(self):
124124
dlg.setIcon(QtWidgets.QMessageBox.Icon.Information)
125125
dlg.exec()
126126
self.close()
127+
super().accept()
127128
else:
128129
dlg.setText("Update Edition Failure!")
129130
dlg.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)

app/UIHandling/mainWindow.py

Lines changed: 95 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,13 @@ def PopulateTitles(self):
167167

168168
self.modelTitles = TitlesTableModel(titles)
169169
self.proxy_modelTitles.setSourceModel(self.modelTitles)
170+
self.tableTitles.setSortingEnabled(False)
170171
self.tableTitles.setModel(self.proxy_modelTitles)
171-
self.tableTitles.setWordWrap(True)
172-
self.tableTitles.verticalHeader().setDefaultAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
172+
173+
try:
174+
self.proxy_modelTitles.layoutChanged.disconnect()
175+
except:
176+
pass
173177

174178
self.tableTitles.setStyleSheet("""
175179
QTableView {
@@ -180,42 +184,64 @@ def PopulateTitles(self):
180184
}
181185
""")
182186

183-
self.tableTitles.setSortingEnabled(False)
187+
self.tableTitles.setSortingEnabled(True)
188+
self.proxy_modelTitles.layoutChanged.connect(self.AssignButtonsTitles)
189+
self.AssignButtonsTitles()
190+
self.tableTitles.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder)
191+
self.tableTitles.setItemDelegateForColumn(6, HyperlinkDelegate(self.tableTitles))
192+
self.tableTitles.viewport().setMouseTracking(True)
193+
self.tableTitles.viewport().installEventFilter(self)
194+
self.tableTitles.setWordWrap(True)
195+
self.tableTitles.verticalHeader().setDefaultAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
196+
self.tableTitles.resizeColumnsToContents()
197+
self.tableTitles.resizeRowsToContents()
198+
# self.tableTitles.clicked.connect(self.open_link)
199+
200+
def AssignButtonsTitles(self):
201+
# Clear existing buttons
202+
for row in range(self.proxy_modelTitles.rowCount()):
203+
self.tableTitles.setIndexWidget(
204+
self.proxy_modelTitles.index(row, self.proxy_modelTitles.columnCount()-1),
205+
None
206+
)
207+
184208
# Add tool buttons for the last column
185-
for row in range(self.modelTitles.rowCount()):
209+
for row in range(self.proxy_modelTitles.rowCount()):
186210
tool_button = QtWidgets.QToolButton()
211+
proxy_index = self.proxy_modelTitles.index(row, 0)
212+
persistent_index = QtCore.QPersistentModelIndex(proxy_index)
213+
187214
tool_button.setText("⋮")
188215
tool_button.setStyleSheet("QToolButton::menu-indicator { image: none; }")
216+
189217
menu = QtWidgets.QMenu()
190218
edit_action = menu.addAction("Edit")
191219
delete_action = menu.addAction("Delete")
192-
edit_action.triggered.connect(lambda _, r=row: self.edit_title(r))
193-
delete_action.triggered.connect(lambda _, r=row: self.delete_title(r))
220+
221+
edit_action.triggered.connect(lambda _, r=persistent_index: self.edit_title(r))
222+
delete_action.triggered.connect(lambda _, r=persistent_index: self.delete_title(r))
223+
194224
tool_button.setMenu(menu)
195225
tool_button.setPopupMode(QtWidgets.QToolButton.ToolButtonPopupMode.InstantPopup)
196226
tool_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor))
227+
197228
self.tableTitles.setIndexWidget(
198-
self.proxy_modelTitles.index(row, self.modelTitles.columnCount()-1),
229+
self.proxy_modelTitles.index(row, self.proxy_modelTitles.columnCount()-1),
199230
tool_button
200231
)
201-
202-
self.tableTitles.setSortingEnabled(True)
203-
self.tableTitles.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder)
204-
self.tableTitles.setItemDelegateForColumn(6, HyperlinkDelegate(self.tableTitles))
205-
self.tableTitles.viewport().setMouseTracking(True)
206-
self.tableTitles.viewport().installEventFilter(self)
207-
self.tableTitles.resizeColumnsToContents()
208-
self.tableTitles.resizeRowsToContents()
209-
# self.tableTitles.clicked.connect(self.open_link)
210232

211233
def PopulateUpdates(self):
212234
update = app.GetUpdateDetails(DB)
213235

214236
self.modelUpdates = UpdatesTableModel(update)
215237
self.proxy_modelUpdates.setSourceModel(self.modelUpdates)
238+
self.tableTitles.setSortingEnabled(False)
216239
self.tableUpdates.setModel(self.proxy_modelUpdates)
217-
self.tableUpdates.setWordWrap(True)
218-
self.tableUpdates.verticalHeader().setDefaultAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
240+
241+
try:
242+
self.proxy_modelUpdates.layoutChanged.disconnect()
243+
except:
244+
pass
219245

220246
self.tableUpdates.setStyleSheet("""
221247
QTableView {
@@ -226,41 +252,64 @@ def PopulateUpdates(self):
226252
}
227253
""")
228254

229-
self.tableTitles.setSortingEnabled(False)
230-
# Add tool buttons for the last column
231-
for row in range(self.modelUpdates.rowCount()):
255+
self.tableUpdates.setSortingEnabled(True)
256+
self.proxy_modelUpdates.layoutChanged.connect(self.AssignButtonsUpdates)
257+
self.AssignButtonsUpdates()
258+
self.tableUpdates.setWordWrap(True)
259+
self.tableUpdates.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder)
260+
self.tableUpdates.verticalHeader().setDefaultAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
261+
self.tableUpdates.resizeColumnsToContents()
262+
self.tableUpdates.resizeRowsToContents()
263+
264+
def AssignButtonsUpdates(self):
265+
# Clear existing buttons
266+
for row in range(self.proxy_modelUpdates.rowCount()):
267+
self.tableUpdates.setIndexWidget(
268+
self.proxy_modelUpdates.index(row, self.proxy_modelUpdates.columnCount()-1),
269+
None
270+
)
271+
272+
for row in range(self.proxy_modelUpdates.rowCount()):
232273
tool_button = QtWidgets.QToolButton()
274+
proxy_index = self.proxy_modelUpdates.index(row, 0)
275+
persistent_index = QtCore.QPersistentModelIndex(proxy_index)
276+
233277
tool_button.setText("⋮")
234278
tool_button.setStyleSheet("QToolButton::menu-indicator { image: none; }")
279+
235280
menu = QtWidgets.QMenu()
236281
edit_action = menu.addAction("Edit")
237282
delete_action = menu.addAction("Delete")
238-
edit_action.triggered.connect(lambda _, r=row: self.edit_update(r))
239-
delete_action.triggered.connect(lambda _, r=row: self.delete_update(r))
283+
284+
edit_action.triggered.connect(lambda _, r=persistent_index: self.edit_update(r))
285+
delete_action.triggered.connect(lambda _, r=persistent_index: self.delete_update(r))
286+
240287
tool_button.setMenu(menu)
241288
tool_button.setPopupMode(QtWidgets.QToolButton.ToolButtonPopupMode.InstantPopup)
242289
tool_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor))
290+
243291
self.tableUpdates.setIndexWidget(
244-
self.proxy_modelUpdates.index(row, self.modelUpdates.columnCount()-1),
292+
self.proxy_modelUpdates.index(row, self.proxy_modelUpdates.columnCount()-1),
245293
tool_button
246294
)
247-
248-
self.tableUpdates.setSortingEnabled(True)
249-
self.tableUpdates.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder)
250-
self.tableUpdates.resizeColumnsToContents()
251-
self.tableUpdates.resizeRowsToContents()
252-
295+
253296
def edit_title(self, row):
254297
# print(f"Editing row {row}")
255-
if row < 0 or row >= self.modelTitles.rowCount():
298+
if not row.isValid():
256299
return
257-
index = self.modelTitles.index(row, 0)
258-
row_data = index.data(QtCore.Qt.ItemDataRole.UserRole)
300+
# proxy_index = self.proxy_modelTitles.index(row, 0)
301+
# source_index = self.proxy_modelTitles.mapToSource(proxy_index)
302+
proxy_index = QtCore.QModelIndex(row)
303+
source_index = self.proxy_modelTitles.mapToSource(proxy_index)
304+
if not source_index.isValid():
305+
return
306+
row_data = self.modelTitles.data(source_index, QtCore.Qt.ItemDataRole.UserRole)
259307
if not row_data:
260308
return
261-
dlg = app.EditTitleDialog(data=row_data)
262-
dlg.exec()
263-
self.PopulateTitles()
309+
# print(f'title edit data: {row_data}')
310+
dlg = app.EditTitleDialog(data=row_data[0], parent=self)
311+
if dlg.exec() == QtWidgets.QDialog.DialogCode.Accepted:
312+
self.PopulateTitles()
264313

265314
def delete_title(self, row):
266315
# print(f"Deleting row {row}")
@@ -269,7 +318,7 @@ def delete_title(self, row):
269318
index = self.modelTitles.index(row, 0)
270319
reply = QtWidgets.QMessageBox.question(
271320
self, 'Delete Title',
272-
'Are you sure you want to delete this title?',
321+
f'Are you sure you want to delete this title?',
273322
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No
274323
)
275324
if reply == QtWidgets.QMessageBox.StandardButton.Yes:
@@ -294,12 +343,16 @@ def delete_title(self, row):
294343

295344
def edit_update(self, row):
296345
# print(f"Editing row {row}")
297-
if row < 0 or row >= self.modelUpdates.rowCount():
346+
if not row:
298347
return
299-
index = self.modelUpdates.index(row, 0)
300-
row_data = index.data(QtCore.Qt.ItemDataRole.UserRole)
348+
proxy_index = QtCore.QModelIndex(row)
349+
source_index = self.proxy_modelUpdates.mapToSource(proxy_index)
350+
if not source_index.isValid():
351+
return
352+
row_data = self.modelUpdates.data(source_index, QtCore.Qt.ItemDataRole.UserRole)
301353
if not row_data:
302354
return
355+
# print(row_data)
303356
dlg = app.EditUpdateDialog(data=row_data[0])
304357
dlg.exec()
305358
self.PopulateUpdates()
@@ -350,10 +403,12 @@ def open_link(self, row, col):
350403
def filterTableTitle(self):
351404
search_text = self.lineEditSearchTitle.text().strip()
352405
self.proxy_modelTitles.setFilterFixedString(search_text)
406+
self.AssignButtonsTitles()
353407

354408
def filterTableUpdate(self):
355409
search_text = self.lineEditSearchUpdate.text().strip()
356410
self.proxy_modelUpdates.setFilterFixedString(search_text)
411+
self.AssignButtonsUpdates()
357412

358413
def eventFilter(self, obj, event):
359414
if obj == self.tableTitles.viewport():
@@ -413,8 +468,6 @@ def data(self, index, role=QtCore.Qt.ItemDataRole.DisplayRole):
413468
elif col == 9:
414469
return "⋮"
415470
elif role == QtCore.Qt.ItemDataRole.UserRole:
416-
if col == 0:
417-
return int(record[0])
418471
return record # full row data for potential use
419472
return None
420473

app/UIHandling/newTitleDialog.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ def HandleSubmit(self):
113113
dlg.setIcon(QtWidgets.QMessageBox.Icon.Information)
114114
dlg.exec()
115115
self.close()
116+
super().accept()
116117
else:
117118
dlg.setText("Title Addition Failure!")
118119
dlg.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)

app/UIHandling/newUpdateDialog.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ def HandleSubmit(self):
8888
dlg.setIcon(QtWidgets.QMessageBox.Icon.Information)
8989
dlg.exec()
9090
self.close()
91+
super().accept()
9192
else:
9293
dlg.setText("Update Addition Failure!")
9394
dlg.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)

0 commit comments

Comments
 (0)