Verwenden Sie Pfadform zur Erweiterung des Menüs.
Protokollieren, wie ein Pfadmenü in UE implementiert wird.
Wenn du mit dem UE-Erweiterungsmenü nicht vertraut bist, empfehle ich dir, zuerst einen kurzen Blick darauf zu werfen: UE-Erweiterungs-Editor-Menü
Dieser Text basiert auf dem Plugin: UE.EditorPlus
Node Management
Organisieren Sie das Menü nach dem Baumstrukturprinzip, wobei Elternknoten Kinder enthalten können:
class EDITORPLUS_API FEditorPlusMenuBase: public TSharedFromThis<FEditorPlusMenuBase>
{
protected:
// sub menus
TArray<TSharedRef<FEditorPlusMenuBase>> Children;
}
Beim Erstellen eines Elternelements gleichzeitig ein Unterelement erstellen:
void FEditorPlusMenuBase::Register(FMenuBuilder& MenuBuilder)
{
for (const auto Menu: Children)
{
Menu->Register(MenuBuilder);
}
}
Natürlich wird das konkrete Erstellungsverhalten für jeden Knoten etwas unterschiedlich sein, indem die virtuelle Funktion überschrieben wird:
// Menubar
void FEditorPlusMenuBar::Register(FMenuBarBuilder& MenuBarBuilder)
{
MenuBarBuilder.AddPullDownMenu(
GetFriendlyName(),
GetFriendlyTips(),
// Delegate to call Register
FEditorPlusMenuManager::GetDelegate<FNewMenuDelegate>(GetUniqueId()),
Hook);
}
// Section
void FEditorPlusSection::Register(FMenuBuilder& MenuBuilder)
{
MenuBuilder.BeginSection(Hook, GetFriendlyName());
FEditorPlusMenuBase::Register(MenuBuilder);
MenuBuilder.EndSection();
}
// Separator
void FEditorPlusSeparator::Register(FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddMenuSeparator(Hook);
FEditorPlusMenuBase::Register(MenuBuilder);
}
// SubMenu
void FEditorPlusSubMenu::Register(FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddSubMenu(
GetFriendlyName(),
GetFriendlyTips(),
FNewMenuDelegate::CreateSP(this, &FEditorPlusSubMenu::MakeSubMenu),
false,
FSlateIcon(),
true,
Hook
);
}
// Command
void FEditorPlusCommand::Register(FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddMenuEntry(
CommandInfo->Label, CommandInfo->Tips, CommandInfo->Icon,
CommandInfo->ExecuteAction, CommandInfo->Hook, CommandInfo->Type);
}
// ......
Erstellen Sie Knoten durch den Pfad.
Organisieren Sie das Menü in Baumstruktur, dann können Sie mit dem Pfadformat die Struktur eines Menüs definieren:
Die oben genannte Methode ermöglicht die Erstellung einer Reihe von Menüs:
<Hook>Help
: Positioniert hinter dem Menü mit dem Hook-Namen Help.<MenuBar>BarTest
:Erstellt ein Menü vom Typ Menüleiste mit dem Namen BarTest.<SubMenu>SubTest
:Create a sub-node, type SubMenu, named SubTest.<Command>Action
: Erstellen Sie schließlich einen Befehl.
Die Aufrufmethode der Schnittstelle kann sehr einfach sein:
const FString Path = "/<Hook>Help/<MenuBar>BarTest/<SubMenu>SubTest/<Command>Action";
FEditorPlusPath::RegisterPathAction(
Path,
FExecuteAction::CreateLambda([]
{
// do action
})
);
Erstellen von Knoten aus benutzerdefinierten Formen.
Wir halten immer noch an der umständlichen Methode fest, Menüs zu erstellen. Diese umständliche Methode ermöglicht detailliertere Einstellungen und ähnelt der Organisationsstruktur von UE's SlateUI-Schreibweise.
EP_NEW_MENU(FEditorPlusMenuBar)("BarTest")
->RegisterPath()
->Content({
EP_NEW_MENU(FEditorPlusSubMenu)("SubTest")
->Content({
EP_NEW_MENU(FEditorPlusCommand)("Action")
->BindAction(FExecuteAction::CreateLambda([]
{
// do action
})),
})
});
Gemischte Form
Natürlich sind sowohl die vorgegebenen Pfadformen als auch benutzerdefinierte Menüs identisch und können flexibel kombiniert werden.
FEditorPlusPath::RegisterPath(
"/<MenuBar>BarTest/<SubMenu>SubMenu/<Command>Action1",
EP_NEW_MENU(FEditorPlusCommand)("Action1")
->BindAction(FExecuteAction::CreateLambda([]
{
// do action
})),
);
FEditorPlusPath::RegisterPath(
"/<MenuBar>BarTest/<SubMenu>SubMenu/<Command>Action2",
EP_NEW_MENU(FEditorPlusCommand)("Action2")
->BindAction(FExecuteAction::CreateLambda([]
{
// do action
})),
);
Menüs, die an verschiedenen Stellen definiert sind, werden in einer einzigen Baumstruktur zusammengeführt, wobei Knoten mit demselben Namen als derselbe Knoten betrachtet werden. Anders ausgedrückt, der Pfad ist eindeutig; ein und derselbe Pfad kann einen Menüknoten eindeutig bestimmen. Dann können wir auch die Knoten finden, neu konfigurieren und anpassen:
// set Name and Tips
FEditorPlusPath::GetNodeByPath("/<MenuBar>BarTest")->SetFriendlyName(LOCTEXT("MenuTest", "MenuTest"))->SetFriendlyTips(LOCTEXT("MenuTestTips", "MenuTestTips"));
Original: https://wiki.disenone.site/de
This post is protected by CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.
Visitors. Total Visits. Page Visits.
Dieser Text wurde mit ChatGPT übersetzt. Bitte geben Sie FeedbackBenennen Sie alle Übersehenen Stellen.