1+ import pandas as pd
12from PySide6 .QtCore import Qt , QAbstractTableModel , QModelIndex , Signal , QSortFilterProxyModel
23from PySide6 .QtGui import QColor
34
89class PandasTableModel (QAbstractTableModel ):
910 """Basic table model for a pandas DataFrame."""
1011 # Signals
11- observable_id_changed = Signal (str , str ) # new_id, old_id
12+ relevant_id_changed = Signal (str , str , str ) # new_id, old_id, type
1213 new_log_message = Signal (str , str ) # message, color
1314 cell_needs_validation = Signal (int , int ) # row, column
1415 something_changed = Signal (bool )
@@ -148,11 +149,17 @@ def setData(self, index, value, role=Qt.EditRole):
148149 if column_name == "observableId" :
149150 self ._data_frame .iloc [row , column - col_setoff ] = value
150151 self .dataChanged .emit (index , index , [Qt .DisplayRole ])
151- self .observable_id_changed .emit (value , old_value )
152+ self .relevant_id_changed .emit (value , old_value , "observable" )
153+ self .cell_needs_validation .emit (row , column )
154+ self .something_changed .emit (True )
155+ return True
156+ if column_name in ["conditionId" , "simulationConditionId" , "preequilibrationConditionId" ]:
157+ self ._data_frame .iloc [row , column - col_setoff ] = value
158+ self .dataChanged .emit (index , index , [Qt .DisplayRole ])
159+ self .relevant_id_changed .emit (value , old_value , "condition" )
152160 self .cell_needs_validation .emit (row , column )
153161 self .something_changed .emit (True )
154162 return True
155- # Maybe TODO: same for conditionId?
156163
157164 # Validate data based on expected type
158165 expected_type = self ._allowed_columns .get (column_name )["type" ]
@@ -165,7 +172,7 @@ def setData(self, index, value, role=Qt.EditRole):
165172 self .new_log_message .emit (
166173 f"Column '{ column_name } ' expects a value of "
167174 f"type { expected_type } , but got '{ tried_value } '" ,
168- color = "red"
175+ "red"
169176 )
170177 return False
171178 # Set the new value
@@ -256,6 +263,7 @@ def clear_table(self):
256263
257264class IndexedPandasTableModel (PandasTableModel ):
258265 """Table model for tables with named index."""
266+ condition_2be_renamed = Signal (str , str ) # Signal to mother controller
259267 def __init__ (self , data_frame , allowed_columns , table_type , parent = None ):
260268 super ().__init__ (
261269 data_frame = data_frame ,
@@ -274,20 +282,20 @@ def handle_named_index(self, index, value):
274282 if value in self ._data_frame .index :
275283 self .new_log_message .emit (
276284 f"Duplicate index value '{ value } '" ,
277- color = "red"
285+ "red"
278286 )
279287 return False
280288 try :
281289 self ._data_frame .rename (index = {old_value : value }, inplace = True )
282290 self .dataChanged .emit (index , index , [Qt .DisplayRole ])
283- self .observable_id_changed .emit (value , old_value )
291+ self .relevant_id_changed .emit (value , old_value , self . table_type )
284292 self .cell_needs_validation .emit (row , 0 )
285293 self .something_changed .emit (True )
286294 return True
287295 except Exception as e :
288296 self .new_log_message .emit (
289297 f"Error renaming index value '{ old_value } ' to '{ value } ': { e } " ,
290- color = "red"
298+ "red"
291299 )
292300 return False
293301
@@ -397,10 +405,11 @@ def fill_row(self, row_position: int, data: dict):
397405 data_to_add .update (data )
398406 # Maybe add default values for missing columns?
399407 new_index = self ._data_frame .index .tolist ()
408+ index_name = self ._data_frame .index .name
400409 new_index [row_position ] = data_to_add .pop (
401410 "observableId"
402411 )
403- self ._data_frame .index = new_index
412+ self ._data_frame .index = pd . Index ( new_index , name = index_name )
404413 self ._data_frame .iloc [row_position ] = data_to_add
405414
406415
@@ -440,7 +449,12 @@ def fill_row(self, row_position: int, data: dict):
440449 column_name : "" for column_name in self ._data_frame .columns
441450 }
442451 data_to_add .update (data )
443- self ._data_frame .index [row_position ] = data_to_add .pop ("conditionId" )
452+ new_index = self ._data_frame .index .tolist ()
453+ index_name = self ._data_frame .index .name
454+ new_index [row_position ] = data_to_add .pop (
455+ "conditionId"
456+ )
457+ self ._data_frame .index = pd .Index (new_index , name = index_name )
444458 self ._data_frame .iloc [row_position ] = data_to_add
445459
446460
0 commit comments