// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Components/Widget.h" #include "Framework/Views/TreeFilterHandler.h" #include "Misc/TextFilter.h" #include "Framework/SlateDelegates.h" #include "UObject/ObjectPtr.h" #include "WidgetBlueprint.h" #include "Widgets/SCompoundWidget.h" #include "SReadOnlyHierarchyView.generated.h" class ITableRow; class SSearchBox; class STableViewBase; template class STreeView; template class TreeFilterHandler; template class TTextFilter; UENUM() enum class ERootSelectionMode : uint8 { /** The Root Widget is not selectable */ Disabled, /** The Root Widget is selectable and will show it's name as the display text */ Enabled, /** The Root Widget is selectable and it will show Self as the display text */ Self }; class UMGEDITOR_API SReadOnlyHierarchyView : public SCompoundWidget { private: struct FItem { FItem(const UWidget* InWidget) : Widget(InWidget) {} FItem(const UWidgetBlueprint* InWidgetBlueprint) : WidgetBlueprint(InWidgetBlueprint) {} TWeakObjectPtr Widget; TWeakObjectPtr WidgetBlueprint; TArray> Children; }; public: using FOnSelectionChanged = typename TSlateDelegates::FOnSelectionChanged; SLATE_BEGIN_ARGS(SReadOnlyHierarchyView) {} SLATE_ARGUMENT_DEFAULT(bool, ShowSearch) = true; SLATE_ARGUMENT_DEFAULT(ERootSelectionMode, RootSelectionMode) = ERootSelectionMode::Enabled; SLATE_ARGUMENT_DEFAULT(ESelectionMode::Type, SelectionMode) = ESelectionMode::Single; SLATE_EVENT(FOnSelectionChanged, OnSelectionChanged) SLATE_ARGUMENT(TArray, ShowOnly) SLATE_ARGUMENT_DEFAULT(bool, ExpandAll) = true; SLATE_END_ARGS() virtual ~SReadOnlyHierarchyView(); void Construct(const FArguments& InArgs, const UWidgetBlueprint* WidgetBlueprint); void Refresh(); void SetSelectedWidget(FName WidgetName); void SetRawFilterText(const FText& Text); TArray GetSelectedWidgets() const; void ClearSelection(); private: TSharedRef GenerateRow(TSharedPtr Item, const TSharedRef& OwnerTable) const; void GetItemChildren(TSharedPtr Item, TArray>& OutChildren) const; FText GetItemText(TSharedPtr Item) const; const FSlateBrush* GetIconBrush(TSharedPtr Item) const; FText GetIconToolTipText(TSharedPtr Item) const; FText GetWidgetToolTipText(TSharedPtr Item) const; void GetFilterStringsForItem(TSharedPtr Item, TArray& OutStrings) const; TSharedPtr FindItem(const TArray>& RootItems, FName Name) const; void OnSelectionChanged(TSharedPtr Selected, ESelectInfo::Type SelectionType); void RebuildTree(); void BuildWidgetChildren(const UWidget* Widget, TSharedPtr Parent); void SetItemExpansionRecursive(TSharedPtr Item, bool bShouldBeExpanded); void ExpandAll(); FName GetItemName(const TSharedPtr& Item) const; private: TWeakObjectPtr WidgetBlueprint; TArray ShowOnly; TArray> RootWidgets; TArray> FilteredRootWidgets; ERootSelectionMode RootSelectionMode; FOnSelectionChanged OnSelectionChangedDelegate; TSharedPtr SearchBox; using FTextFilter = TTextFilter>; TSharedPtr SearchFilter; using FTreeFilterHandler = TreeFilterHandler>; TSharedPtr FilterHandler; TSharedPtr>> TreeView; bool bExpandAll; };