Audacity 3.2.0
CommonCommandFlags.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5CommonCommandFlags.cpp
6
7Paul Licameli split from Menus.cpp
8
9**********************************************************************/
10
11
12#include "CommonCommandFlags.h"
13
14
15
16#include <wx/frame.h>
17
18#include "AudioIO.h"
19#include "Clipboard.h"
20#include "LabelTrack.h"
21#include "Project.h"
22#include "ProjectAudioIO.h"
23#include "ProjectHistory.h"
24#include "ProjectWindows.h"
25#include "SyncLock.h"
26#include "UndoManager.h"
27#include "ViewInfo.h"
28#include "WaveTrack.h"
30
31/*
32
33This file registers functions implementing many of the tests for enabling of
34menu items. Sequence of a few of them has minor significance, but for most
35there is little reason to keep them in one file. Flags used only by one
36other file might instead be defined only where used.
37
38They are collected here because Menus.cpp is too low level to have the
39dependencies implied by the include directives above -- it would make dependency
40cycles.
41
42*/
43
44// Strong predicate excludes tracks that do not support basic editing.
46{
47 auto range = TrackList::Get(project).Selected()
48 - [](const Track *pTrack){
49 return !pTrack->SupportsBasicEditing(); };
50 return !range.empty();
51};
52
53// Weaker predicate.
55{
56 auto range = TrackList::Get(project).Selected();
57 return !range.empty();
58};
59
61{
63 ProjectAudioIO::Get( project ).GetAudioIOToken());
64};
65
67{
68 // This is equivalent to check if there is a valid selection,
69 // so it's used for Zoom to Selection too
71};
72
74static CommandFlagOptions result{
75// In reporting the issue with cut or copy, we don't tell the user they could also select some text in a label.
76 []( const TranslatableString &Name ) {
77 // PRL: These strings have hard-coded mention of a certain shortcut key,
78 // thus assuming the default shortcuts. That is questionable.
80#ifdef __WXMAC__
81 // i18n-hint: %s will be replaced by the name of an action, such as Normalize, Cut, Fade.
82 format = XO("Select the audio for %s to use (for example, Cmd + A to Select All) then try again."
83 );
84
85#else
86 // i18n-hint: %s will be replaced by the name of an action, such as Normalize, Cut, Fade.
87 format = XO("Select the audio for %s to use (for example, Ctrl + A to Select All) then try again."
88 );
89#endif
90 return format.Format( Name );
91 },
92 "Selecting_Audio_-_the_basics",
93 XO("No Audio Selected")
94};
95return result;
96}
97
98// Noise Reduction has a custom error message, when nothing selected.
100 []( const TranslatableString &Name ) {
101 // i18n-hint: %s will be replaced by the name of an effect, usually 'Noise Reduction'.
102 auto format = XO("Select the audio for %s to use.\n\n1. Select audio that represents noise and use %s to get your 'noise profile'.\n\n2. When you have got your noise profile, select the audio you want to change\nand use %s to change that audio.");
103 return format.Format( Name, Name, Name );
104 },
105 "Noise_Reduction",
106 XO("No Audio Selected")
107};
108
109
110 // The sequence of these definitions has a minor significance in determining
111 // which user error message has precedence if more than one might apply, so
112 // they should be kept in this sequence in one .cpp file if it is important
113 // to preserve that behavior. If they are dispersed to more than one file,
114 // then the precedence will be unspecified.
115 // The ordering of the flags that only disable the default message is not
116 // significant.
119 [](const AudacityProject &project ){
120 return !AudioIOBusyPred( project );
121 },
122 CommandFlagOptions{ []( const TranslatableString& ) { return
123 // This reason will not be shown, because options that require it will be greyed out.
124 XO("You can only do this when playing and recording are\nstopped. (Pausing is not sufficient.)");
125 } ,"FAQ:Errors:Audio Must Be Stopped"}
126 .QuickTest()
127 .Priority( 1 )
128 }; return flag; }//lll
131 [](const AudacityProject &project){
132 // TODO: more-than-two-channels
133 auto range =
135 return std::any_of(range.begin(), range.end(),
136 [](auto pTrack){ return pTrack->NChannels() > 1; });
137 },
138 { []( const TranslatableString& ) { return
139 // This reason will not be shown, because the stereo-to-mono is greyed out if not allowed.
140 XO("You must first select some stereo audio to perform this\naction. (You cannot use this with mono.)");
141 } ,"Audacity_Selection"}
142 }; return flag; } //lda
147 }; return flag; }
152 }; return flag; }
155 [](const AudacityProject &project){
156 return
157 !TrackList::Get(project).Selected<const WaveTrack>().empty();
158 },
159 { [](const TranslatableString&) { return
160 XO("You must first select some audio to perform this action.\n(Selecting other kinds of track won't work.)");
161 } ,"Audacity_Selection"}
162 }; return flag; }
165 [](const AudacityProject &project){
166 return !TrackList::Get(project).Any().empty();
167 },
169 }; return flag; }
173 { []( const TranslatableString &Name ){ return
174 // i18n-hint: %s will be replaced by the name of an action, such as "Remove Tracks".
175 XO("\"%s\" requires one or more tracks to be selected.").Format( Name );
176 },"Audacity_Selection" }
177 }; return flag; }
181 { []( const TranslatableString &Name ){ return
182 // i18n-hint: %s will be replaced by the name of an action, such as "Remove Tracks".
183 XO("\"%s\" requires one or more tracks to be selected.").Format( Name );
184 },"Audacity_Selection" }
185 }; return flag; }
188 [](const AudacityProject &project){
189 for (auto w = wxWindow::FindFocus(); w; w = w->GetParent()) {
190 if (dynamic_cast<const NonKeystrokeInterceptingWindow*>(w))
191 return true;
192 }
193 return false;
194 },
196 }; return flag; }; //lll
197
202 }; return flag; } //lll
205 [](const AudacityProject &){
206 auto gAudioIO = AudioIO::Get();
207 return !(
208 gAudioIO->IsBusy() &&
209 gAudioIO->GetNumCaptureChannels() > 0
210 );
211 }
212 }; return flag; };
213
216 [](const AudacityProject &project){
217 return !TrackList::Get(project)
218 .Selected<const LabelTrack>().empty();
219 }
220 }; return flag; }
223 [](const AudacityProject &project){
225 }
226 }; return flag; }
229 [](const AudacityProject &project){
231 }
232 }; return flag; }
235 [](const AudacityProject &project){
236 return
238 &&
239 !TrackList::Get(project).Any().empty()
240 ;
241 }
242 }; return flag; }
245 [](const AudacityProject &project){
246 return
248 &&
249 !TrackList::Get(project).Any().empty()
250 ;
251 }
252 }; return flag; }
255 [](const AudacityProject &project){
256 return !TrackList::Get(project).Any<const WaveTrack>().empty();
257 }
258 }; return flag; }
261 [](const AudacityProject &project){
263 }
264 }; return flag; } //awd
267 [](const AudacityProject &project){
269 }
270 }; return flag; } //awd
273 [](const AudacityProject &project){
274 const wxWindow *focus = FindProjectFrame( &project );
275 if (focus) {
276 while (focus && focus->GetParent())
277 focus = focus->GetParent();
278 }
279 return (focus &&
280 !static_cast<const wxTopLevelWindow*>(focus)->IsIconized()
281 );
282 },
284 }; return flag; } // prl
287 [](const AudacityProject&){
288 return AudioIOBase::Get()->IsPaused();
289 },
291 }; return flag; }
294 [](const AudacityProject &){ return true; }
295 }; return flag; } // jkc
296
const ReservedCommandFlag & NoAutoSelect()
const CommandFlagOptions noiseReductionOptions
const ReservedCommandFlag & CaptureNotBusyFlag()
const ReservedCommandFlag & NoiseReductionTimeSelectedFlag()
const ReservedCommandFlag & AudioIOBusyFlag()
bool EditableTracksSelectedPred(const AudacityProject &project)
const ReservedCommandFlag & AudioIONotBusyFlag()
const ReservedCommandFlag & ZoomInAvailableFlag()
const ReservedCommandFlag & NotMinimizedFlag()
const ReservedCommandFlag & UndoAvailableFlag()
const ReservedCommandFlag & RedoAvailableFlag()
const ReservedCommandFlag & ZoomOutAvailableFlag()
const ReservedCommandFlag & IsSyncLockedFlag()
const ReservedCommandFlag & StereoRequiredFlag()
bool AudioIOBusyPred(const AudacityProject &project)
const ReservedCommandFlag & LabelTracksExistFlag()
const ReservedCommandFlag & TimeSelectedFlag()
const ReservedCommandFlag & EditableTracksSelectedFlag()
bool AnyTracksSelectedPred(const AudacityProject &project)
const ReservedCommandFlag & AnyTracksSelectedFlag()
const CommandFlagOptions & cutCopyOptions()
const ReservedCommandFlag & TracksExistFlag()
const ReservedCommandFlag & PausedFlag()
const ReservedCommandFlag & IsNotSyncLockedFlag()
const ReservedCommandFlag & WaveTracksExistFlag()
const ReservedCommandFlag & WaveTracksSelectedFlag()
const ReservedCommandFlag & TrackPanelHasFocus()
bool TimeSelectedPred(const AudacityProject &project)
XO("Cut/Copy/Paste")
wxFrame * FindProjectFrame(AudacityProject *project)
Get a pointer to the window associated with a project, or null if the given pointer is null,...
accessors for certain important windows associated with each project
const auto project
static std::once_flag flag
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
static AudioIOBase * Get()
Definition: AudioIOBase.cpp:94
bool IsAudioTokenActive(int token) const
Returns true if the stream is active, or even if audio I/O is busy cleaning up its data or writing to...
bool IsPaused() const
Find out if playback / recording is currently paused.
static AudioIO * Get()
Definition: AudioIO.cpp:126
A LabelTrack is a Track that holds labels (LabelStruct).
Definition: LabelTrack.h:98
bool isPoint() const
Definition: ViewInfo.h:40
static ProjectAudioIO & Get(AudacityProject &project)
bool UndoAvailable() const
bool RedoAvailable() const
static ProjectHistory & Get(AudacityProject &project)
bool IsSyncLocked() const
Definition: SyncLock.cpp:44
static SyncLockState & Get(AudacityProject &project)
Definition: SyncLock.cpp:27
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:110
auto Any() -> TrackIterRange< TrackType >
Definition: Track.h:950
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:314
auto Selected() -> TrackIterRange< TrackType >
Definition: Track.h:967
Holds a msgid for the translation catalog; may also bind format arguments.
NotifyingSelectedRegion selectedRegion
Definition: ViewInfo.h:216
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
A Track that contains audio waveform data.
Definition: WaveTrack.h:203
bool ZoomInAvailable() const
Definition: ZoomInfo.cpp:65
bool ZoomOutAvailable() const
Definition: ZoomInfo.cpp:70
std::unique_ptr< WindowPlacement > FindFocus()
Find the window that is accepting keyboard input, if any.
Definition: BasicUI.h:383
CommandFlagOptions && DisableDefaultMessage() &&
Definition: CommandFlag.h:53
CommandFlagOptions && QuickTest() &&
Definition: CommandFlag.h:51