@@ -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
0 commit comments