mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-04 22:49:07 +02:00
MenuManager::GetUpdateFlags is now table-driven
This commit is contained in:
parent
82ea023843
commit
3847b66638
186
src/Menus.cpp
186
src/Menus.cpp
@ -400,22 +400,6 @@ void MenuManager::OnUndoRedo( wxCommandEvent &evt )
|
|||||||
UpdateMenus();
|
UpdateMenus();
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandFlag MenuManager::GetFocusedFrame(AudacityProject &project)
|
|
||||||
{
|
|
||||||
wxWindow *w = wxWindow::FindFocus();
|
|
||||||
|
|
||||||
while (w) {
|
|
||||||
if (dynamic_cast<NonKeystrokeInterceptingWindow*>(w)) {
|
|
||||||
return TrackPanelHasFocus;
|
|
||||||
}
|
|
||||||
|
|
||||||
w = w->GetParent();
|
|
||||||
}
|
|
||||||
|
|
||||||
return AlwaysEnabledFlag;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Really means, some track is selected, that isn't a time track
|
// Really means, some track is selected, that isn't a time track
|
||||||
const auto TracksSelectedPred =
|
const auto TracksSelectedPred =
|
||||||
[](const AudacityProject &project){
|
[](const AudacityProject &project){
|
||||||
@ -711,165 +695,39 @@ const ReservedCommandFlag
|
|||||||
|
|
||||||
CommandFlag MenuManager::GetUpdateFlags( bool checkActive )
|
CommandFlag MenuManager::GetUpdateFlags( bool checkActive )
|
||||||
{
|
{
|
||||||
auto &project = mProject;
|
|
||||||
|
|
||||||
// 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.
|
||||||
auto flags = AlwaysEnabledFlag;
|
|
||||||
// static variable, used to remember flags for next time.
|
// static variable, used to remember flags for next time.
|
||||||
static auto lastFlags = flags;
|
static CommandFlag lastFlags;
|
||||||
|
|
||||||
// if (auto focus = wxWindow::FindFocus()) {
|
CommandFlag flags, quickFlags;
|
||||||
auto &window = GetProjectFrame( project );
|
|
||||||
if (wxWindow * focus = &window) {
|
const auto &options = Options();
|
||||||
while (focus && focus->GetParent())
|
size_t ii = 0;
|
||||||
focus = focus->GetParent();
|
for ( const auto &predicate : RegisteredPredicates() ) {
|
||||||
if (focus && !static_cast<wxTopLevelWindow*>(focus)->IsIconized())
|
if ( options[ii].quickTest ) {
|
||||||
flags |= NotMinimizedFlag;
|
quickFlags[ii] = true;
|
||||||
|
if( predicate( mProject ) )
|
||||||
|
flags[ii] = true;
|
||||||
|
}
|
||||||
|
++ii;
|
||||||
}
|
}
|
||||||
|
|
||||||
// These flags are cheap to calculate.
|
if ( checkActive && !GetProjectFrame( mProject ).IsActive() )
|
||||||
auto gAudioIO = AudioIO::Get();
|
// quick 'short-circuit' return.
|
||||||
if (!gAudioIO->IsAudioTokenActive(ProjectAudioIO::Get( project )
|
flags = (lastFlags & ~quickFlags) | flags;
|
||||||
.GetAudioIOToken()))
|
else {
|
||||||
flags |= AudioIONotBusyFlag;
|
ii = 0;
|
||||||
else
|
for ( const auto &predicate : RegisteredPredicates() ) {
|
||||||
flags |= AudioIOBusyFlag;
|
if ( !options[ii].quickTest && predicate( mProject ) )
|
||||||
|
flags[ii] = true;
|
||||||
if( gAudioIO->IsPaused() )
|
++ii;
|
||||||
flags |= PausedFlag;
|
|
||||||
|
|
||||||
// quick 'short-circuit' return.
|
|
||||||
if ( checkActive && !window.IsActive() ){
|
|
||||||
const auto checkedFlags =
|
|
||||||
NotMinimizedFlag | AudioIONotBusyFlag | AudioIOBusyFlag |
|
|
||||||
PausedFlag;
|
|
||||||
// short cirucit return should preserve flags that have not been calculated.
|
|
||||||
flags = (lastFlags & ~checkedFlags) | flags;
|
|
||||||
lastFlags = flags;
|
|
||||||
return flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto &viewInfo = ViewInfo::Get( project );
|
|
||||||
const auto &selectedRegion = viewInfo.selectedRegion;
|
|
||||||
|
|
||||||
if (!selectedRegion.isPoint())
|
|
||||||
flags |= TimeSelectedFlag;
|
|
||||||
|
|
||||||
auto &tracks = TrackList::Get( project );
|
|
||||||
auto trackRange = tracks.Any();
|
|
||||||
if ( trackRange )
|
|
||||||
flags |= TracksExistFlag;
|
|
||||||
trackRange.Visit(
|
|
||||||
[&](LabelTrack *lt) {
|
|
||||||
flags |= LabelTracksExistFlag;
|
|
||||||
|
|
||||||
if (lt->GetSelected()) {
|
|
||||||
flags |= TracksSelectedFlag;
|
|
||||||
for (int i = 0; i < lt->GetNumLabels(); i++) {
|
|
||||||
const LabelStruct *ls = lt->GetLabel(i);
|
|
||||||
if (ls->getT0() >= selectedRegion.t0() &&
|
|
||||||
ls->getT1() <= selectedRegion.t1()) {
|
|
||||||
flags |= LabelsSelectedFlag;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lt->IsTextSelected()) {
|
|
||||||
flags |= CutCopyAvailableFlag;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[&](WaveTrack *t) {
|
|
||||||
flags |= WaveTracksExistFlag;
|
|
||||||
flags |= PlayableTracksExistFlag;
|
|
||||||
if (t->GetSelected()) {
|
|
||||||
flags |= TracksSelectedFlag;
|
|
||||||
// TODO: more-than-two-channels
|
|
||||||
if (TrackList::Channels(t).size() > 1) {
|
|
||||||
flags |= StereoRequiredFlag;
|
|
||||||
}
|
|
||||||
flags |= WaveTracksSelectedFlag;
|
|
||||||
flags |= AudioTracksSelectedFlag;
|
|
||||||
}
|
|
||||||
if( t->GetEndTime() > t->GetStartTime() )
|
|
||||||
flags |= HasWaveDataFlag;
|
|
||||||
}
|
|
||||||
#if defined(USE_MIDI)
|
|
||||||
,
|
|
||||||
[&](NoteTrack *nt) {
|
|
||||||
flags |= NoteTracksExistFlag;
|
|
||||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
|
||||||
flags |= PlayableTracksExistFlag;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (nt->GetSelected()) {
|
|
||||||
flags |= TracksSelectedFlag;
|
|
||||||
flags |= NoteTracksSelectedFlag;
|
|
||||||
flags |= AudioTracksSelectedFlag; // even if not EXPERIMENTAL_MIDI_OUT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
auto &undoManager = UndoManager::Get( project );
|
|
||||||
|
|
||||||
if (undoManager.UnsavedChanges() ||
|
|
||||||
!ProjectFileIO::Get( project ).IsProjectSaved())
|
|
||||||
flags |= UnsavedChangesFlag;
|
|
||||||
|
|
||||||
if (!mLastEffect.empty())
|
|
||||||
flags |= HasLastEffectFlag;
|
|
||||||
|
|
||||||
auto &history = ProjectHistory::Get( project );
|
|
||||||
if (history.UndoAvailable())
|
|
||||||
flags |= UndoAvailableFlag;
|
|
||||||
|
|
||||||
if (history.RedoAvailable())
|
|
||||||
flags |= RedoAvailableFlag;
|
|
||||||
|
|
||||||
if (ViewInfo::Get( project ).ZoomInAvailable() &&
|
|
||||||
(flags & TracksExistFlag).any())
|
|
||||||
flags |= ZoomInAvailableFlag;
|
|
||||||
|
|
||||||
if (ViewInfo::Get( project ).ZoomOutAvailable() &&
|
|
||||||
(flags & TracksExistFlag).any())
|
|
||||||
flags |= ZoomOutAvailableFlag;
|
|
||||||
|
|
||||||
flags |= GetFocusedFrame(project);
|
|
||||||
|
|
||||||
const auto &playRegion = viewInfo.playRegion;
|
|
||||||
if (playRegion.Locked())
|
|
||||||
flags |= PlayRegionLockedFlag;
|
|
||||||
else if (!playRegion.Empty())
|
|
||||||
flags |= PlayRegionNotLockedFlag;
|
|
||||||
|
|
||||||
if ( (flags & AudioIONotBusyFlag).any() ) {
|
|
||||||
if ( (flags & TimeSelectedFlag).any() ) {
|
|
||||||
if ( (flags & TracksSelectedFlag).any() ) {
|
|
||||||
flags |= CutCopyAvailableFlag;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &settings = ProjectSettings::Get( project );
|
|
||||||
if (settings.IsSyncLocked())
|
|
||||||
flags |= IsSyncLockedFlag;
|
|
||||||
else
|
|
||||||
flags |= IsNotSyncLockedFlag;
|
|
||||||
|
|
||||||
if (!EffectManager::Get().RealtimeIsActive())
|
|
||||||
flags |= IsRealtimeNotActiveFlag;
|
|
||||||
|
|
||||||
if ( !( gAudioIO->IsBusy() && gAudioIO->GetNumCaptureChannels() > 0 ) )
|
|
||||||
flags |= CaptureNotBusyFlag;
|
|
||||||
|
|
||||||
auto &bar = ControlToolBar::Get( project );
|
|
||||||
if (bar.ControlToolBar::CanStopAudioStream())
|
|
||||||
flags |= CanStopAudioStreamFlag;
|
|
||||||
|
|
||||||
lastFlags = flags;
|
lastFlags = flags;
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
void OnUndoRedo( wxCommandEvent &evt );
|
void OnUndoRedo( wxCommandEvent &evt );
|
||||||
|
|
||||||
CommandFlag GetFocusedFrame(AudacityProject &project);
|
|
||||||
|
|
||||||
AudacityProject &mProject;
|
AudacityProject &mProject;
|
||||||
|
|
||||||
// 0 is grey out, 1 is Autoselect, 2 is Give warnings.
|
// 0 is grey out, 1 is Autoselect, 2 is Give warnings.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user