Audacity 3.2.0
ListNavigationEnabled.cpp
Go to the documentation of this file.
1/*!********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 @file ListNavigationEnabled.cpp
6
7 @author Vitaly Sverchinsky
8
9**********************************************************************/
10
12
13void ListNavigationEnabled_HandleCharHook(wxWindow* self, wxKeyEvent& evt)
14{
15 //We want to restore focus to list item once arrow navigation is used
16 //on the child item, for this we need a char hook since key/navigation
17 //events are sent directly to the focused item
18 const auto keyCode = evt.GetKeyCode();
19 if((keyCode == WXK_DOWN || keyCode == WXK_UP) &&
20 !self->HasFocus() &&
21 self->IsDescendant(wxWindow::FindFocus()))
22 {
23 self->SetFocusFromKbd();
24 }
25 else
26 evt.Skip();
29void ListNavigationEnabled_HandleKeyDown(wxWindow* self, wxKeyEvent& evt)
31 const auto keyCode = evt.GetKeyCode();
32 if(keyCode == WXK_TAB)
33 self->NavigateIn(wxNavigationKeyEvent::FromTab | (evt.ShiftDown() ? wxNavigationKeyEvent::IsBackward : wxNavigationKeyEvent::IsForward));
34 else if(keyCode == WXK_DOWN)
35 self->Navigate(wxNavigationKeyEvent::IsForward);
36 else if(keyCode == WXK_UP)
37 self->Navigate(wxNavigationKeyEvent::IsBackward);
38 else
39 evt.Skip();
40}
41
43 wxNavigationKeyEvent& evt, bool inTabOrder)
44{
45 if(evt.GetEventObject() == self->GetParent() && (!evt.IsFromTab() || inTabOrder))
46 self->SetFocusFromKbd();
47 else if(evt.GetEventObject() == self && evt.GetCurrentFocus() == self && evt.IsFromTab())
48 {
49 //NavigateIn
50 wxPropagationDisabler disableProp(evt);
51 const auto isForward = evt.GetDirection();
52 const auto& children = self->GetChildren();
53 auto node = isForward ? children.GetFirst() : children.GetLast();
54 while(node)
55 {
56 auto child = node->GetData();
57 if(child->CanAcceptFocusFromKeyboard())
58 {
59 if(!child->GetEventHandler()->ProcessEvent(evt))
60 {
61 child->SetFocusFromKbd();
62 }
63 evt.Skip(false);
64 return;
65 }
66 node = isForward ? node->GetNext() : node->GetPrevious();
67 }
68 }
69 else
70 evt.Skip();
71}
72
74{
75 if(self->IsDescendant(wxWindow::FindFocus()))
76 {
77 auto next = self->GetNextSibling();
78 if(next != nullptr && next->AcceptsFocus())
79 next->SetFocus();
80 else
81 {
82 auto prev = self->GetPrevSibling();
83 if(prev != nullptr && prev->AcceptsFocus())
84 prev->SetFocus();
85 }
86 }
87}
void ListNavigationEnabled_HandleNavigationKeyEvent(wxWindow *self, wxNavigationKeyEvent &evt, bool inTabOrder)
void ListNavigationEnabled_HandleDestroy(wxWindow *self)
void ListNavigationEnabled_HandleKeyDown(wxWindow *self, wxKeyEvent &evt)
void ListNavigationEnabled_HandleCharHook(wxWindow *self, wxKeyEvent &evt)
std::unique_ptr< WindowPlacement > FindFocus()
Find the window that is accepting keyboard input, if any.
Definition: BasicUI.h:383