Type safety in the use of command flags, and make enum wide, allowing more bits

This commit is contained in:
Paul Licameli 2016-05-05 20:02:13 -04:00
parent a0a6f26b9c
commit 014d5ab93c
9 changed files with 193 additions and 101 deletions

View File

@ -56,7 +56,7 @@ DECLARE_EXPORTED_EVENT_TYPE(AUDACITY_DLL_API, EVT_OPEN_AUDIO_FILE, -1);
// These flags represent the majority of the states that affect
// whether or not items in menus are enabled or disabled.
enum
enum CommandFlag : unsigned long long
{
AlwaysEnabledFlag = 0x00000000,
@ -93,11 +93,89 @@ enum
CaptureNotBusyFlag = 0x20000000,
CanStopAudioStreamFlag = 0x40000000,
AudioStreamNotScrubbingFlag
= 0x80000000,
= 0x80000000ULL, // prl
NoFlagsSpecifed = 0xffffffff
NoFlagsSpecifed = ~0ULL
};
// Prevent accidental misuse with narrower types
bool operator == (CommandFlag, unsigned long) PROHIBITED;
bool operator == (CommandFlag, long) PROHIBITED;
bool operator == (unsigned long, CommandFlag) PROHIBITED;
bool operator == (long, CommandFlag) PROHIBITED;
bool operator != (CommandFlag, unsigned long) PROHIBITED;
bool operator != (CommandFlag, long) PROHIBITED;
bool operator != (unsigned long, CommandFlag) PROHIBITED;
bool operator != (long, CommandFlag) PROHIBITED;
CommandFlag operator & (CommandFlag, unsigned long) PROHIBITED;
CommandFlag operator & (CommandFlag, long) PROHIBITED;
CommandFlag operator & (unsigned long, CommandFlag) PROHIBITED;
CommandFlag operator & (long, CommandFlag) PROHIBITED;
CommandFlag operator | (CommandFlag, unsigned long) PROHIBITED;
CommandFlag operator | (CommandFlag, long) PROHIBITED;
CommandFlag operator | (unsigned long, CommandFlag) PROHIBITED;
CommandFlag operator | (long, CommandFlag) PROHIBITED;
CommandFlag operator ^ (CommandFlag, unsigned long) PROHIBITED;
CommandFlag operator ^ (CommandFlag, long) PROHIBITED;
CommandFlag operator ^ (unsigned long, CommandFlag) PROHIBITED;
CommandFlag operator ^ (long, CommandFlag) PROHIBITED;
bool operator == (CommandFlag, unsigned int) PROHIBITED;
bool operator == (CommandFlag, int) PROHIBITED;
bool operator == (unsigned int, CommandFlag) PROHIBITED;
bool operator == (int, CommandFlag) PROHIBITED;
bool operator != (CommandFlag, unsigned int) PROHIBITED;
bool operator != (CommandFlag, int) PROHIBITED;
bool operator != (unsigned int, CommandFlag) PROHIBITED;
bool operator != (int, CommandFlag) PROHIBITED;
CommandFlag operator & (CommandFlag, unsigned int) PROHIBITED;
CommandFlag operator & (CommandFlag, int) PROHIBITED;
CommandFlag operator & (unsigned int, CommandFlag) PROHIBITED;
CommandFlag operator & (int, CommandFlag) PROHIBITED;
CommandFlag operator | (CommandFlag, unsigned int) PROHIBITED;
CommandFlag operator | (CommandFlag, int) PROHIBITED;
CommandFlag operator | (unsigned int, CommandFlag) PROHIBITED;
CommandFlag operator | (int, CommandFlag) PROHIBITED;
CommandFlag operator ^ (CommandFlag, unsigned int) PROHIBITED;
CommandFlag operator ^ (CommandFlag, int) PROHIBITED;
CommandFlag operator ^ (unsigned int, CommandFlag) PROHIBITED;
CommandFlag operator ^ (int, CommandFlag) PROHIBITED;
// Supply the bitwise operations
inline CommandFlag operator ~ (CommandFlag flag)
{
return static_cast<CommandFlag>( ~ static_cast<unsigned long long> (flag) );
}
inline CommandFlag operator & (CommandFlag lhs, CommandFlag rhs)
{
return static_cast<CommandFlag> (
static_cast<unsigned long long>(lhs) & static_cast<unsigned long long>(rhs)
);
}
inline CommandFlag operator | (CommandFlag lhs, CommandFlag rhs)
{
return static_cast<CommandFlag> (
static_cast<unsigned long long>(lhs) | static_cast<unsigned long long>(rhs)
);
}
inline CommandFlag & operator |= (CommandFlag &lhs, CommandFlag rhs)
{
lhs = lhs | rhs;
return lhs;
}
using CommandMask = CommandFlag;
class BlockFile;
class AudacityApp final : public wxApp {

View File

@ -907,7 +907,8 @@ void AudacityProject::CreateMenusAndCommands()
#else
wxT("Ctrl+M"),
#endif
0, AudioIONotBusyFlag);
AlwaysEnabledFlag, // is this correct??
AudioIONotBusyFlag);
c->AddItem(wxT("EditLabels"), _("&Edit Labels..."), FN(OnEditLabels));
c->AddSeparator();
@ -1214,7 +1215,7 @@ void AudacityProject::CreateMenusAndCommands()
c->AddCommand(wxT("PlaySpeedInc"), _("Increase playback speed"), FN(OnPlaySpeedInc));
c->AddCommand(wxT("PlaySpeedDec"), _("Decrease playback speed"), FN(OnPlaySpeedDec));
mLastFlags = 0;
mLastFlags = AlwaysEnabledFlag;
#if defined(__WXDEBUG__)
// c->CheckDups();
@ -1223,8 +1224,8 @@ void AudacityProject::CreateMenusAndCommands()
void AudacityProject::PopulateEffectsMenu(CommandManager* c,
EffectType type,
int batchflags,
int realflags)
CommandFlag batchflags,
CommandFlag realflags)
{
PluginManager & pm = PluginManager::Get();
@ -1295,8 +1296,8 @@ void AudacityProject::PopulateEffectsMenu(CommandManager* c,
void AudacityProject::AddEffectMenuItems(CommandManager *c,
EffectPlugs & plugs,
int batchflags,
int realflags,
CommandFlag batchflags,
CommandFlag realflags,
bool isDefault)
{
size_t pluginCnt = plugs.GetCount();
@ -1311,7 +1312,7 @@ void AudacityProject::AddEffectMenuItems(CommandManager *c,
wxArrayString groupNames;
PluginIDList groupPlugs;
wxArrayInt groupFlags;
std::vector<CommandFlag> groupFlags;
if (grouped)
{
wxString last;
@ -1361,13 +1362,13 @@ void AudacityProject::AddEffectMenuItems(CommandManager *c,
groupNames.Clear();
groupPlugs.Clear();
groupFlags.Clear();
groupFlags.clear();
last = current;
}
groupNames.Add(name);
groupPlugs.Add(plug->GetID());
groupFlags.Add(plug->IsEffectRealtime() ? realflags : batchflags);
groupFlags.push_back(plug->IsEffectRealtime() ? realflags : batchflags);
}
if (groupNames.GetCount() > 0)
@ -1414,7 +1415,7 @@ void AudacityProject::AddEffectMenuItems(CommandManager *c,
groupNames.Add(group + name);
groupPlugs.Add(plug->GetID());
groupFlags.Add(plug->IsEffectRealtime() ? realflags : batchflags);
groupFlags.push_back(plug->IsEffectRealtime() ? realflags : batchflags);
}
if (groupNames.GetCount() > 0)
@ -1430,7 +1431,7 @@ void AudacityProject::AddEffectMenuItems(CommandManager *c,
void AudacityProject::AddEffectMenuItemGroup(CommandManager *c,
const wxArrayString & names,
const PluginIDList & plugs,
const wxArrayInt & flags,
const std::vector<CommandFlag> & flags,
bool isDefault)
{
int namesCnt = (int) names.GetCount();
@ -1609,7 +1610,7 @@ void AudacityProject::RebuildOtherMenus()
}
}
int AudacityProject::GetFocusedFrame()
CommandFlag AudacityProject::GetFocusedFrame()
{
wxWindow *w = FindFocus();
@ -1629,16 +1630,16 @@ int AudacityProject::GetFocusedFrame()
w = w->GetParent();
}
return 0;
return AlwaysEnabledFlag;
}
wxUint32 AudacityProject::GetUpdateFlags()
CommandFlag AudacityProject::GetUpdateFlags()
{
// This method determines all of the flags that determine whether
// certain menu items and commands should be enabled or disabled,
// and returns them in a bitfield. Note that if none of the flags
// have changed, it's not necessary to even check for updates.
wxUint32 flags = 0;
auto flags = AlwaysEnabledFlag;
if (!gAudioIO->IsAudioTokenActive(GetAudioIOToken()))
flags |= AudioIONotBusyFlag;
@ -1767,8 +1768,8 @@ wxUint32 AudacityProject::GetUpdateFlags()
void AudacityProject::SelectAllIfNone()
{
wxUint32 flags = GetUpdateFlags();
if(((flags & TracksSelectedFlag) ==0) ||
auto flags = GetUpdateFlags();
if(!(flags & TracksSelectedFlag) ||
(mViewInfo.selectedRegion.isPoint()))
OnSelectAll();
}
@ -1850,17 +1851,17 @@ void AudacityProject::UpdateMenus(bool checkActive)
if (checkActive && !IsActive())
return;
wxUint32 flags = GetUpdateFlags();
wxUint32 flags2 = flags;
auto flags = GetUpdateFlags();
auto flags2 = flags;
// We can enable some extra items if we have select-all-on-none.
//EXPLAIN-ME: Why is this here rather than in GetUpdateFlags()?
if (mSelectAllOnNone)
{
if ((flags & TracksExistFlag) != 0)
if ((flags & TracksExistFlag))
{
flags2 |= TracksSelectedFlag;
if ((flags & WaveTracksExistFlag) != 0 )
if ((flags & WaveTracksExistFlag))
{
flags2 |= TimeSelectedFlag
| WaveTracksSelectedFlag
@ -1875,21 +1876,21 @@ void AudacityProject::UpdateMenus(bool checkActive)
return;
mLastFlags = flags;
mCommandManager.EnableUsingFlags(flags2 , 0xFFFFFFFF);
mCommandManager.EnableUsingFlags(flags2 , NoFlagsSpecifed);
// With select-all-on-none, some items that we don't want enabled may have
// been enabled, since we changed the flags. Here we manually disable them.
if (mSelectAllOnNone)
{
if ((flags & TracksSelectedFlag) == 0)
if (!(flags & TracksSelectedFlag))
{
mCommandManager.Enable(wxT("SplitCut"), false);
if ((flags & WaveTracksSelectedFlag) == 0)
if (!(flags & WaveTracksSelectedFlag))
{
mCommandManager.Enable(wxT("Split"), false);
}
if ((flags & TimeSelectedFlag) == 0)
if (!(flags & TimeSelectedFlag))
{
mCommandManager.Enable(wxT("ExportSel"), false);
mCommandManager.Enable(wxT("SplitNew"), false);
@ -2690,6 +2691,9 @@ void AudacityProject::NextFrame()
case BotDockHasFocus:
mToolManager->GetTopDock()->SetFocus();
break;
default:
break;
}
}
@ -2708,6 +2712,9 @@ void AudacityProject::PrevFrame()
case BotDockHasFocus:
mTrackPanel->SetFocus();
break;
default:
break;
}
}

View File

@ -24,17 +24,21 @@
private:
void CreateMenusAndCommands();
void PopulateEffectsMenu(CommandManager *c, EffectType type, int batchflags, int realflags);
void AddEffectMenuItems(CommandManager *c, EffectPlugs & plugs, int batchflags, int realflags, bool isDefault);
void AddEffectMenuItemGroup(CommandManager *c, const wxArrayString & names, const PluginIDList & plugs, const wxArrayInt & flags, bool isDefault);
void PopulateEffectsMenu(CommandManager *c, EffectType type,
CommandFlag batchflags, CommandFlag realflags);
void AddEffectMenuItems(CommandManager *c, EffectPlugs & plugs,
CommandFlag batchflags, CommandFlag realflags, bool isDefault);
void AddEffectMenuItemGroup(CommandManager *c, const wxArrayString & names,
const PluginIDList & plugs,
const std::vector<CommandFlag> & flags, bool isDefault);
void CreateRecentFilesMenu(CommandManager *c);
void ModifyUndoMenuItems();
void ModifyToolbarMenus();
// Calls ModifyToolbarMenus() on all projects
void ModifyAllProjectToolbarMenus();
int GetFocusedFrame();
wxUint32 GetUpdateFlags();
CommandFlag GetFocusedFrame();
CommandFlag GetUpdateFlags();
double NearestZeroCrossing(double t0);

View File

@ -2072,11 +2072,12 @@ void AudacityProject::OnScroll(wxScrollEvent & WXUNUSED(event))
/// Determines if flags for command are compatible with current state.
/// If not, then try some recovery action to make it so.
/// @return whether compatible or not after any actions taken.
bool AudacityProject::TryToMakeActionAllowed( wxUint32 & flags, wxUint32 flagsRqd, wxUint32 mask )
bool AudacityProject::TryToMakeActionAllowed
( CommandFlag & flags, CommandFlag flagsRqd, CommandFlag mask )
{
bool bAllowed;
if( flags == 0 )
if( !flags )
flags = GetUpdateFlags();
bAllowed = ((flags & mask) == (flagsRqd & mask));
@ -2088,12 +2089,12 @@ bool AudacityProject::TryToMakeActionAllowed( wxUint32 & flags, wxUint32 flagsRq
if( !mSelectAllOnNone )
return false;
wxUint32 MissingFlags = (flags & ~flagsRqd) & mask;
auto MissingFlags = (flags & ~flagsRqd) & mask;
// IF selecting all audio won't do any good, THEN return with failure.
if( (flags & WaveTracksExistFlag) == 0 )
if( !(flags & WaveTracksExistFlag) )
return false;
if( (MissingFlags & ~( TimeSelectedFlag | WaveTracksSelectedFlag))!=0)
if( (MissingFlags & ~( TimeSelectedFlag | WaveTracksSelectedFlag)) )
return false;
OnSelectAll();
@ -2107,7 +2108,7 @@ void AudacityProject::OnMenu(wxCommandEvent & event)
bool handled = mCommandManager.HandleMenuID(event.GetId(),
GetUpdateFlags(),
0xFFFFFFFF);
NoFlagsSpecifed);
if (handled)
event.Skip(false);

View File

@ -504,7 +504,8 @@ public:
void OnAudioIONewBlockFiles(const AutoSaveFile & blockFileLog) override;
// Command Handling
bool TryToMakeActionAllowed( wxUint32 & flags, wxUint32 flagsRqd, wxUint32 mask );
bool TryToMakeActionAllowed
( CommandFlag & flags, CommandFlag flagsRqd, CommandFlag mask );
///Prevents DELETE from external thread - for e.g. use of GetActiveProject
static void AllProjectsDeleteLock();
@ -580,7 +581,7 @@ public:
CommandManager mCommandManager;
wxUint32 mLastFlags;
CommandFlag mLastFlags;
// Window elements

View File

@ -395,8 +395,8 @@ CommandManager::CommandManager():
mCurrentID(17000),
mCurrentMenuName(COMMAND),
mCurrentMenu(NULL),
mDefaultFlags(0),
mDefaultMask(0)
mDefaultFlags(AlwaysEnabledFlag),
mDefaultMask(AlwaysEnabledFlag)
{
mbSeparatorAllowed = false;
}
@ -647,15 +647,15 @@ void CommandManager::AddCheck(const wxChar *name,
const CommandFunctorPointer &callback,
int checkmark)
{
AddItem(name, label, callback, wxT(""), (unsigned int)NoFlagsSpecifed, (unsigned int)NoFlagsSpecifed, checkmark);
AddItem(name, label, callback, wxT(""), NoFlagsSpecifed, NoFlagsSpecifed, checkmark);
}
void CommandManager::AddCheck(const wxChar *name,
const wxChar *label,
const CommandFunctorPointer &callback,
int checkmark,
unsigned int flags,
unsigned int mask)
CommandFlag flags,
CommandMask mask)
{
AddItem(name, label, callback, wxT(""), flags, mask, checkmark);
}
@ -663,8 +663,8 @@ void CommandManager::AddCheck(const wxChar *name,
void CommandManager::AddItem(const wxChar *name,
const wxChar *label,
const CommandFunctorPointer &callback,
unsigned int flags,
unsigned int mask)
CommandFlag flags,
CommandMask mask)
{
AddItem(name, label, callback, wxT(""), flags, mask);
}
@ -673,8 +673,8 @@ void CommandManager::AddItem(const wxChar *name,
const wxChar *label_in,
const CommandFunctorPointer &callback,
const wxChar *accel,
unsigned int flags,
unsigned int mask,
CommandFlag flags,
CommandMask mask,
int checkmark)
{
CommandListEntry *entry = NewIdentifier(name, label_in, accel, CurrentMenu(), callback, false, 0, 0);
@ -726,8 +726,8 @@ void CommandManager::AddItemList(const wxString & name,
void CommandManager::AddCommand(const wxChar *name,
const wxChar *label,
const CommandFunctorPointer &callback,
unsigned int flags,
unsigned int mask)
CommandFlag flags,
CommandMask mask)
{
AddCommand(name, label, callback, wxT(""), flags, mask);
}
@ -736,8 +736,8 @@ void CommandManager::AddCommand(const wxChar *name,
const wxChar *label_in,
const CommandFunctorPointer &callback,
const wxChar *accel,
unsigned int flags,
unsigned int mask)
CommandFlag flags,
CommandMask mask)
{
NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0);
@ -755,8 +755,8 @@ void CommandManager::AddGlobalCommand(const wxChar *name,
entry->enabled = false;
entry->isGlobal = true;
entry->flags = 0;
entry->mask = 0;
entry->flags = AlwaysEnabledFlag;
entry->mask = AlwaysEnabledFlag;
}
void CommandManager::AddSeparator()
@ -978,13 +978,13 @@ void CommandManager::Enable(const wxString &name, bool enabled)
Enable(entry, enabled);
}
void CommandManager::EnableUsingFlags(wxUint32 flags, wxUint32 mask)
void CommandManager::EnableUsingFlags(CommandFlag flags, CommandMask mask)
{
for(const auto &entry : mCommandList) {
if (entry->multi && entry->index != 0)
continue;
wxUint32 combinedMask = (mask & entry->mask);
auto combinedMask = (mask & entry->mask);
if (combinedMask) {
bool enable = ((flags & combinedMask) ==
(entry->flags & combinedMask));
@ -1038,15 +1038,15 @@ void CommandManager::SetKeyFromIndex(int i, const wxString &key)
entry->key = KeyStringNormalize(key);
}
void CommandManager::TellUserWhyDisallowed( wxUint32 flagsGot, wxUint32 flagsRequired )
void CommandManager::TellUserWhyDisallowed( CommandFlag flagsGot, CommandMask flagsRequired )
{
// The default string for 'reason' is a catch all. I hope it won't ever be seen
// and that we will get something more specific.
wxString reason = _("There was a problem with your last action. If you think\nthis is a bug, please tell us exactly where it occurred.");
wxUint32 missingFlags = flagsRequired & (~flagsGot );
auto missingFlags = flagsRequired & (~flagsGot );
if( missingFlags & AudioIONotBusyFlag )
reason= _("You can only do this when playing and recording are\n stopped. (Pausing is not sufficient.)");
reason = _("You can only do this when playing and recording are\n stopped. (Pausing is not sufficient.)");
else if( missingFlags & StereoRequiredFlag )
reason = _("You must first select some stereo audio for this\n to use. (You cannot use this with mono.)");
else if( missingFlags & TimeSelectedFlag )
@ -1081,7 +1081,7 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
// enable them temporarily and then disable them again after handling.
// LL: Why do they need to be disabled???
entry->enabled = true;
bool ret = HandleCommandEntry(entry, 0xffffffff, 0xffffffff, &evt);
bool ret = HandleCommandEntry(entry, NoFlagsSpecifed, NoFlagsSpecifed, &evt);
entry->enabled = false;
return ret;
}
@ -1094,7 +1094,7 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
return false;
}
wxUint32 flags = project->GetUpdateFlags();
auto flags = project->GetUpdateFlags();
wxKeyEvent temp = evt;
@ -1105,12 +1105,12 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
return true;
}
return HandleCommandEntry(entry, flags, 0xffffffff, &temp);
return HandleCommandEntry(entry, flags, NoFlagsSpecifed, &temp);
}
if (type == wxEVT_KEY_UP && entry->wantKeyup)
{
return HandleCommandEntry(entry, flags, 0xffffffff, &temp);
return HandleCommandEntry(entry, flags, NoFlagsSpecifed, &temp);
}
return false;
@ -1120,12 +1120,13 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
/// returning true iff successful. If you pass any flags,
///the command won't be executed unless the flags are compatible
///with the command's flags.
bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, wxUint32 flags, wxUint32 mask, const wxEvent * evt)
bool CommandManager::HandleCommandEntry(const CommandListEntry * entry,
CommandFlag flags, CommandMask mask, const wxEvent * evt)
{
if (!entry || !entry->enabled)
return false;
wxUint32 combinedMask = (mask & entry->mask);
auto combinedMask = (mask & entry->mask);
if (combinedMask) {
AudacityProject * proj;
@ -1154,7 +1155,7 @@ bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, wxUint32
///CommandManagerListener function. If you pass any flags,
///the command won't be executed unless the flags are compatible
///with the command's flags.
bool CommandManager::HandleMenuID(int id, wxUint32 flags, wxUint32 mask)
bool CommandManager::HandleMenuID(int id, CommandFlag flags, CommandMask mask)
{
CommandListEntry *entry = mCommandIDHash[id];
return HandleCommandEntry( entry, flags, mask );
@ -1163,7 +1164,7 @@ bool CommandManager::HandleMenuID(int id, wxUint32 flags, wxUint32 mask)
/// HandleTextualCommand() allows us a limitted version of script/batch
/// behavior, since we can get from a string command name to the actual
/// code to run.
bool CommandManager::HandleTextualCommand(wxString & Str, wxUint32 flags, wxUint32 mask)
bool CommandManager::HandleTextualCommand(wxString & Str, CommandFlag flags, CommandMask mask)
{
// Linear search for now...
for (const auto &entry : mCommandList)
@ -1410,14 +1411,14 @@ void CommandManager::WriteXML(XMLWriter &xmlFile)
xmlFile.EndTag(wxT("audacitykeyboard"));
}
void CommandManager::SetDefaultFlags(wxUint32 flags, wxUint32 mask)
void CommandManager::SetDefaultFlags(CommandFlag flags, CommandMask mask)
{
mDefaultFlags = flags;
mDefaultMask = mask;
}
void CommandManager::SetCommandFlags(const wxString &name,
wxUint32 flags, wxUint32 mask)
CommandFlag flags, CommandMask mask)
{
CommandListEntry *entry = mCommandNameHash[name];
if (entry) {
@ -1427,7 +1428,7 @@ void CommandManager::SetCommandFlags(const wxString &name,
}
void CommandManager::SetCommandFlags(const wxChar **names,
wxUint32 flags, wxUint32 mask)
CommandFlag flags, CommandMask mask)
{
const wxChar **nptr = names;
while(*nptr) {
@ -1436,7 +1437,7 @@ void CommandManager::SetCommandFlags(const wxChar **names,
}
}
void CommandManager::SetCommandFlags(wxUint32 flags, wxUint32 mask, ...)
void CommandManager::SetCommandFlags(CommandFlag flags, CommandMask mask, ...)
{
va_list list;
va_start(list, mask);

View File

@ -66,8 +66,8 @@ struct CommandListEntry
bool skipKeydown;
bool wantKeyup;
bool isGlobal;
wxUint32 flags;
wxUint32 mask;
CommandFlag flags;
CommandMask mask;
};
using MenuBarList = std::vector < MenuBarListEntry >;
@ -132,21 +132,21 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
const wxChar *label,
const CommandFunctorPointer &callback,
int checkmark,
unsigned int flags,
unsigned int mask);
CommandFlag flags,
CommandMask mask);
void AddItem(const wxChar *name,
const wxChar *label,
const CommandFunctorPointer &callback,
unsigned int flags = NoFlagsSpecifed,
unsigned int mask = NoFlagsSpecifed);
CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed);
void AddItem(const wxChar *name,
const wxChar *label_in,
const CommandFunctorPointer &callback,
const wxChar *accel,
unsigned int flags = NoFlagsSpecifed,
unsigned int mask = NoFlagsSpecifed,
CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed,
int checkmark = -1);
void AddSeparator();
@ -156,15 +156,15 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
void AddCommand(const wxChar *name,
const wxChar *label,
const CommandFunctorPointer &callback,
unsigned int flags = NoFlagsSpecifed,
unsigned int mask = NoFlagsSpecifed);
CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed);
void AddCommand(const wxChar *name,
const wxChar *label,
const CommandFunctorPointer &callback,
const wxChar *accel,
unsigned int flags = NoFlagsSpecifed,
unsigned int mask = NoFlagsSpecifed);
CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed);
void AddGlobalCommand(const wxChar *name,
const wxChar *label,
@ -175,21 +175,21 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
//
// For NEW items/commands
void SetDefaultFlags(wxUint32 flags, wxUint32 mask);
wxUint32 GetDefaultFlags() const { return mDefaultFlags; }
wxUint32 GetDefaultMask() const { return mDefaultMask; }
void SetDefaultFlags(CommandFlag flags, CommandMask mask);
CommandFlag GetDefaultFlags() const { return mDefaultFlags; }
CommandMask GetDefaultMask() const { return mDefaultMask; }
void SetCommandFlags(const wxString &name, wxUint32 flags, wxUint32 mask);
void SetCommandFlags(const wxString &name, CommandFlag flags, CommandMask mask);
void SetCommandFlags(const wxChar **names,
wxUint32 flags, wxUint32 mask);
CommandFlag flags, CommandMask mask);
// Pass multiple command names as const wxChar *, terminated by NULL
void SetCommandFlags(wxUint32 flags, wxUint32 mask, ...);
void SetCommandFlags(CommandFlag flags, CommandMask mask, ...);
//
// Modifying menus
//
void EnableUsingFlags(wxUint32 flags, wxUint32 mask);
void EnableUsingFlags(CommandFlag flags, CommandMask mask);
void Enable(const wxString &name, bool enabled);
void Check(const wxString &name, bool checked);
void Modify(const wxString &name, const wxString &newLabel);
@ -208,8 +208,8 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
// "permit" allows filtering even if the active window isn't a child of the project.
// Lyrics and MixerTrackCluster classes use it.
bool FilterKeyEvent(AudacityProject *project, const wxKeyEvent & evt, bool permit = false);
bool HandleMenuID(int id, wxUint32 flags, wxUint32 mask);
bool HandleTextualCommand(wxString & Str, wxUint32 flags, wxUint32 mask);
bool HandleMenuID(int id, CommandFlag flags, CommandMask mask);
bool HandleTextualCommand(wxString & Str, CommandFlag flags, CommandMask mask);
//
// Accessing
@ -271,8 +271,8 @@ protected:
// Executing commands
//
bool HandleCommandEntry(const CommandListEntry * entry, wxUint32 flags, wxUint32 mask, const wxEvent * evt = NULL);
void TellUserWhyDisallowed(wxUint32 flagsGot, wxUint32 flagsRequired);
bool HandleCommandEntry(const CommandListEntry * entry, CommandFlag flags, CommandMask mask, const wxEvent * evt = NULL);
void TellUserWhyDisallowed(CommandFlag flagsGot, CommandFlag flagsRequired);
//
// Modifying
@ -313,8 +313,8 @@ private:
wxString mCurrentMenuName;
wxMenu * mCurrentMenu;
wxUint32 mDefaultFlags;
wxUint32 mDefaultMask;
CommandFlag mDefaultFlags;
CommandMask mDefaultMask;
};
#endif

View File

@ -38,7 +38,7 @@ bool ExecMenuCommand::Apply(CommandExecutionContext context)
CommandManager *cmdManager = context.GetProject()->GetCommandManager();
wxString cmdName = GetString(wxT("CommandName"));
wxUint32 cmdFlags = 0; // TODO ?
wxUint32 cmdMask = 0;
auto cmdFlags = AlwaysEnabledFlag; // TODO ?
auto cmdMask = AlwaysEnabledFlag;
return cmdManager->HandleTextualCommand(cmdName, cmdFlags, cmdMask);
}

View File

@ -3219,7 +3219,7 @@ void EffectUIHost::OnApply(wxCommandEvent & evt)
// Honor the "select all if none" preference...a little hackish, but whatcha gonna do...
if (!mIsBatch && mEffect->GetType() != EffectTypeGenerate && mProject->mViewInfo.selectedRegion.isPoint())
{
wxUint32 flags = 0;
auto flags = AlwaysEnabledFlag;
bool allowed = mProject->TryToMakeActionAllowed(flags,
WaveTracksSelectedFlag | TimeSelectedFlag,
WaveTracksSelectedFlag | TimeSelectedFlag);