@@ -497,6 +497,42 @@ def _create_nested_container(manager: ParameterFormManager, param_info: Paramete
497497 return container
498498
499499
500+ def _create_inline_dataclass_container (
501+ manager : ParameterFormManager ,
502+ param_info : ParameterInfo ,
503+ display_info : DisplayInfo ,
504+ field_ids : FieldIds ,
505+ current_value : Any ,
506+ unwrapped_type : Optional [Type ],
507+ layout = None ,
508+ CURRENT_LAYOUT = None ,
509+ QWidget = None ,
510+ GroupBoxWithHelp = None ,
511+ PyQt6ColorScheme = None ,
512+ ) -> Any :
513+ """Create dataclass chrome for a registered inline dataclass editor."""
514+ from pyqt_reactive .widgets .shared .clickable_help_components import (
515+ InlineDataclassGroupBox ,
516+ )
517+ from pyqt_reactive .theming .color_scheme import ColorScheme as PCS
518+
519+ color_scheme = manager .config .color_scheme or PCS ()
520+ root_manager = manager
521+ while getattr (root_manager , '_parent_manager' , None ) is not None :
522+ root_manager = root_manager ._parent_manager
523+ flash_key = f"{ manager .field_id } .{ param_info .name } " if manager .field_id else param_info .name
524+ scope_accent_color = getattr (manager , '_scope_accent_color' , None )
525+
526+ return InlineDataclassGroupBox (
527+ title = display_info ['field_label' ],
528+ help_target = unwrapped_type ,
529+ color_scheme = color_scheme ,
530+ scope_accent_color = scope_accent_color ,
531+ flash_key = flash_key ,
532+ flash_manager = root_manager ,
533+ )
534+
535+
500536def _create_inline_dataclass_widget (
501537 manager : ParameterFormManager ,
502538 param_info : ParameterInfo ,
@@ -612,12 +648,12 @@ def _setup_optional_nested_layout(manager: ParameterFormManager, param_info: Par
612648 WidgetCreationType .INLINE_DATACLASS : WidgetCreationConfig (
613649 layout_type = 'GroupBoxWithHelp' ,
614650 is_nested = True ,
615- create_container = _create_nested_container ,
651+ create_container = _create_inline_dataclass_container ,
616652 setup_layout = None ,
617653 create_main_widget = _create_inline_dataclass_widget ,
618654 needs_label = False ,
619655 needs_reset_button = False ,
620- needs_unwrap_type = False ,
656+ needs_unwrap_type = True ,
621657 is_optional = False ,
622658 ),
623659
@@ -982,29 +1018,39 @@ def create_widget_parametric(manager: ParameterFormManager, param_info: Paramete
9821018 unwrapped_type
9831019 )
9841020
1021+ def on_widget_change (pname , value , mgr : ParameterFormManager = manager ):
1022+ converted_value = mgr ._convert_widget_value (value , pname )
1023+ event = FieldChangeEvent (pname , converted_value , mgr )
1024+ from objectstate import ObjectStateRegistry
1025+
1026+ if mgr .state and mgr .state ._parent_state is not None :
1027+ with ObjectStateRegistry .atomic ("edit func parameter" ):
1028+ FieldChangeDispatcher .instance ().dispatch (event )
1029+ else :
1030+ FieldChangeDispatcher .instance ().dispatch (event )
1031+
9851032 # Store widget and connect signals
9861033 if config .is_nested :
987- # For nested, store the GroupBox/container
988- manager .widgets [param_info .name ] = container
989- logger .debug (f"[CREATE_NESTED_DATACLASS] param_info.name={ param_info .name } , stored container in manager.widgets" )
1034+ if creation_type is WidgetCreationType .INLINE_DATACLASS :
1035+ container .set_value_widget (main_widget )
1036+ manager .widgets [param_info .name ] = container
1037+ PyQt6WidgetEnhancer .connect_change_signal (
1038+ container ,
1039+ param_info .name ,
1040+ on_widget_change ,
1041+ )
1042+ logger .debug (
1043+ "[CREATE_INLINE_DATACLASS] param_info.name=%s, stored inline container in manager.widgets" ,
1044+ param_info .name ,
1045+ )
1046+ else :
1047+ # For nested, store the GroupBox/container
1048+ manager .widgets [param_info .name ] = container
1049+ logger .debug (f"[CREATE_NESTED_DATACLASS] param_info.name={ param_info .name } , stored container in manager.widgets" )
9901050 else :
9911051 # For regular, store the main widget
9921052 manager .widgets [param_info .name ] = main_widget
9931053
994- # Connect widget changes to dispatcher
995- # NOTE: connect_change_signal calls callback(param_name, value)
996- def on_widget_change (pname , value , mgr : ParameterFormManager = manager ):
997- converted_value = mgr ._convert_widget_value (value , pname )
998- event = FieldChangeEvent (pname , converted_value , mgr )
999- # ATOMIC: If this manager's state has a parent (e.g., function in step),
1000- # wrap dispatch in atomic to coalesce with parent step update
1001- from objectstate import ObjectStateRegistry
1002- if mgr .state and mgr .state ._parent_state is not None :
1003- with ObjectStateRegistry .atomic ("edit func parameter" ):
1004- FieldChangeDispatcher .instance ().dispatch (event )
1005- else :
1006- FieldChangeDispatcher .instance ().dispatch (event )
1007-
10081054 PyQt6WidgetEnhancer .connect_change_signal (main_widget , param_info .name , on_widget_change )
10091055
10101056 if manager .read_only :
0 commit comments