#include "Hoge.h"
#include "Engine/World.h"
#include "LevelEditor.h"
#include "ContentBrowserModule.h"
#include "IContentBrowserSingleton.h"
#include "Misc/MessageDialog.h"
#include "Engine/LevelScriptBlueprint.h"
#include "Toolkits/AssetEditorManager.h"
#define LOCTEXT_NAMESPACE "FHogeModule"
namespace
{
FContentBrowserMenuExtender_SelectedAssets ContentBrowserExtenderDelegate;
FDelegateHandle ContentBrowserExtenderDelegateHandle;
}
void FHogeModule::StartupModule()
{
if (IsRunningCommandlet()) { return; }
FContentBrowserModule& ContentBrowserModule =
FModuleManager::LoadModuleChecked<FContentBrowserModule>(TEXT("ContentBrowser"));
// アセット右クリックメニューへのExtender登録
ContentBrowserExtenderDelegate =
FContentBrowserMenuExtender_SelectedAssets::CreateStatic(
&FHogeModule::OnExtendContentBrowserAssetSelectionMenu
);
TArray<FContentBrowserMenuExtender_SelectedAssets>& CBMenuExtenderDelegates =
ContentBrowserModule.GetAllAssetViewContextMenuExtenders();
CBMenuExtenderDelegates.Add(ContentBrowserExtenderDelegate);
ContentBrowserExtenderDelegateHandle = CBMenuExtenderDelegates.Last().GetHandle();
}
void FHogeModule::ShutdownModule()
{
FContentBrowserModule* ContentBrowserModule =
FModuleManager::GetModulePtr<FContentBrowserModule>(TEXT("ContentBrowser"));
if (nullptr != ContentBrowserModule)
{
TArray<FContentBrowserMenuExtender_SelectedAssets>& CBMenuExtenderDelegates =
ContentBrowserModule->GetAllAssetViewContextMenuExtenders();
CBMenuExtenderDelegates.RemoveAll([](const FContentBrowserMenuExtender_SelectedAssets& Delegate)
{ return Delegate.GetHandle() == ContentBrowserExtenderDelegateHandle; });
}
}
TSharedRef<FExtender> FHogeModule::OnExtendContentBrowserAssetSelectionMenu(const TArray<FAssetData>& SelectedAssets)
{
TSharedRef<FExtender> Extender(new FExtender());
for (auto ItAsset = SelectedAssets.CreateConstIterator(); ItAsset; ++ItAsset)
{
if ((*ItAsset).AssetClass == UWorld::StaticClass()->GetFName())
{
Extender->AddMenuExtension(
TEXT("CommonAssetActions"),
EExtensionHook::First,
nullptr,
FMenuExtensionDelegate::CreateStatic(&FHogeModule::CreateAssetMenu, SelectedAssets)
);
return Extender;
}
}
return Extender;
}
void FHogeModule::CreateAssetMenu(FMenuBuilder& MenuBuilder, TArray<FAssetData> SelectedAssets)
{
int count = 0;
for (auto ItAsset = SelectedAssets.CreateConstIterator(); ItAsset; ++ItAsset)
{
if ((*ItAsset).AssetClass == UWorld::StaticClass()->GetFName())
{
count++;
}
}
FText toolTip = count == 1 ? LOCTEXT("Open Level Blueprint", "Open Level Blueprint") : LOCTEXT("Open Level Blueprints", "Open Level Blueprints");
MenuBuilder.AddMenuEntry(
toolTip,
LOCTEXT("OpenLevelBlueprint_Tooltip", "Open Level Blueprint. Note: This is unofficial"),
FSlateIcon(),
FUIAction(FExecuteAction::CreateStatic(&FHogeModule::OpenLevelBlueprint, SelectedAssets)),
NAME_None,
EUserInterfaceActionType::Button
);
}
void FHogeModule::OpenLevelBlueprint(TArray<FAssetData> SelectedAssets)
{
for (auto ItAsset = SelectedAssets.CreateConstIterator(); ItAsset; ++ItAsset)
{
UWorld* world = Cast<UWorld>((*ItAsset).GetAsset());
if (!world)
{
continue;
}
ULevel* level = world->GetCurrentLevel();
if (level == NULL)
{
return;
}
ULevelScriptBlueprint* LevelScriptBlueprint = level->GetLevelScriptBlueprint();
if (LevelScriptBlueprint)
{
FAssetEditorManager::Get().OpenEditorForAsset(LevelScriptBlueprint);
}
else
{
FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "UnableToCreateLevelScript", "Unable to find or create a level blueprint for this level."));
}
}
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FHogeModule, Hoge)