project method
Implementation
@override
LmRenderedTree project(LmNavigationState state, LmLayoutMode layoutMode) {
final activeBranch = state.branches[state.activeBranchId];
if (activeBranch == null || activeBranch.semanticStack.isEmpty) {
return LmRenderedTree(
kind: layoutMode == LmLayoutMode.compact
? LmRenderedTreeKind.compactStack
: LmRenderedTreeKind.expandedSplit,
activeBranchId: state.activeBranchId,
);
}
if (layoutMode == LmLayoutMode.compact) {
return LmRenderedTree(
kind: LmRenderedTreeKind.compactStack,
activeBranchId: state.activeBranchId,
compactStack: activeBranch.semanticStack,
);
}
final semanticStack = activeBranch.semanticStack;
final primaryStack = [semanticStack.first];
final secondaryStack = <LmRouteNode>[];
final overlayStack = <LmRouteNode>[];
final modalStack = <LmRouteNode>[];
for (var index = 1; index < semanticStack.length; index += 1) {
final node = semanticStack[index];
if (node.detailPolicy == LmDetailPolicy.replaceSecondary) {
secondaryStack
..clear()
..add(node);
} else if (node.detailPolicy == LmDetailPolicy.modalOnExpanded) {
modalStack.add(node);
} else if (_usesSecondaryPane(node)) {
secondaryStack.add(node);
} else {
overlayStack.add(node);
}
}
return LmRenderedTree(
kind: LmRenderedTreeKind.expandedSplit,
activeBranchId: state.activeBranchId,
primaryStack: primaryStack,
secondaryStack: secondaryStack,
overlayStack: overlayStack,
modalStack: modalStack,
);
}