#include "GaeaUEToolsEditor.h" #include "GaeaEditorStyle.h" #include "EditorStyleSet.h" #include "GaeaCommands.h" #include "LevelEditor.h" #include "Misc/CoreDelegates.h" #include "Subsystems/EditorActorSubsystem.h" #include "GaeaLandscapeComponent.h" #include "Landscape.h" #include "ToolMenus.h" #include "WorldPartition/WorldPartitionSubsystem.h" DEFINE_LOG_CATEGORY(GaeaUETools); #define LOCTEXT_NAMESPACE "FGaeaUEToolsEditorModule" void FGaeaUEToolsEditorModule::StartupModule() { FGaeaEditorStyle::Initialize(); FGaeaCommands::Register(); /*UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw( this, &FGaeaUEToolsEditorModule::RegisterMCWindow));*/ // Register Material Creator Callback UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw( this, &FGaeaUEToolsEditorModule::RegisterGaeaActorMenu)); /*UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw( this, &FGaeaUEToolsEditorModule::RegisterLandscapeActorMenu));*/ UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw( this, &FGaeaUEToolsEditorModule::RegisterImporterWindow)); // Register Importer Callback // Bind the commands const FLevelEditorModule& LevelEditor = FModuleManager::GetModuleChecked("LevelEditor"); const TSharedRef Commands = LevelEditor.GetGlobalLevelEditorActions(); Commands->MapAction( FGaeaCommands::Get().OpenImporter, FExecuteAction::CreateLambda([this]() { UE_LOG(LogTemp, Log, TEXT("Opening Gaea Landscape Importer Window")); if (UGaeaSubsystem* GSubsystem = UGaeaSubsystem::GetGaeaSubsystem()) { //UE_LOG(LogTemp, Log, TEXT("Opened Gaea Landscape Importer Window.")); GSubsystem->SpawnGImporterWindow(); } }) ); } void FGaeaUEToolsEditorModule::ShutdownModule() { FGaeaEditorStyle::Shutdown(); FGaeaCommands::Unregister(); UToolMenus::UnregisterOwner(this); //Unregister menu entry } /*void FGaeaUEToolsEditorModule::RegisterMCWindow() { //Register owner for menu entry FToolMenuOwnerScoped OwnerScoped(this); //Set our menu entry name constexpr TCHAR ParentMenuName[] = TEXT("ContentBrowser.Toolbar"); UToolMenu* GaeaToolBar = UToolMenus::Get()->ExtendMenu(ParentMenuName); GaeaToolBar->StyleName = TEXT("GaeaToolbar"); //Find the section of the editor menu we want to add to //FToolMenuSection& Section = GaeaToolBar->FindOrAddSection("Tools"); FToolMenuSection& Section = GaeaToolBar->AddSection(TEXT("Gaea Material Creator"), LOCTEXT("GaeaMaterialTools_Label", "GaeaMaterialTools")); //Create and define our UI action FToolUIAction OpenGaeaMaterialAction; OpenGaeaMaterialAction.ExecuteAction = FToolMenuExecuteAction::CreateLambda([](const FToolMenuContext& InContext) { if ( UGaeaSubsystem* Manager = UGaeaSubsystem::GetGaeaSubsystem()) { Manager->SpawnGMCWindow(); // Spawn Material Creator Window } } ); //Create our custom toolbar entry const FToolMenuEntry OpenGaeaLandscapeMaterialCreator = FToolMenuEntry::InitToolBarButton( TEXT("OpenGaeaLandscapeMaterialCreator"), OpenGaeaMaterialAction, LOCTEXT("OpenGaeaLandscapeMaterialCreator_Label", "Gaea Landscape Material Creation"), LOCTEXT("OpenGaeaLandscapeMaterialCreator_Label_Description", "Opens Gaea Material Creator"), FSlateIcon(FAppStyle::Get().GetStyleSetName(), TEXT("ClassIcon.Material"))) ; //Add our custom menu entry to our previously selected menu section Section.AddEntry(OpenGaeaLandscapeMaterialCreator); }*/ void FGaeaUEToolsEditorModule::RegisterImporterWindow() { //Register owner for menu entry FToolMenuOwnerScoped OwnerScoped(this); //Set our menu entry name constexpr TCHAR ParentMenuName[] = TEXT("LevelEditor.LevelEditorToolBar.User"); UToolMenu* GaeaToolBar = UToolMenus::Get()->ExtendMenu(ParentMenuName); GaeaToolBar->StyleName = TEXT("GaeaToolbar"); //Find the section of the editor menu we want to add to //FToolMenuSection& Section = GaeaToolBar->FindOrAddSection("User"); FToolMenuSection& Section = GaeaToolBar->AddSection(TEXT("Gaea Landscape Importer"), LOCTEXT("GaeaLandscapeImporter_Label", "GaeaImporterTools")); //Create and define our UI action FToolUIAction OpenGaeaImporter; OpenGaeaImporter.ExecuteAction = FToolMenuExecuteAction::CreateLambda([](const FToolMenuContext& InContext) { if ( UGaeaSubsystem* Manager = UGaeaSubsystem::GetGaeaSubsystem()) { Manager->SpawnGImporterWindow(); // Spawn Importer Window } } ); //Create our custom toolbar entry - OLD. Does not work with editor shortcut key. /*const FToolMenuEntry OpenGaeaLandscapeImporter = FToolMenuEntry::InitToolBarButton( TEXT("OpenGaeaLandscapeImporter"), OpenGaeaImporter, LOCTEXT("OpenGaeaLandscapeImporter_Label", "Gaea Landscape Importer"), LOCTEXT("OpenGaeaLandscapeImporter_Label_Description", "Opens Gaea Landscape Importer"), //FSlateIcon(FAppStyle::Get().GetStyleSetName(), TEXT("ClassIcon.LandscapeComponent"))); FSlateIcon(FGaeaEditorStyle::GetStyleSetName(), TEXT("ImporterIcon")) );*/ const FToolMenuEntry OpenGaeaLandscapeImporter = FToolMenuEntry::InitToolBarButton( FGaeaCommands::Get().OpenImporter, LOCTEXT("OpenGaeaLandscapeImporter_Label", "Gaea Landscape Importer"), LOCTEXT("OpenGaeaLandscapeImporter_Label_Description", "Opens Gaea Landscape Importer"), FSlateIcon(FGaeaEditorStyle::GetStyleSetName(), TEXT("ImporterIcon")) ); //Add our custom menu entry to our previously selected menu section Section.AddEntry(OpenGaeaLandscapeImporter); } void FGaeaUEToolsEditorModule::RegisterGaeaActorMenu() { // Register owner for menu entry FToolMenuOwnerScoped OwnerScoped(this); // Create menu entry button in a new sub-menu UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("LevelEditor.ActorContextMenu"); Menu->AddDynamicSection("GaeaOptions", FNewToolMenuDelegate::CreateLambda([this](UToolMenu* InMenu) { // This delegate is called when it is time to create the menu section UEditorActorSubsystem* ActorSubsystem = GEditor->GetEditorSubsystem(); if (ActorSubsystem) { const TArray& SelectedActors = ActorSubsystem->GetSelectedLevelActors(); if (SelectedActors.Num() > 0) { AActor* Actor = SelectedActors[0]; if (Actor && Actor->GetClass()->IsChildOf(ALandscape::StaticClass())) { if (UGaeaLandscapeComponent* GaeaComponent = Actor->FindComponentByClass()) { // If a Landscape is selected, then add an item to the section FToolMenuSection& Section = InMenu->AddSection("GaeaOptionsSection", FText::FromString("Gaea Options"), FToolMenuInsert("ActorGeneral", EToolMenuInsertType::Before)); Section.AddSubMenu( "GaeaLandscapeSubMenu", FText::FromString("Gaea Landscape Actions"), FText::FromString("Contains various actions for landscapes imported from Gaea"), FNewMenuDelegate::CreateRaw(this, &FGaeaUEToolsEditorModule::GaeaActorActions), false, FSlateIcon(FGaeaEditorStyle::GetStyleSetName(), TEXT("ImporterIcon")) ); } } } } })); } void FGaeaUEToolsEditorModule::GaeaActorActions(FMenuBuilder& MenuBuilder) { FUIAction ExecuteReimportGaeaLandscape( FExecuteAction::CreateLambda([]() { if (UGaeaSubsystem* Manager = UGaeaSubsystem::GetGaeaSubsystem()) { UWorld* World = GEditor->GetEditorWorldContext().World(); if (World) { if (World->IsPartitionedWorld()) { Manager->ReimportGaeaWPTerrain(); // Reimport for World Partition } else { Manager->ReimportGaeaTerrain(); // Reimport for standard landscape } } // ReimportTerrain } }) ); MenuBuilder.AddMenuEntry( FText::FromString("Refresh Landscape in Place"), FText::FromString("Clears current landscape actor internal data and fills with the associated heightmap/weightmaps"), FSlateIcon(), ExecuteReimportGaeaLandscape ); } void FGaeaUEToolsEditorModule::RegisterLandscapeActorMenu() { FToolMenuOwnerScoped OwnerScoped(this); UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("LevelEditor.LevelEditorSceneOutliner.ContextMenu"); FToolMenuSection& Section = Menu->FindOrAddSection("ActorOptions"); Section.AddDynamicEntry("DeleteWPLandscapeEntry", FNewToolMenuSectionDelegate::CreateLambda([](FToolMenuSection& Section) { FToolMenuEntry Entry = FToolMenuEntry::InitMenuEntry( "DeleteWPLandscapeEntry", FText::FromString("Delete World Partitioned Landscape"), FText::FromString("Deletes selected landscape and its proxies."), FSlateIcon(FGaeaEditorStyle::GetStyleSetName(), "ImporterIcon"), FUIAction( FExecuteAction::CreateLambda([]() { if (UGaeaSubsystem* Subsystem = UGaeaSubsystem::GetGaeaSubsystem()) { //Subsystem->DeleteWPLandscape(); } }), FCanExecuteAction::CreateLambda([]() { UEditorActorSubsystem* ActorSubsystem = GEditor->GetEditorSubsystem(); const TArray& Selected = ActorSubsystem->GetSelectedLevelActors(); const UWorld* World = GEditor->GetEditorWorldContext().World(); const bool bWP = World->IsPartitionedWorld(); return Selected.Num() > 0 && Selected[0]->IsA() && bWP; }) ) ); Entry.InsertPosition = FToolMenuInsert("EditSubMenu", EToolMenuInsertType::After); Section.AddEntry(Entry); })); } #undef LOCTEXT_NAMESPACE IMPLEMENT_MODULE(FGaeaUEToolsEditorModule, GaeaUEToolsEditor)