mirror of
https://github.com/cookiengineer/audacity
synced 2025-04-30 07:39:42 +02:00
One less delegating ctor of SnapManager, move code to TimeShiftHandle
This commit is contained in:
parent
aa4b808714
commit
dc9eaf6a3a
72
src/Snap.cpp
72
src/Snap.cpp
@ -69,65 +69,6 @@ SnapPointArray FindCandidates( const TrackList &tracks )
|
||||
}
|
||||
return candidates;
|
||||
}
|
||||
|
||||
SnapPointArray FindCandidates(
|
||||
const TrackList &tracks,
|
||||
const TrackClipArray *clipExclusions, const TrackArray *trackExclusions )
|
||||
{
|
||||
// Special case restricted candidates for time shift
|
||||
SnapPointArray candidates;
|
||||
auto trackRange =
|
||||
tracks.Any()
|
||||
- [&](const Track *pTrack){
|
||||
return trackExclusions &&
|
||||
make_iterator_range( *trackExclusions ).contains( pTrack );
|
||||
};
|
||||
trackRange.Visit(
|
||||
[&](const LabelTrack *labelTrack) {
|
||||
for (int i = 0, cnt = labelTrack->GetNumLabels(); i < cnt; ++i)
|
||||
{
|
||||
const LabelStruct *label = labelTrack->GetLabel(i);
|
||||
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())
|
||||
{
|
||||
if (clipExclusions)
|
||||
{
|
||||
bool skip = false;
|
||||
for (size_t j = 0, cnt = clipExclusions->size(); j < cnt; ++j)
|
||||
{
|
||||
if ((*clipExclusions)[j].track == waveTrack &&
|
||||
(*clipExclusions)[j].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;
|
||||
}
|
||||
}
|
||||
|
||||
SnapManager::SnapManager(const AudacityProject &project,
|
||||
@ -141,19 +82,6 @@ SnapManager::SnapManager(const AudacityProject &project,
|
||||
{
|
||||
}
|
||||
|
||||
SnapManager::SnapManager(const AudacityProject &project,
|
||||
const TrackList &tracks,
|
||||
const ZoomInfo &zoomInfo,
|
||||
bool noTimeSnap,
|
||||
int pixelTolerance,
|
||||
const TrackClipArray *clipExclusions,
|
||||
const TrackArray *trackExclusions)
|
||||
: SnapManager{ project,
|
||||
FindCandidates( tracks, clipExclusions, trackExclusions ),
|
||||
zoomInfo, noTimeSnap, pixelTolerance }
|
||||
{
|
||||
}
|
||||
|
||||
SnapManager::~SnapManager()
|
||||
{
|
||||
}
|
||||
|
@ -89,13 +89,6 @@ public:
|
||||
bool noTimeSnap = false,
|
||||
int pixelTolerance = kPixelTolerance);
|
||||
|
||||
SnapManager(const AudacityProject &project,
|
||||
const TrackList &tracks,
|
||||
const ZoomInfo &zoomInfo,
|
||||
bool noTimeSnap,
|
||||
int pixelTolerance,
|
||||
const TrackClipArray *clipExclusions = NULL,
|
||||
const TrackArray *trackExclusions = NULL);
|
||||
~SnapManager();
|
||||
|
||||
// The track may be NULL.
|
||||
|
@ -350,6 +350,64 @@ void TimeShiftHandle::DoSlideHorizontal
|
||||
DoOffset( state, &capturedTrack, state.hSlideAmount );
|
||||
}
|
||||
|
||||
#include "LabelTrack.h"
|
||||
namespace {
|
||||
SnapPointArray FindCandidates(
|
||||
const TrackList &tracks,
|
||||
const TrackClipArray &clipExclusions, const TrackArray &trackExclusions )
|
||||
{
|
||||
// Special case restricted candidates for time shift
|
||||
SnapPointArray candidates;
|
||||
auto trackRange =
|
||||
tracks.Any()
|
||||
- [&](const Track *pTrack){
|
||||
return
|
||||
make_iterator_range( trackExclusions ).contains( pTrack );
|
||||
};
|
||||
trackRange.Visit(
|
||||
[&](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;
|
||||
}
|
||||
}
|
||||
|
||||
UIHandle::Result TimeShiftHandle::Click
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
|
||||
{
|
||||
@ -415,12 +473,12 @@ UIHandle::Result TimeShiftHandle::Click
|
||||
mRect = rect;
|
||||
mClipMoveState.mMouseClickX = event.m_x;
|
||||
mSnapManager =
|
||||
std::make_shared<SnapManager>(*trackList.GetOwner(), trackList,
|
||||
viewInfo,
|
||||
true, // don't snap to time
|
||||
kPixelTolerance,
|
||||
&mClipMoveState.capturedClipArray,
|
||||
&mClipMoveState.trackExclusions);
|
||||
std::make_shared<SnapManager>(*trackList.GetOwner(),
|
||||
FindCandidates( trackList,
|
||||
mClipMoveState.capturedClipArray, mClipMoveState.trackExclusions),
|
||||
viewInfo,
|
||||
true, // don't snap to time
|
||||
kPixelTolerance);
|
||||
mClipMoveState.snapLeft = -1;
|
||||
mClipMoveState.snapRight = -1;
|
||||
mSnapPreferRightEdge =
|
||||
|
Loading…
x
Reference in New Issue
Block a user