33from PySide6 .QtGui import QColor
44
55from ..C import COLUMNS
6- from ..utils import validate_value , create_empty_dataframe , is_invalid
6+ from ..utils import validate_value , create_empty_dataframe , is_invalid , get_selected
77
88
99class PandasTableModel (QAbstractTableModel ):
@@ -24,6 +24,8 @@ def __init__(self, data_frame, allowed_columns, table_type, parent=None):
2424 if data_frame is None :
2525 data_frame = create_empty_dataframe (allowed_columns , table_type )
2626 self ._data_frame = data_frame
27+ # add a view here, access is needed for selectionModels
28+ self .view = None
2729
2830 def rowCount (self , parent = QModelIndex ()):
2931 return self ._data_frame .shape [0 ] + 1 # empty row at the end
@@ -126,11 +128,23 @@ def insertColumn(self, column_name: str):
126128 return True
127129
128130 def setData (self , index , value , role = Qt .EditRole ):
131+ if not (index .isValid () and role == Qt .EditRole ):
132+ return False
133+ # check whether multiple rows but only one column is selected
134+ multi_row_change , selected = self .check_selection ()
135+ if not multi_row_change :
136+ return self ._set_data_single (index , value )
137+ # multiple rows but only one column is selected
138+ all_set = list ()
139+ for index in selected :
140+ all_set .append (self ._set_data_single (index , value ))
141+ return all (all_set )
142+
143+ def _set_data_single (self , index , value ):
144+ """Set the data of a single cell."""
129145 col_setoff = 0
130146 if self ._has_named_index :
131147 col_setoff = 1
132- if not (index .isValid () and role == Qt .EditRole ):
133- return False
134148 if index .row () == self ._data_frame .shape [0 ]:
135149 # empty row at the end
136150 self .insertRows (index .row (), 1 )
@@ -260,6 +274,16 @@ def clear_table(self):
260274 self ._data_frame .drop (self ._data_frame .index , inplace = True )
261275 self .endResetModel ()
262276
277+ def check_selection (self ):
278+ """Check if multiple rows but only one column is selected."""
279+ if self .view is None :
280+ return False
281+ selected = get_selected (self .view , mode = "index" )
282+ cols = set ([index .column () for index in selected ])
283+ rows = set ([index .row () for index in selected ])
284+ return len (rows ) > 1 and len (cols ) == 1 , selected
285+
286+
263287
264288class IndexedPandasTableModel (PandasTableModel ):
265289 """Table model for tables with named index."""
0 commit comments