@@ -82,6 +82,10 @@ def __init__(self, parent_style):
8282
8383 self .left_canvas = ElectrodeCanvas ()
8484 self .right_canvas = ElectrodeCanvas ()
85+
86+ # Electrode disable state
87+ self .left_electrode_enabled = True
88+ self .right_electrode_enabled = True
8589 self .left_canvas .validation_callback = self ._on_left_canvas_validation
8690 self .right_canvas .validation_callback = self ._on_right_canvas_validation
8791 self ._left_selection_valid = True
@@ -238,8 +242,8 @@ def _create_settings_group(self) -> QGroupBox:
238242 amp_limits = STIMULATION_LIMITS ["amplitude" ]
239243 pw_limits = STIMULATION_LIMITS ["pulse_width" ]
240244
241- left_group = QGroupBox ("Left" )
242- left_group .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
245+ self . left_group = QGroupBox ("Left" )
246+ self . left_group .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
243247 left_group_layout = QVBoxLayout ()
244248
245249 freq_row = QHBoxLayout ()
@@ -313,10 +317,10 @@ def _create_settings_group(self) -> QGroupBox:
313317 left_config_layout .addWidget (self .left_config_label )
314318 left_group_layout .addWidget (self .left_config_box )
315319 left_group_layout .addStretch (1 )
316- left_group .setLayout (left_group_layout )
320+ self . left_group .setLayout (left_group_layout )
317321
318- right_group = QGroupBox ("Right" )
319- right_group .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
322+ self . right_group = QGroupBox ("Right" )
323+ self . right_group .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
320324 right_group_layout = QVBoxLayout ()
321325
322326 freq_row = QHBoxLayout ()
@@ -390,12 +394,12 @@ def _create_settings_group(self) -> QGroupBox:
390394 right_config_layout .addWidget (self .right_config_label )
391395 right_group_layout .addWidget (self .right_config_box )
392396 right_group_layout .addStretch (1 )
393- right_group .setLayout (right_group_layout )
397+ self . right_group .setLayout (right_group_layout )
394398
395399 sidebar_layout .addWidget (model_group )
396400 sidebar_layout .addWidget (group_row )
397- sidebar_layout .addWidget (left_group )
398- sidebar_layout .addWidget (right_group )
401+ sidebar_layout .addWidget (self . left_group )
402+ sidebar_layout .addWidget (self . right_group )
399403 sidebar_layout .addStretch (1 )
400404
401405 # Wrap sidebar in a scroll area so it scrolls when rows overflow
@@ -427,18 +431,24 @@ def _create_settings_group(self) -> QGroupBox:
427431 electrodes_layout = QVBoxLayout ()
428432 electrodes_row = QHBoxLayout ()
429433
430- left_canvas_group = QGroupBox ("Left electrode" )
434+ self .left_canvas_group = QGroupBox ("Left electrode" )
435+ self .left_canvas_group .setCheckable (True )
436+ self .left_canvas_group .setChecked (True )
437+ self .left_canvas_group .toggled .connect (lambda checked : self ._toggle_electrode ('left' , checked ))
431438 left_canvas_layout = QVBoxLayout ()
432439 left_canvas_layout .addWidget (self .left_canvas , 1 )
433- left_canvas_group .setLayout (left_canvas_layout )
440+ self . left_canvas_group .setLayout (left_canvas_layout )
434441
435- right_canvas_group = QGroupBox ("Right electrode" )
442+ self .right_canvas_group = QGroupBox ("Right electrode" )
443+ self .right_canvas_group .setCheckable (True )
444+ self .right_canvas_group .setChecked (True )
445+ self .right_canvas_group .toggled .connect (lambda checked : self ._toggle_electrode ('right' , checked ))
436446 right_canvas_layout = QVBoxLayout ()
437447 right_canvas_layout .addWidget (self .right_canvas , 1 )
438- right_canvas_group .setLayout (right_canvas_layout )
448+ self . right_canvas_group .setLayout (right_canvas_layout )
439449
440- electrodes_row .addWidget (left_canvas_group , 1 )
441- electrodes_row .addWidget (right_canvas_group , 1 )
450+ electrodes_row .addWidget (self . left_canvas_group , 1 )
451+ electrodes_row .addWidget (self . right_canvas_group , 1 )
442452
443453 electrodes_layout .addLayout (electrodes_row )
444454 electrodes_layout .addLayout (self ._create_electrode_legend_layout ())
@@ -878,6 +888,51 @@ def _create_clinical_scales_group(self) -> QGroupBox:
878888
879889 return gb_clinical
880890
891+ def _toggle_electrode (self , side : str , checked : bool ) -> None :
892+ """Toggle electrode enable/disable state for canvas and settings."""
893+ from PySide6 .QtWidgets import QGraphicsOpacityEffect
894+
895+ if side == 'left' :
896+ self .left_electrode_enabled = checked
897+ self .left_group .setEnabled (checked )
898+ self .left_canvas .setEnabled (checked )
899+ # Apply opacity to visually dim canvas and settings
900+ for widget in (self .left_canvas , self .left_group ):
901+ if not checked :
902+ effect = QGraphicsOpacityEffect (widget )
903+ effect .setOpacity (0.3 )
904+ widget .setGraphicsEffect (effect )
905+ else :
906+ widget .setGraphicsEffect (None )
907+ elif side == 'right' :
908+ self .right_electrode_enabled = checked
909+ self .right_group .setEnabled (checked )
910+ self .right_canvas .setEnabled (checked )
911+ for widget in (self .right_canvas , self .right_group ):
912+ if not checked :
913+ effect = QGraphicsOpacityEffect (widget )
914+ effect .setOpacity (0.3 )
915+ widget .setGraphicsEffect (effect )
916+ else :
917+ widget .setGraphicsEffect (None )
918+
919+ def _apply_preset_scales (self , scales : list [str ]) -> None :
920+ """Apply a list of preset scales to the clinical scales container."""
921+ # Remove any existing stretches from container
922+ while self .clinical_scales_container .count ():
923+ item = self .clinical_scales_container .takeAt (0 )
924+ if item .spacerItem ():
925+ # Just remove the stretch, no widget to delete
926+ continue
927+ elif item .widget ():
928+ item .widget ().deleteLater ()
929+
930+ for scale_name in scales :
931+ self ._add_clinical_scale_row (scale_name , with_minus = True , on_remove = self .on_remove_callback )
932+
933+ self ._add_clinical_scale_row ("" , with_plus = True , on_add = self .on_add_callback )
934+ self .clinical_scales_container .addStretch ()
935+
881936 def _create_notes_group (self ) -> QGroupBox :
882937 """Create the initial notes group box."""
883938 gb_notes = QGroupBox ("Initial notes" )
0 commit comments