Audacity 3.2.0
Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
WaveClipTrimHandle::AdjustBorder Class Referencefinal
Inheritance diagram for WaveClipTrimHandle::AdjustBorder:
[legend]
Collaboration diagram for WaveClipTrimHandle::AdjustBorder:
[legend]

Public Member Functions

 AdjustBorder (const std::shared_ptr< WaveTrack > &track, const std::shared_ptr< WaveClip > &clip, bool leftBorder, const ZoomInfo &zoomInfo)
 
bool Init (const TrackPanelMouseEvent &event) override
 
UIHandle::Result Trim (const TrackPanelMouseEvent &event, AudacityProject &project) override
 
void Finish (AudacityProject &project) override
 
void Cancel () override
 
void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
 
wxRect DrawingArea (TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
 
- Public Member Functions inherited from WaveClipTrimHandle::ClipTrimPolicy
virtual ~ClipTrimPolicy ()
 
virtual bool Init (const TrackPanelMouseEvent &event)=0
 
virtual UIHandle::Result Trim (const TrackPanelMouseEvent &event, AudacityProject &project)=0
 
virtual void Finish (AudacityProject &project)=0
 
virtual void Cancel ()=0
 
virtual void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
 
virtual wxRect DrawingArea (TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
 

Private Member Functions

void TrimTo (double t)
 

Static Private Member Functions

static SnapPointArray FindSnapPoints (const WaveTrack *currentTrack, WaveClip *adjustedClip, const std::pair< double, double > range)
 

Private Attributes

std::shared_ptr< WaveTrackmTrack
 
std::vector< std::shared_ptr< WaveClip > > mClips
 
double mInitialBorderPosition {}
 
int mDragStartX { }
 
std::pair< double, double > mRange
 
bool mAdjustingLeftBorder
 
std::unique_ptr< SnapManagermSnapManager
 
SnapResults mSnap
 

Detailed Description

Definition at line 48 of file WaveClipTrimHandle.cpp.

Constructor & Destructor Documentation

◆ AdjustBorder()

WaveClipTrimHandle::AdjustBorder::AdjustBorder ( const std::shared_ptr< WaveTrack > &  track,
const std::shared_ptr< WaveClip > &  clip,
bool  leftBorder,
const ZoomInfo zoomInfo 
)
inline

Definition at line 124 of file WaveClipTrimHandle.cpp.

129 : mTrack(track),
130 mAdjustingLeftBorder(leftBorder)
131 {
132 auto clips = track->GetClips();
133
134 wxASSERT(std::find(clips.begin(), clips.end(), clip) != clips.end());
135
136 if (track->IsAlignedWithLeader() || track->GetLinkType() == Track::LinkType::Aligned)
137 //find clips in other channels which are also should be trimmed
138 mClips = FindClipsInChannels(clip->GetPlayStartTime(), clip->GetPlayEndTime(), track.get());
139 else
140 mClips.push_back(clip);
141
143 {
144 auto left = clip->GetSequenceStartTime();
145 for (const auto& other : clips)
146 if (other->GetPlayStartTime() < clip->GetPlayStartTime() && other->GetPlayEndTime() > left)
147 left = other->GetPlayEndTime();
148 //not less than 1 sample length
149 mRange = std::make_pair(left, clip->GetPlayEndTime() - 1.0 / clip->GetRate());
150
151 mInitialBorderPosition = mClips[0]->GetPlayStartTime();
152 }
153 else
154 {
155 auto right = clip->GetSequenceEndTime();
156 for (const auto& other : clips)
157 if (other->GetPlayStartTime() > clip->GetPlayStartTime() && other->GetPlayStartTime() < right)
158 right = other->GetPlayStartTime();
159 //not less than 1 sample length
160 mRange = std::make_pair(clip->GetPlayStartTime() + 1.0 / clip->GetRate(), right);
161
162 mInitialBorderPosition = mClips[0]->GetPlayEndTime();
163 }
164
165 if(const auto trackList = track->GetOwner())
166 {
167 mSnapManager = std::make_unique<SnapManager>(
168 *trackList->GetOwner(),
169 FindSnapPoints(track.get(), clip.get(), mRange),
170 zoomInfo);
171 }
172 }
std::vector< std::shared_ptr< WaveClip > > mClips
std::unique_ptr< SnapManager > mSnapManager
static SnapPointArray FindSnapPoints(const WaveTrack *currentTrack, WaveClip *adjustedClip, const std::pair< double, double > range)
std::pair< double, double > mRange
std::shared_ptr< WaveTrack > mTrack
std::vector< std::shared_ptr< WaveClip > > FindClipsInChannels(double start, double end, WaveTrack *track)

References ChannelGroup::Aligned, anonymous_namespace{WaveClipTrimHandle.cpp}::FindClipsInChannels(), FindSnapPoints(), mAdjustingLeftBorder, mClips, mInitialBorderPosition, mRange, and mSnapManager.

Here is the call graph for this function:

Member Function Documentation

◆ Cancel()

void WaveClipTrimHandle::AdjustBorder::Cancel ( )
inlineoverridevirtual

Implements WaveClipTrimHandle::ClipTrimPolicy.

Definition at line 239 of file WaveClipTrimHandle.cpp.

References mInitialBorderPosition, and TrimTo().

Here is the call graph for this function:

◆ Draw()

void WaveClipTrimHandle::AdjustBorder::Draw ( TrackPanelDrawingContext context,
const wxRect &  rect,
unsigned  iPass 
)
inlineoverridevirtual

Reimplemented from WaveClipTrimHandle::ClipTrimPolicy.

Definition at line 244 of file WaveClipTrimHandle.cpp.

245 {
246 if(iPass == TrackArtist::PassSnapping && mSnap.Snapped())
247 {
248 auto &dc = context.dc;
249 SnapManager::Draw(&dc, rect.x + mSnap.outCoord, -1);
250 }
251 }
static void Draw(wxDC *dc, wxInt64 snap0, wxInt64 snap1)
Definition: Snap.cpp:304
wxInt64 outCoord
Definition: Snap.h:48
bool Snapped() const
Definition: Snap.h:52

References TrackPanelDrawingContext::dc, SnapManager::Draw(), mSnap, SnapResults::outCoord, TrackArtist::PassSnapping, and SnapResults::Snapped().

Here is the call graph for this function:

◆ DrawingArea()

wxRect WaveClipTrimHandle::AdjustBorder::DrawingArea ( TrackPanelDrawingContext ,
const wxRect &  rect,
const wxRect &  panelRect,
unsigned  iPass 
)
inlineoverridevirtual

Reimplemented from WaveClipTrimHandle::ClipTrimPolicy.

Definition at line 253 of file WaveClipTrimHandle.cpp.

254 {
255 if(iPass == TrackArtist::PassSnapping)
256 return MaximizeHeight(rect, panelRect);
257 return rect;
258 }
static wxRect MaximizeHeight(const wxRect &rect, const wxRect &panelRect)

References TrackPanelDrawable::MaximizeHeight(), and TrackArtist::PassSnapping.

Here is the call graph for this function:

◆ FindSnapPoints()

static SnapPointArray WaveClipTrimHandle::AdjustBorder::FindSnapPoints ( const WaveTrack currentTrack,
WaveClip adjustedClip,
const std::pair< double, double >  range 
)
inlinestaticprivate

Definition at line 78 of file WaveClipTrimHandle.cpp.

82 {
83 SnapPointArray result;
84
85 auto addSnapPoint = [&](double t, const Track* track)
86 {
87 if(t > range.second || t < range.first)
88 return;
89
90 for(const auto& snapPoint : result)
91 if(snapPoint.t == t)
92 return;
93 result.emplace_back(t, track);
94 };
95
96 if(const auto trackList = currentTrack->GetOwner())
97 {
98 for(const auto track : as_const(*trackList).Leaders())
99 {
100 const auto isSameTrack = (track == currentTrack) ||
101 (track->GetLinkType() == Track::LinkType::Aligned && *trackList->FindLeader(currentTrack) == track) ||
102 (currentTrack->GetLinkType() == Track::LinkType::Aligned && *trackList->FindLeader(track) == currentTrack);
103 for(const auto& interval : track->Intervals())
104 {
105 if(isSameTrack)
106 {
107 auto waveTrackIntervalData =
108 std::dynamic_pointer_cast<const WaveTrack::Interval>(
109 interval);
110 if(waveTrackIntervalData->GetClip(0).get() == adjustedClip)
111 //exclude boundaries of the adjusted clip
112 continue;
113 }
114 addSnapPoint(interval->Start(), track);
115 if(interval->Start() != interval->End())
116 addSnapPoint(interval->End(), track);
117 }
118 }
119 }
120 return result;
121 }
std::vector< SnapPoint > SnapPointArray
Definition: Snap.h:43
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:120
std::shared_ptr< TrackList > GetOwner() const
Definition: Track.h:252
LinkType GetLinkType() const noexcept
Definition: Track.cpp:1252

References ChannelGroup::Aligned, Track::GetLinkType(), and Track::GetOwner().

Referenced by AdjustBorder().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Finish()

void WaveClipTrimHandle::AdjustBorder::Finish ( AudacityProject project)
inlineoverridevirtual

Implements WaveClipTrimHandle::ClipTrimPolicy.

Definition at line 220 of file WaveClipTrimHandle.cpp.

221 {
222 if (mClips[0]->GetPlayStartTime() != mInitialBorderPosition)
223 {
225 {
226 auto dt = std::abs(mClips[0]->GetPlayStartTime() - mInitialBorderPosition);
227 ProjectHistory::Get(project).PushState(XO("Clip-Trim-Left"),
228 XO("Moved by %.02f").Format(dt));
229 }
230 else
231 {
232 auto dt = std::abs(mInitialBorderPosition - mClips[0]->GetPlayEndTime());
233 ProjectHistory::Get(project).PushState(XO("Clip-Trim-Right"),
234 XO("Moved by %.02f").Format(dt));
235 }
236 }
237 }
XO("Cut/Copy/Paste")
const auto project
Abstract base class used in importing a file.
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
static ProjectHistory & Get(AudacityProject &project)

References ProjectHistory::Get(), mAdjustingLeftBorder, mClips, mInitialBorderPosition, project, ProjectHistory::PushState(), and XO().

Here is the call graph for this function:

◆ Init()

bool WaveClipTrimHandle::AdjustBorder::Init ( const TrackPanelMouseEvent event)
inlineoverridevirtual

Implements WaveClipTrimHandle::ClipTrimPolicy.

Definition at line 174 of file WaveClipTrimHandle.cpp.

175 {
176 if (event.event.LeftDown())
177 {
178 mDragStartX = event.event.GetX();
179 return true;
180 }
181 return false;
182 }

References TrackPanelMouseEvent::event, and mDragStartX.

◆ Trim()

UIHandle::Result WaveClipTrimHandle::AdjustBorder::Trim ( const TrackPanelMouseEvent event,
AudacityProject project 
)
inlineoverridevirtual

Implements WaveClipTrimHandle::ClipTrimPolicy.

Definition at line 184 of file WaveClipTrimHandle.cpp.

185 {
186 const auto eventX = event.event.GetX();
187 const auto dx = eventX - mDragStartX;
188
189 const auto& viewInfo = ViewInfo::Get(project);
190
191 const auto eventT = viewInfo.PositionToTime(viewInfo.TimeToPosition(mInitialBorderPosition, event.rect.x) + dx, event.rect.x);
192
193 const auto offset = sampleCount(floor((eventT - mInitialBorderPosition) * mClips[0]->GetRate())).as_double() / mClips[0]->GetRate();
194 const auto t = std::clamp(mInitialBorderPosition + offset, mRange.first, mRange.second);
195 const auto wasSnapped = mSnap.Snapped();
196 if(mSnapManager)
197 mSnap = mSnapManager->Snap(mTrack.get(), t, !mAdjustingLeftBorder);
198 if(mSnap.Snapped())
199 {
200 if(mSnap.outTime >= mRange.first && mSnap.outTime <= mRange.second)
201 {
202 //Make sure that outTime belongs to the adjustment range after snapping
205 }
206 else
207 {
208 //Otherwise snapping cannot be performed
209 mSnap = {};
210 TrimTo(t);
211 }
212 }
213 else
214 TrimTo(t);
215 //If there was a snap line, make sure it is removed
216 //from the screen by redrawing whole TrackPanel
218 }
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19
double as_double() const
Definition: SampleCount.h:46
double GetRate(const Track &track)
Definition: TimeTrack.cpp:196
double outTime
Definition: Snap.h:47

References sampleCount::as_double(), ViewInfo::Get(), anonymous_namespace{TimeTrack.cpp}::GetRate(), mAdjustingLeftBorder, mClips, mDragStartX, mInitialBorderPosition, mRange, mSnap, mSnapManager, mTrack, SnapResults::outTime, project, TrackPanelMouseEvent::rect, RefreshCode::RefreshAll, RefreshCode::RefreshCell, SnapResults::Snapped(), and TrimTo().

Here is the call graph for this function:

◆ TrimTo()

void WaveClipTrimHandle::AdjustBorder::TrimTo ( double  t)
inlineprivate

Definition at line 60 of file WaveClipTrimHandle.cpp.

61 {
62 t = std::clamp(t, mRange.first, mRange.second);
64 {
65 for (auto& clip : mClips)
66 clip->TrimLeftTo(t);
67 }
68 else
69 {
70 for (auto& clip : mClips)
71 clip->TrimRightTo(t);
72 }
73 }

References mAdjustingLeftBorder, mClips, and mRange.

Referenced by Cancel(), and Trim().

Here is the caller graph for this function:

Member Data Documentation

◆ mAdjustingLeftBorder

bool WaveClipTrimHandle::AdjustBorder::mAdjustingLeftBorder
private

Definition at line 55 of file WaveClipTrimHandle.cpp.

Referenced by AdjustBorder(), Finish(), Trim(), and TrimTo().

◆ mClips

std::vector<std::shared_ptr<WaveClip> > WaveClipTrimHandle::AdjustBorder::mClips
private

Definition at line 51 of file WaveClipTrimHandle.cpp.

Referenced by AdjustBorder(), Finish(), Trim(), and TrimTo().

◆ mDragStartX

int WaveClipTrimHandle::AdjustBorder::mDragStartX { }
private

Definition at line 53 of file WaveClipTrimHandle.cpp.

Referenced by Init(), and Trim().

◆ mInitialBorderPosition

double WaveClipTrimHandle::AdjustBorder::mInitialBorderPosition {}
private

Definition at line 52 of file WaveClipTrimHandle.cpp.

Referenced by AdjustBorder(), Cancel(), Finish(), and Trim().

◆ mRange

std::pair<double, double> WaveClipTrimHandle::AdjustBorder::mRange
private

Definition at line 54 of file WaveClipTrimHandle.cpp.

Referenced by AdjustBorder(), Trim(), and TrimTo().

◆ mSnap

SnapResults WaveClipTrimHandle::AdjustBorder::mSnap
private

Definition at line 58 of file WaveClipTrimHandle.cpp.

Referenced by Draw(), and Trim().

◆ mSnapManager

std::unique_ptr<SnapManager> WaveClipTrimHandle::AdjustBorder::mSnapManager
private

Definition at line 57 of file WaveClipTrimHandle.cpp.

Referenced by AdjustBorder(), and Trim().

◆ mTrack

std::shared_ptr<WaveTrack> WaveClipTrimHandle::AdjustBorder::mTrack
private

Definition at line 50 of file WaveClipTrimHandle.cpp.

Referenced by Trim().


The documentation for this class was generated from the following file: