-
Notifications
You must be signed in to change notification settings - Fork 1
/
AutoSliderCtrl.h
351 lines (302 loc) · 8.78 KB
/
AutoSliderCtrl.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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
// Copyleft 2004 Chris Korda
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 of the License, or any later version.
/*
chris korda
revision history:
rev date comments
00 26dec03 initial version
slider with automation support
*/
#if !defined(AFX_AUTOSLIDERCTRL_H__03E1B7AD_4969_4091_B6E1_CB470C63B395__INCLUDED_)
#define AFX_AUTOSLIDERCTRL_H__03E1B7AD_4969_4091_B6E1_CB470C63B395__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AutoSliderCtrl.h : header file
//
#include "SelectSliderCtrl.h"
#include "AutoDlg.h"
// non-standard notification codes
#define AUTOSLIDER_STOP 1000 // sent when stop is pressed
#define AUTOSLIDER_PAUSE 1001 // sent when pause is pressed
#define AUTOSLIDER_PLAY 1002 // sent when play is pressed
#define AUTOSLIDER_UNSET 1003 // sent when transport is unset
#define AUTOSLIDER_CREATE 1004 // sent when dialog is created
#define AUTOSLIDER_CLOSE 1005 // sent when dialog is closed
#define AUTOSLIDER_ACTIVATE 1006 // sent when dialog is activated
#define AUTOSLIDER_MODIFY 1007 // sent when dialog is modified
#define AUTOSLIDER_GO 1008 // sent when go is signaled
/////////////////////////////////////////////////////////////////////////////
// CAutoSliderCtrl window
class CAutoSliderCtrl : public CSelectSliderCtrl
{
public:
// Construction
CAutoSliderCtrl();
virtual ~CAutoSliderCtrl();
// Constants
enum TRANSPORT { // transport states
STOP = CAutoInfo::STOP,
PAUSE = CAutoInfo::PAUSE,
PLAY = CAutoInfo::PLAY,
UNSET = CAutoInfo::UNSET,
TRANSPORT_STATES = CAutoInfo::TRANSPORT_STATES
};
enum OPTION { // same for all auto-sliders
MCLICK_SHOWS_DLG = 0x01, // middle-click shows auto dialog
DEFAULT_OPTIONS = MCLICK_SHOWS_DLG
};
enum AUTO_STYLE { // auto-slider styles
AUTO_DIALOG = 0x01, // enable automation dialog
AUTO_DLG_WAVEFORM = 0x02, // enable auto dialog's waveform combo box
AUTO_DLG_LOOP = 0x04 // enable auto dialog's loop button
};
// Attributes
void GetInfo(CAutoInfo& Info) const;
void SetInfo(const CAutoInfo& Info);
void SetInfoNotify(const CAutoInfo& Info);
int GetTime() const;
void SetTime(int Time);
int GetTransport() const;
void SetTransport(int Transport);
bool IsPlaying() const;
bool GetLoop() const;
void SetLoop(bool Enable);
void SetSelection(int nMin, int nMax);
void GetSelection(int& nMin, int& nMax) const;
void SetNormSelection(float fMin, float fMax);
void GetNormSelection(float& fMin, float& fMax) const;
int GetPos() const;
void SetPos(int Pos);
double GetNormPos() const;
void SetNormPos(double Pos);
bool GetReverse() const;
void SetReverse(bool Reverse);
int GetWaveform() const;
void SetWaveform(int Waveform);
bool IsAutoDlgVisible() const;
bool IsSelectionActive() const;
PVOID GetCookie() const;
void SetCookie(PVOID Cookie);
int GetAutoStyle() const;
void SetAutoStyle(int Style);
static void SetAnimDelay(int Delay);
static int GetAnimDelay();
static bool IsAnimated();
static void SetOptions(int Options);
static int GetOptions();
// Operations
void Go();
void ShowAutoDlg(bool Enable, bool Undoable = TRUE);
void ToggleAutoDlg();
bool TimerHook(float Scale = 1);
void SetAutoDlgParent(CWnd *Parent);
void SetAutoDlgTitle(LPCSTR Title);
BOOL EnableToolTips(BOOL bEnable);
static void ResetAnimCount();
static bool IsKeyDown(int VKey);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAutoSliderCtrl)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CAutoSliderCtrl)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnToggleAutoDlg();
afx_msg void HScroll(UINT nSBCode, UINT nPos);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
// Nested classes
class CMyAutoDlg : public CAutoDlg {
public:
CMyAutoDlg(CAutoSliderCtrl *Slider, CWnd *pParent = NULL);
private:
BOOL OnInitDialog();
void OnOK();
void OnCancel();
BOOL PreTranslateMessage(MSG* pMsg);
void OnTransport(int Transport);
void OnGo();
BOOL OnNcActivate(BOOL bActive);
void OnModify();
void OnNewPos();
void SaveUndoState(CUndoState& State);
void RestoreUndoState(const CUndoState& State);
CAutoSliderCtrl *m_Slider;
};
// Types
typedef struct {
float Pos;
float Start;
float End;
BYTE Transport;
BYTE Reverse;
bool ShowDlg;
} QUICK_START_UNDO_STATE;
// Constants
enum {
MKU_SHOW_DLG = MK_CONTROL
};
enum {
UNDO_SHOW_DLG = 0x8000, // avoid base undo codes and windows control IDs
UNDO_TRANSPORT,
UNDO_QUICK_START
};
enum { // adjust function masks
AF_INC = 0, // increment selection point(s)
AF_DEC = 0x01, // decrement selection point(s)
AF_GOTO = 0x02, // move selection to start/end
AF_START = 0x04, // selection start point
AF_END = 0x08, // selection end point
AF_BOTH = AF_START | AF_END // entire selection
};
static const CPen m_PenDisabled;
static const CBrush m_BrStop;
static const CBrush m_BrPause;
static const CBrush m_BrPlay;
static const CBrush *m_BrTransport[TRANSPORT_STATES];
static const int m_TransportNotification[TRANSPORT_STATES];
static const int m_FineAdjustPrecision;
// Member data
static HACCEL m_Accel;
static int m_AnimDelay;
static int m_AnimCount;
static int m_AnimBase;
static int m_Options;
CAutoInfo m_Info;
CMyAutoDlg *m_AutoDlg;
int m_PrevTransport;
CWnd *m_AutoDlgParent;
BOOL m_HasToolTips;
PVOID m_Cookie;
int m_AutoStyle;
double m_WavePos;
// Helpers
void Notify(int NotificationCode);
void AdjSel(int Func);
void AdjPos(int Func);
void UpdateAutoDlgUI();
// Overridables
virtual void OnSelection();
virtual void OnTransport(int Transport);
virtual void OnNewPos();
virtual void OnDlgSaveUndoState(CUndoState& State);
virtual void OnDlgRestoreUndoState(const CUndoState& State);
// Overrides
void SaveUndoState(CUndoState& State);
void RestoreUndoState(const CUndoState& State);
CUndoable *FindUndoable(CUndoState::UNDO_KEY Key);
void GetUndoTitle(const CUndoState& State, CString& Title);
// Friends
friend CMyAutoDlg;
NOCOPIES(CAutoSliderCtrl);
};
inline int CAutoSliderCtrl::GetTime() const
{
return(m_Info.m_Time);
}
inline int CAutoSliderCtrl::GetTransport() const
{
return(m_Info.m_Transport);
}
inline bool CAutoSliderCtrl::IsPlaying() const
{
return(m_Info.m_Transport == PLAY);
}
inline bool CAutoSliderCtrl::GetLoop() const
{
return(m_Info.m_Loop != 0);
}
inline void CAutoSliderCtrl::GetSelection(int& nMin, int& nMax) const
{
nMin = NormToSlider(m_Info.m_StartPos);
nMax = NormToSlider(m_Info.m_EndPos);
}
inline int CAutoSliderCtrl::GetPos() const
{
return(NormToSlider(m_Info.m_Pos));
}
inline double CAutoSliderCtrl::GetNormPos() const
{
return(m_Info.IsPlaying() ? m_WavePos : m_Info.m_Pos);
}
inline bool CAutoSliderCtrl::GetReverse() const
{
return(m_Info.m_Reverse != 0);
}
inline int CAutoSliderCtrl::GetWaveform() const
{
return(m_Info.m_Waveform);
}
inline bool CAutoSliderCtrl::IsAutoDlgVisible() const
{
return(m_AutoDlg != NULL && m_AutoDlg->IsWindowVisible());
}
inline bool CAutoSliderCtrl::IsSelectionActive() const
{
return(m_Info.m_Transport != STOP);
}
inline PVOID CAutoSliderCtrl::GetCookie() const
{
return(m_Cookie);
}
inline void CAutoSliderCtrl::SetCookie(PVOID Cookie)
{
m_Cookie = Cookie;
}
inline void CAutoSliderCtrl::SetAnimDelay(int Delay)
{
m_AnimDelay = Delay;
}
inline int CAutoSliderCtrl::GetAnimDelay()
{
return(m_AnimDelay);
}
inline bool CAutoSliderCtrl::IsAnimated()
{
return(m_AnimDelay ? !(m_AnimCount++ % (m_AnimDelay + 1)) : TRUE);
}
inline void CAutoSliderCtrl::ResetAnimCount()
{
m_AnimCount = m_AnimBase++;
}
inline void CAutoSliderCtrl::GetNormSelection(float& fMin, float& fMax) const
{
fMin = m_Info.m_StartPos;
fMax = m_Info.m_EndPos;
}
inline bool CAutoSliderCtrl::IsKeyDown(int VKey)
{
return((GetAsyncKeyState(VKey) & 0x80000000) != 0);
}
inline int CAutoSliderCtrl::GetAutoStyle() const
{
return(m_AutoStyle);
}
inline void CAutoSliderCtrl::SetAutoStyle(int Style)
{
m_AutoStyle = Style;
}
inline void CAutoSliderCtrl::SetOptions(int Options)
{
m_Options = Options;
}
inline int CAutoSliderCtrl::GetOptions()
{
return(m_Options);
}
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_AUTOSLIDERCTRL_H__03E1B7AD_4969_4091_B6E1_CB470C63B395__INCLUDED_)