From bc6a928312bcf5f1b66c0275e8447be2d2a8f085 Mon Sep 17 00:00:00 2001 From: Ange-Marie MAURIN Date: Thu, 10 Jul 2025 20:35:06 +0200 Subject: [PATCH] Switching DTFluxApi Tab Implementation to use the more modern UToolMenus approach API --- .../DTFluxAPIStatus/DTFluxAPIStatus.Build.cs | 1 + .../Private/DTFluxAPIStatusModule.cpp | 138 +++++++++++++----- .../Public/DTFluxAPIStatusModule.h | 8 +- 3 files changed, 106 insertions(+), 41 deletions(-) diff --git a/Source/DTFluxAPIStatus/DTFluxAPIStatus.Build.cs b/Source/DTFluxAPIStatus/DTFluxAPIStatus.Build.cs index eaaa0e8..93ac977 100644 --- a/Source/DTFluxAPIStatus/DTFluxAPIStatus.Build.cs +++ b/Source/DTFluxAPIStatus/DTFluxAPIStatus.Build.cs @@ -31,6 +31,7 @@ public class DTFluxAPIStatus : ModuleRules "DTFluxCoreSubsystem", "InputCore", "OutputLog", + "ToolMenus", } ); } diff --git a/Source/DTFluxAPIStatus/Private/DTFluxAPIStatusModule.cpp b/Source/DTFluxAPIStatus/Private/DTFluxAPIStatusModule.cpp index b8a1ddb..18a3220 100644 --- a/Source/DTFluxAPIStatus/Private/DTFluxAPIStatusModule.cpp +++ b/Source/DTFluxAPIStatus/Private/DTFluxAPIStatusModule.cpp @@ -14,9 +14,9 @@ FText DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::StatusTabDisplayName = FText:: void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::StartupModule() { + FDTFluxStatusStyle::RegisterStyle(); InitMenuExtension(); RegisterStatusTab(); - FDTFluxStatusStyle::RegisterStyle(); } @@ -25,45 +25,109 @@ void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::StartupModule() void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::InitMenuExtension() { - FLevelEditorModule& LevelEditorModule = - FModuleManager::LoadModuleChecked(TEXT("LevelEditor")); - // FDTFluxAPIModule& DTFluxApi = - // FModuleManager::LoadModuleChecked(TEXT("DTFluxAPI")); - const TSharedPtr MenuExtender = MakeShareable(new FExtender()); - - MenuExtender->AddMenuBarExtension( - "Help", - EExtensionHook::Before, - nullptr, - FMenuBarExtensionDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::AddMenu) - ); - LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender); - - -} - -void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::AddMenu(FMenuBarBuilder& MenuBarBuilder) -{ - MenuBarBuilder.AddPullDownMenu( - FText::FromString("DTFlux"), - FText::FromString("DTFlux API Tools"), - FNewMenuDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::FillMenu) - ); -} - -void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::FillMenu(FMenuBuilder& MenuBuilder) -{ - MenuBuilder.BeginSection(NAME_None, FText::FromString("DTFlux API")); - MenuBuilder.AddMenuEntry( - FText::FromString("Status"), - FText::FromString("Launch DTFlux Status"), - FSlateIcon(FDTFluxStatusStyle::GetStyleSetName(), "LevelEditor.Tab.Icon"), - FExecuteAction::CreateRaw(this, &FDTFluxAPIStatusModule::OnButtonClicked) - ); - MenuBuilder.EndSection(); + // FLevelEditorModule& LevelEditorModule = + // FModuleManager::LoadModuleChecked(TEXT("LevelEditor")); + // // FDTFluxAPIModule& DTFluxApi = + // // FModuleManager::LoadModuleChecked(TEXT("DTFluxAPI")); + // const TSharedPtr MenuExtender = MakeShareable(new FExtender()); + // + // MenuExtender->AddMenuBarExtension( + // "Help", + // EExtensionHook::Before, + // nullptr, + // FMenuBarExtensionDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::AddMenu) + // ); + // LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender); + UToolMenus::RegisterStartupCallback( + FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::RegisterMenus) + ); + } +void FDTFluxAPIStatusModule::RegisterMenus() +{ + UE_LOG(logDTFluxStatus, Warning, TEXT("Creating DTFlux menu")); + + // 1. Enregistrer le menu DTFlux + UToolMenu* DTFluxMenu = UToolMenus::Get()->RegisterMenu("DTFlux.MainMenu"); + if (DTFluxMenu) + { + CreateSubmenu(DTFluxMenu); + } + + // 2. Ajouter ce menu à la barre principale + if (UToolMenu* MainMenu = UToolMenus::Get()->ExtendMenu("MainFrame.MainMenu")) + { + FToolMenuSection& DTFluxMenuSection = MainMenu->FindOrAddSection("DTFlux"); + DTFluxMenuSection.Label = FText::FromString("DTFlux"); + + DTFluxMenuSection.AddSubMenu( + "DTFluxSubmenu", + FText::FromString("DTFlux"), + FText::FromString("DTFlux API Tools"), + FNewToolMenuDelegate::CreateLambda([](UToolMenu* Menu) + { + // Référencer le menu enregistré + if (UToolMenu* RegisteredMenu = UToolMenus::Get()->FindMenu("DTFlux.MainMenu")) + { + // Copier la structure du menu enregistré + for (const FToolMenuSection& Section : RegisteredMenu->Sections) + { + Menu->Sections.Add(Section); + } + } + }), + false, + FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tab.Icon") + ); + } + +} + +void FDTFluxAPIStatusModule::CreateSubmenu(UToolMenu* Menu) +{ + FToolMenuSection& DTFluxAPISection = Menu->FindOrAddSection("DTFluxAPI"); + DTFluxAPISection.Label = FText::FromString("DTFlux API"); + // Cette section est vide pour le moment, prête pour de futurs boutons + + + // Section 2 : Tools + FToolMenuSection& ToolsSection = Menu->FindOrAddSection("Tools"); + ToolsSection.Label = FText::FromString("Tools"); + + + // Ajouter le bouton Status dans la section Tools + DTFluxAPISection.AddMenuEntry( + "DTFluxStatus", + FText::FromString("DTFlux Status"), + FText::FromString("Launch DTFlux Status Control Panel"), + FSlateIcon(FDTFluxStatusStyle::GetStyleSetName(), "LevelEditor.Tab.Icon"), + FUIAction(FExecuteAction::CreateRaw(this, &FDTFluxAPIStatusModule::OnButtonClicked)) + ); +} + +// void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::AddMenu(FMenuBarBuilder& MenuBarBuilder) +// { +// MenuBarBuilder.AddPullDownMenu( +// FText::FromString("DTFlux"), +// FText::FromString("DTFlux API Tools"), +// FNewMenuDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::FillMenu) +// ); +// } + +// void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::FillMenu(FMenuBuilder& MenuBuilder) +// { +// MenuBuilder.BeginSection(NAME_None, FText::FromString("DTFlux API")); +// MenuBuilder.AddMenuEntry( +// FText::FromString("Status"), +// FText::FromString("Launch DTFlux Status"), +// FSlateIcon(FDTFluxStatusStyle::GetStyleSetName(), "LevelEditor.Tab.Icon"), +// FExecuteAction::CreateRaw(this, &FDTFluxAPIStatusModule::OnButtonClicked) +// ); +// MenuBuilder.EndSection(); +// } + void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::OnButtonClicked() { FGlobalTabmanager::Get()->TryInvokeTab(StatusTabId); diff --git a/Source/DTFluxAPIStatus/Public/DTFluxAPIStatusModule.h b/Source/DTFluxAPIStatus/Public/DTFluxAPIStatusModule.h index 112e34b..3c66e89 100644 --- a/Source/DTFluxAPIStatus/Public/DTFluxAPIStatusModule.h +++ b/Source/DTFluxAPIStatus/Public/DTFluxAPIStatusModule.h @@ -13,10 +13,11 @@ public: #pragma region MenuExtention void InitMenuExtension(); - void AddMenu(FMenuBarBuilder& MenuBarBuilder); - void FillMenu(FMenuBuilder& MenuBuilder); + void RegisterMenus(); + void CreateSubmenu(UToolMenu* Menu); + // void AddMenu(FMenuBarBuilder& MenuBarBuilder); + // void FillMenu(FMenuBuilder& MenuBuilder); void OnButtonClicked(); - // void OnWsEvent(TEnumAsByte WsResponseEvent) const; #pragma endregion #pragma region EditorTab @@ -25,7 +26,6 @@ public: private: static FName StatusTabId; static FText StatusTabDisplayName; - TSharedPtr StatusWidget; #pragma endregion };