From ead3ae8cd0d1e7b83c3a930db03a1a318aea7e88 Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Mon, 27 Mar 2023 11:16:53 +0200 Subject: [PATCH] add custom asset type actions for skeletons --- .../SGEditor/SGAssetTypeActions_Skeleton.cpp | 82 +++++++++++++++++++ .../Private/SGEditor/SGSkeletonEditor.cpp | 81 +++++++++++++++--- .../Private/SenseGloveEditorModule.cpp | 1 + .../SGEditor/SGAssetTypeActions_Skeleton.h | 62 ++++++++++++++ .../Public/SGEditor/SGSkeletonEditor.h | 14 +++- .../SGEditor/SGSkeletonEditorCommands.h | 2 +- 6 files changed, 226 insertions(+), 16 deletions(-) create mode 100644 Source/SenseGloveEditor/Private/SGEditor/SGAssetTypeActions_Skeleton.cpp create mode 100644 Source/SenseGloveEditor/Public/SGEditor/SGAssetTypeActions_Skeleton.h diff --git a/Source/SenseGloveEditor/Private/SGEditor/SGAssetTypeActions_Skeleton.cpp b/Source/SenseGloveEditor/Private/SGEditor/SGAssetTypeActions_Skeleton.cpp new file mode 100644 index 00000000..d0150a77 --- /dev/null +++ b/Source/SenseGloveEditor/Private/SGEditor/SGAssetTypeActions_Skeleton.cpp @@ -0,0 +1,82 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2023 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#include "SGEditor/SGAssetTypeActions_Skeleton.h" + +#include "Toolkits/IToolkitHost.h" +#include "ToolMenuSection.h" +#include "UObject/Class.h" +#include "UObject/Object.h" + +FText FSGAssetTypeActions_Skeleton::GetName() const +{ + return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_Skeleton", "Skeleton"); +} + +FColor FSGAssetTypeActions_Skeleton::GetTypeColor() const +{ + return FColor(105, 181, 205); +} + +UClass* FSGAssetTypeActions_Skeleton::GetSupportedClass() const +{ + return USkeleton::StaticClass(); +} + +bool FSGAssetTypeActions_Skeleton::HasActions(const TArray& InObjects) const +{ + return true; +} + +void FSGAssetTypeActions_Skeleton::GetActions(const TArray& InObjects, FToolMenuSection& Section) +{ + /*MenuBuilder.AddMenuEntry( + FText::FromString("Show Message"), + FText::FromString("Show a message box"), + FSlateIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.ViewOptions"), + FUIAction(FExecuteAction::CreateRaw(this, &FMyAssetActions::ShowMessage, InObjects)) + );*/ +} + +void FSGAssetTypeActions_Skeleton::OpenAssetEditor(const TArray& InObjects, + TSharedPtr EditWithinLevelEditor) +{ + //FAssetTypeActions_Base::OpenAssetEditor(InObjects, EditWithinLevelEditor); +} + +uint32 FSGAssetTypeActions_Skeleton::GetCategories() +{ + return EAssetTypeCategories::Animation; +} \ No newline at end of file diff --git a/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp b/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp index 53b604ce..afb0a04b 100644 --- a/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp +++ b/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp @@ -35,15 +35,49 @@ #include "SGEditor/SGSkeletonEditor.h" +#include "Framework/MultiBox/MultiBoxExtender.h" #include "ISkeletonEditor.h" #include "ISkeletonEditorModule.h" #include "Modules/ModuleManager.h" +#include "SGEditor/SGAssetTypeActions_Skeleton.h" #include "SGEditor/SGSkeletonEditorCommands.h" #define LOCTEXT_NAMESPACE "SkeletonEditor" +struct FSGSkeletonEditor::FImpl +{ + /************************ + * Member variables + ************************/ + + TSharedPtr ToolbarExtender; + TSharedPtr EditorCommands; + TSharedPtr AssetActions; + + /************************ + * Owner object + ************************/ + + FSGSkeletonEditor* Owner; + + /************************ + * Constructor / Destructor + ************************/ + + explicit FImpl(FSGSkeletonEditor* InOwner); + ~FImpl(); + + /************************ + * Default copy constructor & copy assignment operator + ************************/ + + FImpl(const FImpl& Rhs) = default; + FImpl& operator=(const FImpl& Rhs) = default; +}; + FSGSkeletonEditor::FSGSkeletonEditor() + : Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) { } @@ -51,41 +85,66 @@ FSGSkeletonEditor::~FSGSkeletonEditor() = default; void FSGSkeletonEditor::ExtendToolbar() { - if (EditorCommands.IsValid()) + if (Pimpl->EditorCommands.IsValid()) { - EditorCommands.Reset(); + Pimpl->EditorCommands.Reset(); } - EditorCommands = MakeShared(); - EditorCommands->RegisterCommands(); + Pimpl->EditorCommands = MakeShared(); + Pimpl->EditorCommands->RegisterCommands(); - if (ToolbarExtender.IsValid()) + if (Pimpl->ToolbarExtender.IsValid()) { - ToolbarExtender.Reset(); + Pimpl->ToolbarExtender.Reset(); } - ToolbarExtender = MakeShared(); + Pimpl->ToolbarExtender = MakeShared(); ISkeletonEditorModule& SkeletonEditorModule{ FModuleManager::LoadModuleChecked("SkeletonEditor") }; TSharedPtr ExtensibilityManager{SkeletonEditorModule.GetToolBarExtensibilityManager()}; - ToolbarExtender->AddToolBarExtension( + Pimpl->ToolbarExtender->AddToolBarExtension( "Skeleton", EExtensionHook::Before, - EditorCommands->CommandList, + Pimpl->EditorCommands->CommandList, FToolBarExtensionDelegate::CreateLambda([&](FToolBarBuilder& ToolbarBuilder)-> void { ToolbarBuilder.BeginSection("SenseGlove"); { ToolbarBuilder.AddToolBarButton( - EditorCommands->UpdateSkeletonReferencePose, + Pimpl->EditorCommands->UpdateSkeletonReferencePose, NAME_None, LOCTEXT("UpdateSkeletonReferencePose", "Update Skeleton Reference Pose")); } ToolbarBuilder.EndSection(); } )); - ExtensibilityManager->AddExtender(ToolbarExtender); + ExtensibilityManager->AddExtender(Pimpl->ToolbarExtender); +} + +void FSGSkeletonEditor::RegisterAssetTypeActions() const +{ + if (Pimpl->AssetActions.IsValid()) + { + Pimpl->AssetActions.Reset(); + } + Pimpl->AssetActions = MakeShared(); + + IAssetTools& AssetTools = FModuleManager::LoadModuleChecked("AssetTools").Get(); + + AssetTools.RegisterAssetTypeActions(Pimpl->AssetActions.ToSharedRef()); +} + +FSGSkeletonEditor::FImpl::FImpl(FSGSkeletonEditor* InOwner) + : Owner(InOwner) +{ +} + +FSGSkeletonEditor::FImpl::~FImpl() = default; + +void FSGSkeletonEditor::FImplDeleter::operator()(const FImpl* P) const +{ + delete P; } #undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp b/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp index 8c92b129..4a6db3a2 100644 --- a/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp +++ b/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp @@ -45,6 +45,7 @@ void FSenseGloveEditorModule::StartupModule() SkeletonEditor = MakeShared(); SkeletonEditor->ExtendToolbar(); + SkeletonEditor->RegisterAssetTypeActions(); } void FSenseGloveEditorModule::PreUnloadCallback() diff --git a/Source/SenseGloveEditor/Public/SGEditor/SGAssetTypeActions_Skeleton.h b/Source/SenseGloveEditor/Public/SGEditor/SGAssetTypeActions_Skeleton.h new file mode 100644 index 00000000..35249cd6 --- /dev/null +++ b/Source/SenseGloveEditor/Public/SGEditor/SGAssetTypeActions_Skeleton.h @@ -0,0 +1,62 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2023 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#pragma once + +#include "AssetTypeActions_Base.h" +#include "Containers/Array.h" +#include "Internationalization/Text.h" +#include "Math/Color.h" +#include "HAL/Platform.h" +#include "Templates/SharedPointer.h" + +struct FToolMenuSection; +class IToolkitHost; +class UClass; +class UObject; + +class FSGAssetTypeActions_Skeleton : public FAssetTypeActions_Base +{ +public: + virtual FText GetName() const override; + virtual FColor GetTypeColor() const override; + virtual UClass* GetSupportedClass() const override; + virtual bool HasActions(const TArray& InObjects) const override; + virtual void GetActions(const TArray& InObjects, FToolMenuSection& Section) override; + virtual void OpenAssetEditor( + const TArray& InObjects, + TSharedPtr EditWithinLevelEditor = TSharedPtr()) override; + virtual uint32 GetCategories() override; +}; \ No newline at end of file diff --git a/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h index 8475ba92..3aee36ec 100644 --- a/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h +++ b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h @@ -39,13 +39,18 @@ #include "Framework/MultiBox/MultiBoxExtender.h" #include "Templates/SharedPointer.h" -class FSGSkeletonEditorCommands; - class FSGSkeletonEditor { private: - TSharedPtr ToolbarExtender; - TSharedPtr EditorCommands; + struct FImpl; + + struct FImplDeleter + { + void operator()(const FImpl* P) const; + }; + + TUniquePtr Pimpl; + FImplDeleter PimplDeleter; public: FSGSkeletonEditor(); @@ -53,4 +58,5 @@ public: public: void ExtendToolbar(); + void RegisterAssetTypeActions() const; }; \ No newline at end of file diff --git a/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h index e1e4105c..d0ca27a7 100644 --- a/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h +++ b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h @@ -48,7 +48,7 @@ public: public: FSGSkeletonEditorCommands(); - virtual ~FSGSkeletonEditorCommands(); + virtual ~FSGSkeletonEditorCommands() override; public: virtual void RegisterCommands() override;