Skip to content

Commit bc87b2a

Browse files
committed
Insert parameter after selected row
1 parent 0883f37 commit bc87b2a

2 files changed

Lines changed: 91 additions & 11 deletions

File tree

rascal2/widgets/project/tables.py

Lines changed: 75 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

tests/widgets/project/test_models.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,18 +138,32 @@ def test_model_set_data(table_model):
138138
def test_append(table_model):
139139
"""Test that append_item successfully adds an item of the relevant type."""
140140
model = table_model
141-
142141
model.append_item()
143142

144143
assert len(model.classlist) == 4
145144
assert model.classlist[-1].name == "Test Model"
146145
assert model.classlist[-1].value == 15
147146

148147

148+
def test_insert(table_model):
149+
"""Test that insert_item successfully inserts an item of the relevant type."""
150+
model = table_model
151+
model.insert_item(1)
152+
153+
assert len(model.classlist) == 4
154+
assert model.classlist[1].name == "Test Model"
155+
assert model.classlist[1].value == 15
156+
157+
model.classlist[1].name = "D"
158+
model.insert_item(3)
159+
assert len(model.classlist) == 5
160+
assert model.classlist[3].name == "Test Model"
161+
assert model.classlist[3].value == 15
162+
163+
149164
def test_delete(table_model):
150165
"""Test that delete_item deletes the item at the desired index."""
151166
model = table_model
152-
153167
model.delete_item(1)
154168

155169
assert len(model.classlist) == 2

0 commit comments

Comments
 (0)