forked from Sneeds-Feed-and-Seed/sneedacity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTrackPanelAx.h
204 lines (147 loc) · 6.27 KB
/
TrackPanelAx.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/**********************************************************************
Sneedacity: A Digital Audio Editor
TrackPanelAx.h
Leland Lucius
**********************************************************************/
#ifndef __SNEEDACITY_TRACK_PANEL_ACCESSIBILITY__
#define __SNEEDACITY_TRACK_PANEL_ACCESSIBILITY__
#include <functional>
#include <memory>
#include <wx/event.h> // to declare custom event types
#include <wx/setup.h> // for wxUSE_* macros
#include <wx/string.h> // member variable
#if wxUSE_ACCESSIBILITY
#include "widgets/WindowAccessible.h" // to inherit
#endif
#include "ClientData.h" // to inherit
class wxRect;
class SneedacityProject;
class Track;
class TrackList;
// An event sent to the project
wxDECLARE_EXPORTED_EVENT(SNEEDACITY_DLL_API,
EVT_TRACK_FOCUS_CHANGE, wxCommandEvent);
class TrackPanelAx final
#if wxUSE_ACCESSIBILITY
: public WindowAccessible
#endif
{
public:
TrackPanelAx(SneedacityProject &project);
virtual ~ TrackPanelAx();
using RectangleFinder = std::function< wxRect( Track& ) >;
void SetFinder( const RectangleFinder &finder ) { mFinder = finder; }
// Returns currently focused track or first one if none focused
std::shared_ptr<Track> GetFocus();
// Changes focus to a specified track
// Return is the actual focused track, which may be different from
// the argument when that is null
std::shared_ptr<Track> SetFocus( std::shared_ptr<Track> track = {} );
// Returns TRUE if passed track has the focus
bool IsFocused( const Track *track );
// Called to signal changes to a track
void Updated();
void MessageForScreenReader(const TranslatableString& message);
#if wxUSE_ACCESSIBILITY
// Retrieves the address of an IDispatch interface for the specified child.
// All objects must support this property.
wxAccStatus GetChild(int childId, wxAccessible** child) override;
// Gets the number of children.
wxAccStatus GetChildCount(int* childCount) override;
// Gets the default action for this object (0) or > 0 (the action for a child).
// Return wxACC_OK even if there is no action. actionName is the action, or the empty
// string if there is no action.
// The retrieved string describes the action that is performed on an object,
// not what the object does as a result. For example, a toolbar button that prints
// a document has a default action of "Press" rather than "Prints the current document."
wxAccStatus GetDefaultAction(int childId, wxString *actionName) override;
// Returns the description for this object or a child.
wxAccStatus GetDescription(int childId, wxString *description) override;
// Gets the window with the keyboard focus.
// If childId is 0 and child is NULL, no object in
// this subhierarchy has the focus.
// If this object has the focus, child should be 'this'.
wxAccStatus GetFocus(int *childId, wxAccessible **child) override;
// Returns help text for this object or a child, similar to tooltip text.
wxAccStatus GetHelpText(int childId, wxString *helpText) override;
// Returns the keyboard shortcut for this object or child.
// Return e.g. ALT+K
wxAccStatus GetKeyboardShortcut(int childId, wxString *shortcut) override;
// Returns the rectangle for this object (id = 0) or a child element (id > 0).
// rect is in screen coordinates.
wxAccStatus GetLocation(wxRect& rect, int elementId) override;
// Gets the name of the specified object.
wxAccStatus GetName(int childId, wxString *name) override;
// Returns a role constant.
wxAccStatus GetRole(int childId, wxAccRole *role) override;
// Gets a variant representing the selected children
// of this object.
// Acceptable values:
// - a null variant (IsNull() returns TRUE)
// - a list variant (GetType() == wxT("list"))
// - an integer representing the selected child element,
// or 0 if this object is selected (GetType() == wxT("long"))
// - a "void*" pointer to a wxAccessible child object
wxAccStatus GetSelections(wxVariant *selections) override;
// Returns a state constant.
wxAccStatus GetState(int childId, long* state) override;
// Returns a localized string representing the value for the object
// or child.
wxAccStatus GetValue(int childId, wxString* strValue) override;
// Navigates from fromId to toId/toObject
wxAccStatus Navigate(wxNavDir navDir, int fromId, int* toId, wxAccessible** toObject) override;
// Modify focus or selection
wxAccStatus Select(int childId, wxAccSelectionFlags selectFlags) override;
#else
wxWindow *GetWindow() const { return mWindow; }
void SetWindow( wxWindow *window ) { mWindow = window; }
#endif
private:
TrackList &GetTracks();
int TrackNum( const std::shared_ptr<Track> &track );
std::shared_ptr<Track> FindTrack( int num );
SneedacityProject &mProject;
#if !wxUSE_ACCESSIBILITY
wxWindow *mWindow{};
#endif
RectangleFinder mFinder;
std::weak_ptr<Track> mFocusedTrack;
int mNumFocusedTrack;
wxString mMessage;
bool mTrackName;
int mMessageCount;
};
class SNEEDACITY_DLL_API TrackFocus final
: public ClientData::Base
{
public:
static TrackFocus &Get( SneedacityProject &project );
static const TrackFocus &Get( const SneedacityProject &project );
explicit TrackFocus( SneedacityProject &project );
~TrackFocus() override;
TrackFocus( const TrackFocus & ) PROHIBITED;
TrackFocus& operator=( const TrackFocus & ) PROHIBITED;
// Report the currently focused track, which may be null, otherwise is
// a leader track
// This function is not const, because it may have a side effect of setting
// a focus if none was already set
Track *Get();
// Set the track focus to a given track or to null
void Set( Track *pTrack );
// Not equivalent to pTrack == this->Get(): may return true also for
// other channels than the leader
// As with Get(), this is not const
bool IsFocused( const Track *pTrack );
void SetAccessible( wxWindow &owner,
std::unique_ptr< TrackPanelAx > pAccessible );
void MessageForScreenReader(const TranslatableString& message);
void UpdateAccessibility();
private:
SneedacityProject &mProject;
#if wxUSE_ACCESSIBILITY
TrackPanelAx *mAx{};
#else
std::unique_ptr<TrackPanelAx> mAx;
#endif
};
#endif // __SNEEDACITY_TRACK_PANEL_ACCESSIBILITY__