// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Textures/SlateIcon.h" #include "Tools/Modes.h" class FEditorModeTools; // Required forward declarations class FEdMode; DECLARE_DELEGATE_RetVal(TSharedRef, FEditorModeFactoryCallback); /** * Class responsible for maintaining a list of registered editor mode types. * * Example usage: * * Register your mode type with: * FEditorModeRegistry::Get().RegisterMode( FName( TEXT("MyEditorMode") ) ); * or: * class FMyEditorModeFactory : public IEditorModeFactory * { * virtual void OnSelectionChanged( FEditorModeTools& Tools, UObject* ItemUndergoingChange ) const override; * virtual FEditorModeInfo GetModeInfo() const override; * virtual TSharedRef CreateMode() const override; * }; * TSharedRef Factory = MakeShareable( new FMyEditorModeFactory ); * FEditorModeRegistry::Get().RegisterMode( FName( TEXT("MyEditorMode") ), Factory ); * * Unregister your mode when it is no longer available like so (this will prompt the destruction of any existing modes of this type): * FEditorModeRegistry::Get().UnregisterMode( FName( TEXT("MyEditorMode") ) ); */ struct IEditorModeFactory : public TSharedFromThis { /** Virtual destructor */ virtual ~IEditorModeFactory() {} /** * Allows mode factories to handle selection change events, and potentially activate/deactivate modes * @param Tools The mode tools that are triggering the event * @param ItemUndergoingChange Either an actor being selected or deselected, or a selection set being modified (typically emptied) */ virtual void OnSelectionChanged(FEditorModeTools& Tools, UObject* ItemUndergoingChange) const { } /** * Gets the information pertaining to the mode type that this factory creates */ virtual FEditorModeInfo GetModeInfo() const = 0; /** * Create a new instance of our mode */ virtual TSharedRef CreateMode() const = 0; }; struct FEditorModeFactory : IEditorModeFactory { public: UNREALED_API FEditorModeFactory(const FEditorModeInfo& InModeInfo); UNREALED_API FEditorModeFactory(FEditorModeInfo&& InModeInfo); UNREALED_API virtual ~FEditorModeFactory(); /** Information pertaining to this factory's mode */ FEditorModeInfo ModeInfo; /** Callback used to create an instance of this mode type */ FEditorModeFactoryCallback FactoryCallback; /** * Gets the information pertaining to the mode type that this factory creates */ UNREALED_API virtual FEditorModeInfo GetModeInfo() const final; UNREALED_API virtual TSharedRef CreateMode() const final; }; /** * A registry of editor modes and factories */ class FEditorModeRegistry { typedef TMap> FactoryMap; friend class ULegacyEdModeWrapper; friend class UAssetEditorSubsystem; public: /** * Singleton access */ UNREALED_API static FEditorModeRegistry& Get(); /** * Get a list of information for all currently registered modes, sorted by UI priority order */ UE_DEPRECATED(4.26, "Use UAssetEditorSubsystem::GetEditorModeInfoOrderedByPriority") UNREALED_API TArray GetSortedModeInfo() const; /** * Get a currently registered mode information for specified ID */ UE_DEPRECATED(4.26, "Use UAssetEditorSubsystem::FindEditorModeInfo") UNREALED_API FEditorModeInfo GetModeInfo(FEditorModeID ModeID) const; /** * Registers an editor mode. Typically called from a module's StartupModule() routine. * * @param ModeID ID of the mode to register */ UNREALED_API void RegisterMode(FEditorModeID ModeID, TSharedRef Factory); /** * Registers an editor mode type. Typically called from a module's StartupModule() routine. * * @param ModeID ID of the mode to register */ template void RegisterMode(FEditorModeID ModeID, FText Name = FText(), FSlateIcon IconBrush = FSlateIcon(), bool bVisible = false, int32 PriorityOrder = MAX_int32) { TSharedRef Factory = MakeShareable( new FEditorModeFactory(FEditorModeInfo(ModeID, Name, IconBrush, bVisible, PriorityOrder)) ); Factory->FactoryCallback = FEditorModeFactoryCallback::CreateStatic([]() -> TSharedRef{ return MakeShareable(new T); }); RegisterMode(ModeID, Factory); } /** * Unregisters an editor mode. Typically called from a module's ShutdownModule() routine. * Note: will exit the edit mode if it is currently active. * * @param ModeID ID of the mode to unregister */ UNREALED_API void UnregisterMode(FEditorModeID ModeID); /** * Event that is triggered whenever a mode is registered or unregistered */ UE_DEPRECATED(4.26, "Use UAssetEditorSubsystem::OnEditorModesChanged") FRegisteredModesChangedEvent& OnRegisteredModesChanged(); /** * Event that is triggered whenever a mode is registered */ UE_DEPRECATED(4.26, "Use UAssetEditorSubsystem::OnEditorModeRegistered") FOnModeRegistered& OnModeRegistered(); /** * Event that is triggered whenever a mode is unregistered */ UE_DEPRECATED(4.26, "Use UAssetEditorSubsystem::OnEditorModeUnregistered") FOnModeUnregistered& OnModeUnregistered(); /** * Const access to the internal factory map */ const FactoryMap& GetFactoryMap() const { return ModeFactories; } private: /** * Initialize this registry */ void Initialize(); /** * Shutdown this registry */ void Shutdown(); /** * Create a new instance of the mode registered under the specified ID */ TSharedPtr CreateMode(FEditorModeID ModeID, FEditorModeTools& Owner); /** A map of editor mode IDs to factory callbacks */ FactoryMap ModeFactories; bool bInitialized = false; };