// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Widgets/SCompoundWidget.h" #include "Containers/ArrayView.h" struct FAssetData; class IPersonaPreviewScene; class UBlendProfile; struct FSelectedSocketInfo; class ISkeletonTreeBuilder; class ISkeletonTreeItem; class FMenuBuilder; class FExtender; class IPinnedCommandList; // Called when an item is selected/deselected DECLARE_MULTICAST_DELEGATE_TwoParams(FOnSkeletonTreeSelectionChangedMulticast, const TArrayView>& /* InSelectedItems */, ESelectInfo::Type /* SelectInfo */); // Called when an item is selected/deselected typedef FOnSkeletonTreeSelectionChangedMulticast::FDelegate FOnSkeletonTreeSelectionChanged; // Called when a bone is selected - DEPRECATED, please use FOnSkeletonTreeSelectionChangedMulticast DECLARE_MULTICAST_DELEGATE_OneParam(FOnObjectSelectedMulticast, UObject* /* InObject */); // Called when an object is selected - DEPRECATED, please use FOnSkeletonTreeSelectionChanged typedef FOnObjectSelectedMulticast::FDelegate FOnObjectSelected; /** Delegate that allows custom filtering text to be shown on the filter button */ DECLARE_DELEGATE_OneParam(FOnGetFilterText, TArray& /*InOutTextItems*/); enum class ESkeletonTreeMode { /** Skeleton tree allows editing */ Editor, /** Skeleton tree allows picking of tree elements */ Picker, }; /** Init params for a skeleton tree widget */ struct FSkeletonTreeArgs { FSkeletonTreeArgs() : Mode(ESkeletonTreeMode::Editor) , ContextName(TEXT("SkeletonTree")) , bShowBlendProfiles(true) , bShowFilterMenu(true) , bShowDebugVisualizationOptions(false) , bAllowMeshOperations(true) , bAllowSkeletonOperations(true) , bHideBonesByDefault(false) {} /** Delegate called by the tree when a socket is selected */ FOnSkeletonTreeSelectionChanged OnSelectionChanged; /** Delegate that allows custom filtering text to be shown on the filter button */ FOnGetFilterText OnGetFilterText; /** Optional preview scene that we can pair with */ TSharedPtr PreviewScene; /** Optional builder to allow for custom tree construction */ TSharedPtr Builder; /** Menu extenders applied to context and filter menus */ TSharedPtr Extenders; /** The mode that this skeleton tree is in */ ESkeletonTreeMode Mode; /** Context name used to persist settings */ FName ContextName; /** Whether to show the blend profiles editor for the skeleton being displayed */ bool bShowBlendProfiles; /** Whether to show the filter menu to allow filtering of active bones, sockets etc. */ bool bShowFilterMenu; /** Whether to show the filter option to allow filtering of debug draw elements in the viewport. */ bool bShowDebugVisualizationOptions; /** Whether to allow operations that modify the mesh */ bool bAllowMeshOperations; /** Whether to allow operations that modify the skeleton */ bool bAllowSkeletonOperations; /** Whether to hide bones by default */ bool bHideBonesByDefault; }; /** Interface used to deal with skeleton editing UI */ class SKELETONEDITOR_API ISkeletonTree : public SCompoundWidget { public: struct Columns { static const FName Name; static const FName Retargeting; static const FName BlendProfile; static const FName DebugVisualization; }; static const FName DebugVisualizationOptionsName() { return Columns::DebugVisualization; }; /** Manually refresh the tree */ virtual void Refresh() = 0; /** Manually refresh the tree filter */ virtual void RefreshFilter() = 0; /** Get editable skeleton that this widget is editing */ virtual TSharedRef GetEditableSkeleton() const = 0; /** Get preview scene that this widget is editing */ virtual TSharedPtr GetPreviewScene() const = 0; /** Set the skeletal mesh we optionally work with */ virtual void SetSkeletalMesh(class USkeletalMesh* NewSkeletalMesh) = 0; /** Set the selected socket */ virtual void SetSelectedSocket(const struct FSelectedSocketInfo& InSocketInfo) = 0; /** Set the selected bone */ UE_DEPRECATED(4.26, "Please call/implement SetSelectedBone with ESelectInfo") virtual void SetSelectedBone(const FName& InBoneName) final { SetSelectedBone(InBoneName, ESelectInfo::Direct); } /** Set the selected bone */ virtual void SetSelectedBone(const FName& InBoneName, ESelectInfo::Type InSelectInfo) = 0; /** Set the selected bone(s) */ virtual void SetSelectedBones(const TArray& InBoneNames, ESelectInfo::Type InSelectInfo) = 0; /** Deselect everything that is currently selected */ virtual void DeselectAll() = 0; /** Get the selected items */ virtual TArray> GetSelectedItems() const = 0; /** Select items using the passed in predicate */ virtual void SelectItemsBy(TFunctionRef& /* InItem */, bool& /* bInOutExpand */)> Predicate, const ESelectInfo::Type SelectInfo = ESelectInfo::Direct) const = 0; /** Duplicate the socket and select it */ virtual void DuplicateAndSelectSocket(const FSelectedSocketInfo& SocketInfoToDuplicate, const FName& NewParentBoneName = FName()) = 0; /** Registers a delegate to be called when the selected items have changed */ virtual FDelegateHandle RegisterOnSelectionChanged(const FOnSkeletonTreeSelectionChanged& Delegate) = 0; /** Unregisters a delegate to be called when the selected items have changed */ virtual void UnregisterOnSelectionChanged(FDelegateHandle DelegateHandle) = 0; /** Gets the currently selected blend profile */ virtual UBlendProfile* GetSelectedBlendProfile() = 0; /** Attached the supplied assets to the tree to the specified attach item (bone/socket) */ virtual void AttachAssets(const TSharedRef& TargetItem, const TArray& AssetData) = 0; /** Get the search box widget, if any, for this tree */ virtual TSharedPtr GetSearchWidget() const = 0; /** Get the pinned commands widget, if any, for this tree */ virtual TSharedPtr GetPinnedCommandList() const = 0; /** Function to reset the transforms of selected bones */ virtual void ResetBoneTransforms(const bool bSelectedOnly) = 0; };