Files
UnrealEngine/Engine/Source/Editor/StructViewer/Private/SStructViewer.h
2025-05-18 13:04:45 +08:00

239 lines
8.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "SlateFwd.h"
#include "Input/Reply.h"
#include "StructViewerModule.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"
#include "Settings/StructViewerSettings.h"
#include "Engine/EngineTypes.h"
#include "UObject/SoftObjectPath.h"
class FMenuBuilder;
class FTextFilterExpressionEvaluator;
class UBlueprint;
class SComboButton;
class FStructViewerNode;
class FTextFilterExpressionEvaluator;
class SStructViewer : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SStructViewer)
{
}
SLATE_ARGUMENT(FOnStructPicked, OnStructPickedDelegate)
SLATE_END_ARGS()
/**
* Construct the widget
*
* @param InArgs A declaration from which to construct the widget
* @param InitOptions Programmer-driven initialization options for this widget
*/
void Construct(const FArguments& InArgs, const FStructViewerInitializationOptions& InInitOptions);
/** Gets the widget contents of the app */
virtual TSharedRef<SWidget> GetContent();
virtual ~SStructViewer();
/** Empty the selection set. */
virtual void ClearSelection();
/** SWidget interface */
virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;
virtual FReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent) override;
virtual bool SupportsKeyboardFocus() const override;
/** Test to see whether the given struct would be allowed by this struct viewer */
virtual bool IsStructAllowed(const UScriptStruct* InStruct) const;
/** Destroys the internal Struct Hierarchy database */
static void DestroyStructHierarchy();
private:
/** Retrieves the children for the input node.
* @param InParent The parent node to retrieve the children from.
* @param OutChildren List of children for the parent node.
*
*/
void OnGetChildrenForStructViewerTree(TSharedPtr<FStructViewerNode> InParent, TArray<TSharedPtr<FStructViewerNode>>& OutChildren);
/** Creates the row widget when called by Slate when an item appears on the tree. */
TSharedRef<ITableRow> OnGenerateRowForStructViewer(TSharedPtr<FStructViewerNode> Item, const TSharedRef<STableViewBase>& OwnerTable);
/** Invoked when the user attempts to drag an item out of the struct browser */
FReply OnDragDetected(const FGeometry& Geometry, const FPointerEvent& PointerEvent) override;
/** Called by Slate when the filter box changes text. */
void OnFilterTextChanged(const FText& InFilterText);
/** Called when enter is hit in search box */
void OnFilterTextCommitted(const FText& InText, ETextCommit::Type CommitInfo);
/** Called by Slate when an item is selected from the tree/list. */
void OnStructViewerSelectionChanged(TSharedPtr<FStructViewerNode> Item, ESelectInfo::Type SelectInfo);
/** Called by Slate when an item is expanded/collapsed from the tree/list. */
void OnStructViewerExpansionChanged(TSharedPtr<FStructViewerNode> Item, bool bExpanded);
/**
* Sets all expansion states in the tree.
*
* @param bInExpansionState The expansion state to set the tree to.
*/
void SetAllExpansionStates(bool bInExpansionState);
/**
* A helper function to recursively set the tree.
*
* @param InNode The current node in the tree.
* @param bInExpansionState The expansion state to set the tree to.
*/
void SetAllExpansionStates_Helper(TSharedPtr<FStructViewerNode> InNode, bool bInExpansionState);
/**
* A helper function to toggle expansion state of a single node
*
* @param InNode The node to toggle expansion.
*/
void ToggleExpansionState_Helper(TSharedPtr<FStructViewerNode> InNode);
/** Builds the right click menu widget for the selected node. */
TSharedPtr<SWidget> BuildMenuWidget();
/** Recursive function to expand nodes not filtered out of the tree
* @param InNode The current node to inspect for expansion.
*
* @return bool true if the child expanded, thus the parent should.
*/
bool ExpandFilteredInNodes(TSharedPtr<FStructViewerNode> InNode);
/** Recursive function to map the expansion states of items in the tree.
* @param InItem The current item to examine the expansion state of.
*/
void MapExpansionStatesInTree(TSharedPtr<FStructViewerNode> InItem);
/** Recursive function to set the expansion states of items in the tree.
* @param InItem The current item to set the expansion state of.
*/
void SetExpansionStatesInTree(TSharedPtr<FStructViewerNode> InItem);
/** Sends a requests to the Struct Viewer to refresh itself the next chance it gets */
void Refresh();
/** Populates the tree with items based on the current filter. */
void Populate();
/** Returns an array of the currently selected StructViewerNodes */
const TArray<TSharedPtr<FStructViewerNode>> GetSelectedItems() const;
/** Expands all of the root nodes */
virtual void ExpandRootNodes();
/** Returns the foreground color for the view button */
FSlateColor GetViewButtonForegroundColor() const;
/** Handler for when the view combo button is clicked */
TSharedRef<SWidget> GetViewButtonContent();
/** Gets the text for the struct count label */
FText GetStructCountText() const;
/** Sets the view type and updates lists accordingly */
void SetCurrentDeveloperViewType(EStructViewerDeveloperType NewType);
/** Gets the current view type (list or tile) */
EStructViewerDeveloperType GetCurrentDeveloperViewType() const;
/** Returns true if ViewType is the current view type */
bool IsCurrentDeveloperViewType(EStructViewerDeveloperType ViewType) const;
/** Toggle whether internal use structs should be shown or not */
void ToggleShowInternalStructs();
/** Whether or not it's possible to show internal use structs */
bool IsShowingInternalStructs() const;
/** Whether or not it's possible to show internal use structs */
bool IsToggleShowInternalStructsAllowed() const;
/** Get the total number of structs passing the current filters.*/
const int GetNumItems() const;
/** Count the number of tree items in the specified hierarchy*/
int32 CountTreeItems(FStructViewerNode* Node);
/** Handle the settings for StructViewer changing.*/
void HandleSettingChanged(FName PropertyName);
/** Accessor for the struct names that have been marked as internal only in settings */
void GetInternalOnlyStructs(TArray<TSoftObjectPtr<const UScriptStruct>>& Structs);
/** Accessor for the struct paths that have been marked as internal only in settings */
void GetInternalOnlyPaths(TArray<FDirectoryPath>& Paths);
private:
/** Init options, cached */
FStructViewerInitializationOptions InitOptions;
/** The items to be displayed in the tree. */
TArray<TSharedPtr<FStructViewerNode>> RootTreeItems;
/** Compiled filter search terms. */
TSharedPtr<FTextFilterExpressionEvaluator> TextFilterPtr;
/** Holds the Slate Tree widget which holds the structs for the Struct Viewer. */
TSharedPtr<STreeView<TSharedPtr<FStructViewerNode>>> StructTree;
/** Holds the Slate List widget which holds the structs for the Struct Viewer. */
TSharedPtr<SListView<TSharedPtr<FStructViewerNode>>> StructList;
/** The struct Search Box, used for filtering the structs visible. */
TSharedPtr<SSearchBox> SearchBox;
/** true to filter for unloaded structs. */
bool bShowUnloadedStructs;
/** true to allow struct dynamic loading. */
bool bEnableStructDynamicLoading;
/** Callback that's fired when a struct is selected while in 'struct picking' mode */
FOnStructPicked OnStructPicked;
/** true if expansions states should be saved when compiling. */
bool bSaveExpansionStates;
/** The map holding the expansion state map for the tree. */
TMap<FSoftObjectPath, bool> ExpansionStateMap;
/** True if the Struct Viewer needs to be repopulated at the next appropriate opportunity, occurs whenever structs are added, removed, renamed, etc. */
bool bNeedsRefresh;
/** True if the search box will take keyboard focus next frame */
bool bPendingFocusNextFrame;
/** True if we need to set the tree expansion states according to our local copy next tick */
bool bPendingSetExpansionStates;
/** Indicates if the 'Show Internal Structs' option should be enabled or disabled */
bool bCanShowInternalStructs;
/** The button that displays view options */
TSharedPtr<SComboButton> ViewOptionsComboButton;
/** Number of structs that passed the filter*/
int32 NumStructs;
};