Files
UnrealEngineUWP/Engine/Source/Editor/LevelEditor/Private/SLevelEditor.h
rex hill 4511728f09 Tab manager filter can now block tab spawn
#rb chris.gagnon


#ROBOMERGE-OWNER: rex.hill
#ROBOMERGE-AUTHOR: rex.hill
#ROBOMERGE-SOURCE: CL 11604269 via CL 11604360 via CL 11604439
#ROBOMERGE-BOT: (v656-11643781)

[CL 11743509 by rex hill in Main branch]
2020-02-28 11:30:46 -05:00

284 lines
11 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Input/Reply.h"
#include "Widgets/SWidget.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Engine/World.h"
#include "Widgets/SWindow.h"
#include "SLevelViewport.h"
#include "Framework/Commands/UICommandList.h"
#include "Framework/Docking/TabManager.h"
#include "Toolkits/IToolkit.h"
#include "AssetThumbnail.h"
#include "ILevelEditor.h"
#include "LevelViewportTabContent.h"
class IAssetEditorInstance;
class IDetailsView;
class SActorDetails;
class SBorder;
class SLevelEditorModeContent;
class SLevelEditorToolBox;
/**
* Unreal editor level editor Slate widget
*/
class SLevelEditor
: public ILevelEditor
{
public:
SLATE_BEGIN_ARGS( SLevelEditor ){}
SLATE_END_ARGS()
/**
* Constructor
*/
SLevelEditor();
~SLevelEditor();
/**
* Constructs this widget
*
* @param InArgs Declaration from which to construct the widget
*/
void Construct( const FArguments& InArgs );
/**
* Initialize the newly constructed level editor UI, needed because restoring the layout could trigger showing tabs
* that immediately try to get a reference to the current level editor.
*/
void Initialize( const TSharedRef<SDockTab>& OwnerTab, const TSharedRef<SWindow>& OwnerWindow );
/**
* Gets the currently active viewport in the level editor
* @todo Slate: Needs a better implementation
*
* @return The active viewport. If multiple are active it returns the first one
*/
TSharedPtr<class SLevelViewport> GetActiveViewport();
/** ILevelEditor interface */
virtual void SummonLevelViewportContextMenu() override;
virtual void SummonLevelViewportViewOptionMenu(const ELevelViewportType ViewOption) override;
virtual const TArray< TSharedPtr< class IToolkit > >& GetHostedToolkits() const override;
virtual TArray< TSharedPtr< IAssetViewport > > GetViewports() const override;
virtual TSharedPtr<IAssetViewport> GetActiveViewportInterface() override;
virtual TSharedPtr< class FAssetThumbnailPool > GetThumbnailPool() const override;
virtual void AppendCommands( const TSharedRef<FUICommandList>& InCommandsToAppend ) override;
virtual void AddStandaloneLevelViewport( const TSharedRef<SLevelViewport>& LevelViewport ) override;
/**
* Given a tab ID, summons a new tab in the position saved in the current layout, or in a default position.
* @return the invoked tab
*/
TSharedPtr<SDockTab> TryInvokeTab( FName TabID );
/**
* Sync the details panel to the current selection
* Will spawn a new details window if required (and possible) due to other details windows being locked
*/
void SyncDetailsToSelection();
/**
* @return true if the level editor has a viewport currently being used for pie
*/
bool HasActivePlayInEditorViewport() const;
/** @return Returns the title to display in the level editor's tab label */
FText GetTabTitle() const;
/** @return Returns the suffix to display in the level editor's after tab label */
FText GetTabSuffix() const;
/**
* Processes level editor keybindings using events made in a viewport
*
* @param MyGeometry Information about the size and position of the viewport widget
* @param InKeyEvent The event which just occurred
*/
virtual FReply OnKeyDownInViewport( const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent ) override;
bool CanCloseApp();
/** Returns the full action list for this level editor instance */
virtual const TSharedPtr< FUICommandList >& GetLevelEditorActions() const override
{
return LevelEditorCommands;
}
/** IToolKitHost interface */
virtual TSharedRef< class SWidget > GetParentWidget() override;
virtual void BringToFront() override;
virtual TSharedRef< class SDockTabStack > GetTabSpot( const EToolkitTabSpot::Type TabSpot ) override;
virtual TSharedPtr<FTabManager> GetTabManager() const override;
virtual void OnToolkitHostingStarted( const TSharedRef< class IToolkit >& Toolkit ) override;
virtual void OnToolkitHostingFinished( const TSharedRef< class IToolkit >& Toolkit ) override;
virtual UWorld* GetWorld() const override;
virtual TSharedRef<SWidget> CreateActorDetails( const FName TabIdentifier ) override;
virtual void SetActorDetailsRootCustomization(TSharedPtr<FDetailsViewObjectFilter> ActorDetailsObjectFilter, TSharedPtr<IDetailRootObjectCustomization> ActorDetailsRootCustomization) override;
virtual TSharedRef<SWidget> CreateToolBox() override;
/** SWidget overrides */
virtual bool SupportsKeyboardFocus() const override
{
return true;
}
/** Attaches a sequencer asset editor used to animate objects in the level to this level editor */
void AttachSequencer( TSharedPtr<SWidget> SequencerWidget, TSharedPtr<IAssetEditorInstance> NewSequencerAssetEditor );
/** Returns current scene outliner associated with level editor's scene outliner tab, if it exists */
virtual TSharedPtr<ISceneOutliner> GetSceneOutliner() const override { return SceneOutlinerPtr.Pin(); }
private:
TSharedRef<SDockTab> SpawnLevelEditorTab(const FSpawnTabArgs& Args, FName TabIdentifier, FString InitializationPayload);
bool CanSpawnEditorModeToolbarTab(const FSpawnTabArgs& Args) const;
bool CanSpawnEditorModeToolboxTab(const FSpawnTabArgs& Args) const;
//TSharedRef<SDockTab> SpawnLevelEditorModeTab(const FSpawnTabArgs& Args, FEdMode* EditorMode);
TSharedRef<SDockTab> SummonDetailsPanel( FName Identifier );
/**
* Binds UI commands to actions for the level editor
*/
void BindCommands();
/** Registers menus associated with level editor */
void RegisterMenus();
/**
* Fills the level editor with content, using the layout string, or the default if
* no layout string is passed in
*/
TSharedRef<SWidget> RestoreContentArea( const TSharedRef<SDockTab>& OwnerTab, const TSharedRef<SWindow>& OwnerWindow );
/** Called when a property is changed */
void HandleExperimentalSettingChanged(FName PropertyName);
/** Rebuilds the command list for spawning editor modes, this is done when new modes are registered. */
void RefreshEditorModeCommands();
/** Editor mode has been added or removed, clears cached command list so it will be rebuilt */
void EditorModeCommandsChanged();
/** Called when a level editor mode is toggled */
void OnEditorModeIdChanged(const FEditorModeID& ModeChangedID, bool bIsEnteringMode);
/** Gets the tabId mapping to an editor mode */
static FName GetEditorModeTabId( FEditorModeID ModeID );
/** Toggles the editor mode on and off, this is what the auto generated editor mode commands are mapped to. */
static void ToggleEditorMode( FEditorModeID ModeID );
/** Checks if the editor mode is active for the auto-generated editor mode command. */
static bool IsModeActive( FEditorModeID ModeID );
/**
* Processes keybindings on the level editor
*
* @param MyGeometry Information about the size and position of the level editor widget
* @param InKeyEvent The event which just occurred
*/
virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent ) override;
/** Callback for when the property view changes */
void OnPropertyObjectArrayChanged(const FString& NewTitle, const TArray< UObject* >& UObjects );
/** Callback for when the level editor layout has changed */
void OnLayoutHasChanged();
/** Constructs the NotificationBar widgets */
void ConstructNotificationBar();
/** Builds a viewport tab. */
TSharedRef<SDockTab> BuildViewportTab( const FText& Label, const FString LayoutId, const FString& InitializationPayload );
/** Called when a viewport tab is closed */
void OnViewportTabClosed(TSharedRef<SDockTab> ClosedTab);
/** Called when the toolbox tab is closed */
void OnToolboxTabClosed(TSharedRef<SDockTab> ClosedTab);
/** Save the information about the given viewport in the transient viewport information */
void SaveViewportTabInfo(TSharedRef<const class FLevelViewportTabContent> ViewportTabContent);
/** Restore the information about the given viewport from the transient viewport information */
void RestoreViewportTabInfo(TSharedRef<FLevelViewportTabContent> ViewportTabContent) const;
/** Reset the transient viewport information */
void ResetViewportTabInfo();
/** Handles Editor map changes */
void HandleEditorMapChange( uint32 MapChangeFlags );
/** Called when actors are selected or unselected */
void OnActorSelectionChanged(const TArray<UObject*>& NewSelection, bool bForceRefresh = false);
/** Called when an actor changes outer */
void OnLevelActorOuterChanged(AActor* InActor = nullptr, UObject* InOldOuter = nullptr);
private:
// Tracking the active viewports in this level editor.
TArray< TWeakPtr<FLevelViewportTabContent> > ViewportTabs;
// A list of any standalone editor viewports that aren't in tabs
TArray< TWeakPtr<SLevelViewport> > StandaloneViewports;
// Border that hosts the document content for the level editor.
TSharedPtr< SBorder > DocumentsAreaBorder;
// The list of commands with bound delegates for the level editor.
TSharedPtr<FUICommandList> LevelEditorCommands;
// Weak reference to all toolbox panels this level editor has spawned. May contain invalid entries for tabs that were closed.
TArray< TWeakPtr< class SLevelEditorToolBox > > ToolBoxTabs;
TArray< TWeakPtr< class SLevelEditorModeContent > > ModesTabs;
// List of all of the toolkits we're currently hosting.
TArray< TSharedPtr< class IToolkit > > HostedToolkits;
// The UWorld that this level editor is viewing and allowing the user to interact with through.
UWorld* World;
// The box that holds the notification bar.
TSharedPtr< SHorizontalBox > NotificationBarBox;
// Holds the world settings details view.
TSharedPtr<IDetailsView> WorldSettingsView;
// The thumbnail pool used to display asset thumbnails
TSharedPtr<FAssetThumbnailPool> ThumbnailPool;
/** Transient editor viewport states - one for each view type. Key is "LayoutId[ELevelViewportType]", eg) "Viewport 1[0]" */
TMap<FString, FLevelViewportInfo> TransientEditorViews;
/** List of all actor details panels to update when selection changes */
TArray< TWeakPtr<class SActorDetails> > AllActorDetailPanels;
/** Attached sequencer asset editor */
TWeakPtr<IAssetEditorInstance> SequencerAssetEditor;
/** Weak pointer to the level editor's Sequencer widget */
TWeakPtr<SWidget> SequencerWidgetPtr;
/** Weak pointer to the level editor's scene outliner */
TWeakPtr<ISceneOutliner> SceneOutlinerPtr;
/** Handle to the registered OnPreviewFeatureLevelChanged delegate. */
FDelegateHandle PreviewFeatureLevelChangedHandle;
/** Handle to the registered OnLevelActorOuterChanged delegate */
FDelegateHandle LevelActorOuterChangedHandle;
/** If this flag is raised we will force refresh on next selection update. */
bool bNeedsRefresh : 1;
};