1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-15 15:49:36 +02:00

TrackShifters responsible for snapping; remove a TrackList::Visit...

... Also dependency of TimeShiftHandle on LabelTrack, lately added, is removed
This commit is contained in:
Paul Licameli 2020-09-09 20:27:26 -04:00
parent eb22892064
commit 00f761eb5e
3 changed files with 13 additions and 58 deletions

View File

@ -652,7 +652,6 @@ double DoClipMove
state.capturedClipIsSelection = state.capturedClipIsSelection =
track->GetSelected() && !selectedRegion.isPoint(); track->GetSelected() && !selectedRegion.isPoint();
state.trackExclusions.clear();
TimeShiftHandle::Init( TimeShiftHandle::Init(
state, viewInfo, *track, trackList, syncLocked, t0 ); state, viewInfo, *track, trackList, syncLocked, t0 );

View File

@ -121,11 +121,9 @@ namespace
void AddClipsToCaptured void AddClipsToCaptured
( ClipMoveState &state, Track *t, double t0, double t1 ) ( ClipMoveState &state, Track *t, double t0, double t1 )
{ {
bool exclude = true; // to exclude a whole track.
auto &clips = state.capturedClipArray; auto &clips = state.capturedClipArray;
t->TypeSwitch( t->TypeSwitch(
[&](WaveTrack *wt) { [&](WaveTrack *wt) {
exclude = false;
for(const auto &clip: wt->GetClips()) for(const auto &clip: wt->GetClips())
if ( ! clip->IsClipStartAfterClip(t0) && ! clip->BeforeClip(t1) && if ( ! clip->IsClipStartAfterClip(t0) && ! clip->BeforeClip(t1) &&
// Avoid getting clips that were already captured // Avoid getting clips that were already captured
@ -154,8 +152,6 @@ namespace
} }
} }
); );
if (exclude)
state.trackExclusions.push_back(t);
} }
// Helper for the above, adds a track's clips to capturedClipArray (eliminates // Helper for the above, adds a track's clips to capturedClipArray (eliminates
@ -492,60 +488,23 @@ void TimeShiftHandle::DoSlideHorizontal
DoOffset( state, &capturedTrack, state.hSlideAmount ); DoOffset( state, &capturedTrack, state.hSlideAmount );
} }
#include "LabelTrack.h"
namespace { namespace {
SnapPointArray FindCandidates( SnapPointArray FindCandidates(
const TrackList &tracks, const TrackList &tracks, const ClipMoveState::ShifterMap &shifters )
const TrackClipArray &clipExclusions, const TrackArray &trackExclusions )
{ {
// Special case restricted candidates for time shift // Compare with the other function FindCandidates in Snap
// Make the snap manager more selective than it would be if just constructed
// from the track list
SnapPointArray candidates; SnapPointArray candidates;
auto trackRange = for ( const auto &pair : shifters ) {
tracks.Any() auto &shifter = pair.second;
- [&](const Track *pTrack){ auto &track = shifter->GetTrack();
return for (const auto &interval : shifter->FixedIntervals() ) {
make_iterator_range( trackExclusions ).contains( pTrack ); candidates.emplace_back( interval.Start(), &track );
}; if ( interval.Start() != interval.End() )
trackRange.Visit( candidates.emplace_back( interval.End(), &track );
[&](const LabelTrack *labelTrack) {
for (const auto &label : labelTrack->GetLabels())
{
const double t0 = label.getT0();
const double t1 = label.getT1();
candidates.emplace_back(t0, labelTrack);
if (t1 != t0)
candidates.emplace_back(t1, labelTrack);
}
},
[&](const WaveTrack *waveTrack) {
for (const auto &clip: waveTrack->GetClips())
{
bool skip = false;
for (const auto &exclusion : clipExclusions)
{
if (exclusion.track == waveTrack &&
exclusion.clip == clip.get())
{
skip = true;
break;
}
}
if (skip)
continue;
candidates.emplace_back(clip->GetStartTime(), waveTrack);
candidates.emplace_back(clip->GetEndTime(), waveTrack);
}
} }
#ifdef USE_MIDI }
,
[&](const NoteTrack *track) {
candidates.emplace_back(track->GetStartTime(), track);
candidates.emplace_back(track->GetEndTime(), track);
}
#endif
);
return candidates; return candidates;
} }
} }
@ -638,8 +597,7 @@ UIHandle::Result TimeShiftHandle::Click
mClipMoveState.mMouseClickX = event.m_x; mClipMoveState.mMouseClickX = event.m_x;
mSnapManager = mSnapManager =
std::make_shared<SnapManager>(*trackList.GetOwner(), std::make_shared<SnapManager>(*trackList.GetOwner(),
FindCandidates( trackList, FindCandidates( trackList, mClipMoveState.shifters ),
mClipMoveState.capturedClipArray, mClipMoveState.trackExclusions),
viewInfo, viewInfo,
true, // don't snap to time true, // don't snap to time
kPixelTolerance); kPixelTolerance);

View File

@ -126,7 +126,6 @@ struct ClipMoveState {
WaveClip *capturedClip {}; WaveClip *capturedClip {};
bool capturedClipIsSelection {}; bool capturedClipIsSelection {};
TrackArray trackExclusions {};
double hSlideAmount {}; double hSlideAmount {};
ShifterMap shifters; ShifterMap shifters;
TrackClipArray capturedClipArray {}; TrackClipArray capturedClipArray {};
@ -138,7 +137,6 @@ struct ClipMoveState {
{ {
capturedClip = nullptr; capturedClip = nullptr;
capturedClipIsSelection = false; capturedClipIsSelection = false;
trackExclusions.clear();
hSlideAmount = 0; hSlideAmount = 0;
shifters.clear(); shifters.clear();
capturedClipArray.clear(); capturedClipArray.clear();