12#ifndef __AUDACITY_COMMAND_MANAGER__
13#define __AUDACITY_COMMAND_MANAGER__
33#include <unordered_map>
51using CommandList = std::vector<std::unique_ptr<CommandListEntry>>;
53using CommandKeyHash = std::unordered_map<NormalizedKeyString, CommandListEntry*>;
71 bool(const CommandID&)
91 std::unique_ptr<wxMenuBar> AddMenuBar(
const wxString & sMenu);
105 Options(
const wxChar *accel_ ) : accel{ accel_ } {}
108 const wxChar *accel_,
110 : accel{ accel_ }, longName{ longName_ } {}
113 { accel = value;
return std::move(*
this); }
115 { bIsEffect = value;
return std::move(*
this); }
117 { parameter = value;
return std::move(*
this); }
119 { longName = value;
return std::move(*
this); }
121 { global =
true;
return std::move(*
this); }
123 { useStrictFlags =
true;
return std::move(*
this); }
125 { wantKeyUp =
true;
return std::move(*
this); }
127 { skipKeyDown =
true;
return std::move(*
this); }
131 { allowDup =
true;
return std::move(*
this); }
134 { allowInMacros = value;
return std::move(*
this); }
139 { checker =
fn;
return std::move(*
this); }
142 checker = MakeCheckFn(
key, defaultValue );
143 return std::move(*
this);
147 checker = MakeCheckFn( setting );
148 return std::move(*
this);
151 const wxChar *accel{
wxT(
"") };
153 bool bIsEffect{
false };
156 bool global{
false };
157 bool useStrictFlags{
false };
158 bool wantKeyUp{
false };
159 bool skipKeyDown{
false };
160 bool allowDup{
false };
161 int allowInMacros{ -1 };
165 MakeCheckFn(
const wxString
key,
bool defaultValue );
176 bool bIsEffect =
false);
189 void BeginOccultCommands();
190 void EndOccultCommands();
199 void EnableUsingFlags(
201 void Enable(
const wxString &
name,
bool enabled);
240 void GetAllCommandLabels(
242 bool includeMultis)
const;
243 void GetAllCommandData(
245 std::vector<NormalizedKeyString> &keys,
246 std::vector<NormalizedKeyString> &default_keys,
248#
if defined(EXPERIMENTAL_KEY_VIEW)
255 CommandID GetNameFromNumericID(
int id );
264 int GetNumberOfKeysRead()
const;
269 void RemoveDuplicateShortcuts();
275 void WriteXML(
XMLWriter &xmlFile)
const ;
286 static const std::vector<NormalizedKeyString> &ExcludedList();
294 int NextIdentifier(
int ID);
317 bool alwaysEnabled,
const wxEvent * evt =
nullptr,
334 wxMenuBar * CurrentMenuBar()
const;
335 wxMenuBar * GetMenuBar(
const wxString & sMenu)
const;
336 wxMenu * CurrentSubMenu()
const;
338 wxMenu * CurrentMenu()
const;
347 wxString FormatLabelForMenu(
352 wxString FormatLabelForMenu(
385 wxMenu *mCurrentMenu {};
406 virtual void DoSeparator();
409 void MaybeDoSeparator();
435 WholeMenu(
bool extend =
false ) : extension{ extend } {}
448 GroupItem<Traits>, MenuItemData, const Identifier&
452 using Extension::Extension;
463 GroupItem<Traits>, Condition, const Identifier &
466 using Extension::Extension;
468 using Condition::operator();
511 template<
typename Handler >
521 flags, options, finder)
533 flags, options,
nullptr)
536 ~CommandItem()
override;
550 std::vector<ComponentInterfaceSymbol> items_,
561 template<
typename Handler >
563 std::vector<ComponentInterfaceSymbol> items_,
571 flags_, isEffect_, finder)
577 std::vector< ComponentInterfaceSymbol > items,
580 bool isEffect =
false)
583 flags, isEffect, nullptr)
588 const std::vector<ComponentInterfaceSymbol>
items;
615 GroupItem<Traits>, void, const Identifier &
618 using Extension::Extension;
626 GroupItem<Traits>, void, const Identifier &
630 using Extension::Extension;
649 constexpr auto Items = Callable::UniqueMaker<MenuItems>();
658 constexpr auto Section = Callable::UniqueMaker<MenuPart>();
667 constexpr auto Menu = Callable::UniqueMaker<MenuItem>();
678 constexpr auto Command = Callable::UniqueMaker<CommandItem>();
681 const Identifier &, std::vector<ComponentInterfaceSymbol>>();
683 constexpr auto Special = Callable::UniqueMaker<SpecialItem>();
Functions and classes that generate callable objects.
Utility ClientData::Site to register hooks into a host class that attach client data.
std::bitset< NCommandFlags > CommandFlag
std::function< CommandHandlerObject &(AudacityProject &) > CommandHandlerFinder
static const AudacityProject::AttachedObjects::RegisteredFactory key
std::unordered_map< CommandID, CommandListEntry * > CommandNameHash
std::unordered_map< int, CommandListEntry * > CommandNumericIDHash
std::unordered_map< NormalizedKeyString, CommandListEntry * > CommandKeyHash
const TranslatableString name
std::vector< CommandID > CommandIDs
TaggedIdentifier< CommandIdTag, false > CommandID
Identifies a menu command or macro. Case-insensitive comparison.
std::vector< TranslatableString > TranslatableStrings
std::vector< Attribute > AttributesList
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
This specialization of Setting for bool adds a Toggle method to negate the saved value.
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
List of CommandListEntry.
CommandManager implements a system for organizing all user-callable commands.
CommandNameHash mCommandNameHash
std::unique_ptr< wxMenuBar > mTempMenuBar
TranslatableString mCurrentMenuName
std::vector< NormalizedKeyString > mMaxListOnly
std::unique_ptr< wxMenu > uCurrentMenu
bool bMakingOccultCommands
CommandKeyHash mCommandKeyHash
std::function< bool(AudacityProject &) > CheckFn
CommandManager(const CommandManager &)=delete
TranslatableString mNiceName
CommandNumericIDHash mCommandNumericIDHash
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
Global function-valued variable, adding a convenient Call()
An explicitly nonlocalized string, not meant for the user to see.
Generates classes whose instances register items at construction.
std::vector< Identifier > Path
Holds a msgid for the translation catalog; may also bind format arguments.
Set a variable temporarily in a scope.
This class is an interface which should be implemented by classes which wish to be able to load and s...
virtual XMLTagHandler * HandleXMLChild(const std::string_view &tag)=0
virtual void HandleXMLEndTag(const std::string_view &WXUNUSED(tag))
virtual bool HandleXMLTag(const std::string_view &tag, const AttributesList &attrs)=0
Base class for XMLFileWriter and XMLStringWriter that provides the general functionality for creating...
Services * Get()
Fetch the global instance, or nullptr if none is yet installed.
constexpr auto UniqueMaker()
Generate variadic factory functions.
AUDACITY_DLL_API bool HandleTextualCommand(CommandManager &commandManager, const CommandID &Str, const CommandContext &context, CommandFlag flags, bool alwaysEnabled)
std::unique_ptr< BaseItem > BaseItemPtr
void Visit(Visitor &visitor, BaseItem *pTopItem, const GroupItemBase *pRegistry)
CommandManager::Options Options
A convenient default parameter for class template Site.
CommandListEntry is a structure used by CommandManager.
Options && CheckTest(const BoolSetting &setting) &&
Options && CheckTest(const wxChar *key, bool defaultValue) &&
Options && UseStrictFlags() &&
Options && CheckTest(const CheckFn &fn) &&
Options(const wxChar *accel_)
Options(const wxChar *accel_, const TranslatableString &longName_)
Options && WantKeyUp() &&
Options && Accel(const wxChar *value) &&
Options && IsEffect(bool value=true) &&
Options && SkipKeyDown() &&
Options && Parameter(const CommandParameter &value) &&
Options && LongName(const TranslatableString &value) &&
Options && AllowInMacros(int value=1) &&
Extend Base with extra fields, in a second, protected base class.
const std::vector< ComponentInterfaceSymbol > items
CommandHandlerFinder finder
CommandFunctorPointer callback
CommandGroupItem(const CommandID &name, std::vector< ComponentInterfaceSymbol > items, CommandFunctorPointer::NonMemberFn fn, CommandFlag flags, bool isEffect=false)
CommandGroupItem(const Identifier &name_, std::vector< ComponentInterfaceSymbol > items_, void(Handler::*pmf)(const CommandContext &), CommandFlag flags_, bool isEffect_, CommandHandlerFinder finder=FinderScope::DefaultFinder())
const TranslatableString label_in
CommandHandlerFinder finder
CommandItem(const CommandID &name, const TranslatableString &label_in, void(Handler::*pmf)(const CommandContext &), CommandFlag flags, const CommandManager::Options &options={}, CommandHandlerFinder finder=FinderScope::DefaultFinder())
CommandItem(const CommandID &name, const TranslatableString &label_in, CommandFunctorPointer::NonMemberFn callback, CommandFlag flags, const CommandManager::Options &options={})
CommandFunctorPointer callback
CommandManager::Options options
Common abstract base class for items that group other items.
Common abstract base class for items that are not groups.
void(*)(const CommandContext &context) NonMemberFn
void(CommandHandlerObject::*)(const CommandContext &context) MemberFn