handleExpandNonPrimitives method
- String nodeId
Handle "expand non-primitives" button click.
Reveals all non-primitive (submodule) hidden children of nodeId
via partial expansion. Uses the same mechanism as port expansion
but targets all submodules at once.
Implementation
Future<SchematicLayoutResult?> handleExpandNonPrimitives(
String nodeId,
) async {
if (isToggling) {
return null;
}
final engine = _layoutEngine;
if (engine == null || schematicAdapter == null) {
return null;
}
setState(() {
isToggling = true;
togglingLabel = 'Expanding...';
pendingToggleNodeId = nodeId;
});
// Let the spinner appear before heavy processing.
final completer = Completer<void>();
WidgetsBinding.instance.addPostFrameCallback((_) {
completer.complete();
});
await completer.future;
SchedulerBinding.instance.ensureVisualUpdate();
try {
final expanded = schematicAdapter!.expandNonPrimitives(nodeId);
if (!expanded) {
if (mounted) {
setState(() {
isToggling = false;
pendingToggleNodeId = null;
});
}
return null;
}
final elkGraph = schematicAdapter!.schematic.toJsGraph();
final newLayout = await engine.computeLayoutFromElkGraph(
elkGraph,
sessionId: _sessionId,
);
if (newLayout.hasError || !mounted) {
if (mounted) {
setState(() {
isToggling = false;
pendingToggleNodeId = null;
});
}
return null;
}
setState(() {
layout = newLayout;
isToggling = false;
pendingToggleNodeId = null;
// Fit the newly expanded node in view.
focusPortId = null;
recentlyToggledNodeId = nodeId;
});
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
setState(() {
recentlyToggledNodeId = null;
});
}
});
return newLayout;
} on Exception {
if (mounted) {
setState(() {
isToggling = false;
pendingToggleNodeId = null;
});
}
return null;
}
}