Audacity 3.2.0
Public Member Functions | Static Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
EnvelopeHandle Class Referencefinal

#include <EnvelopeHandle.h>

Inheritance diagram for EnvelopeHandle:
[legend]
Collaboration diagram for EnvelopeHandle:
[legend]

Public Member Functions

 EnvelopeHandle (Envelope *pEnvelope)
 
 EnvelopeHandle (EnvelopeHandle &&)=default
 
EnvelopeHandleoperator= (EnvelopeHandle &&)=default
 
virtual ~EnvelopeHandle ()
 
EnvelopeGetEnvelope () const
 
void Enter (bool forward, AudacityProject *) override
 
Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override
 
Result Drag (const TrackPanelMouseEvent &event, AudacityProject *pProject) override
 
HitTestPreview Preview (const TrackPanelMouseState &state, AudacityProject *pProject) override
 
Result Release (const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
 
Result Cancel (AudacityProject *pProject) override
 
bool StopsOnKeystroke () override
 
- Public Member Functions inherited from UIHandle
virtual ~UIHandle ()=0
 
virtual void Enter (bool forward, AudacityProject *pProject)
 
virtual bool HasRotation () const
 
virtual bool Rotate (bool forward)
 
virtual bool HasEscape (AudacityProject *pProject) const
 
virtual bool Escape (AudacityProject *pProject)
 
virtual bool HandlesRightClick ()
 Whether the handle has any special right-button handling. More...
 
virtual Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
 
virtual Result Drag (const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
 
virtual HitTestPreview Preview (const TrackPanelMouseState &state, AudacityProject *pProject)=0
 
virtual Result Release (const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent)=0
 
virtual Result Cancel (AudacityProject *pProject)=0
 
virtual bool StopsOnKeystroke ()
 
virtual void OnProjectChange (AudacityProject *pProject)
 
Result GetChangeHighlight () const
 
void SetChangeHighlight (Result val)
 
- Public Member Functions inherited from TrackPanelDrawable
virtual ~TrackPanelDrawable ()=0
 
virtual void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
 
virtual wxRect DrawingArea (TrackPanelDrawingContext &context, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
 

Static Public Member Functions

static UIHandlePtr HitAnywhere (std::weak_ptr< EnvelopeHandle > &holder, Envelope *envelope, bool timeTrack)
 
static UIHandlePtr TimeTrackHitTest (std::weak_ptr< EnvelopeHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, const std::shared_ptr< TimeTrack > &tt)
 
static UIHandlePtr WaveTrackHitTest (std::weak_ptr< EnvelopeHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, const std::shared_ptr< WaveTrack > &wt)
 
- Static Public Member Functions inherited from UIHandle
static UIHandle::Result NeedChangeHighlight (const UIHandle &, const UIHandle &)
 
- Static Public Member Functions inherited from TrackPanelDrawable
static wxRect MaximizeWidth (const wxRect &rect, const wxRect &panelRect)
 
static wxRect MaximizeHeight (const wxRect &rect, const wxRect &panelRect)
 

Private Member Functions

 EnvelopeHandle (const EnvelopeHandle &)=delete
 
EnvelopeHandleoperator= (const EnvelopeHandle &)=delete
 
bool ForwardEventToEnvelopes (const wxMouseEvent &event, const ViewInfo &viewInfo)
 

Static Private Member Functions

static UIHandlePtr HitEnvelope (std::weak_ptr< EnvelopeHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, Envelope *envelope, float zoomMin, float zoomMax, bool dB, float dBRange, bool timeTrack)
 

Private Attributes

wxRect mRect {}
 
bool mLog {}
 
float mLower {}
 
float mUpper {}
 
double mdBRange {}
 
EnvelopemEnvelope {}
 
std::vector< std::unique_ptr< EnvelopeEditor > > mEnvelopeEditors
 
bool mTimeTrack {}
 

Additional Inherited Members

- Public Types inherited from UIHandle
using Result = unsigned
 
using Cell = TrackPanelCell
 
- Protected Attributes inherited from UIHandle
Result mChangeHighlight { 0 }
 

Detailed Description

Definition at line 27 of file EnvelopeHandle.h.

Constructor & Destructor Documentation

◆ EnvelopeHandle() [1/3]

EnvelopeHandle::EnvelopeHandle ( const EnvelopeHandle )
privatedelete

◆ EnvelopeHandle() [2/3]

EnvelopeHandle::EnvelopeHandle ( Envelope pEnvelope)
explicit

Definition at line 33 of file EnvelopeHandle.cpp.

34 : mEnvelope{ pEnvelope }
35{
36}
Envelope * mEnvelope

◆ EnvelopeHandle() [3/3]

EnvelopeHandle::EnvelopeHandle ( EnvelopeHandle &&  )
default

◆ ~EnvelopeHandle()

EnvelopeHandle::~EnvelopeHandle ( )
virtual

Definition at line 45 of file EnvelopeHandle.cpp.

46{}

Member Function Documentation

◆ Cancel()

UIHandle::Result EnvelopeHandle::Cancel ( AudacityProject pProject)
overridevirtual

Implements UIHandle.

Definition at line 305 of file EnvelopeHandle.cpp.

306{
307 ProjectHistory::Get( *pProject ).RollbackState();
308 mEnvelopeEditors.clear();
310}
std::vector< std::unique_ptr< EnvelopeEditor > > mEnvelopeEditors
static ProjectHistory & Get(AudacityProject &project)

References ProjectHistory::Get(), mEnvelopeEditors, RefreshCode::RefreshCell, and ProjectHistory::RollbackState().

Referenced by Drag(), and Release().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Click()

UIHandle::Result EnvelopeHandle::Click ( const TrackPanelMouseEvent event,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 172 of file EnvelopeHandle.cpp.

174{
175 using namespace RefreshCode;
176 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
177 if ( unsafe )
178 return Cancelled;
179
180 const wxMouseEvent &event = evt.event;
181 const auto &viewInfo = ViewInfo::Get( *pProject );
182 const auto pView = std::static_pointer_cast<TrackView>(evt.pCell);
183 const auto pTrack = pView ? pView->FindTrack().get() : nullptr;
184
185 mEnvelopeEditors.clear();
186
187 unsigned result = Cancelled;
188 if (pTrack)
189 result = pTrack->TypeSwitch< decltype(RefreshNone) >(
190 [&](WaveTrack *wt) {
191 if (!mEnvelope)
192 return Cancelled;
193
195 auto &cache = WaveformScale::Get(*wt);
196 cache.GetDisplayBounds(mLower, mUpper);
198 auto channels = TrackList::Channels( wt );
199 for ( auto channel : channels ) {
200 if (channel == wt)
201 mEnvelopeEditors.push_back(
202 std::make_unique< EnvelopeEditor >( *mEnvelope, true ) );
203 else {
204 auto time =
205 viewInfo.PositionToTime(event.GetX(), evt.rect.GetX());
206 auto e2 = channel->GetEnvelopeAtTime(time);
207 if (e2)
208 mEnvelopeEditors.push_back(
209 std::make_unique< EnvelopeEditor >( *e2, true ) );
210 else {
211 // There isn't necessarily an envelope there; no guarantee a
212 // linked track has the same WaveClip structure...
213 }
214 }
215 }
216
217 return RefreshNone;
218 },
219 [&](TimeTrack *tt) {
220 if (!mEnvelope)
221 return Cancelled;
222 GetTimeTrackData( *pProject, *tt, mdBRange, mLog, mLower, mUpper);
223 mEnvelopeEditors.push_back(
224 std::make_unique< EnvelopeEditor >( *mEnvelope, false )
225 );
226
227 return RefreshNone;
228 },
229 [](Track *) {
230 return Cancelled;
231 }
232 );
233
234 if (result & Cancelled)
235 return result;
236
237 mRect = evt.rect;
238
239 const bool needUpdate = ForwardEventToEnvelopes(event, viewInfo);
240 return needUpdate ? RefreshCell : RefreshNone;
241}
bool ForwardEventToEnvelopes(const wxMouseEvent &event, const ViewInfo &viewInfo)
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
A kind of Track used to 'warp time'.
Definition: TimeTrack.h:22
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:226
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
Definition: Track.h:1544
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
A Track that contains audio waveform data.
Definition: WaveTrack.h:51
static WaveformScale & Get(const WaveTrack &track)
Mutative access to attachment even if the track argument is const.
bool isLinear() const
static WaveformSettings & Get(const WaveTrack &track)
Namespace containing an enum 'what to do on a refresh?'.
Definition: RefreshCode.h:16
void GetTimeTrackData(const AudacityProject &project, const TimeTrack &tt, double &dBRange, bool &dB, float &zoomMin, float &zoomMax)

References RefreshCode::Cancelled, TrackList::Channels(), WaveformSettings::dBRange, TrackPanelMouseEvent::event, ForwardEventToEnvelopes(), ProjectAudioIO::Get(), ViewInfo::Get(), WaveformSettings::Get(), WaveformScale::Get(), anonymous_namespace{EnvelopeHandle.cpp}::GetTimeTrackData(), ProjectAudioIO::IsAudioActive(), WaveformSettings::isLinear(), mdBRange, mEnvelope, mEnvelopeEditors, mLog, mLower, mRect, mUpper, TrackPanelMouseEvent::pCell, TrackPanelMouseEvent::rect, RefreshCode::RefreshCell, and RefreshCode::RefreshNone.

Here is the call graph for this function:

◆ Drag()

UIHandle::Result EnvelopeHandle::Drag ( const TrackPanelMouseEvent event,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 243 of file EnvelopeHandle.cpp.

245{
246 using namespace RefreshCode;
247 const wxMouseEvent &event = evt.event;
248 const auto &viewInfo = ViewInfo::Get( *pProject );
249 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
250 if (unsafe) {
251 this->Cancel(pProject);
252 return RefreshCell | Cancelled;
253 }
254
255 const bool needUpdate = ForwardEventToEnvelopes(event, viewInfo);
256 return needUpdate ? RefreshCell : RefreshNone;
257}
Result Cancel(AudacityProject *pProject) override

References Cancel(), RefreshCode::Cancelled, TrackPanelMouseEvent::event, ForwardEventToEnvelopes(), ProjectAudioIO::Get(), ViewInfo::Get(), ProjectAudioIO::IsAudioActive(), RefreshCode::RefreshCell, and RefreshCode::RefreshNone.

Here is the call graph for this function:

◆ Enter()

void EnvelopeHandle::Enter ( bool  forward,
AudacityProject  
)
overridevirtual

Reimplemented from UIHandle.

Definition at line 38 of file EnvelopeHandle.cpp.

39{
40#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
42#endif
43}
Result mChangeHighlight
Definition: UIHandle.h:139

References UIHandle::mChangeHighlight, and RefreshCode::RefreshCell.

◆ ForwardEventToEnvelopes()

bool EnvelopeHandle::ForwardEventToEnvelopes ( const wxMouseEvent &  event,
const ViewInfo viewInfo 
)
private

The Envelope class actually handles things at the mouse event level, so we have to forward the events over. Envelope will then tell us whether or not we need to redraw.

Definition at line 312 of file EnvelopeHandle.cpp.

314{
318
319 // AS: I'm not sure why we can't let the Envelope take care of
320 // redrawing itself. ?
321 bool needUpdate = false;
322 for (const auto &pEditor : mEnvelopeEditors) {
323 needUpdate =
324 pEditor->MouseEvent(
325 event, mRect, viewInfo, mLog, mdBRange, mLower, mUpper)
326 || needUpdate;
327 }
328
329 return needUpdate;
330}

References mdBRange, mEnvelopeEditors, mLog, mLower, mRect, and mUpper.

Referenced by Click(), Drag(), and Release().

Here is the caller graph for this function:

◆ GetEnvelope()

Envelope * EnvelopeHandle::GetEnvelope ( ) const
inline

Definition at line 59 of file EnvelopeHandle.h.

59{ return mEnvelope; }

Referenced by anonymous_namespace{WaveformView.cpp}::DrawClipWaveform(), anonymous_namespace{TimeTrackView.cpp}::DrawHorzRulerAndCurve(), and EnvelopeEditor::DrawPoints().

Here is the caller graph for this function:

◆ HitAnywhere()

UIHandlePtr EnvelopeHandle::HitAnywhere ( std::weak_ptr< EnvelopeHandle > &  holder,
Envelope envelope,
bool  timeTrack 
)
static

Definition at line 48 of file EnvelopeHandle.cpp.

50{
51 auto result = AssignUIHandlePtr(holder, std::make_shared<EnvelopeHandle>(envelope));
52 result->mTimeTrack = timeTrack;
53 return result;
54}
std::shared_ptr< Subclass > AssignUIHandlePtr(std::weak_ptr< Subclass > &holder, const std::shared_ptr< Subclass > &pNew)
Definition: UIHandle.h:151

References AssignUIHandlePtr().

Referenced by WaveformView::DetailedHitTest(), and HitEnvelope().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HitEnvelope()

UIHandlePtr EnvelopeHandle::HitEnvelope ( std::weak_ptr< EnvelopeHandle > &  holder,
const wxMouseState &  state,
const wxRect &  rect,
const AudacityProject pProject,
Envelope envelope,
float  zoomMin,
float  zoomMax,
bool  dB,
float  dBRange,
bool  timeTrack 
)
staticprivate

Definition at line 117 of file EnvelopeHandle.cpp.

122{
123 const auto &viewInfo = ViewInfo::Get( *pProject );
124
125 const double envValue =
126 envelope->GetValue(viewInfo.PositionToTime(state.m_x, rect.x));
127
128 // Get y position of envelope point.
129 int yValue = GetWaveYPos(envValue,
130 zoomMin, zoomMax,
131 rect.height, dB, true, dBRange, false) + rect.y;
132
133 // Get y position of center line
134 int ctr = GetWaveYPos(0.0,
135 zoomMin, zoomMax,
136 rect.height, dB, true, dBRange, false) + rect.y;
137
138 // Get y distance of mouse from center line (in pixels).
139 int yMouse = abs(ctr - state.m_y);
140 // Get y distance of envelope from center line (in pixels)
141 yValue = abs(ctr - yValue);
142
143 // JKC: It happens that the envelope is actually drawn offset from its
144 // 'true' position (it is 3 pixels wide). yMisalign is really a fudge
145 // factor to allow us to hit it exactly, but I wouldn't dream of
146 // calling it yFudgeFactor :)
147 const int yMisalign = 2;
148 // Perhaps yTolerance should be put into preferences?
149 const int yTolerance = 5; // how far from envelope we may be and count as a hit.
150 int distance;
151
152 // For amplification using the envelope we introduced the idea of contours.
153 // The contours have the same shape as the envelope, which may be partially off-screen.
154 // The contours are closer in to the center line.
155 // Beware very short rectangles! Make this at least 1
156 int ContourSpacing = std::max(1,
157 static_cast<int>(rect.height / (2 * (zoomMax - zoomMin))));
158 const int MaxContours = 2;
159
160 // Adding ContourSpacing/2 selects a region either side of the contour.
161 int yDisplace = yValue - yMisalign - yMouse + ContourSpacing / 2;
162 if (yDisplace > (MaxContours * ContourSpacing))
163 return {};
164 // Subtracting the ContourSpacing/2 we added earlier ensures distance is centred on the contour.
165 distance = abs((yDisplace % ContourSpacing) - ContourSpacing / 2);
166 if (distance >= yTolerance)
167 return {};
168
169 return HitAnywhere(holder, envelope, timeTrack);
170}
int GetWaveYPos(float value, float min, float max, int height, bool dB, bool outer, float dBr, bool clip)
Definition: TrackArt.cpp:46
static UIHandlePtr HitAnywhere(std::weak_ptr< EnvelopeHandle > &holder, Envelope *envelope, bool timeTrack)
double GetValue(double t, double sampleDur=0) const
Get envelope value at time t.
Definition: Envelope.cpp:828

References ViewInfo::Get(), Envelope::GetValue(), GetWaveYPos(), and HitAnywhere().

Referenced by TimeTrackHitTest(), and WaveTrackHitTest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=() [1/2]

EnvelopeHandle & EnvelopeHandle::operator= ( const EnvelopeHandle )
privatedelete

◆ operator=() [2/2]

EnvelopeHandle & EnvelopeHandle::operator= ( EnvelopeHandle &&  )
default

◆ Preview()

HitTestPreview EnvelopeHandle::Preview ( const TrackPanelMouseState state,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 259 of file EnvelopeHandle.cpp.

261{
262 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
263 static auto disabledCursor =
264 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
265 static auto envelopeCursor =
266 ::MakeCursor(wxCURSOR_ARROW, EnvCursorXpm, 16, 16);
267
268 auto message = mTimeTrack
269 ? XO("Click and drag to warp playback time")
270 : XO("Click and drag to edit the amplitude envelope");
271
272 return {
273 message,
274 (unsafe
275 ? &*disabledCursor
276 : &*envelopeCursor)
277 };
278}
XO("Cut/Copy/Paste")
std::unique_ptr< wxCursor > MakeCursor(int WXUNUSED(CursorId), const char *const pXpm[36], int HotX, int HotY)
Definition: TrackPanel.cpp:186

References ProjectAudioIO::Get(), ProjectAudioIO::IsAudioActive(), MakeCursor(), mTimeTrack, and XO().

Here is the call graph for this function:

◆ Release()

UIHandle::Result EnvelopeHandle::Release ( const TrackPanelMouseEvent event,
AudacityProject pProject,
wxWindow *  pParent 
)
overridevirtual

Implements UIHandle.

Definition at line 280 of file EnvelopeHandle.cpp.

283{
284 const wxMouseEvent &event = evt.event;
285 const auto &viewInfo = ViewInfo::Get( *pProject );
286 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
287 if (unsafe)
288 return this->Cancel(pProject);
289
290 const bool needUpdate = ForwardEventToEnvelopes(event, viewInfo);
291
292 ProjectHistory::Get( *pProject ).PushState(
293 /* i18n-hint: (verb) Audacity has just adjusted the envelope .*/
294 XO("Adjusted envelope."),
295 /* i18n-hint: The envelope is a curve that controls the audio loudness.*/
296 XO("Envelope")
297 );
298
299 mEnvelopeEditors.clear();
300
301 using namespace RefreshCode;
302 return needUpdate ? RefreshCell : RefreshNone;
303}
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)

References Cancel(), TrackPanelMouseEvent::event, ForwardEventToEnvelopes(), ProjectAudioIO::Get(), ProjectHistory::Get(), ViewInfo::Get(), ProjectAudioIO::IsAudioActive(), mEnvelopeEditors, ProjectHistory::PushState(), RefreshCode::RefreshCell, RefreshCode::RefreshNone, and XO().

Here is the call graph for this function:

◆ StopsOnKeystroke()

bool EnvelopeHandle::StopsOnKeystroke ( )
inlineoverridevirtual

Reimplemented from UIHandle.

Definition at line 79 of file EnvelopeHandle.h.

79{ return true; }

◆ TimeTrackHitTest()

UIHandlePtr EnvelopeHandle::TimeTrackHitTest ( std::weak_ptr< EnvelopeHandle > &  holder,
const wxMouseState &  state,
const wxRect &  rect,
const AudacityProject pProject,
const std::shared_ptr< TimeTrack > &  tt 
)
static

Definition at line 73 of file EnvelopeHandle.cpp.

77{
78 auto envelope = tt->GetEnvelope();
79 if (!envelope)
80 return {};
81 bool dB;
82 double dBRange;
83 float zoomMin, zoomMax;
84 GetTimeTrackData( *pProject, *tt, dBRange, dB, zoomMin, zoomMax);
86 (holder, state, rect, pProject, envelope, zoomMin, zoomMax, dB, dBRange,
87 true);
88}
static UIHandlePtr HitEnvelope(std::weak_ptr< EnvelopeHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, Envelope *envelope, float zoomMin, float zoomMax, bool dB, float dBRange, bool timeTrack)

References anonymous_namespace{EnvelopeHandle.cpp}::GetTimeTrackData(), and HitEnvelope().

Referenced by TimeTrackView::DetailedHitTest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ WaveTrackHitTest()

UIHandlePtr EnvelopeHandle::WaveTrackHitTest ( std::weak_ptr< EnvelopeHandle > &  holder,
const wxMouseState &  state,
const wxRect &  rect,
const AudacityProject pProject,
const std::shared_ptr< WaveTrack > &  wt 
)
static

method that tells us if the mouse event landed on an envelope boundary.

Definition at line 90 of file EnvelopeHandle.cpp.

94{
97 auto &viewInfo = ViewInfo::Get(*pProject);
98 auto time = viewInfo.PositionToTime(state.m_x, rect.GetX());
99 Envelope *const envelope = wt->GetEnvelopeAtTime(time);
100
101 if (!envelope)
102 return {};
103
104 // Get envelope point, range 0.0 to 1.0
105 const bool dB = !WaveformSettings::Get(*wt).isLinear();
106
107 float zoomMin, zoomMax;
108 auto &cache = WaveformScale::Get(*wt);
109 cache.GetDisplayBounds(zoomMin, zoomMax);
110
111 const float dBRange = WaveformSettings::Get(*wt).dBRange;
112
114 (holder, state, rect, pProject, envelope, zoomMin, zoomMax, dB, dBRange, false);
115}
Piecewise linear or piecewise exponential function from double to double.
Definition: Envelope.h:72

References WaveformSettings::dBRange, ViewInfo::Get(), WaveformSettings::Get(), WaveformScale::Get(), HitEnvelope(), and WaveformSettings::isLinear().

Referenced by WaveformView::DetailedHitTest().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mdBRange

double EnvelopeHandle::mdBRange {}
private

Definition at line 88 of file EnvelopeHandle.h.

Referenced by Click(), and ForwardEventToEnvelopes().

◆ mEnvelope

Envelope* EnvelopeHandle::mEnvelope {}
private

Definition at line 90 of file EnvelopeHandle.h.

Referenced by Click().

◆ mEnvelopeEditors

std::vector< std::unique_ptr<EnvelopeEditor> > EnvelopeHandle::mEnvelopeEditors
private

Definition at line 91 of file EnvelopeHandle.h.

Referenced by Cancel(), Click(), ForwardEventToEnvelopes(), and Release().

◆ mLog

bool EnvelopeHandle::mLog {}
private

Definition at line 86 of file EnvelopeHandle.h.

Referenced by Click(), and ForwardEventToEnvelopes().

◆ mLower

float EnvelopeHandle::mLower {}
private

Definition at line 87 of file EnvelopeHandle.h.

Referenced by Click(), and ForwardEventToEnvelopes().

◆ mRect

wxRect EnvelopeHandle::mRect {}
private

Definition at line 85 of file EnvelopeHandle.h.

Referenced by Click(), and ForwardEventToEnvelopes().

◆ mTimeTrack

bool EnvelopeHandle::mTimeTrack {}
private

Definition at line 93 of file EnvelopeHandle.h.

Referenced by Preview().

◆ mUpper

float EnvelopeHandle::mUpper {}
private

Definition at line 87 of file EnvelopeHandle.h.

Referenced by Click(), and ForwardEventToEnvelopes().


The documentation for this class was generated from the following files: