@@ -124,13 +124,27 @@ def headerData(self, section, orientation, role=QtCore.Qt.ItemDataRole.DisplayRo
124124 else :
125125 header = header .replace ("_" , " " ).title ()
126126 return header
127+ elif orientation == QtCore .Qt .Orientation .Vertical and role == QtCore .Qt .ItemDataRole .DisplayRole :
128+ return f"{ section + 1 } "
127129 return None
128130
129131 def append_item (self ):
130132 """Append an item to the ClassList."""
131133 self .classlist .append (self .item_type ())
132134 self .endResetModel ()
133135
136+ def insert_item (self , row : int ):
137+ """Insert an item in the ClassList at given row.
138+
139+ Parameters
140+ ----------
141+ row : int
142+ The row to insert the item.
143+
144+ """
145+ self .classlist .insert (row , self .item_type ())
146+ self .endResetModel ()
147+
134148 def delete_item (self , row : int ):
135149 """Delete an item in the ClassList.
136150
@@ -188,26 +202,46 @@ def __init__(self, field: str, parent):
188202 self .parent = parent
189203 self .project_widget = parent .parent
190204 self .table = QtWidgets .QTableView (parent )
191-
205+ self .table .setSelectionMode (self .table .SelectionMode .SingleSelection )
206+ self .table .setSelectionBehavior (self .table .SelectionBehavior .SelectItems )
207+ self .table .verticalHeader ().sectionClicked .connect (self .toggle_row_selection )
192208 self .table .horizontalHeader ().setCascadingSectionResizes (True )
209+ self .table .horizontalHeader ().setHighlightSections (False )
193210 self .table .setMinimumHeight (100 )
194211
195212 layout = QtWidgets .QVBoxLayout ()
196213 layout .setContentsMargins (0 , 0 , 0 , 0 )
197- topbar = QtWidgets .QHBoxLayout ()
198- topbar .addWidget (QtWidgets .QLabel (header , objectName = "ProjectFieldWidgetLabel" ))
214+ top_bar = QtWidgets .QHBoxLayout ()
215+ top_bar .addWidget (QtWidgets .QLabel (header , objectName = "ProjectFieldWidgetLabel" ))
199216 self .add_button = QtWidgets .QPushButton (
200217 f"Add new { header [:- 1 ] if header [- 1 ] == 's' else header } " , objectName = "ProjectFieldWidgetButton"
201218 )
202219 self .add_button .setHidden (True )
203220 self .add_button .pressed .connect (self .append_item )
204- topbar .addStretch (1 )
205- topbar .addWidget (self .add_button )
221+ top_bar .addStretch (1 )
222+ top_bar .addWidget (self .add_button )
206223
207- layout .addLayout (topbar )
224+ layout .addLayout (top_bar )
208225 layout .addWidget (self .table )
209226 self .setLayout (layout )
210227
228+ def toggle_row_selection (self , index ):
229+ """Toggle selection of a given row in the table.
230+
231+ Parameters
232+ ----------
233+ index : int
234+ The row to be deleted.
235+
236+ """
237+ selection = self .table .selectionModel ()
238+ if selection .isRowSelected (index ):
239+ selection .clear ()
240+ else :
241+ selection .clear ()
242+ for i in range (self .model .columnCount ()):
243+ selection .select (self .model .index (index , i ), QtCore .QItemSelectionModel .SelectionFlag .Select )
244+
211245 def resizeEvent (self , event ):
212246 self .resize_columns ()
213247 super ().resizeEvent (event )
@@ -271,11 +305,19 @@ def append_item(self):
271305 """Append an item to the model if the model exists."""
272306 self .model .rowCount ()
273307 if self .model is not None :
274- self .model .append_item ()
308+ selection = self .table .selectionModel ().selectedRows ()
309+ if selection :
310+ cur_row = selection [- 1 ].row () + 1
311+ self .model .insert_item (selection [- 1 ].row () + 1 )
312+ else :
313+ self .model .append_item ()
314+ cur_row = self .model .rowCount () - 1
315+ self .table .scrollToBottom ()
316+ cur_col = self .model .headers .index ("name" ) + self .model .col_offset
317+ self .table .setCurrentIndex (self .model .index (cur_row , cur_col ))
275318
276319 # call edit again to recreate delete buttons
277320 self .edit ()
278- self .table .scrollToBottom ()
279321
280322 def delete_item (self , index ):
281323 """Delete an item at the index if the model exists.
@@ -303,7 +345,14 @@ def edit(self):
303345 self .resize_columns ()
304346
305347 def make_delete_button (self , index ):
306- """Make a button that deletes index `index` from the list."""
348+ """Make a button that deletes the given row from the list when clicked.
349+
350+ Parameters
351+ ----------
352+ index : int
353+ The row to be deleted.
354+
355+ """
307356 button = QtWidgets .QPushButton (icon = QtGui .QIcon (path_for ("delete-dark.png" )))
308357 button .resize (button .sizeHint ().width (), button .sizeHint ().width ())
309358 button .pressed .connect (lambda : self .delete_item (index ))
@@ -340,6 +389,16 @@ def __init__(self, classlist: ratapi.ClassList, parent: QtWidgets.QWidget):
340389 if isinstance (item , ratapi .models .ProtectedParameter ):
341390 self .protected_indices .append (i )
342391
392+ def data (self , index , role = QtCore .Qt .ItemDataRole .DisplayRole ):
393+ if not index .isValid ():
394+ return QtCore .QVariant ()
395+
396+ if role == QtCore .Qt .ItemDataRole .BackgroundRole :
397+ header = self .index_header (index )
398+ if self .classlist [index .row ()].prior_type != "gaussian" and header in ["mu" , "sigma" ]:
399+ return QtGui .QBrush (self .parent .palette ().window ().color ())
400+ return super ().data (index , role )
401+
343402 def flags (self , index ):
344403 flags = super ().flags (index )
345404 header = self .index_header (index )
@@ -458,6 +517,13 @@ def append_item(self):
458517 self .classlist .append (self .item_type (** kwargs ))
459518 self .endResetModel ()
460519
520+ def insert_item (self , row : int ):
521+ kwargs = {"thickness" : "" , "SLD" : "" , "roughness" : "" }
522+ if self .absorption :
523+ kwargs ["SLD_imaginary" ] = ""
524+ self .classlist .insert (row , self .item_type (** kwargs ))
525+ self .endResetModel ()
526+
461527 def set_absorption (self , absorption : bool ):
462528 """Set whether the project is using absorption or not.
463529
0 commit comments