3#include "../CommonCommandFlags.h"
7#include "../ProjectWindow.h"
8#include "../ProjectWindows.h"
9#include "../RealtimeEffectPanel.h"
12#include "../TrackPanel.h"
13#include "../TrackPanelAx.h"
14#include "../commands/CommandContext.h"
15#include "../commands/CommandManager.h"
16#include "../toolbars/ToolManager.h"
17#include "../widgets/AButton.h"
18#include "../widgets/ASlider.h"
19#include "../widgets/MeterPanel.h"
34 std::vector<wxWindow*> seq;
43 auto FindAncestor = [&]() {
47 auto it = std::find(seq.cbegin(), seq.cend(), pWindow);
49 return static_cast<size_t>(std::distance(seq.cbegin(), it));
50 pWindow = pWindow->GetParent();
55 const auto idx = FindAncestor();
56 if (idx == seq.size())
60 const auto increment = (
forward ? 1 :
static_cast<int>(seq.size()) - 1);
62 while( idx != (idx2 = (idx2 + increment) % seq.size()) ) {
63 wxWindow *toFocus = seq[idx2];
64 if(!toFocus->IsShown())
68 if ( FindAncestor() == idx2 )
83 const auto t = trackFocus.Get();
86 const auto last = *
tracks.rbegin();
89 last->EnsureVisible(
true);
92 assert(t->IsLeader());
95 auto p = * --
tracks.Find(t);
101 if (circularTrackNavigation)
110 assert(p && p->IsLeader());
111 auto tSelected = t->GetSelected();
112 auto pSelected = p->GetSelected();
113 if (tSelected && pSelected) {
114 selectionState.SelectTrack(*t,
false,
false);
117 p->EnsureVisible(
true);
120 if (tSelected && !pSelected) {
121 selectionState.SelectTrack(*p,
true,
false);
124 p->EnsureVisible(
true);
127 if (!tSelected && pSelected) {
128 selectionState.SelectTrack(*p,
false,
false);
131 p->EnsureVisible(
true);
134 if (!tSelected && !pSelected) {
135 selectionState.SelectTrack(*t,
true,
false);
138 p->EnsureVisible(
true);
143 auto p = * --
tracks.Find(t);
147 if (circularTrackNavigation) {
148 auto range =
tracks.Any();
149 p = * range.rbegin();
152 p->EnsureVisible(
true);
162 p->EnsureVisible(
true);
179 const auto t = trackFocus.Get();
182 const auto first = *
tracks.begin();
183 trackFocus.Set(first);
185 first->EnsureVisible(
true);
188 assert(t->IsLeader());
191 auto n = * ++
tracks.Find(t);
195 if (circularTrackNavigation)
204 assert(n && n->IsLeader());
205 auto tSelected = t->GetSelected();
206 auto nSelected = n->GetSelected();
207 if (tSelected && nSelected) {
208 selectionState.SelectTrack(*t,
false,
false);
211 n->EnsureVisible(
true);
214 if (tSelected && !nSelected) {
215 selectionState.SelectTrack(*n,
true,
false);
218 n->EnsureVisible(
true);
221 if (!tSelected && nSelected) {
222 selectionState.SelectTrack(*n,
false,
false);
225 n->EnsureVisible(
true);
228 if (!tSelected && !nSelected) {
229 selectionState.SelectTrack(*t,
true,
false);
232 n->EnsureVisible(
true);
237 auto n = * ++
tracks.Find(t);
241 if (circularTrackNavigation) {
245 n->EnsureVisible(
true );
255 n->EnsureVisible(
true);
281 auto isEnabled = window.IsEnabled();
284 const auto & list = window.GetChildren();
285 auto iter = list.rbegin(),
end = list.rend();
295 while (iter !=
end && *iter != w)
302 for (; iter !=
end; ++iter)
307 if (w->IsTopLevel() && w->IsShown() && isEnabled)
314 if ((iter ==
end) && isEnabled)
325#if defined(__WXMAC__) || defined(__WXGTK__)
330 if (
dynamic_cast<wxDialog*
>(w)) {
340 auto isEnabled = window.IsEnabled();
343 const auto & list = window.GetChildren();
344 auto iter = list.begin(),
end = list.end();
357 while (iter !=
end && *iter != w)
364 for (; iter !=
end; ++iter)
370 if (w->IsTopLevel() && w->IsShown() && w->IsEnabled())
377 if ((iter ==
end) && isEnabled)
388#if defined(__WXMAC__) || defined(__WXGTK__)
393 if (
dynamic_cast<wxDialog*
>(w)) {
432 auto t = trackFocus.Get();
440 f->EnsureVisible( t != f );
454 auto l = *
tracks.rbegin();
458 l->EnsureVisible(t != l);
481 t = trackFocus.
Get();
485 selectionState.SelectTrack(*t, !t->
GetSelected(),
true);
488 trackFocus.UpdateAccessibility();
513 return std::make_unique< NavigationActions::Handler >(); } };
521#define FN(X) (& NavigationActions::Handler :: X)
533 Command(
wxT(
"PrevWindow"),
XXO(
"Move Backward Through Active Windows"),
536 Command(
wxT(
"NextWindow"),
XXO(
"Move Forward Through Active Windows"),
544 wxT(
"Optional/Extra/Part2"),
556 XXO(
"Move &Backward from Toolbars to Tracks"),
FN(OnPrevFrame),
559 XXO(
"Move F&orward from Toolbars to Tracks"),
FN(OnNextFrame),
561 Command(
wxT(
"PrevTrack"),
XXO(
"Move Focus to &Previous Track"),
562 FN(OnCursorUp), FocusedTracksFlags,
wxT(
"Up") ),
564 FN(OnCursorDown), FocusedTracksFlags,
wxT(
"Down") ),
565 Command(
wxT(
"FirstTrack"),
XXO(
"Move Focus to &First Track"),
566 FN(OnFirstTrack), FocusedTracksFlags,
wxT(
"Ctrl+Home") ),
568 FN(OnLastTrack), FocusedTracksFlags,
wxT(
"Ctrl+End") ),
569 Command(
wxT(
"ShiftUp"),
XXO(
"Move Focus to P&revious and Select"),
570 FN(OnShiftUp), FocusedTracksFlags,
wxT(
"Shift+Up") ),
571 Command(
wxT(
"ShiftDown"),
XXO(
"Move Focus to N&ext and Select"),
572 FN(OnShiftDown), FocusedTracksFlags,
wxT(
"Shift+Down") ),
574 FocusedTracksFlags,
wxT(
"Return") ),
576 FocusedTracksFlags,
wxT(
"NUMPAD_ENTER") )
582 wxT(
"Optional/Extra/Part2"),
AttachedItem sAttachment3
AttachedItem sAttachment2
constexpr CommandFlag AlwaysEnabledFlag
wxEvtHandler CommandHandlerObject
const ReservedCommandFlag & TracksExistFlag()
const ReservedCommandFlag & TrackPanelHasFocus()
XXO("&Cut/Copy/Paste Toolbar")
audacity::BasicSettings * gPrefs
AUDACITY_DLL_API wxFrame & GetProjectFrame(AudacityProject &project)
Get the top-level window associated with the project (as a wxFrame only, when you do not need to use ...
declares abstract base class Track, TrackList, and iterators over TrackList
static TempAllowFocus TemporarilyAllowFocus()
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Client code makes static instance from a factory of attachments; passes it to Get or Find as a retrie...
Subclass & Get(const RegisteredFactory &key)
Get reference to an attachment, creating on demand if not present, down-cast it to Subclass.
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
AudacityProject & project
static TempAllowFocus TemporarilyAllowFocus()
A listener notified of changes in preferences.
static ProjectHistory & Get(AudacityProject &project)
static ProjectWindow & Get(AudacityProject &project)
static RealtimeEffectPanel & Get(AudacityProject &project)
static SelectionState & Get(AudacityProject &project)
Abstract base class for an object holding data associated with points on a time axis.
bool GetSelected() const
Selectedness is always the same for all channels of a group.
void EnsureVisible(bool modifyState=false)
bool IsLeader() const override
static TrackList & Get(AudacityProject &project)
static TrackPanel & Get(AudacityProject &project)
bool ReadBool(const wxString &key, bool defaultValue) const
std::unique_ptr< WindowPlacement > FindFocus()
Find the window that is accepting keyboard input, if any.
Namespace for functions for project navigation menu (part of Extra menu)
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
std::unique_ptr< detail::IndirectItem< Item > > Indirect(const std::shared_ptr< Item > &ptr)
A convenience function.
std::shared_ptr< BaseItem > BaseItemSharedPtr
CommandManager::Options Options
A convenient default parameter for class template Site.
void OnNextWindow(const CommandContext &context)
void OnNextFrame(const CommandContext &context)
Handler(const Handler &)=delete
void OnToggle(const CommandContext &context)
void OnPrevFrame(const CommandContext &context)
void OnCursorUp(const CommandContext &context)
void OnShiftDown(const CommandContext &context)
void OnPrevWindow(const CommandContext &context)
void UpdatePrefs() override
Handler & operator=(const Handler &)=delete
void OnLastTrack(const CommandContext &context)
void OnCursorDown(const CommandContext &context)
bool mCircularTrackNavigation
void OnFirstTrack(const CommandContext &context)
void OnShiftUp(const CommandContext &context)