@@ -295,6 +295,58 @@ def _apply_nested_config_styling(self, manager, resolved_value: bool) -> None:
295295 effect .setOpacity (0.4 )
296296 widget .setGraphicsEffect (effect )
297297
298+ # Update provenance button visibility and title label underline
299+ self ._update_title_label_styling (manager )
300+
301+ def _update_title_label_styling (self , manager ) -> None :
302+ """
303+ Update title label styling for nested configs with enabled fields.
304+
305+ This handles:
306+ - Provenance button visibility (only show when provenance source available)
307+ - Title label underline (when enabled field's value differs from signature)
308+
309+ Args:
310+ manager: ParameterFormManager instance (nested manager)
311+ """
312+ # Only apply to nested configs
313+ if manager ._parent_manager is None :
314+ return
315+
316+ # Find the GroupBox and param_name for this nested manager
317+ group_box = None
318+ param_name = None
319+ for pn , nested_manager in manager ._parent_manager .nested_managers .items ():
320+ if nested_manager == manager :
321+ group_box = manager ._parent_manager .widgets .get (pn )
322+ param_name = pn
323+ break
324+
325+ if not group_box :
326+ return
327+
328+ # Get title label from GroupBox
329+ title_label = getattr (group_box , '_title_label' , None )
330+ if not title_label :
331+ return
332+
333+ # Update provenance button visibility
334+ # The button is in the title layout, we need to find it
335+ from pyqt_reactive .widgets .shared .clickable_help_components import ProvenanceButton
336+ for widget in group_box .title_layout .findChildren (ProvenanceButton ):
337+ if hasattr (widget , 'update_visibility_based_on_provenance' ):
338+ widget .update_visibility_based_on_provenance ()
339+ logger .debug (f"[TITLE_STYLING] Updated provenance button visibility for { param_name } " )
340+ break
341+
342+ # Update title label underline based on signature diff
343+ dotted_path = f'{ manager .field_id } .{ param_name } ' if manager .field_id else param_name
344+ should_underline = dotted_path in manager .state .signature_diff_fields
345+ font = title_label .font ()
346+ font .setUnderline (should_underline )
347+ title_label .setFont (font )
348+ logger .debug (f"[TITLE_STYLING] field_id={ param_name } , should_underline={ should_underline } " )
349+
298350 # CRITICAL: Trigger a visual update so opacity effects are rendered
299351 # Qt doesn't automatically render QGraphicsOpacityEffect changes
300352 # Use repaint() for immediate synchronous update, not update() which is async
0 commit comments