1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-04-30 07:39:42 +02:00

New method of TrackShifter moves a calculation out of ClipMenus

This commit is contained in:
Paul Licameli 2020-09-13 22:59:24 -04:00
parent bc7f527a3b
commit 4f159a7629
4 changed files with 33 additions and 13 deletions

View File

@ -646,10 +646,8 @@ double DoClipMove
uShifter = MakeTrackShifter::Call( *wt );
if( uShifter->HitTest( t0 ) == TrackShifter::HitTestResult::Miss )
uShifter.reset();
else {
wt = channel;
else
break;
}
}
if (!uShifter)
@ -660,16 +658,7 @@ double DoClipMove
t0, viewInfo, trackList, syncLocked );
auto desiredT0 = viewInfo.OffsetTimeByPixels( t0, ( right ? 1 : -1 ) );
auto desiredSlideAmount = desiredT0 - t0;
// set it to a sample point, and minimum of 1 sample point
if (!right)
desiredSlideAmount *= -1;
double nSamples = rint(wt->GetRate() * desiredSlideAmount);
nSamples = std::max(nSamples, 1.0);
desiredSlideAmount = nSamples / wt->GetRate();
if (!right)
desiredSlideAmount *= -1;
auto desiredSlideAmount = pShifter->HintOffsetLarger( desiredT0 - t0 );
auto hSlideAmount =
state.DoSlideHorizontal( desiredSlideAmount, trackList );

View File

@ -1344,6 +1344,20 @@ public:
bool SyncLocks() override { return true; }
double HintOffsetLarger(double desiredOffset) override
{
// set it to a sample point, and minimum of 1 sample point
bool positive = (desiredOffset > 0);
if (!positive)
desiredOffset *= -1;
double nSamples = rint(mpTrack->GetRate() * desiredOffset);
nSamples = std::max(nSamples, 1.0);
desiredOffset = nSamples / mpTrack->GetRate();
if (!positive)
desiredOffset *= -1;
return desiredOffset;
}
private:
std::shared_ptr<WaveTrack> mpTrack;
};

View File

@ -274,6 +274,11 @@ void TrackShifter::CommonSelectInterval(const TrackInterval &interval)
});
}
double TrackShifter::HintOffsetLarger(double desiredOffset)
{
return desiredOffset;
}
void TrackShifter::InitIntervals()
{
mMoving.clear();
@ -960,6 +965,8 @@ UIHandle::Result TimeShiftHandle::Drag
if (desiredSlideAmount == 0.0)
return RefreshAll;
// Note that mouse dragging doesn't use TrackShifter::HintOffsetLarger()
mClipMoveState.DoSlideHorizontal( desiredSlideAmount, trackList );
if (mClipMoveState.movingSelection) {

View File

@ -65,6 +65,16 @@ public:
//! Whether unfixing of an interval should propagate to all overlapping intervals in the sync lock group
virtual bool SyncLocks() = 0;
//! Given amount to shift by horizontally, maybe adjust it from zero to suggest minimum distance
/*!
Any interval placement constraints, not necessarily met at the suggested offset
Default implementation returns the argument
@post `fabs(r) >= fabs(desiredOffset)`
@post `r * desiredOffset >= 0` (i.e. signs are not opposite)
@post (where `r` is return value)
*/
virtual double HintOffsetLarger( double desiredOffset );
protected:
/*! Unfix any of the intervals that intersect the given one; may be useful to override `SelectInterval()` */
void CommonSelectInterval( const TrackInterval &interval );