Files
UnrealEngine/Engine/Source/Editor/Persona/Public/BoneSelectionWidget.h
2025-05-18 13:04:45 +08:00

179 lines
5.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "SlateFwd.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SWidget.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Views/STableViewBase.h"
#include "Widgets/Views/STableRow.h"
#include "Widgets/Views/STreeView.h"
class IEditableSkeleton;
class SComboButton;
DECLARE_DELEGATE_OneParam(FOnBoneSelectionChanged, FName);
DECLARE_DELEGATE_RetVal_OneParam(FName, FGetSelectedBone, bool& /*bMultipleValues*/);
DECLARE_DELEGATE_RetVal(const struct FReferenceSkeleton&, FGetReferenceSkeleton);
DECLARE_DELEGATE_RetVal(const TArray<class USkeletalMeshSocket*>&, FGetSocketList);
class PERSONA_API SBoneTreeMenu : public SCompoundWidget
{
public:
// Storage object for bone hierarchy
struct FBoneNameInfo
{
FBoneNameInfo(FName Name) : BoneName(Name) {}
FName BoneName;
TArray<TSharedPtr<FBoneNameInfo>> Children;
};
SLATE_BEGIN_ARGS(SBoneTreeMenu)
: _bShowVirtualBones(true)
, _bShowSocket(false)
, _bShowNone(false)
, _OnGetReferenceSkeleton()
, _OnBoneSelectionChanged()
, _OnGetSocketList()
{}
SLATE_ARGUMENT(FText, Title)
SLATE_ARGUMENT(bool, bShowVirtualBones)
SLATE_ARGUMENT(bool, bShowSocket)
SLATE_ARGUMENT(bool, bShowNone)
SLATE_ARGUMENT(FName, SelectedBone)
SLATE_EVENT(FGetReferenceSkeleton, OnGetReferenceSkeleton)
SLATE_EVENT(FOnBoneSelectionChanged, OnBoneSelectionChanged)
SLATE_EVENT(FGetSocketList, OnGetSocketList)
SLATE_END_ARGS();
/**
* Construct this widget
*
* @param InArgs The declaration data for this widget
*/
void Construct(const FArguments& InArgs);
/** Get the filter text widget, e.g. for focus */
TSharedPtr<SWidget> GetFilterTextWidget();
private:
// SWidget interface
virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;
// Using the current filter, repopulate the tree view
void RebuildBoneList(const FName& SelectedBone);
// Make a single tree row widget
TSharedRef<ITableRow> MakeTreeRowWidget(TSharedPtr<FBoneNameInfo> InInfo, const TSharedRef<STableViewBase>& OwnerTable);
// Get the children for the provided bone info
void GetChildrenForInfo(TSharedPtr<FBoneNameInfo> InInfo, TArray< TSharedPtr<FBoneNameInfo> >& OutChildren);
// Called when the user changes the search filter
void OnFilterTextChanged(const FText& InFilterText);
// Handle the tree view selection changing
void OnSelectionChanged(TSharedPtr<SBoneTreeMenu::FBoneNameInfo> BoneInfo, ESelectInfo::Type SelectInfo);
// Select a specific bone, helper for UI handler functions
void SelectBone(TSharedPtr<SBoneTreeMenu::FBoneNameInfo> BoneInfo);
// Tree info entries for bone picker
TArray<TSharedPtr<FBoneNameInfo>> SkeletonTreeInfo;
// Mirror of SkeletonTreeInfo but flattened for searching
TArray<TSharedPtr<FBoneNameInfo>> SkeletonTreeInfoFlat;
// Text to filter bone tree with
FText FilterText;
// Tree view used in the button menu
TSharedPtr<STreeView<TSharedPtr<FBoneNameInfo>>> TreeView;
//Filter text widget
TSharedPtr<SSearchBox> FilterTextWidget;
FOnBoneSelectionChanged OnSelectionChangedDelegate;
FGetReferenceSkeleton OnGetReferenceSkeletonDelegate;
FGetSocketList OnGetSocketListDelegate;
bool bShowVirtualBones;
bool bShowSocket;
bool bShowNone;
};
class PERSONA_API SBoneSelectionWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS( SBoneSelectionWidget )
: _bShowSocket(false)
, _bShowVirtualBones(true)
, _bShowNone(false)
, _OnBoneSelectionChanged()
, _OnGetSelectedBone()
, _OnGetReferenceSkeleton()
, _OnGetSocketList()
{}
SLATE_ARGUMENT(bool, bShowSocket)
/** Should show skeletons virtual bones in tree */
SLATE_ARGUMENT(bool, bShowVirtualBones)
/** Whether or not to show 'None' as a selectable bone name */
SLATE_ARGUMENT(bool, bShowNone)
/** set selected bone name */
SLATE_EVENT(FOnBoneSelectionChanged, OnBoneSelectionChanged);
/** get selected bone name **/
SLATE_EVENT(FGetSelectedBone, OnGetSelectedBone);
/** Get Reference skeleton */
SLATE_EVENT(FGetReferenceSkeleton, OnGetReferenceSkeleton)
/** Get Socket List */
SLATE_EVENT(FGetSocketList, OnGetSocketList)
SLATE_END_ARGS();
/**
* Construct this widget
*
* @param InArgs The declaration data for this widget
*/
void Construct( const FArguments& InArgs );
private:
// Creates the combo button menu when clicked
TSharedRef<SWidget> CreateSkeletonWidgetMenu();
// Called when the user selects a bone name
void OnSelectionChanged(FName BoneName);
// Gets the current bone name, used to get the right name for the combo button
FText GetCurrentBoneName() const;
FText GetFinalToolTip() const;
// Base combo button
TSharedPtr<SComboButton> BonePickerButton;
// delegates
FOnBoneSelectionChanged OnBoneSelectionChanged;
FGetSelectedBone OnGetSelectedBone;
FGetReferenceSkeleton OnGetReferenceSkeleton;
FGetSocketList OnGetSocketList;
bool bShowSocket;
bool bShowVirtualBones;
bool bShowNone;
// Cache supplied tooltip
FText SuppliedToolTip;
};