@@ -91,7 +91,7 @@ def __init__(self, parent_style=None):
9191
9292 def get_header_title (self ) -> str :
9393 """Return the wizard header title for Step 3."""
94- return self . _get_step_title ()
94+ return "Programming Session Ongoing"
9595
9696 def _undo_last_entry (self ) -> None :
9797 """Show confirmation dialog and delete the last block_ID entry from TSV."""
@@ -110,65 +110,15 @@ def _undo_last_entry(self) -> None:
110110 def _setup_ui (self ) -> None :
111111 """Set up the UI layout."""
112112
113- # Left macro-panel: Stimulation params + electrodes
114- left_container = QGroupBox ("Session settings" )
115- left_container .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
116- left_container_layout = QHBoxLayout (left_container )
117- left_container_layout .setContentsMargins (0 , 0 , 0 , 0 )
113+ # Left side: Session settings (params + electrodes)
114+ left_widget = QWidget ()
115+ left_layout = QVBoxLayout (left_widget )
116+ left_layout .setContentsMargins (0 , 0 , 0 , 0 )
117+ settings_group = self ._create_session_settings_group ()
118+ left_layout .addWidget (settings_group )
119+ left_widget .setMinimumWidth (500 )
118120
119- params_group = self ._create_stimulation_params_group ()
120-
121- # Wrap sidebar in a scroll area like step1_view
122- sidebar_widget = params_group
123- sidebar_scroll = QScrollArea ()
124- sidebar_scroll .setStyleSheet ("""
125- QScrollArea {
126- background: transparent;
127- border: none;
128- }
129- QScrollArea > QWidget > QWidget {
130- background: transparent;
131- }
132- """ )
133- sidebar_scroll .setWidgetResizable (True )
134- sidebar_scroll .setFrameShape (QFrame .NoFrame )
135- sidebar_scroll .setHorizontalScrollBarPolicy (Qt .ScrollBarAlwaysOff )
136- sidebar_scroll .setVerticalScrollBarPolicy (Qt .ScrollBarAsNeeded )
137- sidebar_scroll .setWidget (sidebar_widget )
138-
139- left_container_layout .addWidget (sidebar_scroll , 1 )
140-
141- electrodes_layout = QVBoxLayout ()
142- electrodes_row = QHBoxLayout ()
143-
144- self .left_canvas_group = QGroupBox ("Left electrode" )
145- self .left_canvas_group .setCheckable (True )
146- self .left_canvas_group .setChecked (True )
147- self .left_canvas_group .toggled .connect (
148- lambda checked : self ._toggle_electrode ("left" , checked )
149- )
150- left_canvas_layout = QVBoxLayout ()
151- left_canvas_layout .addWidget (self .left_canvas , 1 )
152- self .left_canvas_group .setLayout (left_canvas_layout )
153-
154- self .right_canvas_group = QGroupBox ("Right electrode" )
155- self .right_canvas_group .setCheckable (True )
156- self .right_canvas_group .setChecked (True )
157- self .right_canvas_group .toggled .connect (
158- lambda checked : self ._toggle_electrode ("right" , checked )
159- )
160- right_canvas_layout = QVBoxLayout ()
161- right_canvas_layout .addWidget (self .right_canvas , 1 )
162- self .right_canvas_group .setLayout (right_canvas_layout )
163-
164- electrodes_row .addWidget (self .left_canvas_group , 1 )
165- electrodes_row .addWidget (self .right_canvas_group , 1 )
166-
167- electrodes_layout .addLayout (electrodes_row )
168- electrodes_layout .addLayout (self ._create_electrode_legend_layout ())
169- left_container_layout .addLayout (electrodes_layout , 2 )
170-
171- # Right macro-panel: Scales and notes
121+ # Right side: Scales and notes
172122 right_widget = QWidget ()
173123 right_layout = QVBoxLayout (right_widget )
174124 right_layout .setContentsMargins (0 , 0 , 0 , 0 )
@@ -177,20 +127,17 @@ def _setup_ui(self) -> None:
177127 right_layout .addWidget (create_horizontal_line ())
178128 notes_group = self ._create_session_notes_group ()
179129 right_layout .addWidget (notes_group )
180-
181- # left_container.setMinimumWidth(500)
182130 right_widget .setMinimumWidth (400 )
183131
184132 # Splitter: right panel shrinks first (stretch=1), left stays stable (stretch=0)
185133 splitter = QSplitter (Qt .Horizontal )
186- splitter .addWidget (left_container )
134+ splitter .addWidget (left_widget )
187135 splitter .addWidget (right_widget )
188136 splitter .setStretchFactor (0 , 0 )
189137 splitter .setStretchFactor (1 , 1 )
190138 splitter .setChildrenCollapsible (False )
191139
192140 self .main_layout .addWidget (splitter )
193- # self.main_layout.addStretch(1)
194141
195142 self .undo_button = QPushButton ("Undo" )
196143 self .undo_button .setIcon (
@@ -231,12 +178,14 @@ def _setup_ui(self) -> None:
231178 # Set menu to button
232179 self .export_button .setMenu (self .export_menu )
233180
234- def _create_stimulation_params_group (self ) -> QWidget :
235- """Create the stimulation parameters container."""
236- container = QWidget ()
237- container .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
238- # container.setMinimumWidth(380)
239- sidebar_layout = QVBoxLayout (container )
181+ def _create_session_settings_group (self ) -> QGroupBox :
182+ """Create the session settings group box."""
183+ gb_session = QGroupBox ("Session settings" )
184+ gb_session .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Expanding )
185+
186+ container_layout = QHBoxLayout ()
187+
188+ sidebar_layout = QVBoxLayout ()
240189
241190 group_row = QGroupBox ("Program" )
242191 group_row_layout = QHBoxLayout ()
@@ -262,8 +211,6 @@ def _create_stimulation_params_group(self) -> QWidget:
262211 edit_programs_btn .clicked .connect (self ._edit_program_names )
263212 group_row_layout .addWidget (edit_programs_btn )
264213
265- group_row_layout .addStretch ()
266-
267214 group_row .setLayout (group_row_layout )
268215
269216 freq_limits = STIMULATION_LIMITS ["frequency" ]
@@ -447,7 +394,61 @@ def _create_stimulation_params_group(self) -> QWidget:
447394 sidebar_layout .addWidget (self .right_group )
448395 sidebar_layout .addStretch (1 )
449396
450- return container
397+ sidebar_widget = QWidget ()
398+ sidebar_widget .setLayout (sidebar_layout )
399+ sidebar_scroll = QScrollArea ()
400+ sidebar_scroll .setStyleSheet ("""
401+ QScrollArea {
402+ background: transparent;
403+ border: none;
404+ }
405+ QScrollArea > QWidget > QWidget {
406+ background: transparent;
407+ }
408+ """ )
409+ sidebar_scroll .setWidgetResizable (True )
410+ sidebar_scroll .setFrameShape (QFrame .NoFrame )
411+ sidebar_scroll .setHorizontalScrollBarPolicy (Qt .ScrollBarAlwaysOff )
412+ sidebar_scroll .setVerticalScrollBarPolicy (Qt .ScrollBarAsNeeded )
413+ sidebar_scroll .setMinimumWidth (380 )
414+ sidebar_scroll .setWidget (sidebar_widget )
415+
416+ electrodes_layout = QVBoxLayout ()
417+ electrodes_row = QHBoxLayout ()
418+
419+ self .left_canvas_group = QGroupBox ("Left electrode" )
420+ self .left_canvas_group .setCheckable (True )
421+ self .left_canvas_group .setChecked (True )
422+ self .left_canvas_group .toggled .connect (
423+ lambda checked : self ._toggle_electrode ("left" , checked )
424+ )
425+ left_canvas_layout = QVBoxLayout ()
426+ left_canvas_layout .addWidget (self .left_canvas , 1 )
427+ self .left_canvas_group .setLayout (left_canvas_layout )
428+
429+ self .right_canvas_group = QGroupBox ("Right electrode" )
430+ self .right_canvas_group .setCheckable (True )
431+ self .right_canvas_group .setChecked (True )
432+ self .right_canvas_group .toggled .connect (
433+ lambda checked : self ._toggle_electrode ("right" , checked )
434+ )
435+ right_canvas_layout = QVBoxLayout ()
436+ right_canvas_layout .addWidget (self .right_canvas , 1 )
437+ self .right_canvas_group .setLayout (right_canvas_layout )
438+
439+ electrodes_row .addWidget (self .left_canvas_group , 1 )
440+ electrodes_row .addWidget (self .right_canvas_group , 1 )
441+
442+ electrodes_layout .addLayout (electrodes_row )
443+ electrodes_layout .addLayout (self ._create_electrode_legend_layout ())
444+
445+ container_layout .addWidget (sidebar_scroll , 0 )
446+ container_layout .addLayout (electrodes_layout , 1 )
447+
448+ layout = QVBoxLayout (gb_session )
449+ layout .addLayout (container_layout )
450+
451+ return gb_session
451452
452453 def _on_left_canvas_validation (self , is_valid : bool , error_msg : str ) -> None :
453454 """Callback when left electrode canvas validation state changes."""
0 commit comments