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::unique_ptr< EnvelopeEditormpEnvelopeEditor
 
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 285 of file EnvelopeHandle.cpp.

286{
287 ProjectHistory::Get( *pProject ).RollbackState();
288 mpEnvelopeEditor.reset();
290}
std::unique_ptr< EnvelopeEditor > mpEnvelopeEditor
static ProjectHistory & Get(AudacityProject &project)

References ProjectHistory::Get(), mpEnvelopeEditor, 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<ChannelView>(evt.pCell);
183 const auto pTrack = pView ? pView->FindTrack().get() : nullptr;
184
185 mpEnvelopeEditor.reset();
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 mpEnvelopeEditor = std::make_unique<EnvelopeEditor>(*mEnvelope, true);
199 return RefreshNone;
200 },
201 [&](TimeTrack &tt) {
202 if (!mEnvelope)
203 return Cancelled;
204 GetTimeTrackData( *pProject, tt, mdBRange, mLog, mLower, mUpper);
205 mpEnvelopeEditor = std::make_unique<EnvelopeEditor>(*mEnvelope, false);
206
207 return RefreshNone;
208 },
209 [](Track &) {
210 return Cancelled;
211 }
212 );
213
214 if (result & Cancelled)
215 return result;
216
217 mRect = evt.rect;
218
219 const bool needUpdate = ForwardEventToEnvelopes(event, viewInfo);
220 return needUpdate ? RefreshCell : RefreshNone;
221}
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:24
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:123
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
A Track that contains audio waveform data.
Definition: WaveTrack.h:220
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 Cancelled, WaveformSettings::dBRange, TrackPanelMouseEvent::event, ForwardEventToEnvelopes(), ProjectAudioIO::Get(), ViewInfo::Get(), WaveformSettings::Get(), WaveformScale::Get(), anonymous_namespace{EnvelopeHandle.cpp}::GetTimeTrackData(), ProjectAudioIO::IsAudioActive(), WaveformSettings::isLinear(), mdBRange, mEnvelope, mLog, mLower, mpEnvelopeEditor, 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 223 of file EnvelopeHandle.cpp.

225{
226 using namespace RefreshCode;
227 const wxMouseEvent &event = evt.event;
228 const auto &viewInfo = ViewInfo::Get( *pProject );
229 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
230 if (unsafe) {
231 this->Cancel(pProject);
232 return RefreshCell | Cancelled;
233 }
234
235 const bool needUpdate = ForwardEventToEnvelopes(event, viewInfo);
236 return needUpdate ? RefreshCell : RefreshNone;
237}
Result Cancel(AudacityProject *pProject) override

References Cancel(), 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 292 of file EnvelopeHandle.cpp.

294{
298
299 // AS: I'm not sure why we can't let the Envelope take care of
300 // redrawing itself. ?
301 return mpEnvelopeEditor && mpEnvelopeEditor->MouseEvent(
302 event, mRect, viewInfo, mLog, mdBRange, mLower, mUpper);
303}

References mdBRange, mLog, mLower, mpEnvelopeEditor, 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:59
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:837

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 239 of file EnvelopeHandle.cpp.

241{
242 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
243 static auto disabledCursor =
244 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
245 static auto envelopeCursor =
246 ::MakeCursor(wxCURSOR_ARROW, EnvCursorXpm, 16, 16);
247
248 auto message = mTimeTrack
249 ? XO("Click and drag to warp playback time")
250 : XO("Click and drag to edit the amplitude envelope");
251
252 return {
253 message,
254 (unsafe
255 ? &*disabledCursor
256 : &*envelopeCursor)
257 };
258}
XO("Cut/Copy/Paste")
std::unique_ptr< wxCursor > MakeCursor(int WXUNUSED(CursorId), const char *const pXpm[36], int HotX, int HotY)
Definition: TrackPanel.cpp:187

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 260 of file EnvelopeHandle.cpp.

263{
264 const wxMouseEvent &event = evt.event;
265 const auto &viewInfo = ViewInfo::Get( *pProject );
266 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
267 if (unsafe)
268 return this->Cancel(pProject);
269
270 const bool needUpdate = ForwardEventToEnvelopes(event, viewInfo);
271
272 ProjectHistory::Get( *pProject ).PushState(
273 /* i18n-hint: (verb) Audacity has just adjusted the envelope .*/
274 XO("Adjusted envelope."),
275 /* i18n-hint: The envelope is a curve that controls the audio loudness.*/
276 XO("Envelope")
277 );
278
279 mpEnvelopeEditor.reset();
280
281 using namespace RefreshCode;
282 return needUpdate ? RefreshCell : RefreshNone;
283}
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)

References Cancel(), TrackPanelMouseEvent::event, ForwardEventToEnvelopes(), ProjectAudioIO::Get(), ProjectHistory::Get(), ViewInfo::Get(), ProjectAudioIO::IsAudioActive(), mpEnvelopeEditor, 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().

◆ 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().

◆ mpEnvelopeEditor

std::unique_ptr<EnvelopeEditor> EnvelopeHandle::mpEnvelopeEditor
private

Definition at line 91 of file EnvelopeHandle.h.

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

◆ 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: