17#include "../../EnvelopeEditor.h"
18#include "../../HitTestResult.h"
19#include "../../prefs/WaveformSettings.h"
20#include "../../ProjectAudioIO.h"
22#include "../../RefreshCode.h"
23#include "../../TimeTrack.h"
24#include "../../TrackArt.h"
25#include "../../TrackPanelMouseEvent.h"
27#include "../../WaveTrack.h"
28#include "../../../images/Cursors.h"
33 : mEnvelope{ pEnvelope }
39#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
48(std::weak_ptr<EnvelopeHandle> &holder,
Envelope *envelope,
bool timeTrack)
50 auto result =
AssignUIHandlePtr(holder, std::make_shared<EnvelopeHandle>(envelope));
51 result->mTimeTrack = timeTrack;
58 double &dBRange,
bool &dB,
float &zoomMin,
float &zoomMax)
61 dBRange = viewInfo.dBr;
66 zoomMin =
LINEAR_TO_DB(std::max(1.0e-7,
double(zoomMin))) / dBRange + 1.0;
67 zoomMax =
LINEAR_TO_DB(std::max(1.0e-7,
double(zoomMax))) / dBRange + 1.0;
73(std::weak_ptr<EnvelopeHandle> &holder,
74 const wxMouseState &state,
const wxRect &rect,
77 auto envelope = tt->GetEnvelope();
82 float zoomMin, zoomMax;
85 (holder, state, rect, pProject, envelope, zoomMin, zoomMax, dB, dBRange,
90(std::weak_ptr<EnvelopeHandle> &holder,
91 const wxMouseState &state,
const wxRect &rect,
97 auto time = viewInfo.PositionToTime(state.m_x, rect.GetX());
98 Envelope *
const envelope = wt->GetEnvelopeAtTime(time);
104 const bool dB = !wt->GetWaveformSettings().isLinear();
106 float zoomMin, zoomMax;
107 wt->GetDisplayBounds(&zoomMin, &zoomMax);
109 const float dBRange = wt->GetWaveformSettings().dBRange;
112 (holder, state, rect, pProject, envelope, zoomMin, zoomMax, dB, dBRange,
false);
116(std::weak_ptr<EnvelopeHandle> &holder,
117 const wxMouseState &state,
const wxRect &rect,
const AudacityProject *pProject,
118 Envelope *envelope,
float zoomMin,
float zoomMax,
119 bool dB,
float dBRange,
bool timeTrack)
123 const double envValue =
124 envelope->
GetValue(viewInfo.PositionToTime(state.m_x, rect.x));
129 rect.height, dB,
true, dBRange,
false) + rect.y;
134 rect.height, dB,
true, dBRange,
false) + rect.y;
137 int yMouse = abs(ctr - state.m_y);
139 yValue = abs(ctr - yValue);
145 const int yMisalign = 2;
147 const int yTolerance = 5;
154 int ContourSpacing = std::max(1,
155 static_cast<int>(rect.height / (2 * (zoomMax - zoomMin))));
156 const int MaxContours = 2;
159 int yDisplace = yValue - yMisalign - yMouse + ContourSpacing / 2;
160 if (yDisplace > (MaxContours * ContourSpacing))
163 distance = abs((yDisplace % ContourSpacing) - ContourSpacing / 2);
164 if (distance >= yTolerance)
178 const wxMouseEvent &
event = evt.
event;
180 const auto pView = std::static_pointer_cast<TrackView>(evt.
pCell);
181 const auto pTrack = pView ? pView->FindTrack().get() :
nullptr;
187 result = pTrack->TypeSwitch<
decltype(
RefreshNone) >(
196 for (
auto channel : channels ) {
199 std::make_unique< EnvelopeEditor >( *
mEnvelope,
true ) );
202 viewInfo.PositionToTime(event.GetX(), evt.
rect.GetX());
203 auto e2 = channel->GetEnvelopeAtTime(time);
206 std::make_unique< EnvelopeEditor >( *e2,
true ) );
221 std::make_unique< EnvelopeEditor >( *
mEnvelope,
false )
244 const wxMouseEvent &
event = evt.
event;
260 static auto disabledCursor =
261 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
262 static auto envelopeCursor =
266 ?
XO(
"Click and drag to warp playback time")
267 :
XO(
"Click and drag to edit the amplitude envelope");
281 const wxMouseEvent &
event = evt.
event;
285 return this->
Cancel(pProject);
291 XO(
"Adjusted envelope."),
310 (
const wxMouseEvent &event,
const ViewInfo &viewInfo)
318 bool needUpdate =
false;
std::shared_ptr< UIHandle > UIHandlePtr
int GetWaveYPos(float value, float min, float max, int height, bool dB, bool outer, float dBr, bool clip)
std::unique_ptr< wxCursor > MakeCursor(int WXUNUSED(CursorId), const char *const pXpm[36], int HotX, int HotY)
std::shared_ptr< Subclass > AssignUIHandlePtr(std::weak_ptr< Subclass > &holder, const std::shared_ptr< Subclass > &pNew)
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
std::vector< std::unique_ptr< EnvelopeEditor > > mEnvelopeEditors
static UIHandlePtr WaveTrackHitTest(std::weak_ptr< EnvelopeHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, const std::shared_ptr< WaveTrack > &wt)
virtual ~EnvelopeHandle()
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 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)
static UIHandlePtr HitAnywhere(std::weak_ptr< EnvelopeHandle > &holder, Envelope *envelope, bool timeTrack)
Result Drag(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
Result Click(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
HitTestPreview Preview(const TrackPanelMouseState &state, AudacityProject *pProject) override
bool ForwardEventToEnvelopes(const wxMouseEvent &event, const ViewInfo &viewInfo)
Result Cancel(AudacityProject *pProject) override
EnvelopeHandle(const EnvelopeHandle &)=delete
void Enter(bool forward, AudacityProject *) override
Result Release(const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
Piecewise linear or piecewise exponential function from double to double.
double GetValue(double t, double sampleDur=0) const
Get envelope value at time t.
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
static ProjectHistory & Get(AudacityProject &project)
A kind of Track used to 'warp time'.
bool GetDisplayLog() const
double GetRangeLower() const
double GetRangeUpper() const
Abstract base class for an object holding data associated with points on a time axis.
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
static ViewInfo & Get(AudacityProject &project)
A Track that contains audio waveform data.
void GetDisplayBounds(float *min, float *max) const
const WaveformSettings & GetWaveformSettings() const
Namespace containing an enum 'what to do on a refresh?'.
void GetTimeTrackData(const AudacityProject &project, const TimeTrack &tt, double &dBRange, bool &dB, float &zoomMin, float &zoomMax)
std::shared_ptr< TrackPanelCell > pCell