Type safety in the use of command flags, and make enum wide, allowing more bits
This commit is contained in:
parent
a0a6f26b9c
commit
014d5ab93c
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
14
src/Menus.h
14
src/Menus.h
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue