// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Widgets/SCompoundWidget.h" #include "Widgets/Views/STreeView.h" class FStateTreeViewModel; class ITableRow; class SScrollBar; class STableViewBase; namespace ESelectInfo { enum Type : int; } struct FPropertyChangedEvent; class UStateTreeState; class SScrollBox; class FUICommandList; class SStateTreeView : public SCompoundWidget { public: SLATE_BEGIN_ARGS(SStateTreeView) {} SLATE_END_ARGS() SStateTreeView(); virtual ~SStateTreeView() override; void Construct(const FArguments& InArgs, TSharedRef StateTreeViewModel, const TSharedRef& InCommandList); void SavePersistentExpandedStates(); TSharedPtr GetViewModel() const; void SetSelection(const TArray>& SelectedStates) const; private: virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override; virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override; void UpdateTree(bool bExpandPersistent = false); //~ Editor/User settings handlers void HandleUserSettingsChanged(); //~ ViewModel handlers void HandleModelAssetChanged(); void HandleModelStatesRemoved(const TSet& AffectedParents); void HandleModelStatesMoved(const TSet& AffectedParents, const TSet& MovedStates); void HandleModelStateAdded(UStateTreeState* ParentState, UStateTreeState* NewState); void HandleModelStatesChanged(const TSet& AffectedStates, const FPropertyChangedEvent& PropertyChangedEvent); void HandleModelStateNodesChanged(const UStateTreeState* AffectedState); void HandleModelSelectionChanged(const TArray>& SelectedStates); //~ Treeview handlers TSharedRef HandleGenerateRow(TWeakObjectPtr InState, const TSharedRef& InOwnerTableView); void HandleGetChildren(TWeakObjectPtr InParent, TArray>& OutChildren); void HandleTreeSelectionChanged(TWeakObjectPtr InSelectedItem, ESelectInfo::Type SelectionType); void HandleTreeExpansionChanged(TWeakObjectPtr InSelectedItem, bool bExpanded); TSharedPtr HandleContextMenuOpening(); TSharedRef HandleGenerateSettingsMenu(); //~ Action handlers //~ @todo: these are also defined in the outliner, figure out how to share code. UStateTreeState* GetFirstSelectedState() const; FReply HandleAddStateButton(); void HandleAddSiblingState(); void HandleAddChildState(); void HandleCutSelectedStates(); void HandleCopySelectedStates(); void HandlePasteStatesAsSiblings(); void HandlePasteStatesAsChildren(); void HandleDuplicateSelectedStates(); void HandleRenameState(); void HandleDeleteStates(); void HandleEnableSelectedStates(); void HandleDisableSelectedStates(); bool HasSelection() const; bool CanPaste() const; bool CanEnableStates() const; bool CanDisableStates() const; void BindCommands(); TSharedPtr StateTreeViewModel; TSharedPtr>> TreeView; TSharedPtr ExternalScrollbar; TSharedPtr ViewBox; TArray> Subtrees; TSharedPtr CommandList; UStateTreeState* RequestedRenameState; FDelegateHandle SettingsChangedHandle; bool bItemsDirty; bool bUpdatingSelection; };