project method

  1. @override
LmRenderedTree project(
  1. LmNavigationState state,
  2. LmLayoutMode layoutMode
)
override

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,
  );
}