Audacity 3.2.0
Public Member Functions | Public Attributes | List of all members
anonymous_namespace{Menus.cpp}::MenuItemVisitor Struct Reference
Inheritance diagram for anonymous_namespace{Menus.cpp}::MenuItemVisitor:
[legend]
Collaboration diagram for anonymous_namespace{Menus.cpp}::MenuItemVisitor:
[legend]

Public Member Functions

 MenuItemVisitor (AudacityProject &proj, CommandManager &man)
 
- Public Member Functions inherited from MenuTable::Visitor< Traits >
 Visitor (VisitorFunctions< Traits > functions, std::function< void()> doSeparator)
 
- Public Member Functions inherited from Registry::VisitorFunctions< Traits >
 VisitorFunctions (Visitors &&visitors)
 Type-erasing constructor. More...
 
void BeginGroup (const GroupItem< Traits > &item, const Path &path) const
 Call-through for a decorating pre-visitor. More...
 
void Visit (const SingleItem &item, const Path &path) const
 Call-through for a decorating leaf-visitor. More...
 
void EndGroup (const GroupItem< Traits > &item, const Path &path) const
 Call-through for a decorating post-visitor. More...
 
- Public Member Functions inherited from MenuTable::detail::VisitorBase
std::pair< bool, bool > ShouldBeginGroup (const MenuItemProperties *pProperties)
 
void AfterBeginGroup (const MenuItemProperties *pProperties)
 
bool ShouldEndGroup (const MenuItemProperties *pProperties)
 
bool ShouldDoSeparator ()
 

Public Attributes

AudacityProjectmProject
 
CommandManagermanager
 
std::vector< bool > flags
 
- Public Attributes inherited from MenuTable::detail::VisitorBase
std::vector< bool > firstItem
 
std::vector< bool > needSeparator
 

Additional Inherited Members

- Public Types inherited from Registry::VisitorFunctions< Traits >
using NodeTypes = detail::VisitedNodeTypes< Traits >
 
using LeafTypes = detail::VisitedLeafTypes< Traits >
 

Detailed Description

Definition at line 281 of file Menus.cpp.

Constructor & Destructor Documentation

◆ MenuItemVisitor()

anonymous_namespace{Menus.cpp}::MenuItemVisitor::MenuItemVisitor ( AudacityProject proj,
CommandManager man 
)
inline

Definition at line 282 of file Menus.cpp.

283 : Visitor<Traits> { std::tuple{
284 // pre-visit
285 std::tuple {
286 [this](const MenuItem &menu, auto&) {
287 manager.BeginMenu(menu.GetTitle());
288 },
289 [this](const ConditionalGroupItem &conditionalGroup, auto&) {
290 const auto flag = conditionalGroup();
291 if (!flag)
293 // to avoid repeated call of condition predicate in EndGroup():
294 flags.push_back(flag);
295 },
296 [this](auto &item, auto&) {
297 assert(IsSection(item));
298 }
299 },
300
301 // leaf visit
302 [this](const auto &item, const auto&) {
303 const auto pCurrentMenu = manager.CurrentMenu();
304 if (!pCurrentMenu) {
305 // There may have been a mistake in the placement hint that registered
306 // this single item. It's not within any menu.
307 assert(false);
308 }
309 else TypeSwitch::VDispatch<void, LeafTypes>(item,
310 [&](const CommandItem &command) {
312 command.name, command.label_in,
313 command.finder, command.callback,
314 command.flags, command.options);
315 },
316 [&](const CommandGroupItem &commandList) {
317 manager.AddItemList(commandList.name,
318 commandList.items.data(), commandList.items.size(),
319 commandList.finder, commandList.callback,
320 commandList.flags, commandList.isEffect);
321 },
322 [&](const SpecialItem &special) {
323 special.fn(mProject, *pCurrentMenu);
324 }
325 );
326 },
327
328 // post-visit
329 std::tuple {
330 [this](const MenuItem &, const auto&) {
332 },
333 [this](const ConditionalGroupItem &, const auto&) {
334 const bool flag = flags.back();
335 if (!flag)
337 flags.pop_back();
338 },
339 [this](auto &item, auto&) {
340 assert(IsSection(item));
341 }
342 }},
343
344 [this]() {
346 }
347 }
348 , mProject{ proj }
349 , manager{ man }
350 {}
static std::once_flag flag
void AddItemList(const CommandID &name, const ComponentInterfaceSymbol items[], size_t nItems, CommandHandlerFinder finder, CommandFunctorPointer callback, CommandFlag flags, bool bIsEffect=false)
wxMenu * BeginMenu(const TranslatableString &tName)
wxMenu * CurrentMenu() const
void EndMenu()
This attaches a menu, if it's main, to the menubar.
void AddItem(AudacityProject &project, const CommandID &name, const TranslatableString &label_in, CommandHandlerFinder finder, CommandFunctorPointer callback, CommandFlag flags, const Options &options={})
static bool IsSection(const GroupItem< RegistryTraits > &item)
const TranslatableString label_in
CommandHandlerFinder finder
CommandFunctorPointer callback
CommandManager::Options options
const auto & GetTitle() const
const Identifier name
Definition: Registry.h:86

References MenuTable::CommandItem::callback, MenuTable::CommandItem::finder, flag, MenuTable::CommandItem::flags, MenuTable::MenuItem::GetTitle(), MenuTable::IsSection(), MenuTable::CommandItem::label_in, manager, Registry::detail::BaseItem::name, and MenuTable::CommandItem::options.

Here is the call graph for this function:

Member Data Documentation

◆ flags

std::vector<bool> anonymous_namespace{Menus.cpp}::MenuItemVisitor::flags

Definition at line 354 of file Menus.cpp.

◆ manager

CommandManager& anonymous_namespace{Menus.cpp}::MenuItemVisitor::manager

Definition at line 353 of file Menus.cpp.

◆ mProject

AudacityProject& anonymous_namespace{Menus.cpp}::MenuItemVisitor::mProject

Definition at line 352 of file Menus.cpp.


The documentation for this struct was generated from the following file: