89 lines
2.0 KiB
C++
89 lines
2.0 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "ToolMenuIteration.h"
|
|
|
|
#include "ToolMenus.h"
|
|
|
|
namespace UE::ToolMenus::Private
|
|
{
|
|
|
|
bool VisitEntriesOfToolMenu(
|
|
UToolMenus* InToolMenus, UToolMenu* InMenu, const FToolMenuContext& InContext, const FToolMenuVisitor& InVisitor
|
|
);
|
|
|
|
bool VisitEntriesOfSubmenu(
|
|
UToolMenus* InToolMenus,
|
|
const UToolMenu* InParentMenu,
|
|
const FName InSubmenuEntryName,
|
|
const FToolMenuContext& InContext,
|
|
const FToolMenuVisitor& InVisitor
|
|
)
|
|
{
|
|
UToolMenu* Submenu = InToolMenus->GenerateSubMenu(InParentMenu, InSubmenuEntryName);
|
|
|
|
return VisitEntriesOfToolMenu(InToolMenus, Submenu, InContext, InVisitor);
|
|
}
|
|
|
|
bool VisitEntriesOfToolMenu(
|
|
UToolMenus* InToolMenus, UToolMenu* InMenu, const FToolMenuContext& InContext, const FToolMenuVisitor& InVisitor
|
|
)
|
|
{
|
|
for (const FToolMenuSection& Section : InMenu->Sections)
|
|
{
|
|
for (const FToolMenuEntry& Entry : Section.Blocks)
|
|
{
|
|
if (Entry.IsSubMenu())
|
|
{
|
|
const bool bContinue = VisitEntriesOfSubmenu(InToolMenus, InMenu, Entry.Name, InContext, InVisitor);
|
|
if (!bContinue)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
FToolMenuIterationInfo IterationInfo(*InMenu, Section, Entry);
|
|
|
|
const bool bContinue = InVisitor.Execute(IterationInfo);
|
|
if (!bContinue)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace UE::ToolMenus::Private
|
|
|
|
namespace UE::ToolMenus
|
|
{
|
|
|
|
FToolMenuIterationInfo::FToolMenuIterationInfo(
|
|
const UToolMenu& InMenu, const FToolMenuSection& InSection, const FToolMenuEntry& InEntry
|
|
)
|
|
: Menu(InMenu)
|
|
, Section(InSection)
|
|
, Entry(InEntry)
|
|
{
|
|
}
|
|
|
|
void VisitMenuEntries(
|
|
UToolMenus* InToolMenus, const FName InMenuName, const FToolMenuContext& InContext, const FToolMenuVisitor& InVisitor
|
|
)
|
|
{
|
|
if (!InToolMenus->FindMenu(InMenuName))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Generate the menu to get the complete menu, including extensions.
|
|
UToolMenu* GeneratedMenu = InToolMenus->GenerateMenu(InMenuName, InContext);
|
|
|
|
Private::VisitEntriesOfToolMenu(InToolMenus, GeneratedMenu, InContext, InVisitor);
|
|
}
|
|
|
|
} // namespace UE::ToolMenus
|