262 lines
No EOL
7.9 KiB
C++
262 lines
No EOL
7.9 KiB
C++
// Copyright 2020 Phyronnaz
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "UObject/GCObject.h"
|
|
#include "Misc/NotifyHook.h"
|
|
#include "EditorUndoClient.h"
|
|
#include "TickableEditorObject.h"
|
|
#include "VoxelGraphErrorReporter.h"
|
|
#include "IVoxelGraphEditorToolkit.h"
|
|
#include "VoxelGraphEditor.h"
|
|
#include "VoxelMinimal.h"
|
|
|
|
class IDetailsView;
|
|
class SVoxelGraphPreview;
|
|
class FVoxelGraphPreview;
|
|
class SVoxelPalette;
|
|
class SVoxelGraphPreviewViewport;
|
|
class SGraphEditor;
|
|
class SWidget;
|
|
class IMessageLogListing;
|
|
|
|
class FVoxelGraphEditorToolkit : public IVoxelGraphEditorToolkit, public FGCObject, public FNotifyHook, public FEditorUndoClient, public FTickableEditorObject
|
|
{
|
|
public:
|
|
FVoxelGraphEditorToolkit();
|
|
virtual ~FVoxelGraphEditorToolkit();
|
|
|
|
virtual void RegisterTabSpawners(const TSharedRef<class FTabManager>& TabManager) override;
|
|
virtual void UnregisterTabSpawners(const TSharedRef<class FTabManager>& TabManager) override;
|
|
|
|
void InitVoxelEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, UObject* ObjectToEdit);
|
|
|
|
private:
|
|
// Creates all internal widgets for the tabs to point at
|
|
void CreateInternalWidgets();
|
|
|
|
// Add the toolbar buttons
|
|
void FillToolbar(FToolBarBuilder& ToolbarBuilder);
|
|
// Builds the toolbar. Calls FillToolbar
|
|
void ExtendToolbar();
|
|
|
|
// Fill the voxel menu dropdown
|
|
void FillVoxelMenu(FMenuBuilder& MenuBuilder);
|
|
// Adds additional dropdowns. Calls FillMenu
|
|
void AddEditorMenus(FMenuBarBuilder& MenuBarBuilder);
|
|
// Builds the menu. Calls AddEditorMenus
|
|
void ExtendMenu();
|
|
|
|
// Binds new graph commands to delegates
|
|
void BindGraphCommands();
|
|
|
|
// Create new graph editor widget
|
|
TSharedRef<SGraphEditor> CreateGraphEditorWidget(bool bDebug);
|
|
|
|
public:
|
|
//~ Begin IVoxelGraphEditorToolkit interface
|
|
virtual bool GetBoundsForSelectedNodes(class FSlateRect& Rect, float Padding) override;
|
|
virtual int32 GetNumberOfSelectedNodes() const override;
|
|
virtual TSet<UObject*> GetSelectedNodes() const override;
|
|
virtual void SelectNodesAndZoomToFit(const TArray<UEdGraphNode*>& Nodes) override;
|
|
virtual void RefreshNodesMessages() override;
|
|
void TriggerUpdatePreview(EVoxelGraphPreviewFlags Flags) override;
|
|
virtual FAdvancedPreviewScene* GetPreviewScene() const override;
|
|
virtual void DebugNodes(const TSet<FVoxelCompilationNode*>& Nodes) override;
|
|
virtual void AddMessages(const TArray<FVoxelGraphMessage>& Messages) override;
|
|
virtual void ClearMessages(bool bClearAll, EVoxelGraphNodeMessageType MessagesToClear) override;
|
|
//~ End IVoxelGraphEditorToolkit interface
|
|
|
|
//~ Begin IToolkit interface
|
|
virtual FName GetToolkitFName() const override { return "VoxelGraphEditor"; }
|
|
virtual FText GetBaseToolkitName() const override { return VOXEL_LOCTEXT("Voxel Graph Editor"); }
|
|
virtual FString GetWorldCentricTabPrefix() const override { return "VoxelGraphEditor"; }
|
|
virtual FLinearColor GetWorldCentricTabColorScale() const override { return FLinearColor(0.3f, 0.2f, 0.5f, 0.5f); }
|
|
virtual void SaveAsset_Execute() override;
|
|
//~ End IToolkit interface
|
|
|
|
//~ Begin FGCObject interface
|
|
virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
|
|
virtual FString GetReferencerName() const override { return "FVoxelGraphEditorToolkit"; }
|
|
//~ End FGCObject interface
|
|
|
|
//~ Begin FEditorUndoClient Interface
|
|
virtual void PostUndo(bool bSuccess) override;
|
|
virtual void PostRedo(bool bSuccess) override { PostUndo(bSuccess); }
|
|
//~ End FEditorUndoClient Interface
|
|
|
|
//~ Begin FNotifyHook Interface
|
|
virtual void NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FProperty* PropertyThatChanged) override;
|
|
//~ End FNotifyHook Interface
|
|
|
|
//~ Begin FTickableGameObject Interface
|
|
virtual void Tick(float DeltaTime) override;
|
|
virtual ETickableTickType GetTickableTickType() const override { return ETickableTickType::Always; }
|
|
virtual TStatId GetStatId() const override;
|
|
//~ End FTickableGameObject Interface
|
|
|
|
private:
|
|
TSharedRef<SDockTab> SpawnTab_GraphCanvas(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_DebugGraphCanvas(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_Properties(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_Shortcuts(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_PreviewSettings(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_Palette(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_Preview(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_PreviewViewport(const FSpawnTabArgs& Args);
|
|
TSharedRef<SDockTab> SpawnTab_Messages(const FSpawnTabArgs& Args);
|
|
|
|
private:
|
|
/**
|
|
* Graph events
|
|
*/
|
|
|
|
void OnSelectedNodesChanged(const TSet<UObject*>& NewSelection);
|
|
|
|
// Called when a node's title is committed for a rename
|
|
void OnNodeTitleCommitted(const FText& NewText, ETextCommit::Type CommitInfo, UEdGraphNode* NodeBeingChanged);
|
|
|
|
void OnNodeDoubleClicked(UEdGraphNode* Node);
|
|
|
|
FReply OnSpawnGraphNodeByShortcut(FInputChord InChord, const FVector2D& InPosition);
|
|
|
|
public:
|
|
/**
|
|
* Graph bindings
|
|
*/
|
|
|
|
void AddInput();
|
|
bool CanAddInput() const;
|
|
|
|
void DeleteInput();
|
|
bool CanDeleteInput() const;
|
|
|
|
void OnCreateComment();
|
|
|
|
void OnTogglePinPreview();
|
|
|
|
void OnSplitPin();
|
|
void OnCombinePin();
|
|
|
|
void SelectAllNodes();
|
|
bool CanSelectAllNodes() const { return true; }
|
|
|
|
void DeleteSelectedNodes();
|
|
bool CanDeleteNodes() const;
|
|
void DeleteSelectedDuplicatableNodes(); // For cut
|
|
|
|
void CutSelectedNodes();
|
|
bool CanCutNodes() const;
|
|
|
|
void CopySelectedNodes();
|
|
bool CanCopyNodes() const;
|
|
|
|
void PasteNodes();
|
|
virtual void PasteNodesHere(const FVector2D& Location) override;
|
|
virtual bool CanPasteNodes() const override;
|
|
|
|
void DuplicateNodes();
|
|
bool CanDuplicateNodes() const;
|
|
|
|
void OnAlignTop();
|
|
void OnAlignMiddle();
|
|
void OnAlignBottom();
|
|
void OnAlignLeft();
|
|
void OnAlignCenter();
|
|
void OnAlignRight();
|
|
|
|
void OnStraightenConnections();
|
|
|
|
void OnDistributeNodesH();
|
|
void OnDistributeNodesV();
|
|
|
|
void OnSelectLocalVariableDeclaration();
|
|
void OnSelectLocalVariableUsages();
|
|
void OnConvertRerouteToVariables();
|
|
void OnConvertVariablesToReroute();
|
|
|
|
void ReconstructNode();
|
|
|
|
public:
|
|
/**
|
|
* Toolbar bindings
|
|
*/
|
|
|
|
void RecreateNodes();
|
|
|
|
void CompileToCpp();
|
|
|
|
void ToggleAutomaticPreview();
|
|
bool IsToggleAutomaticPreviewChecked() const;
|
|
void UpdatePreview(EVoxelGraphPreviewFlags Flags);
|
|
void UpdateVoxelWorlds();
|
|
|
|
void ClearNodesMessages();
|
|
|
|
void ShowAxisDependencies();
|
|
|
|
void UndoGraphAction();
|
|
void RedoGraphAction();
|
|
|
|
public:
|
|
// Message list action
|
|
void SelectNodeAndZoomToFit(TWeakObjectPtr<const UVoxelNode> Node);
|
|
|
|
private:
|
|
// The Voxel asset being inspected
|
|
UVoxelGraphGenerator* Generator = nullptr;
|
|
|
|
// Command list for this editor
|
|
TSharedPtr<FUICommandList> GraphEditorCommands;
|
|
|
|
bool bUpdatePreviewOnNextTick = false;
|
|
EVoxelGraphPreviewFlags NextPreviewFlags = EVoxelGraphPreviewFlags::None;
|
|
|
|
TArray<FVoxelGraphMessage> CurrentMessages;
|
|
|
|
private:
|
|
/**
|
|
* Tabs
|
|
*/
|
|
|
|
// Graphs tabs
|
|
TSharedPtr<SDockTab> GraphTab;
|
|
TSharedPtr<SGraphEditor> VoxelGraphEditor;
|
|
TSharedPtr<SDockTab> DebugGraphTab;
|
|
TSharedPtr<SGraphEditor> VoxelDebugGraphEditor;
|
|
|
|
// Properties tabs
|
|
TSharedPtr<IDetailsView> VoxelProperties;
|
|
TSharedPtr<IDetailsView> ShortcutsProperties;
|
|
|
|
// Preview settings tab
|
|
TSharedPtr<IDetailsView> PreviewSettings;
|
|
|
|
// Palette of Voxel Node types
|
|
TSharedPtr<SVoxelPalette> Palette;
|
|
|
|
// Preview tab
|
|
TSharedPtr<SVoxelGraphPreview> Preview;
|
|
// 3D Preview
|
|
TSharedPtr<SVoxelGraphPreviewViewport> PreviewViewport;
|
|
|
|
// Preview handler
|
|
TSharedPtr<FVoxelGraphPreview> PreviewHandler;
|
|
TSharedPtr<FAdvancedPreviewScene> PreviewScene;
|
|
|
|
// Messages panel
|
|
TSharedPtr<SWidget> MessagesWidget;
|
|
TSharedPtr<IMessageLogListing> MessagesListing;
|
|
|
|
// The tab ids for all the tabs used
|
|
static const FName GraphCanvasTabId;
|
|
static const FName DebugGraphCanvasTabId;
|
|
static const FName PropertiesTabId;
|
|
static const FName ShortcutsTabId;
|
|
static const FName PreviewSettingsTabId;
|
|
static const FName PaletteTabId;
|
|
static const FName PreviewTabId;
|
|
static const FName PreviewViewportTabId;
|
|
static const FName MessagesTabId;
|
|
}; |