Implement asset editor interface so SNGStateMachine object can be created and edited

This commit is contained in:
Kevin Poretti 2022-04-02 16:44:29 -04:00
parent 0eaaa562be
commit b71b54537c
12 changed files with 156 additions and 0 deletions

Binary file not shown.

View File

@ -3,6 +3,7 @@
#pragma once
#include "Modules/ModuleManager.h"
#include "Styling/SlateStyle.h"
class ISNGModuleListenerInterface
{
@ -14,10 +15,14 @@ public:
class ISNGModuleInterface : public IModuleInterface
{
public:
/** IModuleInterface */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
virtual void AddModuleListeners() {};
TSharedPtr<FSlateStyleSet> StyleSet;
protected:
TArray<TSharedRef<ISNGModuleListenerInterface>> ModuleListeners;
};

View File

@ -0,0 +1 @@
#include "States/IStateMachineEditor.h"

View File

@ -0,0 +1,68 @@
#include "States/SNGStateMachineEditor.h"
#define LOCTEXT_NAMESPACE "SNGStateMachineEditor"
const FName SNGStateMachineEditorAppName = FName(TEXT("SNGStateMachineEditorAppName"));
void FSNGStateMachineEditor::RegisterTabSpawners(const TSharedRef<FTabManager>& InTabManager)
{
/*
WorkspaceMenuCategory = TabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_SNGStateMachineEditor", "SNG State Machine Editor"));
TSharedRef<FWorkspaceItem> WorkspaceMenuCatRef = WorkspaceMenuCategory.ToSharedRef();
FAssetEditorToolkit::RegisterTabSpawners(TabManager);
TabManager->RegisterTabSpawner(GraphCanvasTabId, )
.SetDisplayName(LOCTEXT("GraphCanvasTab", "Graph"))
.SetGroup(WorkspaceMenuCategoryRef)
.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), "GraphEditor.EventGraph_16x"));
TabManager->RegisterTabSpawner(PropertiesTabId, FOnSpawnTab::CreateSP(this, &FSoundSubmixEditor::SpawnTab_Properties))
.SetDisplayName(LOCTEXT("PropertiesTab", "Details"))
.SetGroup(WorkspaceMenuCategoryRef)
.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.Tabs.Details"));\
*/
}
void FSNGStateMachineEditor::UnregisterTabSpawners(const TSharedRef<FTabManager>& InTabManager)
{
IStateMachineEditor::UnregisterTabSpawners(InTabManager);
}
FText FSNGStateMachineEditor::GetBaseToolkitName() const
{
return LOCTEXT("SNGStateMachineEditorAppLabel", "SNG State Machine Editor");
}
FText FSNGStateMachineEditor::GetToolkitName() const
{
const bool bDirtyState = StateMachineEdited->GetOutermost()->IsDirty();
FFormatNamedArguments Args;
Args.Add(TEXT("StateMachineName", FText::FromString(StateMachineEdited->GetName())));
Args.Add((TEXT("DirtyState")), bDirtyState ? FText::FromString("*") : FText::GetEmpty());
return FText::Format(LOCTEXT("SNGStateMachineEditorToolkitName", "{StateMachineName}{DirtyState}"), Args);
}
void FSNGStateMachineEditor::SaveAsset_Execute()
{
FAssetEditorToolkit::SaveAsset_Execute();
}
void FSNGStateMachineEditor::SaveAssetAs_Execute()
{
IStateMachineEditor::SaveAssetAs_Execute();
}
void FSNGStateMachineEditor::FocusWindow(UObject* ObjectToFocusOn)
{
BringToolkitToFront();
//JumpToObject
}
void FSNGStateMachineEditor::InitStateMachineEditor(const EToolkitMode::Type Mode,
const TSharedPtr<IToolkitHost>& InitToolkitHost, USNGStateMachine* StateMachine)
{
StateMachineEdited = StateMachine;
FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, SNGStateMachineEditorAppName, , true, true, StateMachine);
}

View File

@ -0,0 +1,7 @@
#pragma once
class IStateMachineEditor : public FAssetEditorToolkit
{
public:
};

View File

@ -0,0 +1,43 @@
// Project Sword & Gun Copyright © 2021 Kevin Poretti
#pragma once
#include "CoreMinimal.h"
#include "IStateMachineEditor.h"
#include "States/SNGStateMachine.h"
#include "Toolkits/SimpleAssetEditor.h"
class FSNGStateMachineEditor : public IStateMachineEditor
{
public:
/** IToolkit Interface */
virtual void RegisterTabSpawners(const TSharedRef<FTabManager>& InTabManager) override;
virtual void UnregisterTabSpawners(const TSharedRef<FTabManager>& InTabManager) override;
virtual FText GetBaseToolkitName() const override;
virtual FText GetToolkitName() const override;
virtual FName GetToolkitFName() const override { return FName(TEXT("SNGStateMachineEditor")); }
virtual FText GetToolkitToolTipText() const override;
virtual FLinearColor GetWorldCentricTabColorScale() const override;
virtual FString GetWorldCentricTabPrefix() const override;
/** FAssetEditorToolkit interface */
virtual FString GetDocumentationLink() const override;
virtual bool CanSaveAsset() const override { return true; }
virtual bool CanSaveAssetAs() const override { return true; }
virtual void SaveAsset_Execute() override;
virtual void SaveAssetAs_Execute() override;
/** IAssetEditorInstance interface */
virtual void FocusWindow(UObject* ObjectToFocusOn = nullptr) override;
void InitStateMachineEditor(const EToolkitMode::Type Mode, const TSharedPtr<IToolkitHost>& InitToolkitHost, USNGStateMachine* StateMachine);
private:
/** State machien being edited */
USNGStateMachine* StateMachineEdited;
/** Graph Editor */
TSharedPtr<SGraphEditor> GraphEditorView;
};

View File

@ -1,14 +1,39 @@
#include "SwordNGunEditor.h"
#include "AssetToolsModule.h"
#include "States/SNGStateMachineTypeActions.h"
IMPLEMENT_GAME_MODULE(FSwordNGunEditor, SwordNGunEditor)
void FSwordNGunEditor::StartupModule()
{
// register custom types
// add custom category
IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
// register custom asset with SwordNGun category
EAssetTypeCategories::Type SNGCategory =
AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("SwordNGun")), FText::FromString("Sword N Gun"));
TSharedPtr<IAssetTypeActions> Action = MakeShareable(new FSNGStateMachineTypeActions(SNGCategory));
AssetTools.RegisterAssetTypeActions(Action.ToSharedRef());
// save for later so it can be unregistered on shutdown
CreatedAssetTypeActions.Add(Action);
ISNGModuleInterface::StartupModule();
}
void FSwordNGunEditor::ShutdownModule()
{
// unregister all asset types created by this module
if(FModuleManager::Get().IsModuleLoaded("AssetTools"))
{
IAssetTools& AssetTools = FModuleManager::GetModuleChecked<FAssetToolsModule>("AssetTools").Get();
for(int32 i = 0; i < CreatedAssetTypeActions.Num(); i++)
{
AssetTools.UnregisterAssetTypeActions(CreatedAssetTypeActions[i].ToSharedRef());
}
}
CreatedAssetTypeActions.Empty();
ISNGModuleInterface::ShutdownModule();
}

View File

@ -1,4 +1,5 @@
#pragma once
#include "IAssetTypeActions.h"
#include "ISNGModuleInterface.h"
class FSwordNGunEditor : public ISNGModuleInterface
@ -19,4 +20,7 @@ public:
{
return FModuleManager::Get().IsModuleLoaded("SwordNGunEditor");
}
private:
TArray<TSharedPtr<IAssetTypeActions>> CreatedAssetTypeActions;
};