// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "MVVM/ICastable.h" #include "MVVM/ViewModels/ViewModel.h" #include "MVVM/Extensions/ICurveEditorTreeItemExtension.h" #include "MVVM/Extensions/IDeactivatableExtension.h" #include "MVVM/Extensions/IDimmableExtension.h" #include "MVVM/Extensions/IGeometryExtension.h" #include "MVVM/Extensions/IHoveredExtension.h" #include "MVVM/Extensions/IOutlinerExtension.h" #include "MVVM/Extensions/IPinnableExtension.h" #include "MVVM/Extensions/IMutableExtension.h" #include "MVVM/Extensions/ISoloableExtension.h" #include "MVVM/Extensions/HierarchicalCacheExtension.h" #include "CurveEditorTypes.h" #include "Tree/ICurveEditorTreeItem.h" class UMovieSceneSection; class UMovieSceneSequence; class UMovieSceneTrack; class FBoolProperty; class FSequencer; class IDetailsView; namespace UE { namespace Sequencer { class FSequencerEditorViewModel; class SEQUENCER_API FOutlinerItemModelMixin : public FOutlinerExtensionShim , public FGeometryExtensionShim , public FPinnableExtensionShim , public FHoveredExtensionShim , public IDimmableExtension , public FCurveEditorTreeItemExtensionShim , public ICurveEditorTreeItem { public: using Implements = TImplements; FOutlinerItemModelMixin(); TSharedPtr GetEditor() const; /*~ IOutlinerExtension */ FName GetIdentifier() const override; bool IsExpanded() const override; void SetExpansion(bool bInIsExpanded) override; bool IsFilteredOut() const override; TSharedPtr CreateContextMenuWidget(const FCreateOutlinerContextMenuWidgetParams& InParams) override; FSlateColor GetLabelColor() const override; /*~ ICurveEditorTreeItemExtension */ virtual bool HasCurves() const override; virtual TSharedPtr GetCurveEditorTreeItem() const override; virtual TOptional GetUniquePathName() const override; /*~ ICurveEditorTreeItem */ virtual TSharedPtr GenerateCurveEditorTreeWidget(const FName& InColumnName, TWeakPtr InCurveEditor, FCurveEditorTreeItemID InTreeItemID, const TSharedRef& InTableRow) override; virtual void CreateCurveModels(TArray>& OutCurveModels) override; virtual bool PassesFilter(const FCurveEditorTreeFilter* InFilter) const override; /*~ IPinnableExtension */ bool IsPinned() const override; /*~ IDimmableExtension */ bool IsDimmed() const override; /** Get context menu contents. */ virtual void BuildContextMenu(FMenuBuilder& MenuBuilder); virtual void BuildSidebarMenu(FMenuBuilder& MenuBuilder); protected: /** Set identifier for computing node paths */ void SetIdentifier(FName InNewIdentifier); /** Get the default expansion state if it wasn't saved in the movie-scene data */ virtual bool GetDefaultExpansionState() const; /** Set expansion state without saving it in the movie-scene data */ void SetExpansionWithoutSaving(bool bInIsExpanded); virtual void BuildSectionColorTintsMenu(FMenuBuilder& MenuBuilder); virtual void BuildOrganizeContextMenu(FMenuBuilder& MenuBuilder); virtual void BuildDisplayOptionsMenu(FMenuBuilder& MenuBuilder); virtual void BuildTrackOptionsMenu(FMenuBuilder& MenuBuilder, const TArray& InTracks); virtual void BuildTrackRowOptionsMenu(FMenuBuilder& MenuBuilder); private: virtual FViewModel* AsViewModel() = 0; virtual const FViewModel* AsViewModel() const = 0; protected: FViewModelListHead OutlinerChildList; private: bool IsRootModelPinned() const; void ToggleRootModelPinned(); ECheckBoxState SelectedModelsSoloState() const; void ToggleSelectedModelsSolo(); ECheckBoxState SelectedModelsMuteState() const; void ToggleSelectedModelsMuted(); TArray GetSelectedSections() const; TArray GetSelectedTracks() const; TArray> GetSelectedTrackRows() const; void AddEvalOptionsPropertyMenuItem(FMenuBuilder& InMenuBuilder, const FBoolProperty* InProperty, TFunction InValidator = nullptr); void AddDisplayOptionsPropertyMenuItem(FMenuBuilder& InMenuBuilder, const FBoolProperty* InProperty, TFunction InValidator = nullptr); private: ICastable* CastableThis; FName TreeItemIdentifier; FCurveEditorTreeItemID CurveEditorItemID; mutable bool bInitializedExpansion; mutable bool bInitializedPinnedState; }; // // Note: You must add the base class you use as a template parameter to the UE_SEQUENCER_DECLARE_CASTABLE list // template class TOutlinerModelMixin : public BaseType, public FOutlinerItemModelMixin { public: template TOutlinerModelMixin(ArgTypes&&... InArgs) : BaseType(Forward(InArgs)...) { this->RegisterChildList(&this->OutlinerChildList); } TOutlinerModelMixin(const TOutlinerModelMixin&) = delete; TOutlinerModelMixin operator=(const TOutlinerModelMixin&) = delete; TOutlinerModelMixin(TOutlinerModelMixin&&) = delete; TOutlinerModelMixin operator=(TOutlinerModelMixin&&) = delete; virtual FViewModel* AsViewModel() { return this; } virtual const FViewModel* AsViewModel() const { return this; } }; class SEQUENCER_API FOutlinerItemModel : public TOutlinerModelMixin { public: UE_SEQUENCER_DECLARE_CASTABLE(FOutlinerItemModel, FViewModel, FOutlinerItemModelMixin); }; class SEQUENCER_API FEvaluableOutlinerItemModel : public FOutlinerItemModel , public IMutableExtension , public ISoloableExtension , public IDeactivatableExtension { public: UE_SEQUENCER_DECLARE_CASTABLE(FEvaluableOutlinerItemModel , FOutlinerItemModel , IMutableExtension , ISoloableExtension , IDeactivatableExtension); /*~ ISoloableExtension */ bool IsSolo() const override; void SetIsSoloed(bool bIsSoloed) override; /*~ IMutableExtension */ bool IsMuted() const override; void SetIsMuted(bool bIsMuted) override; /*~ IDeactivatableExtension */ virtual bool IsDeactivated() const override; virtual void SetIsDeactivated(const bool bInIsDeactivated) override; }; class SEQUENCER_API FOutlinerCacheExtension : public FHierarchicalCacheExtension { public: UE_SEQUENCER_DECLARE_VIEW_MODEL_TYPE_ID(FOutlinerCacheExtension); FOutlinerCacheExtension() { ModelListFilter = EViewModelListType::Outliner; } }; } // namespace Sequencer } // namespace UE