一、认识菜单栏(MenuBar)、工具栏(ToolBar)
UE4中的菜单栏
UE4中的工具栏
上面这些本质上都是菜单栏和工具栏
二、TCommands
在UE4中,菜单栏和工具栏本质也是一个Button,点击菜单栏或者工具栏会执行相对应的mingle,而UE4为了方便操作,让菜单按钮执行的事件绑定用了Commands命令绑定的方式。
TCommands:
命令集合,用于声明各种FUICommandInfo和注册FUICommandInfo
FUICommandInfo
命令信息,用于绑定菜单执行的事件(Delegate)
FUICommandList
FUICommandList是命令队列,每个FUICommandInfo绑定委托都得通过FUICommandList的MapAction接口来
#pragma once
#include "CoreMinimal.h"
#include "Framework/Commands/Commands.h"
#include "Styling/SlateStyle.h"
class FMyCommands :public TCommands<FMyCommands>
{
public:
FMyCommands() :
TCommands<FMyCommands>(TEXT("MyMenu"), NSLOCTEXT("Contexts", "MyMenu", "MyMenu Test"), NAME_None, FMyCommands::GetStyleSetName())
{
}
virtual void RegisterCommands() override;
public:
TSharedPtr<FUICommandInfo> OpenFileCommand;
TSharedPtr<FUICommandInfo> CloseFileCommand;
TSharedPtr<FUICommandInfo> SaveFileCommand;
};
TSharedPtr<FUICommandList> MyCommandList;
void OnClick();
FMyCommands::Register();
MyCommandList = MakeShareable(new FUICommandList);
MyCommandList->MapAction(FMyCommands::Get().OpenFileCommand,FExecuteAction::CreateRaw(this,&SVRLevelEditor::OnClick), FCanExecuteAction());
MyCommandList->MapAction(FMyCommands::Get().CloseFileCommand,FExecuteAction::CreateRaw(this, &SVRLevelEditor::OnClick), FCanExecuteAction());
MyCommandList->MapAction(FMyCommands::Get().SaveFileCommand, FExecuteAction::CreateRaw(this, &SVRLevelEditor::OnClick), FCanExecuteAction());
三、扩展类FExtend
UE4扩展编辑器按钮都是FExtend来扩展,FExtend提供了AddMenuExtension来扩展Menu,AddMenuBarExtension扩展MenuBar, AddToolBarExtension扩展ToolBar.
扩展菜单栏的方法:
一、加载模块
//编辑器的模块加载
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
//动画蓝图的模块加载
IAnimationBlueprintEditorModule& AnimationBlueprintEditorModule = FModuleManager::LoadModuleChecked<IAnimationBlueprintEditorModule>("AnimationBlueprintEditor");
二、创建Extender对象
//编辑器扩展已有的菜单栏
TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());
MenuExtender->AddMenuExtension("WindowLayout", EExtensionHook::After, MyCommands, FMenuExtensionDelegate::CreateRaw(this, &FMyMenuModule::AddMenuExtension));
LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
//编辑器扩展新的菜单栏
TSharedPtr<FExtender> MenuBarExtend = MakeShareable(new FExtender());
MenuBarExtend->AddMenuBarExtension("Help", EExtensionHook::After, MyCommands, FMenuBarExtensionDelegate::CreateRaw(this, &FMyMenuModule::AdddMenuBarExtend));
LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuBarExtend);
//编辑器扩展ToolBar
TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
ToolbarExtender->AddToolBarExtension("Settings", EExtensionHook::After, MyCommands, FToolBarExtensionDelegate::CreateRaw(this, &FMyMenuModule::AddToolbarExtension));
LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarExtender);
三、给Extender对象添加扩展属性
四、将Extender对象绑定到对应模块
//编辑器扩展已有菜单栏
void FMyMenuModule::AddMenuExtension(FMenuBuilder& Builder)
{
Builder.BeginSection(TEXT("MyButton"));
Builder.AddMenuEntry(FMyCommands::Get().OpenFileCommand);
Builder.EndSection();
}
//编辑器扩展新的菜单栏
void FMyMenuModule::AddMenuBarExtension(FMenuBarBuilder& Builder)
{
Builder.BeginSection(TEXT("MyMenuButton"));
Builder.AddMenuEntry(FMyCommands::Get().SaveFileCommand);
Builder.EndSection();
}
//编辑器扩展Toolbar
void FMyMenuModule::AddToolBarExtension(FToolBarBuilder& Builder)
{
Builder.BeginSection(TEXT("MyToolButton"));
Builder.AddMenuEntry(FMyCommands::Get().CloseFileCommand);
Builder.EndSection();
}
四、MenuBar和ToolBar扩展下拉菜单
MenBar主要是通过AddPullDownMenu
TSharedRef<SWidget> SVRLevelEditor::MakeMenuBar()
{
FMenuBarBuilder MenuBulider(MyCommandList);
MenuBulider.AddPullDownMenu(LOCTEXT("MyFile","MyFile"), LOCTEXT("MyMenu", "MyMenu"),FNewMenuDelegate::CreateRaw(this,&SVRLevelEditor::AddPullDownMenu));
MenuBulider.AddPullDownMenu(LOCTEXT("MyEditor", "MyEditor"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));
MenuBulider.AddPullDownMenu(LOCTEXT("MyWindow", "MyWindow"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));
MenuBulider.AddPullDownMenu(LOCTEXT("MyHelp", "MyHelp"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));
return MenuBulider.MakeWidget();
}
//创建下拉菜单
void SVRLevelEditor::AddPullDownMenu(FMenuBuilder& Builder)
{
//第一个参数是分隔栏的Hook名,第二参数是分隔栏的显示名称
Builder.BeginSection("CustomSection", LOCTEXT("CustomArea", "CustomArea"));
Builder.AddMenuEntry(FMyCommands::Get().OpenFileCommand);
//创建分割线
Builder.AddMenuSeparator("SeparatorHook");
Builder.AddMenuEntry(FMyCommands::Get().CloseFileCommand);
Builder.AddMenuSeparator("SeparatorHook");
Builder.AddMenuEntry(FMyCommands::Get().SaveFileCommand);
//菜单下拉菜单的子菜单
Builder.AddSubMenu(
LOCTEXT("SubMenu", "SubMenu"),
LOCTEXT("This_is_Sub_Menu", "This is Sub Menu!"),
FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddSubMenuExtension),
false,
FSlateIcon(),
true,
"SubMenuHook"
);
Builder.EndSection();
}
ToolBar主要是通过AddComboButton添加下拉连续按钮
(1)AddToolBarButton添加工具按钮
(2)AddComboButton添加下拉连续按钮,可以通过FOnGetContent委托任意填充下拉按钮内容,只要是SWidget就行。
void SVRLevelEditor::MakeToolBar(FToolBarBuilder& Builder)
{
Builder.AddToolBarButton(FMyMenuCommands::Get().SaveFileCommand);
Builder.AddComboButton(FUIAction(), FOnGetContent::CreateRaw(this, &FTestMenuModule::GetComboConent), FText::FromString("aaaadd"));
}
//创建下拉菜单
TSharedRef<SWidget> SVRLevelEditor::GetComboConent(FMenuBuilder& Builder)
{
FMenuBuilder MenuBuilder(true, PluginCommands);
MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);
MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);
MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);
MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);
MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);
return MenuBuilder.MakeWidget();
}