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:
parent
bc7f527a3b
commit
4f159a7629
@ -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 );
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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) {
|
||||
|
@ -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 );
|
||||
|
Loading…
x
Reference in New Issue
Block a user