17#include "../../../../TrackArtist.h"
18#include "../../../../Snap.h"
19#include "../../../../TrackPanelDrawingContext.h"
20#include "../../../../../images/Cursors.h"
33 std::vector<std::shared_ptr<WaveClip>> result;
36 for (
auto& clip : channel->GetClips())
38 if (clip->GetPlayStartTime() == start && clip->GetPlayEndTime() ==
end)
39 result.push_back(clip);
51 std::vector<std::shared_ptr<WaveClip>>
mClips;
81 const std::pair<double, double> range)
85 auto addSnapPoint = [&](
double t,
const Track* track)
87 if(t > range.second || t < range.first)
90 for(
const auto& snapPoint : result)
93 result.emplace_back(t, track);
96 if(
const auto trackList = currentTrack->
GetOwner())
98 for(
const auto track : as_const(*trackList).Leaders())
100 const auto isSameTrack = (track == currentTrack) ||
103 for(
const auto& interval : track->Intervals())
107 auto waveTrackIntervalData =
108 std::dynamic_pointer_cast<const WaveTrack::Interval>(
110 if(waveTrackIntervalData->GetClip(0).get() == adjustedClip)
114 addSnapPoint(interval->Start(), track);
115 if(interval->Start() != interval->End())
116 addSnapPoint(interval->End(), track);
125 const std::shared_ptr<WaveTrack>& track,
126 const std::shared_ptr<WaveClip>& clip,
132 auto clips = track->GetClips();
134 wxASSERT(std::find(clips.begin(), clips.end(), clip) != clips.end());
144 auto left = clip->GetSequenceStartTime();
145 for (
const auto& other : clips)
146 if (other->GetPlayStartTime() < clip->GetPlayStartTime() && other->GetPlayEndTime() > left)
147 left = other->GetPlayEndTime();
149 mRange = std::make_pair(left, clip->GetPlayEndTime() - 1.0 / clip->GetRate());
155 auto right = clip->GetSequenceEndTime();
156 for (
const auto& other : clips)
157 if (other->GetPlayStartTime() > clip->GetPlayStartTime() && other->GetPlayStartTime() < right)
158 right = other->GetPlayStartTime();
160 mRange = std::make_pair(clip->GetPlayStartTime() + 1.0 / clip->GetRate(), right);
165 if(
const auto trackList = track->GetOwner())
168 *trackList->GetOwner(),
176 if (event.
event.LeftDown())
186 const auto eventX =
event.event.GetX();
248 auto &dc = context.
dc;
274 clip->TrimRightTo(t);
282 std::shared_ptr<WaveClip>& leftClip,
283 std::shared_ptr<WaveClip>& rightClip)
287 wxASSERT(std::find(clips.begin(), clips.end(), leftClip) != clips.end());
288 wxASSERT(std::find(clips.begin(), clips.end(), rightClip) != clips.end());
312 if (event.
event.LeftDown())
322 const auto newX =
event.event.GetX();
358 static auto disabledCursor =
359 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
360 static auto slideCursor =
361 MakeCursor(wxCURSOR_SIZEWE, TimeCursorXpm, 16, 16);
362 auto message =
XO(
"Click and drag to move clip boundary in time");
374 : mClipTrimPolicy{
std::move(clipTrimPolicy) }
387 std::weak_ptr<WaveClipTrimHandle>& holder,
388 const std::shared_ptr<WaveTrack>& waveTrack,
392 const auto rect = state.
rect;
394 auto px = state.
state.m_x;
398 std::shared_ptr<WaveClip> leftClip;
399 std::shared_ptr<WaveClip> rightClip;
404 for (
auto& clip : waveTrack->GetClips())
418 std::unique_ptr<ClipTrimPolicy> clipTrimPolicy;
419 if (leftClip && rightClip)
423 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, leftClip,
false, zoomInfo);
425 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, rightClip,
true, zoomInfo);
429 auto clip = leftClip ? leftClip : rightClip;
437 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, clip,
true, zoomInfo);
439 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, clip,
false, zoomInfo);
446 std::make_shared<WaveClipTrimHandle>(clipTrimPolicy)
455 auto waveTrack = std::dynamic_pointer_cast<WaveTrack>(view.
FindTrack());
457 if (!waveTrack->IsLeader() && waveTrack->IsAlignedWithLeader())
460 std::vector<UIHandlePtr> results;
462 const auto rect = state.
rect;
464 auto px = state.
state.m_x;
465 auto py = state.
state.m_y;
467 if (py >= rect.GetTop() &&
468 py <= (rect.GetTop() +
static_cast<int>(rect.GetHeight() * 0.3)))
470 return HitAnywhere(holder, waveTrack, pProject, state);
520 const wxRect& panelRect,
unsigned 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)
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)
static void Draw(wxDC *dc, wxInt64 snap0, wxInt64 snap1)
Abstract base class for an object holding data associated with points on a time axis.
std::shared_ptr< TrackList > GetOwner() const
LinkType GetLinkType() const noexcept
bool IsAlignedWithLeader() const
Returns true if the leader track has link type LinkType::Aligned.
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
static wxRect MaximizeHeight(const wxRect &rect, const wxRect &panelRect)
static ViewInfo & Get(AudacityProject &project)
static bool ClipDetailsVisible(const WaveClip &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect)
This allows multiple clips to be a part of one WaveTrack.
AdjustBetweenBorders(WaveTrack *track, std::shared_ptr< WaveClip > &leftClip, std::shared_ptr< WaveClip > &rightClip)
std::vector< std::shared_ptr< WaveClip > > mLeftClips
bool Init(const TrackPanelMouseEvent &event) override
UIHandle::Result Trim(const TrackPanelMouseEvent &event, AudacityProject &project) override
void Finish(AudacityProject &project) override
std::pair< double, double > mRange
std::vector< std::shared_ptr< WaveClip > > mRightClips
double mInitialBorderPosition
bool mAdjustingLeftBorder
UIHandle::Result Trim(const TrackPanelMouseEvent &event, AudacityProject &project) override
std::vector< std::shared_ptr< WaveClip > > mClips
void Finish(AudacityProject &project) override
std::unique_ptr< SnapManager > mSnapManager
AdjustBorder(const std::shared_ptr< WaveTrack > &track, const std::shared_ptr< WaveClip > &clip, bool leftBorder, const ZoomInfo &zoomInfo)
double mInitialBorderPosition
wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
static SnapPointArray FindSnapPoints(const WaveTrack *currentTrack, WaveClip *adjustedClip, const std::pair< double, double > range)
bool Init(const TrackPanelMouseEvent &event) override
std::pair< double, double > mRange
std::shared_ptr< WaveTrack > mTrack
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
virtual wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
virtual void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
virtual ~ClipTrimPolicy()
Result Release(const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
Result Cancel(AudacityProject *pProject) override
static HitTestPreview HitPreview(const AudacityProject *, bool unsafe)
Result Drag(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
WaveClipTrimHandle(std::unique_ptr< ClipTrimPolicy > &clipTrimPolicy)
static UIHandlePtr HitTest(std::weak_ptr< WaveClipTrimHandle > &holder, WaveChannelView &view, const AudacityProject *pProject, const TrackPanelMouseState &state)
Result Click(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
HitTestPreview Preview(const TrackPanelMouseState &mouseState, AudacityProject *pProject) override
wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
std::unique_ptr< ClipTrimPolicy > mClipTrimPolicy
static UIHandlePtr HitAnywhere(std::weak_ptr< WaveClipTrimHandle > &holder, const std::shared_ptr< WaveTrack > &waveTrack, const AudacityProject *pProject, const TrackPanelMouseState &state)
static constexpr int BoundaryThreshold
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
A Track that contains audio waveform data.
WaveClipHolders & GetClips()
Positions or offsets within audio files need a wide type.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
double GetRate(const Track &track)
std::vector< std::shared_ptr< WaveClip > > FindClipsInChannels(double start, double end, WaveTrack *track)
static wxRect GetClipRect(const WaveClip &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect, bool *outShowSamples=nullptr)