// Copyright 2017 ~ 2022 Critical Failure Studio Ltd. All rights reserved. #include "PaperZDContentBrowserExtension.h" #include "ContentBrowserModule.h" #include "PaperZDEditorStyle.h" #include "PaperZDExtractFlipbookFromTextureDialog.h" #include "Engine/Texture2D.h" #include "Framework/MultiBox/MultiBoxBuilder.h" #define LOCTEXT_NAMESPACE "PaperZDTools" static FContentBrowserMenuExtender_SelectedAssets ContentBrowserExtenderDelegate; static FDelegateHandle ContentBrowserExtenderDelegateHandle; struct FContentBrowserSelectedAssetExtensionBase { public: TArray SelectedAssets; public: virtual ~FContentBrowserSelectedAssetExtensionBase() {} virtual void Execute() {} }; struct FExtractFlipbookFromTextureExtension : public FContentBrowserSelectedAssetExtensionBase { void Execute() override { for (auto AssetIt = SelectedAssets.CreateConstIterator(); AssetIt; ++AssetIt) { const FAssetData& AssetData = *AssetIt; if (UTexture2D* Texture = Cast(AssetData.GetAsset())) { SPaperZDExtractFlipbookFromTextureDialog::ShowWindow(Texture); } } } static TArray ValidateAssets(const TArray& Assets) { TArray ValidAssets; const UClass* TextureClass = UTexture2D::StaticClass(); for (auto AssetIt = Assets.CreateConstIterator(); AssetIt; ++AssetIt) { const FAssetData& Asset = *AssetIt; const UClass* AssetClass = Asset.GetClass(); if (AssetClass && AssetClass->IsChildOf(TextureClass)) { ValidAssets.Add(Asset); } } return ValidAssets; } static bool HasValidAssets(const TArray& Assets) { return !ValidateAssets(Assets).IsEmpty(); } }; class FPaperZDContentBrowserExtension_Impl { public: static void ExecuteSelectedContentFunctor(TSharedPtr SelectedAssetFunctor) { SelectedAssetFunctor->Execute(); } static void PopulateActionsMenu(FMenuBuilder& MenuBuilder, TArray SelectedAssets) { // Extract Flipbook TArray ExtractFlipbookAssets = FExtractFlipbookFromTextureExtension::ValidateAssets(SelectedAssets); if (!ExtractFlipbookAssets.IsEmpty()) { TSharedPtr ExtractFlipbookFunctor = MakeShareable(new FExtractFlipbookFromTextureExtension()); ExtractFlipbookFunctor->SelectedAssets = ExtractFlipbookAssets; FUIAction Action_ExtractFlipbook( FExecuteAction::CreateStatic(&FPaperZDContentBrowserExtension_Impl::ExecuteSelectedContentFunctor, StaticCastSharedPtr(ExtractFlipbookFunctor))); MenuBuilder.AddMenuEntry( LOCTEXT("CB_Extension_Texture_ExtractFlipbook", "Extract Flipbook"), LOCTEXT("CB_Extension_Texture_ExtractFlipbook_Tooltip", "Extracts a Flipbook from the selected Texture"), FSlateIcon(FPaperZDEditorStyle::Get().GetStyleSetName(), "PaperZDEditor.Tools.ExtractAction"), Action_ExtractFlipbook, NAME_None, EUserInterfaceActionType::Button); } } static void CreateActionsSubMenu(FMenuBuilder& MenuBuilder, TArray SelectedAssets) { MenuBuilder.AddSubMenu( LOCTEXT("PaperZDActionsSubMenuLabel", "PaperZD Actions"), LOCTEXT("PaperZDActionsSubMenuToolTip", "PaperZD Asset Actions"), FNewMenuDelegate::CreateStatic(&FPaperZDContentBrowserExtension_Impl::PopulateActionsMenu, SelectedAssets), false, FSlateIcon(FPaperZDEditorStyle::Get().GetStyleSetName(), "PaperZDEditor.Tools.PluginAction") ); } static TArray& GetExtenderDelegates() { FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked(TEXT("ContentBrowser")); return ContentBrowserModule.GetAllAssetViewContextMenuExtenders(); } static TSharedRef OnExtendContentBrowserAssetSelectionMenu(const TArray& SelectedAssets) { TSharedRef Extender(new FExtender()); // Add other asset checks here for making the paper zd menu appear const bool bHasAnyValidAssets = FExtractFlipbookFromTextureExtension::HasValidAssets(SelectedAssets); if (bHasAnyValidAssets) { Extender->AddMenuExtension( "GetAssetActions", EExtensionHook::After, nullptr, FMenuExtensionDelegate::CreateStatic(&FPaperZDContentBrowserExtension_Impl::CreateActionsSubMenu, SelectedAssets)); } return Extender; } }; void FPaperZDContentBrowserExtension::InstallHooks() { ContentBrowserExtenderDelegate = FContentBrowserMenuExtender_SelectedAssets::CreateStatic(&FPaperZDContentBrowserExtension_Impl::OnExtendContentBrowserAssetSelectionMenu); TArray& CBMenuExtenderDelegates = FPaperZDContentBrowserExtension_Impl::GetExtenderDelegates(); CBMenuExtenderDelegates.Add(ContentBrowserExtenderDelegate); ContentBrowserExtenderDelegateHandle = CBMenuExtenderDelegates.Last().GetHandle(); } void FPaperZDContentBrowserExtension::RemoveHooks() { TArray& CBMenuExtenderDelegates = FPaperZDContentBrowserExtension_Impl::GetExtenderDelegates(); CBMenuExtenderDelegates.RemoveAll([](const FContentBrowserMenuExtender_SelectedAssets& Delegate) { return Delegate.GetHandle() == ContentBrowserExtenderDelegateHandle; }); } #undef LOCTEXT_NAMESPACE