17#include "../../../../TrackArt.h"
18#include "../../../../TrackArtist.h"
20#include "../../../../TrackPanelDrawingContext.h"
21#include "../../../../../images/Cursors.h"
66 virtual std::shared_ptr<Track>
FindTrack()
const = 0;
76 const wxRect &panelRect,
85 bool adjustingLeftBorder,
88 if (!adjustingLeftBorder)
93 return prevInterval ? prevInterval->End() :
94 std::numeric_limits<double>::lowest();
96 return std::max(interval.
GetClip(0)->GetSequenceStartTime(),
98 return interval.
GetClip(0)->GetSequenceStartTime();
105 if (adjustingLeftBorder)
106 return interval.
End() - 1.0 / track.
GetRate();
110 return nextInterval ? nextInterval->Start() :
111 std::numeric_limits<double>::max();
115 nextInterval->Start());
116 return interval.
GetClip(0)->GetSequenceEndTime();
149 const std::pair<double, double> range)
153 auto addSnapPoint = [&](
double t,
const Track* track)
155 if(t > range.second || t < range.first)
158 for(
const auto& snapPoint : result)
161 result.emplace_back(t, track);
164 if(
const auto trackList = currentTrack->
GetOwner())
166 for(
const auto track : as_const(*trackList))
168 if(track == currentTrack)
174 for(
const auto& interval : track->Intervals())
176 addSnapPoint(interval->Start(), track);
177 if(interval->Start() != interval->End())
178 addSnapPoint(interval->End(), track);
187 std::shared_ptr<WaveTrack> track,
188 std::shared_ptr<WaveTrack::Interval> interval,
189 bool adjustLeftBorder,
204 if(
const auto trackList =
mTrack->GetOwner())
207 *trackList->GetOwner(),
220 if (event.
event.LeftDown())
230 const auto eventX =
event.event.GetX();
235 const auto eventT = viewInfo.PositionToTime(
298 auto &dc = context.
dc;
313 static auto disabledCursor =
314 MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
315 static auto trimCursorLeft =
316 MakeCursor(wxCURSOR_SIZEWE, ClipTrimLeftXpm , 16, 16);
317 static auto trimCursorRight =
318 MakeCursor(wxCURSOR_SIZEWE, ClipTrimRightXpm, 16, 16);
319 auto message =
XO(
"Click and drag to move clip boundary in time");
325 : &*(isLeftBorder ? trimCursorLeft : trimCursorRight))
331 static auto disabledCursor =
332 MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
333 static auto stretchCursorLeft =
334 MakeCursor(wxCURSOR_SIZEWE, ClipStretchLeftXpm, 16, 16);
335 static auto stretchCursorRight =
336 MakeCursor(wxCURSOR_SIZEWE, ClipStretchRightXpm, 16, 16);
337 auto message =
XO(
"Click and drag to stretch clip");
343 : &*(isLeftBorder ? stretchCursorLeft : stretchCursorRight))
348 std::unique_ptr<AdjustPolicy>& adjustPolicy,
349 std::shared_ptr<const WaveTrack> pTrack,
352 : mAdjustPolicy{
std::move(adjustPolicy) }
353 , mpTrack{ move(pTrack) }
354 , mIsStretchMode{stretchMode}
355 , mIsLeftBorder{leftBorder}
379 std::weak_ptr<WaveClipAdjustBorderHandle>& holder,
380 const std::shared_ptr<WaveTrack>& waveTrack,
384 assert(waveTrack->IsLeader());
386 const auto rect = state.
rect;
388 const auto px = state.
state.m_x;
392 std::shared_ptr<WaveTrack::Interval> leftInterval;
393 std::shared_ptr<WaveTrack::Interval> rightInterval;
398 for(
const auto& interval : waveTrack->Intervals())
400 const auto& clip = *interval->GetClip(0);
406 rightInterval = interval;
408 leftInterval = interval;
411 std::shared_ptr<WaveTrack::Interval> adjustedInterval;
412 bool adjustLeftBorder {
false};
413 if (leftInterval && rightInterval)
418 adjustedInterval = leftInterval;
419 adjustLeftBorder =
false;
423 adjustedInterval = rightInterval;
424 adjustLeftBorder =
true;
429 adjustedInterval = leftInterval ? leftInterval : rightInterval;
430 if (adjustedInterval)
437 adjustLeftBorder =
true;
439 adjustLeftBorder =
false;
441 adjustedInterval.reset();
447 const auto isStretchMode = state.
state.AltDown();
452 std::unique_ptr<AdjustPolicy> policy =
453 std::make_unique<AdjustClipBorder>(
454 adjustHandler, waveTrack, adjustedInterval, adjustLeftBorder,
455 isStretchMode, zoomInfo);
459 std::make_shared<WaveClipAdjustBorderHandle>(policy, waveTrack,
470 auto waveTrack = std::dynamic_pointer_cast<WaveTrack>(view.
FindTrack());
472 if (!waveTrack->IsLeader())
475 std::vector<UIHandlePtr> results;
477 const auto rect = state.
rect;
479 auto py = state.
state.m_y;
481 if (py >= rect.GetTop() &&
482 py <= (rect.GetTop() +
static_cast<int>(rect.GetHeight() * 0.3)))
484 return HitAnywhere(holder, waveTrack, pProject, state);
536 const wxRect& panelRect,
unsigned iPass)
538 return mAdjustPolicy->DrawingArea(context, rect, panelRect, iPass);
std::shared_ptr< UIHandle > UIHandlePtr
std::vector< SnapPoint > SnapPointArray
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)
void PushClipSpeedChangedUndoState(AudacityProject &project, double speedInPercent)
std::shared_ptr< WaveTrack::Interval > mInterval
void Finish(AudacityProject &project) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
const std::pair< double, double > mRange
std::shared_ptr< WaveTrack > mTrack
const double mInitialBorderPosition
static SnapPointArray FindSnapPoints(const WaveTrack *currentTrack, const std::pair< double, double > range)
std::unique_ptr< SnapManager > mSnapManager
const bool mAdjustingLeftBorder
std::function< void(WaveTrack::Interval &, double)> AdjustHandler
const bool mIsStretchMode
UIHandle::Result Drag(const TrackPanelMouseEvent &event, AudacityProject &project) override
wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
std::shared_ptr< Track > FindTrack() const override
AdjustClipBorder(AdjustHandler adjustHandler, std::shared_ptr< WaveTrack > track, std::shared_ptr< WaveTrack::Interval > interval, bool adjustLeftBorder, bool isStretchMode, const ZoomInfo &zoomInfo)
AdjustHandler mAdjustHandler
bool Init(const TrackPanelMouseEvent &event) override
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
std::shared_ptr< Track > FindTrack()
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
static ProjectHistory & Get(AudacityProject &project)
Abstract base class for an object holding data associated with points on a time axis.
std::shared_ptr< TrackList > GetOwner() const
static wxRect MaximizeHeight(const wxRect &rect, const wxRect &panelRect)
static ViewInfo & Get(AudacityProject &project)
static bool ClipDetailsVisible(const ClipTimes &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect)
virtual UIHandle::Result Drag(const TrackPanelMouseEvent &event, AudacityProject &project)=0
virtual bool Init(const TrackPanelMouseEvent &event)=0
virtual wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
virtual void Finish(AudacityProject &project)=0
virtual void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
virtual std::shared_ptr< Track > FindTrack() const =0
std::unique_ptr< AdjustPolicy > mAdjustPolicy
std::shared_ptr< const Channel > FindChannel() const override
Result Drag(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
HitTestPreview Preview(const TrackPanelMouseState &mouseState, AudacityProject *pProject) override
~WaveClipAdjustBorderHandle() override
wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
static HitTestPreview HitPreviewTrim(const AudacityProject *, bool unsafe, bool isLeftBorder)
static constexpr int BoundaryThreshold
Result Release(const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
Result Cancel(AudacityProject *pProject) override
WaveClipAdjustBorderHandle(std::unique_ptr< AdjustPolicy > &adjustPolicy, std::shared_ptr< const WaveTrack > pTrack, bool stretchMode, bool leftBorder)
Result Click(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
static HitTestPreview HitPreviewStretch(const AudacityProject *, bool unsafe, bool isLeftBorder)
static UIHandlePtr HitAnywhere(std::weak_ptr< WaveClipAdjustBorderHandle > &holder, const std::shared_ptr< WaveTrack > &waveTrack, const AudacityProject *pProject, const TrackPanelMouseState &state)
std::shared_ptr< const WaveTrack > mpTrack
static UIHandlePtr HitTest(std::weak_ptr< WaveClipAdjustBorderHandle > &holder, WaveChannelView &view, const AudacityProject *pProject, const TrackPanelMouseState &state)
std::shared_ptr< const WaveClip > GetClip(size_t iChannel) const
void TrimRightTo(double t)
void TrimLeftTo(double t)
void StretchLeftTo(double t)
void StretchRightTo(double t)
A Track that contains audio waveform data.
IntervalConstHolder GetNextInterval(const Interval &interval, PlaybackDirection searchDirection) const
double GetRate() const override
Positions or offsets within audio files need a wide type.
AUDACITY_DLL_API void DrawSnapLines(wxDC *dc, wxInt64 snap0, wxInt64 snap1)
void StretchRightTo(WaveTrack::Interval &interval, double t)
double GetRightAdjustLimit(const WaveTrack::Interval &interval, const WaveTrack &track, bool adjustingLeftBorder, bool isStretchMode)
void StretchLeftTo(WaveTrack::Interval &interval, double t)
double GetLeftAdjustLimit(const WaveTrack::Interval &interval, const WaveTrack &track, bool adjustingLeftBorder, bool isStretchMode)
void TrimLeftTo(WaveTrack::Interval &interval, double t)
void TrimRightTo(WaveTrack::Interval &interval, double t)
static wxRect GetClipRect(const ClipTimes &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect, bool *outShowSamples=nullptr)