Files
2025-05-18 13:04:45 +08:00

100 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/Array.h"
#include "Containers/Map.h"
#include "Containers/UnrealString.h"
#include "CoreMinimal.h"
#include "Engine/UserDefinedEnum.h"
#include "HAL/Platform.h"
#include "Kismet2/ListenerManager.h"
#include "UObject/NameTypes.h"
class FArchive;
class FText;
class UEnum;
class UObject;
class UUserDefinedEnum;
class FEnumEditorUtils
{
static void PrepareForChange(UUserDefinedEnum* Enum);
static void BroadcastChanges(const UUserDefinedEnum* Enum, const TArray<TPair<FName, int64>>& OldNames, bool bResolveData = true);
/** copy full enumeratos names from given enum to OutEnumNames, the last '_MAX' enumerator is skipped */
static void CopyEnumeratorsWithoutMax(const UEnum* Enum, TArray<TPair<FName, int64>>& OutEnumNames);
public:
enum EEnumEditorChangeInfo
{
Changed,
};
class FEnumEditorManager : public FListenerManager<UUserDefinedEnum, EEnumEditorChangeInfo>
{
FEnumEditorManager() {}
public:
UNREALED_API static FEnumEditorManager& Get();
class ListenerType : public InnerListenerType<FEnumEditorManager>
{
};
};
typedef FEnumEditorManager::ListenerType INotifyOnEnumChanged;
//////////////////////////////////////////////////////////////////////////
// User defined enumerations
/** Creates new user defined enum in given blueprint. */
static UNREALED_API UEnum* CreateUserDefinedEnum(UObject* InParent, FName EnumName, EObjectFlags Flags);
/** return if an enum can be named/renamed with given name*/
static UNREALED_API bool IsNameAvailebleForUserDefinedEnum(FName Name);
/** Updates enumerators names after name or path of the Enum was changed */
static UNREALED_API void UpdateAfterPathChanged(UEnum* Enum);
/** adds new enumerator (with default unique name) for user defined enum */
static UNREALED_API void AddNewEnumeratorForUserDefinedEnum(class UUserDefinedEnum* Enum);
/** Removes enumerator from enum*/
static UNREALED_API void RemoveEnumeratorFromUserDefinedEnum(class UUserDefinedEnum* Enum, int32 EnumeratorIndex);
/**
* Reorder enumerators in enum. Moves the enumerator at the given initial index to a new target index, shifting other enumerators as needed.
* E.g. with enum [A, B, C, D, E], moving index 1 to index 3 results in [A, C, D, B, E].
*/
static UNREALED_API void MoveEnumeratorInUserDefinedEnum(class UUserDefinedEnum* Enum, int32 InitialEnumeratorIndex, int32 TargetIndex);
/** Check if the enumerator-as-bitflags meta data is set */
static UNREALED_API bool IsEnumeratorBitflagsType(class UUserDefinedEnum* Enum);
/** Set the state of the enumerator-as-bitflags meta data */
static UNREALED_API void SetEnumeratorBitflagsTypeState(class UUserDefinedEnum* Enum, bool bBitflagsType);
/** check if NewName is a short name and is acceptable as name in given enum */
static UNREALED_API bool IsProperNameForUserDefinedEnumerator(const UEnum* Enum, FString NewName);
/** Handles necessary notifications when the Enum has had a transaction undone or redone on it. */
static UNREALED_API void PostEditUndo(UUserDefinedEnum* Enum);
/*
* Try to update an out-of-date enum index after an enum's change
*
* @param Enum - new version of enum
* @param Ar - special archive
* @param EnumeratorIndex - old enumerator index
*
* @return new enum
*/
static UNREALED_API int64 ResolveEnumerator(const UEnum* Enum, FArchive& Ar, int64 EnumeratorValue);
//DISPLAY NAME
static UNREALED_API bool SetEnumeratorDisplayName(UUserDefinedEnum* Enum, int32 EnumeratorIndex, FText NewDisplayName);
static UNREALED_API bool IsEnumeratorDisplayNameValid(const UUserDefinedEnum* Enum, int32 EnumeratorIndex, FText NewDisplayName);
static UNREALED_API void EnsureAllDisplayNamesExist(class UUserDefinedEnum* Enum);
static UNREALED_API void UpgradeDisplayNamesFromMetaData(class UUserDefinedEnum* Enum);
};