Switching DTFluxApi Tab Implementation to use the more modern UToolMenus approach API

This commit is contained in:
2025-07-10 20:35:06 +02:00
parent 03eb1132ef
commit bc6a928312
3 changed files with 106 additions and 41 deletions

View File

@ -31,6 +31,7 @@ public class DTFluxAPIStatus : ModuleRules
"DTFluxCoreSubsystem",
"InputCore",
"OutputLog",
"ToolMenus",
}
);
}

View File

@ -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<FLevelEditorModule>(TEXT("LevelEditor"));
// FDTFluxAPIModule& DTFluxApi =
// FModuleManager::LoadModuleChecked<FDTFluxAPIModule>(TEXT("DTFluxAPI"));
const TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());
// FLevelEditorModule& LevelEditorModule =
// FModuleManager::LoadModuleChecked<FLevelEditorModule>(TEXT("LevelEditor"));
// // FDTFluxAPIModule& DTFluxApi =
// // FModuleManager::LoadModuleChecked<FDTFluxAPIModule>(TEXT("DTFluxAPI"));
// const TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());
//
// MenuExtender->AddMenuBarExtension(
// "Help",
// EExtensionHook::Before,
// nullptr,
// FMenuBarExtensionDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::AddMenu)
// );
// LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
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)
UToolMenus::RegisterStartupCallback(
FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::RegisterMenus)
);
MenuBuilder.EndSection();
}
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);

View File

@ -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<EDTFluxWsStatus> WsResponseEvent) const;
#pragma endregion
#pragma region EditorTab
@ -25,7 +26,6 @@ public:
private:
static FName StatusTabId;
static FText StatusTabDisplayName;
TSharedPtr<class SDTFluxStatusWidget> StatusWidget;
#pragma endregion
};