18#include "../../EnvelopeEditor.h"
19#include "../../HitTestResult.h"
20#include "../../prefs/WaveformSettings.h"
23#include "../../RefreshCode.h"
25#include "../../TrackArt.h"
26#include "../../TrackPanelMouseEvent.h"
29#include "../../../images/Cursors.h"
34 std::weak_ptr<const Channel> wChannel
35) : mEnvelope{ pEnvelope }
36 , mwChannel{ move(wChannel) }
42#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
56 Envelope *envelope, std::weak_ptr<const Channel> wChannel,
bool timeTrack)
59 std::make_shared<EnvelopeHandle>(envelope, move(wChannel)));
60 result->mTimeTrack = timeTrack;
67 double &dBRange,
bool &dB,
float &zoomMin,
float &zoomMax)
75 zoomMin =
LINEAR_TO_DB(std::max(1.0e-7,
double(zoomMin))) / dBRange + 1.0;
76 zoomMax =
LINEAR_TO_DB(std::max(1.0e-7,
double(zoomMax))) / dBRange + 1.0;
82 std::weak_ptr<EnvelopeHandle> &holder,
83 const wxMouseState &state,
const wxRect &rect,
86 auto envelope = tt->GetEnvelope();
91 float zoomMin, zoomMax;
94 std::dynamic_pointer_cast<const Channel>(tt),
95 zoomMin, zoomMax, dB, dBRange,
true);
99(std::weak_ptr<EnvelopeHandle> &holder,
100 const wxMouseState &state,
const wxRect &rect,
106 auto time = viewInfo.PositionToTime(state.m_x, rect.GetX());
107 Envelope *
const envelope = wt->GetEnvelopeAtTime(time);
115 float zoomMin, zoomMax;
117 cache.GetDisplayBounds(zoomMin, zoomMax);
122 std::dynamic_pointer_cast<const Channel>(wt),
123 zoomMin, zoomMax, dB, dBRange,
false);
127 const wxMouseState &state,
const wxRect &rect,
129 Envelope *envelope, std::weak_ptr<const Channel> wChannel,
130 float zoomMin,
float zoomMax,
131 bool dB,
float dBRange,
bool timeTrack)
135 const double envValue =
136 envelope->
GetValue(viewInfo.PositionToTime(state.m_x, rect.x));
141 rect.height, dB,
true, dBRange,
false) + rect.y;
146 rect.height, dB,
true, dBRange,
false) + rect.y;
149 int yMouse = abs(ctr - state.m_y);
151 yValue = abs(ctr - yValue);
157 const int yMisalign = 2;
159 const int yTolerance = 5;
166 int ContourSpacing = std::max(1,
167 static_cast<int>(rect.height / (2 * (zoomMax - zoomMin))));
168 const int MaxContours = 2;
171 int yDisplace = yValue - yMisalign - yMouse + ContourSpacing / 2;
172 if (yDisplace > (MaxContours * ContourSpacing))
175 distance = abs((yDisplace % ContourSpacing) - ContourSpacing / 2);
176 if (distance >= yTolerance)
179 return HitAnywhere(holder, envelope, move(wChannel), timeTrack);
190 const wxMouseEvent &
event = evt.
event;
192 const auto pView = std::static_pointer_cast<ChannelView>(evt.
pCell);
193 const auto pTrack = pView ? pView->FindTrack().get() :
nullptr;
199 result = pTrack->TypeSwitch<
decltype(
RefreshNone) >(
237 const wxMouseEvent &
event = evt.
event;
253 static auto disabledCursor =
254 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
255 static auto envelopeCursor =
259 ?
XO(
"Click and drag to warp playback time")
260 :
XO(
"Click and drag to edit the amplitude envelope");
274 const wxMouseEvent &
event = evt.
event;
278 return this->
Cancel(pProject);
284 XO(
"Adjusted envelope."),
303 (
const wxMouseEvent &event,
const ViewInfo &viewInfo)
std::shared_ptr< UIHandle > UIHandlePtr
IntSetting DecibelScaleCutoff
Negation of this value is the lowest dB level that should be shown in dB scales.
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...
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)
std::unique_ptr< EnvelopeEditor > mpEnvelopeEditor
Result Drag(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
Result Click(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
std::weak_ptr< const Channel > mwChannel
HitTestPreview Preview(const TrackPanelMouseState &state, AudacityProject *pProject) override
std::shared_ptr< const Channel > FindChannel() const override
bool ForwardEventToEnvelopes(const wxMouseEvent &event, const ViewInfo &viewInfo)
Result Cancel(AudacityProject *pProject) override
EnvelopeHandle(const EnvelopeHandle &)=delete
void Enter(bool forward, AudacityProject *) override
static UIHandlePtr HitEnvelope(std::weak_ptr< EnvelopeHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, Envelope *envelope, std::weak_ptr< const Channel > wChannel, float zoomMin, float zoomMax, bool dB, float dBRange, bool timeTrack)
static UIHandlePtr HitAnywhere(std::weak_ptr< EnvelopeHandle > &holder, Envelope *envelope, std::weak_ptr< const Channel > wChannel, bool timeTrack)
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)
bool Read(T *pVar) const
overload of Read returning a boolean that is true if the value was previously defined */
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 ViewInfo & Get(AudacityProject &project)
A Track that contains audio waveform data.
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