#include "ClaudeCodeMenuExtender.h" #include "UnrealMCPSetupLog.h" #include "ClaudeCodeInitializer.h" #include "ToolMenus.h" #include "ToolMenu.h" #include "ToolMenuSection.h" #define LOCTEXT_NAMESPACE "FClaudeCodeMenuExtender" void FClaudeCodeMenuExtender::Register() { // Pattern from UE5 source (LevelEditorMenu.cpp ExtendMenuBar): // - ExtendMenu + FindOrAddSection(NAME_None) // - InsertPosition on the ENTRY, not the section // - Anchor name is "Help" (short form, not the full qualified name) UToolMenu* MenuBar = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu"); FToolMenuSection& Section = MenuBar->FindOrAddSection(NAME_None); FToolMenuEntry& SubMenu = Section.AddSubMenu( "ClaudeCodeMenu", LOCTEXT("MenuLabel", "Claude Code"), LOCTEXT("MenuTooltip", "Claude Code tools for this project"), FNewToolMenuDelegate::CreateStatic(&FClaudeCodeMenuExtender::BuildMenu) ); // "Actor" in the menu bar is the entry named "Actions" (dynamic label, see LevelEditorMenu.cpp). // Using After("Actions") places Claude Code between Actor and Help. SubMenu.InsertPosition = FToolMenuInsert("Actions", EToolMenuInsertType::After); } void FClaudeCodeMenuExtender::BuildMenu(UToolMenu* Menu) { FToolMenuSection& Section = Menu->FindOrAddSection("ClaudeCodeActions"); Section.AddMenuEntry( "InitClaudeCode", LOCTEXT("InitLabel", "Init Claude Code"), LOCTEXT("InitTooltip", "Initialisation de Claude Code pour ce projet"), FSlateIcon(), FUIAction(FExecuteAction::CreateStatic(&FClaudeCodeMenuExtender::OnInitClaudeCodeClicked)) ); } void FClaudeCodeMenuExtender::OnInitClaudeCodeClicked() { UE_LOG(LogUnrealMCPSetup, Display, TEXT("User clicked 'Init Claude Code'")); FClaudeCodeInitializer::Run(); } #undef LOCTEXT_NAMESPACE