207 lines
6.4 KiB
C++
207 lines
6.4 KiB
C++
// 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<IOutlinerExtension, IGeometryExtension, IPinnableExtension, IHoveredExtension, IDimmableExtension, ICurveEditorTreeItemExtension>;
|
|
|
|
FOutlinerItemModelMixin();
|
|
|
|
TSharedPtr<FSequencerEditorViewModel> GetEditor() const;
|
|
|
|
/*~ IOutlinerExtension */
|
|
FName GetIdentifier() const override;
|
|
bool IsExpanded() const override;
|
|
void SetExpansion(bool bInIsExpanded) override;
|
|
bool IsFilteredOut() const override;
|
|
TSharedPtr<SWidget> CreateContextMenuWidget(const FCreateOutlinerContextMenuWidgetParams& InParams) override;
|
|
FSlateColor GetLabelColor() const override;
|
|
|
|
/*~ ICurveEditorTreeItemExtension */
|
|
virtual bool HasCurves() const override;
|
|
virtual TSharedPtr<ICurveEditorTreeItem> GetCurveEditorTreeItem() const override;
|
|
virtual TOptional<FString> GetUniquePathName() const override;
|
|
|
|
/*~ ICurveEditorTreeItem */
|
|
virtual TSharedPtr<SWidget> GenerateCurveEditorTreeWidget(const FName& InColumnName, TWeakPtr<FCurveEditor> InCurveEditor, FCurveEditorTreeItemID InTreeItemID, const TSharedRef<ITableRow>& InTableRow) override;
|
|
virtual void CreateCurveModels(TArray<TUniquePtr<FCurveModel>>& 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<UMovieSceneTrack*>& 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<UMovieSceneSection*> GetSelectedSections() const;
|
|
TArray<UMovieSceneTrack*> GetSelectedTracks() const;
|
|
TArray<TPair<UMovieSceneTrack*, int32>> GetSelectedTrackRows() const;
|
|
|
|
void AddEvalOptionsPropertyMenuItem(FMenuBuilder& InMenuBuilder, const FBoolProperty* InProperty, TFunction<bool(UMovieSceneTrack*)> InValidator = nullptr);
|
|
void AddDisplayOptionsPropertyMenuItem(FMenuBuilder& InMenuBuilder, const FBoolProperty* InProperty, TFunction<bool(UMovieSceneTrack*)> 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<typename BaseType>
|
|
class TOutlinerModelMixin : public BaseType, public FOutlinerItemModelMixin
|
|
{
|
|
public:
|
|
|
|
template<typename... ArgTypes>
|
|
TOutlinerModelMixin(ArgTypes&&... InArgs)
|
|
: BaseType(Forward<ArgTypes>(InArgs)...)
|
|
{
|
|
this->RegisterChildList(&this->OutlinerChildList);
|
|
}
|
|
|
|
TOutlinerModelMixin(const TOutlinerModelMixin<BaseType>&) = delete;
|
|
TOutlinerModelMixin<BaseType> operator=(const TOutlinerModelMixin<BaseType>&) = delete;
|
|
|
|
TOutlinerModelMixin(TOutlinerModelMixin<BaseType>&&) = delete;
|
|
TOutlinerModelMixin<BaseType> operator=(TOutlinerModelMixin<BaseType>&&) = delete;
|
|
|
|
virtual FViewModel* AsViewModel() { return this; }
|
|
virtual const FViewModel* AsViewModel() const { return this; }
|
|
};
|
|
|
|
class SEQUENCER_API FOutlinerItemModel : public TOutlinerModelMixin<FViewModel>
|
|
{
|
|
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
|
|
|