handleConvertToBlocksOnlyRecursive method
- String nodeId
Recursive version of handleConvertToBlocksOnly (Shift+click).
Converts to blocks-only mode down the full hierarchy.
Implementation
Future<SchematicLayoutResult?> handleConvertToBlocksOnlyRecursive(
String nodeId,
) async {
if (isToggling) {
return null;
}
final engine = _layoutEngine;
if (engine == null || schematicAdapter == null) {
return null;
}
setState(() {
isToggling = true;
togglingLabel = 'Collapsing...';
pendingToggleNodeId = nodeId;
});
final completer = Completer<void>();
WidgetsBinding.instance.addPostFrameCallback((_) {
completer.complete();
});
await completer.future;
SchedulerBinding.instance.ensureVisualUpdate();
try {
final converted = schematicAdapter!.convertToBlocksOnlyRecursive(nodeId);
if (!converted) {
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;
recentlyToggledNodeId = nodeId;
});
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
setState(() {
recentlyToggledNodeId = null;
});
}
});
return newLayout;
} on Exception {
if (mounted) {
setState(() {
isToggling = false;
pendingToggleNodeId = null;
});
}
return null;
}
}