18#include "../../../../HitTestResult.h"
19#include "../../../../prefs/WaveformSettings.h"
22#include "../../../../RefreshCode.h"
23#include "../../../../TrackArt.h"
24#include "../../../../TrackArtist.h"
25#include "../../../../TrackPanelMouseEvent.h"
29#include "../../../../../images/Cursors.h"
39 : mClickedTrack{ pTrack }
45#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
51(
const wxMouseState &state,
const AudacityProject *WXUNUSED(pProject),
bool unsafe)
53 static auto disabledCursor =
54 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
55 static wxCursor smoothCursor{ wxCURSOR_SPRAYCAN };
56 static auto pencilCursor =
61 auto message =
XO(
"Click and drag to edit the samples");
74(std::weak_ptr<SampleHandle> &holder,
75 const wxMouseState &WXUNUSED(state),
const std::shared_ptr<WaveTrack> &pTrack)
77 auto result = std::make_shared<SampleHandle>( pTrack );
95 const auto xx = std::max<ZoomInfo::int64>(0, viewInfo.
TimeToPosition(time));
97 const double rate = wt->
GetRate();
99 ZoomInfo::Intervals::const_iterator it = intervals.begin(),
100 end = intervals.end(), prev;
101 wxASSERT(it !=
end && it->position == 0);
104 while (it !=
end && it->position <= xx);
105 const double threshold = 3 * rate;
107 return prev->averageZoom > threshold;
112(std::weak_ptr<SampleHandle> &holder,
113 const wxMouseState &state,
const wxRect &rect,
114 const AudacityProject *pProject,
const std::shared_ptr<WaveTrack> &pTrack)
120 const auto wavetrack = pTrack.get();
121 const auto time = viewInfo.PositionToTime(state.m_x, rect.x);
123 const double tt =
adjustTime(wavetrack, time);
129 const double rate = wavetrack->GetRate();
131 if (! wavetrack->GetFloats(&oneSample, s0, 1,
fillZero,
138 float zoomMin, zoomMax;
139 cache.GetDisplayBounds(zoomMin, zoomMax);
141 double envValue = 1.0;
142 Envelope* env = wavetrack->GetEnvelopeAtTime(time);
145 envValue = env->
GetValue( tt, 1.0 / wavetrack->GetRate() );
148 const bool dB = !
settings.isLinear();
151 rect.height, dB,
true,
155 int yMouse = state.m_y;
158 const int yTolerance = 10;
159 if (abs(yValue - yMouse) >= yTolerance)
174 (
const wxMouseEvent &event,
183"To use Draw, zoom in further until you can see the individual samples."),
199 const wxMouseEvent &
event = evt.
event;
200 const wxRect &rect = evt.
rect;
206 event, rect, viewInfo, pTrack, rect.width))
239 Floats sampleRegion{ sampleRegionSize };
249 float sumOfSamples = 0;
330 const wxMouseEvent &
event = evt.
event;
354 if (event.m_controlDown) {
368 const double tt = viewInfo.PositionToTime(event.m_x,
mRect.x);
385 const auto size = (
end - start + 1 ).as_size_t();
393 for (
auto ii = start; ii <=
end; ++ii) {
396 values[( ii - start ).as_size_t()] =
426 return this->
Cancel(pProject);
449 (
const wxMouseEvent &event,
const ViewInfo &viewInfo,
double t0)
452 float zoomMin, zoomMax;
454 cache.GetDisplayBounds(zoomMin, zoomMax);
456 const int yy =
event.m_y -
mRect.y;
457 const int height =
mRect.GetHeight();
459 const bool dB = !
settings.isLinear();
462 settings.dBRange, zoomMin, zoomMax);
472 newLevel /= envValue;
477 newLevel = std::max(-1.0f,
std::min(1.0f, newLevel));
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
std::shared_ptr< UIHandle > UIHandlePtr
static const int SMOOTHING_BRUSH_RADIUS
static const double SMOOTHING_PROPORTION_MAX
static const int SMOOTHING_KERNEL_RADIUS
static const double SMOOTHING_PROPORTION_MIN
int GetWaveYPos(float value, float min, float max, int height, bool dB, bool outer, float dBr, bool clip)
float ValueOfPixel(int yy, int height, bool offset, bool dB, double dBRange, float zoomMin, float zoomMax)
static Settings & settings()
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...
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)
Result Release(const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
float FindSampleEditingLevel(const wxMouseEvent &event, const ViewInfo &viewInfo, double t0)
float mLastDragSampleValue
sampleCount mClickedStartSample
Result Cancel(AudacityProject *pProject) override
static HitTestPreview HitPreview(const wxMouseState &state, const AudacityProject *pProject, bool unsafe)
static UIHandlePtr HitAnywhere(std::weak_ptr< SampleHandle > &holder, const wxMouseState &state, const std::shared_ptr< WaveTrack > &pTrack)
void Enter(bool forward, AudacityProject *) override
sampleCount mLastDragSample
static UIHandlePtr HitTest(std::weak_ptr< SampleHandle > &holder, const wxMouseState &state, const wxRect &rect, const AudacityProject *pProject, const std::shared_ptr< WaveTrack > &pTrack)
Result Click(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
std::shared_ptr< WaveTrack > mClickedTrack
HitTestPreview Preview(const TrackPanelMouseState &state, AudacityProject *pProject) override
Result Drag(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
SampleHandle(const SampleHandle &)=delete
double LongSamplesToTime(sampleCount pos) const
Convert correctly between a number of samples and an (absolute) time in seconds.
sampleCount TimeToLongSamples(double t0) const
Convert correctly between an (absolute) time in seconds and a number of samples.
static ViewInfo & Get(AudacityProject &project)
A Track that contains audio waveform data.
double GetRate() const override
double PositionToTime(int64 position, int64 origin=0, bool ignoreFisheye=false) const
void FindIntervals(double rate, Intervals &results, int64 width, int64 origin=0) const
std::vector< Interval > Intervals
int64 TimeToPosition(double time, int64 origin=0, bool ignoreFisheye=false) const
STM: Converts a project time to screen x position.
Positions or offsets within audio files need a wide type.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Namespace containing an enum 'what to do on a refresh?'.
bool SampleResolutionTest(const ViewInfo &viewInfo, const WaveTrack *wt, double time, int width)
double adjustTime(const WaveTrack *wt, double time)
bool IsSampleEditingPossible(const wxMouseEvent &event, const wxRect &rect, const ViewInfo &viewInfo, WaveTrack *wt, int width)