Audacity 3.2.0
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
CommandManager::Populator Struct Reference

#include <CommandManager.h>

Inheritance diagram for CommandManager::Populator:
[legend]
Collaboration diagram for CommandManager::Populator:
[legend]

Public Types

using LeafVisitor = std::function< void(const Registry::SingleItem &, const Registry::Path &)>
 
- Public Types inherited from Registry::VisitorFunctions< MenuRegistry::Traits >
using NodeTypes = detail::VisitedNodeTypes< MenuRegistry::Traits >
 
using LeafTypes = detail::VisitedLeafTypes< MenuRegistry::Traits >
 

Public Member Functions

 Populator (AudacityProject &project, LeafVisitor leafVisitor, std::function< void()> doSeparator)
 
virtual ~Populator ()
 
- Public Member Functions inherited from MenuRegistry::Visitor< MenuRegistry::Traits >
 Visitor (VisitorFunctions< MenuRegistry::Traits > functions, std::function< void()> doSeparator)
 
- Public Member Functions inherited from Registry::VisitorFunctions< MenuRegistry::Traits >
 VisitorFunctions (Visitors &&visitors)
 Type-erasing constructor. More...
 
void BeginGroup (const GroupItem< MenuRegistry::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< MenuRegistry::Traits > &item, const Path &path) const
 Call-through for a decorating post-visitor. More...
 
- Public Member Functions inherited from MenuRegistry::detail::VisitorBase
std::pair< bool, bool > ShouldBeginGroup (const ItemProperties *pProperties)
 
void AfterBeginGroup (const ItemProperties *pProperties)
 
bool ShouldEndGroup (const ItemProperties *pProperties)
 
bool ShouldDoSeparator ()
 

Protected Member Functions

void DoBeginGroup (const MenuRegistry::GroupItem< MenuRegistry::Traits > &item)
 
void DoVisit (const Registry::SingleItem &item)
 
void DoEndGroup (const MenuRegistry::GroupItem< MenuRegistry::Traits > &item)
 
virtual void BeginMenu (const TranslatableString &tName)
 
virtual void BeginOccultCommands ()
 
virtual void EndMenu ()
 
virtual void EndOccultCommands ()
 
virtual std::unique_ptr< CommandListEntryAllocateEntry (const MenuRegistry::Options &options)
 
virtual void VisitEntry (CommandListEntry &entry, const MenuRegistry::Options *options)
 
void DoSeparator ()
 
const TranslatableStringsMenuNames () const
 Stack of names of menus that were begun and not yet ended. More...
 

Protected Attributes

AudacityProjectmProject
 
bool mbSeparatorAllowed { false }
 

Private Member Functions

void AddItemList (const CommandID &name, const ComponentInterfaceSymbol items[], size_t nItems, CommandHandlerFinder finder, CommandFunctorPointer callback, CommandFlag flags, bool bIsEffect=false)
 
void AddItem (const CommandID &name, const TranslatableString &label_in, CommandHandlerFinder finder, CommandFunctorPointer callback, CommandFlag flags, const MenuRegistry::Options &options={})
 
CommandListEntryNewIdentifier (const CommandID &name, const TranslatableString &label, CommandHandlerFinder finder, CommandFunctorPointer callback, const CommandID &nameSuffix, int index, int count, const MenuRegistry::Options &options)
 
void AddGlobalCommand (const CommandID &name, const TranslatableString &label, CommandHandlerFinder finder, CommandFunctorPointer callback, const MenuRegistry::Options &options={})
 
void SetMaxList ()
 

Private Attributes

std::vector< NormalizedKeyStringmMaxListOnly
 
TranslatableStrings mMenuNames
 
std::vector< bool > mFlags
 
int mCurrentID { 17000 }
 
bool bMakingOccultCommands { false }
 

Additional Inherited Members

- Public Attributes inherited from MenuRegistry::detail::VisitorBase
std::vector< bool > firstItem
 
std::vector< bool > needSeparator
 

Detailed Description

Definition at line 122 of file CommandManager.h.

Member Typedef Documentation

◆ LeafVisitor

using CommandManager::Populator::LeafVisitor = std::function< void(const Registry::SingleItem &, const Registry::Path&)>

Definition at line 125 of file CommandManager.h.

Constructor & Destructor Documentation

◆ Populator()

CommandManager::Populator::Populator ( AudacityProject project,
LeafVisitor  leafVisitor,
std::function< void()>  doSeparator 
)

Definition at line 85 of file CommandManager.cpp.

88 : Visitor{
89 std::tuple {
90 [this](auto &item, auto &){ DoBeginGroup(item); },
91 move(leafVisitor),
92 [this](auto &item, auto &){ DoEndGroup(item); },
93 },
94 move(doSeparator)
95 }
96 , mProject{ project }
97{
98 // The list of defaults to exclude depends on
99 // preference wxT("/GUI/Shortcuts/FullDefaults"), which may have changed.
100 SetMaxList();
101}
const auto project
AudacityProject & mProject
void DoBeginGroup(const MenuRegistry::GroupItem< MenuRegistry::Traits > &item)
void DoEndGroup(const MenuRegistry::GroupItem< MenuRegistry::Traits > &item)

References DoBeginGroup().

Here is the call graph for this function:

◆ ~Populator()

CommandManager::Populator::~Populator ( )
virtualdefault

Member Function Documentation

◆ AddGlobalCommand()

void CommandManager::Populator::AddGlobalCommand ( const CommandID name,
const TranslatableString label,
CommandHandlerFinder  finder,
CommandFunctorPointer  callback,
const MenuRegistry::Options options = {} 
)
private

Definition at line 408 of file CommandManager.cpp.

413{
415 NewIdentifier(name, label_in, finder, callback,
416 {}, 0, 0, options);
417
418 entry->enabled = false;
419 entry->isGlobal = true;
420 entry->flags = AlwaysEnabledFlag;
421 VisitEntry(*entry, &options);
422}
constexpr CommandFlag AlwaysEnabledFlag
Definition: CommandFlag.h:34
static ProjectFileIORegistry::AttributeWriterEntry entry
wxString name
Definition: TagsEditor.cpp:166
CommandListEntry is a structure used by CommandManager.
CommandListEntry * NewIdentifier(const CommandID &name, const TranslatableString &label, CommandHandlerFinder finder, CommandFunctorPointer callback, const CommandID &nameSuffix, int index, int count, const MenuRegistry::Options &options)
virtual void VisitEntry(CommandListEntry &entry, const MenuRegistry::Options *options)

References AlwaysEnabledFlag, entry, anonymous_namespace{Scrubbing.cpp}::finder, and name.

◆ AddItem()

void CommandManager::Populator::AddItem ( const CommandID name,
const TranslatableString label_in,
CommandHandlerFinder  finder,
CommandFunctorPointer  callback,
CommandFlag  flags,
const MenuRegistry::Options options = {} 
)
private

Definition at line 349 of file CommandManager.cpp.

355{
356 if (options.global) {
357 //wxASSERT( flags == AlwaysEnabledFlag );
359 name, label_in, finder, callback, options );
360 return;
361 }
362
363 wxASSERT( flags != NoFlagsSpecified );
364
367 label_in,
368 finder, callback,
369 {}, 0, 0,
370 options);
371 entry->useStrictFlags = options.useStrictFlags;
373 mbSeparatorAllowed = true;
374 VisitEntry(*entry, &options);
375}
constexpr CommandFlag NoFlagsSpecified
Definition: CommandFlag.h:35
static CommandManager & Get(AudacityProject &project)
void SetCommandFlags(const CommandID &name, CommandFlag flags)
void AddGlobalCommand(const CommandID &name, const TranslatableString &label, CommandHandlerFinder finder, CommandFunctorPointer callback, const MenuRegistry::Options &options={})

References entry, anonymous_namespace{Scrubbing.cpp}::finder, CommandManager::Get(), MenuRegistry::Options::global, CommandManager::mProject, name, NoFlagsSpecified, CommandManager::SetCommandFlags(), and MenuRegistry::Options::useStrictFlags.

Here is the call graph for this function:

◆ AddItemList()

void CommandManager::Populator::AddItemList ( const CommandID name,
const ComponentInterfaceSymbol  items[],
size_t  nItems,
CommandHandlerFinder  finder,
CommandFunctorPointer  callback,
CommandFlag  flags,
bool  bIsEffect = false 
)
private

Add a list of menu items to the current menu. When the user selects any one of these, the given functor will be called with its position in the list as the index number. When you call Enable on this command name, it will enable or disable all of the items at once.

Definition at line 383 of file CommandManager.cpp.

390{
391 for (size_t i = 0, cnt = nItems; i < cnt; i++) {
394 items[i].Msgid(),
395 finder,
396 callback,
397 items[i].Internal(),
398 i,
399 cnt,
401 .IsEffect(bIsEffect));
402 entry->flags = flags;
403 mbSeparatorAllowed = true;
404 VisitEntry(*entry, nullptr);
405 }
406}
@ Internal
Indicates internal failure from Audacity.
Options && IsEffect(bool value=true) &&
Definition: MenuRegistry.h:50

References entry, anonymous_namespace{Scrubbing.cpp}::finder, Internal, MenuRegistry::Options::IsEffect(), and name.

Here is the call graph for this function:

◆ AllocateEntry()

auto CommandManager::Populator::AllocateEntry ( const MenuRegistry::Options options)
protectedvirtual

Called by DoVisit Override to make entries that carry extra information. Not called for every visit, because existing items may be reused

Postcondition
result: result != nullptr

Reimplemented in anonymous_namespace{MenuCreator.cpp}::MenuItemVisitor.

Definition at line 328 of file CommandManager.cpp.

330{
331 return std::make_unique<CommandListEntry>();
332}

◆ BeginMenu()

void CommandManager::Populator::BeginMenu ( const TranslatableString tName)
protectedvirtual

Called by DoBeginGroup Default implementation does nothing

Reimplemented in anonymous_namespace{MenuCreator.cpp}::MenuItemVisitor.

Definition at line 296 of file CommandManager.cpp.

297{
298}

◆ BeginOccultCommands()

void CommandManager::Populator::BeginOccultCommands ( )
protectedvirtual

Called by DoBeginGroup Default implementation does nothing

Reimplemented in anonymous_namespace{MenuCreator.cpp}::MenuItemVisitor.

Definition at line 1195 of file CommandManager.cpp.

1196{
1197}

◆ DoBeginGroup()

void CommandManager::Populator::DoBeginGroup ( const MenuRegistry::GroupItem< MenuRegistry::Traits > &  item)
protected

Definition at line 249 of file CommandManager.cpp.

251{
252 using namespace MenuRegistry;
253 auto pItem = &item;
254 if (const auto pMenu = dynamic_cast<const MenuItem*>( pItem )) {
255 const auto &title = pMenu->GetTitle();
256 mMenuNames.emplace_back(title);
258 }
259 else if (const auto pConditionalGroup =
260 dynamic_cast<const ConditionalGroupItem*>( pItem )
261 ) {
262 const auto flag = (*pConditionalGroup)();
263 if (!flag) {
266 }
267 // to avoid repeated call of condition predicate in EndGroup():
268 mFlags.push_back(flag);
269 }
270 else
271 assert(IsSection(item));
272}
static const auto title
static std::once_flag flag
static bool IsSection(const GroupItem< RegistryTraits > &item)
Definition: MenuRegistry.h:197
std::vector< bool > mFlags
TranslatableStrings mMenuNames
virtual void BeginOccultCommands()
virtual void BeginMenu(const TranslatableString &tName)

References flag, MenuRegistry::IsSection(), and title.

Referenced by Populator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoEndGroup()

void CommandManager::Populator::DoEndGroup ( const MenuRegistry::GroupItem< MenuRegistry::Traits > &  item)
protected

Definition at line 300 of file CommandManager.cpp.

302{
303 using namespace MenuRegistry;
304 auto pItem = &item;
305 if (const auto pMenu = dynamic_cast<const MenuItem*>(pItem)) {
306 EndMenu();
307 mMenuNames.pop_back();
308 }
309 else
310 if (const auto pConditionalGroup =
311 dynamic_cast<const ConditionalGroupItem*>(pItem)
312 ) {
313 const bool flag = mFlags.back();
314 if (!flag) {
316 bMakingOccultCommands = false;
317 }
318 mFlags.pop_back();
319 }
320 else
321 assert(IsSection(item));
322}

References flag, and MenuRegistry::IsSection().

Here is the call graph for this function:

◆ DoSeparator()

void CommandManager::Populator::DoSeparator ( )
protected

Definition at line 424 of file CommandManager.cpp.

425{
426 mbSeparatorAllowed = false; // boolean to prevent too many separators.
427}

◆ DoVisit()

void CommandManager::Populator::DoVisit ( const Registry::SingleItem item)
protected

Definition at line 274 of file CommandManager.cpp.

275{
276 using namespace MenuRegistry;
277 auto pItem = &item;
278 if (const auto pCommand = dynamic_cast<const CommandItem*>(pItem)) {
279 auto &options = pCommand->options;
280 AddItem(
281 pCommand->name, pCommand->label_in,
282 pCommand->finder, pCommand->callback,
283 pCommand->flags, options);
284 }
285 else
286 if (const auto pCommandList = dynamic_cast<const CommandGroupItem*>(pItem)) {
287 AddItemList(pCommandList->name,
288 pCommandList->items.data(), pCommandList->items.size(),
289 pCommandList->finder, pCommandList->callback,
290 pCommandList->flags, pCommandList->isEffect);
291 }
292 else
293 wxASSERT( false );
294}
void AddItem(const CommandID &name, const TranslatableString &label_in, CommandHandlerFinder finder, CommandFunctorPointer callback, CommandFlag flags, const MenuRegistry::Options &options={})
void AddItemList(const CommandID &name, const ComponentInterfaceSymbol items[], size_t nItems, CommandHandlerFinder finder, CommandFunctorPointer callback, CommandFlag flags, bool bIsEffect=false)

◆ EndMenu()

void CommandManager::Populator::EndMenu ( )
protectedvirtual

Called by DoEndGroup Default implementation does nothing

Reimplemented in anonymous_namespace{MenuCreator.cpp}::MenuItemVisitor.

Definition at line 324 of file CommandManager.cpp.

325{
326}

◆ EndOccultCommands()

void CommandManager::Populator::EndOccultCommands ( )
protectedvirtual

Called by DoEndGroup Default implementation does nothing

Reimplemented in anonymous_namespace{MenuCreator.cpp}::MenuItemVisitor.

Definition at line 1199 of file CommandManager.cpp.

1200{
1201}

◆ MenuNames()

const TranslatableStrings & CommandManager::Populator::MenuNames ( ) const
inlineprotected

Stack of names of menus that were begun and not yet ended.

Definition at line 175 of file CommandManager.h.

175{ return mMenuNames; }

◆ NewIdentifier()

auto CommandManager::Populator::NewIdentifier ( const CommandID nameIn,
const TranslatableString label,
CommandHandlerFinder  finder,
CommandFunctorPointer  callback,
const CommandID nameSuffix,
int  index,
int  count,
const MenuRegistry::Options options 
)
private

Given all of the information for a command, comes up with a NEW unique ID, adds it to a list, and returns the ID. WARNING: Does this conflict with the identifiers set for controls/windows? If it does, a workaround may be to keep controls below wxID_LOWEST and keep menus above wxID_HIGHEST

Definition at line 445 of file CommandManager.cpp.

454{
455 auto &cm = Get(mProject);
456
457 bool excludeFromMacros =
458 (options.allowInMacros == 0) ||
459 ((options.allowInMacros == -1) && label.MSGID().GET().Contains("..."));
460
461 const wxString & accel = options.accel;
462 bool bIsEffect = options.bIsEffect;
463 CommandID parameter = options.parameter == "" ? nameIn : options.parameter;
464
465 // if empty, new identifier's long label will be same as label, below:
466 const auto &longLabel = options.longName;
467
468 const bool multi = !nameSuffix.empty();
469 auto name = nameIn;
470
471 // If we have the identifier already, reuse it.
472 CommandListEntry *prev = cm.mCommandNameHash[name];
473 if (prev && prev->label == label && !multi)
474 return prev;
475
476 {
477 auto entry = AllocateEntry(options);
478 assert(entry);
479
480 TranslatableString labelPrefix;
481 if (MenuNames().size() > 1)
482 // submenus only, not main
483 labelPrefix = MenuNames().back().Stripped();
484
485 // For key bindings for commands with a list, such as align,
486 // the name in prefs is the category name plus the effect name.
487 // This feature is not used for built-in effects.
488 if (multi)
489 name = CommandID{ { name, nameSuffix }, wxT('_') };
490
491 // wxMac 2.5 and higher will do special things with the
492 // Preferences, Exit (Quit), and About menu items,
493 // if we give them the right IDs.
494 // Otherwise we just pick increasing ID numbers for each NEW
495 // command. Note that the name string we are comparing
496 // ("About", "Preferences") is the internal command name
497 // (untranslated), not the label that actually appears in the
498 // menu (which might be translated).
499
501 entry->id = mCurrentID;
502 entry->parameter = parameter;
503
504#if defined(__WXMAC__)
505 // See bug #2642 for some history as to why these items
506 // on Mac have their IDs set explicitly and not others.
507 if (name == wxT("Preferences"))
508 entry->id = wxID_PREFERENCES;
509 else if (name == wxT("Exit"))
510 entry->id = wxID_EXIT;
511 else if (name == wxT("About"))
512 entry->id = wxID_ABOUT;
513#endif
514
515 entry->name = name;
516 entry->label = label;
517
518 // long label is the same as label unless options specified otherwise:
519 entry->longLabel = longLabel.empty() ? label : longLabel;
520
521 entry->excludeFromMacros = excludeFromMacros;
522 entry->key = NormalizedKeyString{ accel.BeforeFirst(wxT('\t')) };
523 entry->defaultKey = entry->key;
524 entry->labelPrefix = labelPrefix;
525 entry->labelTop = MenuNames()[0].Stripped();
526 entry->finder = finder;
527 entry->callback = callback;
528 entry->isEffect = bIsEffect;
529 entry->multi = multi;
530 entry->index = index;
531 entry->count = count;
532 entry->flags = AlwaysEnabledFlag;
533 entry->enabled = true;
534 entry->skipKeydown = options.skipKeyDown;
535 entry->wantKeyup = options.wantKeyUp || entry->skipKeydown;
536 entry->allowDup = options.allowDup;
537 entry->isGlobal = false;
538 entry->isOccult = bMakingOccultCommands;
539 entry->checkmarkFn = options.checker;
540
541 // Exclude accelerators that are in the MaxList.
542 // Note that the default is unaffected, intentionally so.
543 // There are effectively two levels of default, the full (max) list
544 // and the normal reduced list.
545 if( std::binary_search( mMaxListOnly.begin(), mMaxListOnly.end(),
546 entry->key ) )
547 {
548 entry->key = {};
549 }
550 auto newKeysGroup = gPrefs->BeginGroup("/NewKeys");
551 // using GET to interpret CommandID as a config path component
552 const auto &path = entry->name.GET();
553 if (gPrefs->HasEntry(path)) {
554 // Key from preferences overrides the default key given
555 entry->key =
556 NormalizedKeyString{ gPrefs->Read(path, entry->key) };
557 }
558
559 cm.mCommandList.push_back(std::move(entry));
560 // Don't use the variable entry eny more!
561 }
562
563 // New variable
564 CommandListEntry *entry = &*cm.mCommandList.back();
565 cm.mCommandNumericIDHash[entry->id] = entry;
566
567#if defined(_DEBUG)
568 prev = cm.mCommandNameHash[entry->name];
569 if (prev) {
570 // Under Linux it looks as if we may ask for a newID for the same command
571 // more than once. So it's only an error if two different commands
572 // have the exact same name.
573 if( prev->label != entry->label )
574 {
575 wxLogDebug(wxT("Command '%s' defined by '%s' and '%s'"),
576 // using GET in a log message for devs' eyes only
577 entry->name.GET(),
578 prev->label.Debug(),
579 entry->label.Debug());
580 wxFAIL_MSG(wxString::Format(wxT("Command '%s' defined by '%s' and '%s'"),
581 // using GET in an assertion violation message for devs'
582 // eyes only
583 entry->name.GET(),
584 prev->label.Debug(),
585 entry->label.Debug()));
586 }
587 }
588#endif
589 cm.mCommandNameHash[entry->name] = entry;
590
591 if (!entry->key.empty()) {
592 cm.mCommandKeyHash[entry->key] = entry;
593 }
594
595 return entry;
596}
wxT("CloseDown"))
audacity::BasicSettings * gPrefs
Definition: Prefs.cpp:68
TranslatableString label
Definition: TagsEditor.cpp:165
static int NextIdentifier(int ID)
bool empty() const
Definition: Identifier.h:61
const wxString & GET() const
Explicit conversion to wxString, meant to be ugly-looking and demanding of a comment why it's correct...
Definition: Identifier.h:66
Holds a msgid for the translation catalog; may also bind format arguments.
Identifier MSGID() const
MSGID is the English lookup key in the catalog, not necessarily for user's eyes if locale is some oth...
GroupScope BeginGroup(const wxString &prefix)
Appends a prefix to the current group or sets a new absolute path. Group that was set as current befo...
virtual bool HasEntry(const wxString &key) const =0
Checks whether specified key exists within the current group.
virtual bool Read(const wxString &key, bool *value) const =0
const TranslatableStrings & MenuNames() const
Stack of names of menus that were begun and not yet ended.
std::vector< NormalizedKeyString > mMaxListOnly
virtual std::unique_ptr< CommandListEntry > AllocateEntry(const MenuRegistry::Options &options)
TranslatableString longName
Definition: MenuRegistry.h:91
const wxChar * accel
Definition: MenuRegistry.h:87
CommandParameter parameter
Definition: MenuRegistry.h:90

References AlwaysEnabledFlag, audacity::BasicSettings::BeginGroup(), TranslatableString::Debug(), Identifier::empty(), entry, anonymous_namespace{Scrubbing.cpp}::finder, Identifier::GET(), CommandManager::Get(), gPrefs, audacity::BasicSettings::HasEntry(), CommandManager::CommandListEntry::label, label, CommandManager::mProject, TranslatableString::MSGID(), name, CommandManager::NextIdentifier(), audacity::BasicSettings::Read(), size, TranslatableString::Stripped(), and wxT().

Here is the call graph for this function:

◆ SetMaxList()

void CommandManager::Populator::SetMaxList ( )
private

Definition at line 218 of file CommandManager.cpp.

219{
220 // This list is a DUPLICATE of the list in
221 // KeyConfigPrefs::OnImportDefaults(wxCommandEvent & event)
222
223 // TODO: At a later date get rid of the maxList entirely and
224 // instead use flags in the menu entries to indicate whether the default
225 // shortcut is standard or full.
226
227 mMaxListOnly.clear();
228
229 // if the full list, don't exclude any.
230 bool bFull = gPrefs->ReadBool(wxT("/GUI/Shortcuts/FullDefaults"),false);
231 if( bFull )
232 return;
233
235}
static const std::vector< NormalizedKeyString > & ExcludedList()
bool ReadBool(const wxString &key, bool defaultValue) const

References CommandManager::ExcludedList(), gPrefs, mMaxListOnly, audacity::BasicSettings::ReadBool(), and wxT().

Here is the call graph for this function:

◆ VisitEntry()

void CommandManager::Populator::VisitEntry ( CommandListEntry entry,
const MenuRegistry::Options options 
)
protectedvirtual

Called by DoVisit Override to intercept all visits of items; default implementation is noop

Parameters
optionsnull if a member of a list of commands

Reimplemented in anonymous_namespace{MenuCreator.cpp}::MenuItemVisitor.

Definition at line 334 of file CommandManager.cpp.

336{
337}

Member Data Documentation

◆ bMakingOccultCommands

bool CommandManager::Populator::bMakingOccultCommands { false }
private

Definition at line 219 of file CommandManager.h.

◆ mbSeparatorAllowed

bool CommandManager::Populator::mbSeparatorAllowed { false }
protected

Definition at line 210 of file CommandManager.h.

◆ mCurrentID

int CommandManager::Populator::mCurrentID { 17000 }
private

Definition at line 218 of file CommandManager.h.

◆ mFlags

std::vector<bool> CommandManager::Populator::mFlags
private

Definition at line 217 of file CommandManager.h.

◆ mMaxListOnly

std::vector<NormalizedKeyString> CommandManager::Populator::mMaxListOnly
private

Definition at line 215 of file CommandManager.h.

Referenced by SetMaxList().

◆ mMenuNames

TranslatableStrings CommandManager::Populator::mMenuNames
private

Definition at line 216 of file CommandManager.h.

◆ mProject

AudacityProject& CommandManager::Populator::mProject
protected

Definition at line 207 of file CommandManager.h.


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