// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Engine/DataTable.h" #include "Kismet2/ListenerManager.h" #include "Widgets/SWidget.h" #include "Framework/Commands/UIAction.h" #include "AssetRegistry/AssetData.h" struct FDataTableEditorColumnHeaderData { /** Unique ID used to identify this column */ FName ColumnId; /** Display name of this column */ FText DisplayName; /** The calculated width of this column taking into account the cell data for each row */ float DesiredColumnWidth; /** The FProperty for the variable in this column */ const FProperty* Property; }; struct FDataTableEditorRowListViewData { /** Unique ID used to identify this row */ FName RowId; /** Display name of this row */ FText DisplayName; /** The calculated height of this row taking into account the cell data for each column */ float DesiredRowHeight; /** Insertion number of the row */ uint32 RowNum; /** Array corresponding to each cell in this row */ TArray CellData; }; typedef TSharedPtr FDataTableEditorColumnHeaderDataPtr; typedef TSharedPtr FDataTableEditorRowListViewDataPtr; enum class ERowInsertionPosition { Above, Below, Bottom, }; struct FDataTableEditorUtils { enum class EDataTableChangeInfo { /** The data corresponding to a single row has been changed */ RowData, /** The data corresponding to the entire list of rows has been changed */ RowList, }; enum class ERowMoveDirection { Up, Down, }; class FDataTableEditorManager : public FListenerManager < UDataTable, EDataTableChangeInfo > { FDataTableEditorManager() {} public: UNREALED_API static FDataTableEditorManager& Get(); class ListenerType : public InnerListenerType { public: virtual void SelectionChange(const UDataTable* DataTable, FName RowName) { } }; }; typedef FDataTableEditorManager::ListenerType INotifyOnDataTableChanged; static UNREALED_API bool RemoveRow(UDataTable* DataTable, FName Name); static UNREALED_API uint8* AddRow(UDataTable* DataTable, FName RowName); static UNREALED_API uint8* DuplicateRow(UDataTable* DataTable, FName SourceRowName, FName RowName); static UNREALED_API bool RenameRow(UDataTable* DataTable, FName OldName, FName NewName); static UNREALED_API bool MoveRow(UDataTable* DataTable, FName RowName, ERowMoveDirection Direction, int32 NumRowsToMoveBy = 1); static UNREALED_API bool SelectRow(const UDataTable* DataTable, FName RowName); static UNREALED_API bool DiffersFromDefault(UDataTable* DataTable, FName RowName); static UNREALED_API bool ResetToDefault(UDataTable* DataTable, FName RowName); static UNREALED_API uint8* AddRowAboveOrBelowSelection(UDataTable* DataTable, const FName& RowName, const FName& NewRowName, ERowInsertionPosition InsertPosition); static UNREALED_API void BroadcastPreChange(UDataTable* DataTable, EDataTableChangeInfo Info); static UNREALED_API void BroadcastPostChange(UDataTable* DataTable, EDataTableChangeInfo Info); /** Reads a data table and parses out editable copies of rows and columns */ static UNREALED_API void CacheDataTableForEditing(const UDataTable* DataTable, TArray& OutAvailableColumns, TArray& OutAvailableRows); /** Generic version that works with any datatable-like structure */ static UNREALED_API void CacheDataForEditing(const UScriptStruct* RowStruct, const TMap& RowMap, TArray& OutAvailableColumns, TArray& OutAvailableRows); /** Returns all script structs that can be used as a data table row. This only includes loaded ones */ static UNREALED_API TArray GetPossibleStructs(); /** Fills in an array with all possible DataTable structs, unloaded and loaded */ static UNREALED_API void GetPossibleStructAssetData(TArray& StructAssets); /** Utility function which verifies that the specified struct type is viable for data tables */ static UNREALED_API bool IsValidTableStruct(const UScriptStruct* Struct); /** Add a UI action for search for references, useful for customizations */ static UNREALED_API void AddSearchForReferencesContextMenu(class FDetailWidgetRow& RowNameDetailWidget, FExecuteAction SearchForReferencesAction); /** Short description for a data or curve handle */ static UNREALED_API FText GetHandleShortDescription(const UObject* TableAsset, FName RowName); /** Tooltip text for the data table row type */ static UNREALED_API FText GetRowTypeInfoTooltipText(FDataTableEditorColumnHeaderDataPtr ColumnHeaderDataPtr); /** Doc excerpt name for the data table row type */ static UNREALED_API FString GetRowTypeTooltipDocExcerptName(FDataTableEditorColumnHeaderDataPtr ColumnHeaderDataPtr); /** Link to variable type doc */ static UNREALED_API const FString VariableTypesTooltipDocLink; /** Delegate called when a data table struct is selected */ DECLARE_DELEGATE_OneParam(FOnDataTableStructSelected, UScriptStruct*); /** Creates a combo box that allows selecting from the list of possible row structures */ static UNREALED_API TSharedRef MakeRowStructureComboBox(FOnDataTableStructSelected OnSelected); };