FKeyAreaLayout::FKeyAreaLayout(FSequencerDisplayNode& InNode, int32 InSectionIndex) { TotalHeight = 0.f; float LastPadding = 0.f; auto SetupKeyArea = [&](FSequencerDisplayNode& Node){ if (Node.GetType() == ESequencerNode::KeyArea) { Elements.Add(FKeyAreaLayoutElement::FromKeyAreaNode(StaticCastSharedRef<FSectionKeyAreaNode>(Node.AsShared()), InSectionIndex, TotalHeight)); } else if (!Node.IsExpanded()) { Elements.Add(FKeyAreaLayoutElement::FromGroup(Node.UpdateKeyGrouping(InSectionIndex), TotalHeight, Node.GetNodeHeight())); } }; // First, layout the parent { FSequencerDisplayNode* LayoutNode = &InNode; if (InNode.GetType() == ESequencerNode::Track) { TSharedPtr<FSequencerDisplayNode> KeyAreaNode = static_cast<FTrackNode&>(InNode).GetTopLevelKeyNode(); if (KeyAreaNode.IsValid()) { LayoutNode = KeyAreaNode.Get(); } } SetupKeyArea(*LayoutNode); LastPadding = LayoutNode->GetNodePadding().Bottom; TotalHeight += LayoutNode->GetNodeHeight() + LastPadding; } // Then any children InNode.TraverseVisible_ParentFirst([&](FSequencerDisplayNode& Node){ TotalHeight += Node.GetNodePadding().Top; SetupKeyArea(Node); LastPadding = Node.GetNodePadding().Bottom; TotalHeight += Node.GetNodeHeight() + LastPadding; return true; }, false); // Remove the padding from the bottom TotalHeight -= LastPadding; }
FSectionLayout::FSectionLayout(FSequencerDisplayNode& InNode, int32 InSectionIndex) { float VerticalOffset = 0.f; auto SetupKeyArea = [&](FSequencerDisplayNode& Node){ if (Node.GetType() == ESequencerNode::KeyArea) { Elements.Add(FSectionLayoutElement::FromKeyAreaNode( StaticCastSharedRef<FSequencerSectionKeyAreaNode>(Node.AsShared()), InSectionIndex, VerticalOffset )); } else if (Node.GetType() == ESequencerNode::Track && static_cast<FSequencerTrackNode&>(Node).GetTopLevelKeyNode().IsValid()) { Elements.Add(FSectionLayoutElement::FromTrack( StaticCastSharedRef<FSequencerTrackNode>(Node.AsShared()), InSectionIndex, VerticalOffset )); } else if (!Node.IsExpanded()) { Elements.Add(FSectionLayoutElement::FromGroup( Node.AsShared(), Node.UpdateKeyGrouping(InSectionIndex), VerticalOffset )); } else { // It's benign space Elements.Add(FSectionLayoutElement::EmptySpace( Node.AsShared(), VerticalOffset )); } }; // First, layout the parent { VerticalOffset += InNode.GetNodePadding().Top; SetupKeyArea(InNode); VerticalOffset += InNode.GetNodeHeight() + InNode.GetNodePadding().Bottom; } // Then any children InNode.TraverseVisible_ParentFirst([&](FSequencerDisplayNode& Node){ VerticalOffset += Node.GetNodePadding().Top; SetupKeyArea(Node); VerticalOffset += Node.GetNodeHeight() + Node.GetNodePadding().Bottom; return true; }, false); }