void SAnimationOutlinerView::Construct( const FArguments& InArgs, TSharedRef<FSequencerDisplayNode> InRootNode, FSequencer* InSequencer ) { SAnimationOutlinerViewBase::Construct( SAnimationOutlinerViewBase::FArguments(), InRootNode ); Sequencer = InSequencer; GenerateWidgetForNode( InRootNode ); SetVisibility( TAttribute<EVisibility>( this, &SAnimationOutlinerView::GetNodeVisibility ) ); }
void SSequencerTrackArea::GenerateLayoutNodeWidgetsRecursive( const TArray< TSharedRef<FSequencerDisplayNode> >& Nodes ) { for( int32 NodeIndex = 0; NodeIndex < Nodes.Num(); ++NodeIndex ) { TSharedRef<FSequencerDisplayNode> Node = Nodes[NodeIndex]; // The section area encompasses multiple logical child nodes so we do not generate children that arent section areas (they would not be top level nodes in that case) if( Node->GetType() == ESequencerNode::Track ) { GenerateWidgetForNode( Node ); GenerateLayoutNodeWidgetsRecursive( Node->GetChildNodes() ); } } }
void SAnimationOutlinerView::GenerateWidgetForNode( TSharedRef<FSequencerDisplayNode>& InLayoutNode ) { Children.Add( SNew( SAnimationOutlinerTreeNode, InLayoutNode) .OnSelectionChanged( this, &SAnimationOutlinerView::OnSelectionChanged ) ); // Object nodes do not generate widgets for their children if( InLayoutNode->GetType() != ESequencerNode::Object ) { const TArray< TSharedRef<FSequencerDisplayNode> >& ChildNodes = InLayoutNode->GetChildNodes(); for( int32 ChildIndex = 0; ChildIndex < ChildNodes.Num(); ++ChildIndex ) { TSharedRef<FSequencerDisplayNode> ChildNode = ChildNodes[ChildIndex]; GenerateWidgetForNode( ChildNode ); } } }
void SSequencerTrackArea::Update( TSharedPtr<FSequencerNodeTree> InSequencerNodeTree ) { ScrollBox->ClearChildren(); const TArray< TSharedRef<FSequencerDisplayNode> >& RootNodes = InSequencerNodeTree->GetRootNodes(); for( int32 RootNodeIndex = 0; RootNodeIndex < RootNodes.Num(); ++RootNodeIndex ) { TSharedRef<FSequencerDisplayNode> RootNode = RootNodes[RootNodeIndex]; // Generate a widget for each root node GenerateWidgetForNode( RootNode ); // Generate a node for each children of the root node GenerateLayoutNodeWidgetsRecursive( RootNode->GetChildNodes() ); } // @todo Sequencer - Remove this expensive operation ScrollBox->SlatePrepass(); CurveEditor->SetSequencerNodeTree(InSequencerNodeTree); }