1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-21 14:50:06 +02:00

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 // These flags represent the majority of the states that affect
// whether or not items in menus are enabled or disabled. // whether or not items in menus are enabled or disabled.
enum enum CommandFlag : unsigned long long
{ {
AlwaysEnabledFlag = 0x00000000, AlwaysEnabledFlag = 0x00000000,
@ -93,11 +93,89 @@ enum
CaptureNotBusyFlag = 0x20000000, CaptureNotBusyFlag = 0x20000000,
CanStopAudioStreamFlag = 0x40000000, CanStopAudioStreamFlag = 0x40000000,
AudioStreamNotScrubbingFlag 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 BlockFile;
class AudacityApp final : public wxApp { class AudacityApp final : public wxApp {

View File

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

View File

@ -24,17 +24,21 @@
private: private:
void CreateMenusAndCommands(); void CreateMenusAndCommands();
void PopulateEffectsMenu(CommandManager *c, EffectType type, int batchflags, int realflags); void PopulateEffectsMenu(CommandManager *c, EffectType type,
void AddEffectMenuItems(CommandManager *c, EffectPlugs & plugs, int batchflags, int realflags, bool isDefault); CommandFlag batchflags, CommandFlag realflags);
void AddEffectMenuItemGroup(CommandManager *c, const wxArrayString & names, const PluginIDList & plugs, const wxArrayInt & flags, bool isDefault); 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 CreateRecentFilesMenu(CommandManager *c);
void ModifyUndoMenuItems(); void ModifyUndoMenuItems();
void ModifyToolbarMenus(); void ModifyToolbarMenus();
// Calls ModifyToolbarMenus() on all projects // Calls ModifyToolbarMenus() on all projects
void ModifyAllProjectToolbarMenus(); void ModifyAllProjectToolbarMenus();
int GetFocusedFrame(); CommandFlag GetFocusedFrame();
wxUint32 GetUpdateFlags(); CommandFlag GetUpdateFlags();
double NearestZeroCrossing(double t0); 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. /// Determines if flags for command are compatible with current state.
/// If not, then try some recovery action to make it so. /// If not, then try some recovery action to make it so.
/// @return whether compatible or not after any actions taken. /// @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; bool bAllowed;
if( flags == 0 ) if( !flags )
flags = GetUpdateFlags(); flags = GetUpdateFlags();
bAllowed = ((flags & mask) == (flagsRqd & mask)); bAllowed = ((flags & mask) == (flagsRqd & mask));
@ -2088,12 +2089,12 @@ bool AudacityProject::TryToMakeActionAllowed( wxUint32 & flags, wxUint32 flagsRq
if( !mSelectAllOnNone ) if( !mSelectAllOnNone )
return false; 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 selecting all audio won't do any good, THEN return with failure.
if( (flags & WaveTracksExistFlag) == 0 ) if( !(flags & WaveTracksExistFlag) )
return false; return false;
if( (MissingFlags & ~( TimeSelectedFlag | WaveTracksSelectedFlag))!=0) if( (MissingFlags & ~( TimeSelectedFlag | WaveTracksSelectedFlag)) )
return false; return false;
OnSelectAll(); OnSelectAll();
@ -2107,7 +2108,7 @@ void AudacityProject::OnMenu(wxCommandEvent & event)
bool handled = mCommandManager.HandleMenuID(event.GetId(), bool handled = mCommandManager.HandleMenuID(event.GetId(),
GetUpdateFlags(), GetUpdateFlags(),
0xFFFFFFFF); NoFlagsSpecifed);
if (handled) if (handled)
event.Skip(false); event.Skip(false);

View File

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

View File

@ -395,8 +395,8 @@ CommandManager::CommandManager():
mCurrentID(17000), mCurrentID(17000),
mCurrentMenuName(COMMAND), mCurrentMenuName(COMMAND),
mCurrentMenu(NULL), mCurrentMenu(NULL),
mDefaultFlags(0), mDefaultFlags(AlwaysEnabledFlag),
mDefaultMask(0) mDefaultMask(AlwaysEnabledFlag)
{ {
mbSeparatorAllowed = false; mbSeparatorAllowed = false;
} }
@ -647,15 +647,15 @@ void CommandManager::AddCheck(const wxChar *name,
const CommandFunctorPointer &callback, const CommandFunctorPointer &callback,
int checkmark) 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, void CommandManager::AddCheck(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, const CommandFunctorPointer &callback,
int checkmark, int checkmark,
unsigned int flags, CommandFlag flags,
unsigned int mask) CommandMask mask)
{ {
AddItem(name, label, callback, wxT(""), flags, mask, checkmark); AddItem(name, label, callback, wxT(""), flags, mask, checkmark);
} }
@ -663,8 +663,8 @@ void CommandManager::AddCheck(const wxChar *name,
void CommandManager::AddItem(const wxChar *name, void CommandManager::AddItem(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, const CommandFunctorPointer &callback,
unsigned int flags, CommandFlag flags,
unsigned int mask) CommandMask mask)
{ {
AddItem(name, label, callback, wxT(""), flags, mask); AddItem(name, label, callback, wxT(""), flags, mask);
} }
@ -673,8 +673,8 @@ void CommandManager::AddItem(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
const CommandFunctorPointer &callback, const CommandFunctorPointer &callback,
const wxChar *accel, const wxChar *accel,
unsigned int flags, CommandFlag flags,
unsigned int mask, CommandMask mask,
int checkmark) int checkmark)
{ {
CommandListEntry *entry = NewIdentifier(name, label_in, accel, CurrentMenu(), callback, false, 0, 0); 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, void CommandManager::AddCommand(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, const CommandFunctorPointer &callback,
unsigned int flags, CommandFlag flags,
unsigned int mask) CommandMask mask)
{ {
AddCommand(name, label, callback, wxT(""), flags, mask); AddCommand(name, label, callback, wxT(""), flags, mask);
} }
@ -736,8 +736,8 @@ void CommandManager::AddCommand(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
const CommandFunctorPointer &callback, const CommandFunctorPointer &callback,
const wxChar *accel, const wxChar *accel,
unsigned int flags, CommandFlag flags,
unsigned int mask) CommandMask mask)
{ {
NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0); NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0);
@ -755,8 +755,8 @@ void CommandManager::AddGlobalCommand(const wxChar *name,
entry->enabled = false; entry->enabled = false;
entry->isGlobal = true; entry->isGlobal = true;
entry->flags = 0; entry->flags = AlwaysEnabledFlag;
entry->mask = 0; entry->mask = AlwaysEnabledFlag;
} }
void CommandManager::AddSeparator() void CommandManager::AddSeparator()
@ -978,13 +978,13 @@ void CommandManager::Enable(const wxString &name, bool enabled)
Enable(entry, enabled); Enable(entry, enabled);
} }
void CommandManager::EnableUsingFlags(wxUint32 flags, wxUint32 mask) void CommandManager::EnableUsingFlags(CommandFlag flags, CommandMask mask)
{ {
for(const auto &entry : mCommandList) { for(const auto &entry : mCommandList) {
if (entry->multi && entry->index != 0) if (entry->multi && entry->index != 0)
continue; continue;
wxUint32 combinedMask = (mask & entry->mask); auto combinedMask = (mask & entry->mask);
if (combinedMask) { if (combinedMask) {
bool enable = ((flags & combinedMask) == bool enable = ((flags & combinedMask) ==
(entry->flags & combinedMask)); (entry->flags & combinedMask));
@ -1038,15 +1038,15 @@ void CommandManager::SetKeyFromIndex(int i, const wxString &key)
entry->key = KeyStringNormalize(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 // 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. // 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."); 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 ) 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 ) else if( missingFlags & StereoRequiredFlag )
reason = _("You must first select some stereo audio for this\n to use. (You cannot use this with mono.)"); reason = _("You must first select some stereo audio for this\n to use. (You cannot use this with mono.)");
else if( missingFlags & TimeSelectedFlag ) 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. // enable them temporarily and then disable them again after handling.
// LL: Why do they need to be disabled??? // LL: Why do they need to be disabled???
entry->enabled = true; entry->enabled = true;
bool ret = HandleCommandEntry(entry, 0xffffffff, 0xffffffff, &evt); bool ret = HandleCommandEntry(entry, NoFlagsSpecifed, NoFlagsSpecifed, &evt);
entry->enabled = false; entry->enabled = false;
return ret; return ret;
} }
@ -1094,7 +1094,7 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
return false; return false;
} }
wxUint32 flags = project->GetUpdateFlags(); auto flags = project->GetUpdateFlags();
wxKeyEvent temp = evt; wxKeyEvent temp = evt;
@ -1105,12 +1105,12 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
return true; return true;
} }
return HandleCommandEntry(entry, flags, 0xffffffff, &temp); return HandleCommandEntry(entry, flags, NoFlagsSpecifed, &temp);
} }
if (type == wxEVT_KEY_UP && entry->wantKeyup) if (type == wxEVT_KEY_UP && entry->wantKeyup)
{ {
return HandleCommandEntry(entry, flags, 0xffffffff, &temp); return HandleCommandEntry(entry, flags, NoFlagsSpecifed, &temp);
} }
return false; return false;
@ -1120,12 +1120,13 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
/// returning true iff successful. If you pass any flags, /// returning true iff successful. If you pass any flags,
///the command won't be executed unless the flags are compatible ///the command won't be executed unless the flags are compatible
///with the command's flags. ///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) if (!entry || !entry->enabled)
return false; return false;
wxUint32 combinedMask = (mask & entry->mask); auto combinedMask = (mask & entry->mask);
if (combinedMask) { if (combinedMask) {
AudacityProject * proj; AudacityProject * proj;
@ -1154,7 +1155,7 @@ bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, wxUint32
///CommandManagerListener function. If you pass any flags, ///CommandManagerListener function. If you pass any flags,
///the command won't be executed unless the flags are compatible ///the command won't be executed unless the flags are compatible
///with the command's flags. ///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]; CommandListEntry *entry = mCommandIDHash[id];
return HandleCommandEntry( entry, flags, mask ); 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 /// HandleTextualCommand() allows us a limitted version of script/batch
/// behavior, since we can get from a string command name to the actual /// behavior, since we can get from a string command name to the actual
/// code to run. /// 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... // Linear search for now...
for (const auto &entry : mCommandList) for (const auto &entry : mCommandList)
@ -1410,14 +1411,14 @@ void CommandManager::WriteXML(XMLWriter &xmlFile)
xmlFile.EndTag(wxT("audacitykeyboard")); xmlFile.EndTag(wxT("audacitykeyboard"));
} }
void CommandManager::SetDefaultFlags(wxUint32 flags, wxUint32 mask) void CommandManager::SetDefaultFlags(CommandFlag flags, CommandMask mask)
{ {
mDefaultFlags = flags; mDefaultFlags = flags;
mDefaultMask = mask; mDefaultMask = mask;
} }
void CommandManager::SetCommandFlags(const wxString &name, void CommandManager::SetCommandFlags(const wxString &name,
wxUint32 flags, wxUint32 mask) CommandFlag flags, CommandMask mask)
{ {
CommandListEntry *entry = mCommandNameHash[name]; CommandListEntry *entry = mCommandNameHash[name];
if (entry) { if (entry) {
@ -1427,7 +1428,7 @@ void CommandManager::SetCommandFlags(const wxString &name,
} }
void CommandManager::SetCommandFlags(const wxChar **names, void CommandManager::SetCommandFlags(const wxChar **names,
wxUint32 flags, wxUint32 mask) CommandFlag flags, CommandMask mask)
{ {
const wxChar **nptr = names; const wxChar **nptr = names;
while(*nptr) { 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_list list;
va_start(list, mask); va_start(list, mask);

View File

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

View File

@ -38,7 +38,7 @@ bool ExecMenuCommand::Apply(CommandExecutionContext context)
CommandManager *cmdManager = context.GetProject()->GetCommandManager(); CommandManager *cmdManager = context.GetProject()->GetCommandManager();
wxString cmdName = GetString(wxT("CommandName")); wxString cmdName = GetString(wxT("CommandName"));
wxUint32 cmdFlags = 0; // TODO ? auto cmdFlags = AlwaysEnabledFlag; // TODO ?
wxUint32 cmdMask = 0; auto cmdMask = AlwaysEnabledFlag;
return cmdManager->HandleTextualCommand(cmdName, cmdFlags, cmdMask); 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... // Honor the "select all if none" preference...a little hackish, but whatcha gonna do...
if (!mIsBatch && mEffect->GetType() != EffectTypeGenerate && mProject->mViewInfo.selectedRegion.isPoint()) if (!mIsBatch && mEffect->GetType() != EffectTypeGenerate && mProject->mViewInfo.selectedRegion.isPoint())
{ {
wxUint32 flags = 0; auto flags = AlwaysEnabledFlag;
bool allowed = mProject->TryToMakeActionAllowed(flags, bool allowed = mProject->TryToMakeActionAllowed(flags,
WaveTracksSelectedFlag | TimeSelectedFlag, WaveTracksSelectedFlag | TimeSelectedFlag,
WaveTracksSelectedFlag | TimeSelectedFlag); WaveTracksSelectedFlag | TimeSelectedFlag);