Skip to content

Commit a0a6b41

Browse files
Move coloring alongside row_deletion, column_deleton and copy/paste (#66)
* Move coloring alongside row_deletion, column_deleton and copy/paste * Added some catches for adding values
1 parent 677b296 commit a0a6b41

3 files changed

Lines changed: 68 additions & 7 deletions

File tree

src/petab_gui/controllers/table_controllers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ def delete_row(self):
199199
selected_rows = get_selected(table_view)
200200
if not selected_rows:
201201
return
202+
self.model.update_invalid_cells(selected_rows, mode="rows")
202203
for row in sorted(selected_rows, reverse=True):
203204
if row >= self.model.rowCount() - 1:
204205
continue
@@ -232,6 +233,7 @@ def delete_column(self):
232233
selected_columns = get_selected(table_view, mode=COLUMN)
233234
if not selected_columns:
234235
return
236+
self.model.update_invalid_cells(selected_columns, mode="columns")
235237
for column in sorted(selected_columns, reverse=True):
236238
# safely delete potential item delegates
237239
column_name = self.model.get_df().columns[column]

src/petab_gui/models/pandas_table_model.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,49 @@ def get_df(self):
229229

230230
def add_invalid_cell(self, row, column):
231231
"""Add an invalid cell to the set."""
232+
# check that the index is valid
233+
if not self.index(row, column).isValid():
234+
return
235+
# return if it is the last row
236+
if row == self._data_frame.shape[0]:
237+
return
238+
# return if it is already invalid
239+
if (row, column) in self._invalid_cells:
240+
return
232241
self._invalid_cells.add((row, column))
242+
self.dataChanged.emit(
243+
self.index(row, column),
244+
self.index(row, column),
245+
[Qt.BackgroundRole]
246+
)
233247

234248
def discard_invalid_cell(self, row, column):
235249
"""Discard an invalid cell from the set."""
236250
self._invalid_cells.discard((row, column))
251+
self.dataChanged.emit(
252+
self.index(row, column),
253+
self.index(row, column),
254+
[Qt.BackgroundRole]
255+
)
256+
257+
def update_invalid_cells(self, selected, mode: str = "rows"):
258+
"""Edits the invalid cells when values are deleted."""
259+
old_invalid_cells = self._invalid_cells.copy()
260+
new_invalid_cells = set()
261+
sorted_to_del = sorted(selected)
262+
for a, b in old_invalid_cells:
263+
if mode == "rows":
264+
to_be_change = a
265+
not_changed = b
266+
elif mode == "columns":
267+
to_be_change = b
268+
not_changed = a
269+
if to_be_change in selected:
270+
continue
271+
smaller_count = sum(1 for x in sorted_to_del if x < to_be_change)
272+
new_val = to_be_change - smaller_count
273+
new_invalid_cells.add((new_val, not_changed))
274+
self._invalid_cells = new_invalid_cells
237275

238276
def notify_data_color_change(self, row, column):
239277
"""Notify the view to change the color of some cells"""

src/petab_gui/views/table_view.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,34 @@ def copy_to_clipboard(self):
3939
def paste_from_clipboard(self):
4040
clipboard = QGuiApplication.clipboard()
4141
text = clipboard.text()
42-
if text:
43-
start_index = self.table_view.selectionModel().currentIndex()
44-
if start_index.isValid():
45-
self.table_view.model().setDataFromText(
46-
text, start_index.row(),
47-
start_index.column()
48-
)
42+
if not text:
43+
return
44+
start_index = self.table_view.selectionModel().currentIndex()
45+
if not start_index.isValid():
46+
return
47+
model = self.table_view.model()
48+
row_start, col_start = start_index.row(), start_index.column()
49+
# identify which invalid cells are being pasted into
50+
pasted_data = [line.split("\t") for line in text.split("\n") if line.strip()]
51+
num_rows = len(pasted_data)
52+
num_cols = max([len(line) for line in pasted_data])
53+
overridden_cells = {
54+
(row_start + r, col_start + c)
55+
for r in range(num_rows)
56+
for c in range(num_cols)
57+
if model.index(row_start + r, col_start + c).isValid()
58+
}
59+
invalid_overridden_cells = overridden_cells.intersection(
60+
model._invalid_cells
61+
)
62+
if invalid_overridden_cells:
63+
for row_invalid, col_invalid in invalid_overridden_cells:
64+
model.discard_invalid_cell(row_invalid, col_invalid)
65+
66+
model.setDataFromText(
67+
text, start_index.row(),
68+
start_index.column()
69+
)
4970

5071

5172
class ComboBoxDelegate(QStyledItemDelegate):

0 commit comments

Comments
 (0)