mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-04 16:14:00 +01:00
More factoring of TimeShiftHandle::Drag
This commit is contained in:
@@ -405,7 +405,7 @@ UIHandle::Result TimeShiftHandle::Click
|
|||||||
|
|
||||||
mSlideUpDownOnly = event.CmdDown() && !multiToolModeActive;
|
mSlideUpDownOnly = event.CmdDown() && !multiToolModeActive;
|
||||||
mRect = rect;
|
mRect = rect;
|
||||||
mMouseClickX = event.m_x;
|
mClipMoveState.mMouseClickX = event.m_x;
|
||||||
mSnapManager = std::make_shared<SnapManager>(trackList,
|
mSnapManager = std::make_shared<SnapManager>(trackList,
|
||||||
&viewInfo,
|
&viewInfo,
|
||||||
&mClipMoveState.capturedClipArray,
|
&mClipMoveState.capturedClipArray,
|
||||||
@@ -422,6 +422,77 @@ UIHandle::Result TimeShiftHandle::Click
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
double FindDesiredSlideAmount(
|
||||||
|
const ViewInfo &viewInfo, wxCoord xx, const wxMouseEvent &event,
|
||||||
|
SnapManager *pSnapManager,
|
||||||
|
bool slideUpDownOnly, bool snapPreferRightEdge,
|
||||||
|
ClipMoveState &state,
|
||||||
|
Track &capturedTrack, Track &track )
|
||||||
|
{
|
||||||
|
if (slideUpDownOnly)
|
||||||
|
return 0.0;
|
||||||
|
else {
|
||||||
|
double desiredSlideAmount =
|
||||||
|
viewInfo.PositionToTime(event.m_x) -
|
||||||
|
viewInfo.PositionToTime(state.mMouseClickX);
|
||||||
|
double clipLeft = 0, clipRight = 0;
|
||||||
|
|
||||||
|
if (track.GetKind() == Track::Wave) {
|
||||||
|
WaveTrack *const mtw = static_cast<WaveTrack*>(&track);
|
||||||
|
const double rate = mtw->GetRate();
|
||||||
|
// set it to a sample point
|
||||||
|
desiredSlideAmount = rint(desiredSlideAmount * rate) / rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust desiredSlideAmount using SnapManager
|
||||||
|
if (pSnapManager) {
|
||||||
|
if (state.capturedClip) {
|
||||||
|
clipLeft = state.capturedClip->GetStartTime()
|
||||||
|
+ desiredSlideAmount;
|
||||||
|
clipRight = state.capturedClip->GetEndTime()
|
||||||
|
+ desiredSlideAmount;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
clipLeft = capturedTrack.GetStartTime() + desiredSlideAmount;
|
||||||
|
clipRight = capturedTrack.GetEndTime() + desiredSlideAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto results =
|
||||||
|
pSnapManager->Snap(&capturedTrack, clipLeft, false);
|
||||||
|
auto newClipLeft = results.outTime;
|
||||||
|
results =
|
||||||
|
pSnapManager->Snap(&capturedTrack, clipRight, false);
|
||||||
|
auto newClipRight = results.outTime;
|
||||||
|
|
||||||
|
// Only one of them is allowed to snap
|
||||||
|
if (newClipLeft != clipLeft && newClipRight != clipRight) {
|
||||||
|
// Un-snap the un-preferred edge
|
||||||
|
if (snapPreferRightEdge)
|
||||||
|
newClipLeft = clipLeft;
|
||||||
|
else
|
||||||
|
newClipRight = clipRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Take whichever one snapped (if any) and compute the NEW desiredSlideAmount
|
||||||
|
state.snapLeft = -1;
|
||||||
|
state.snapRight = -1;
|
||||||
|
if (newClipLeft != clipLeft) {
|
||||||
|
const double difference = (newClipLeft - clipLeft);
|
||||||
|
desiredSlideAmount += difference;
|
||||||
|
state.snapLeft =
|
||||||
|
viewInfo.TimeToPosition(newClipLeft, xx);
|
||||||
|
}
|
||||||
|
else if (newClipRight != clipRight) {
|
||||||
|
const double difference = (newClipRight - clipRight);
|
||||||
|
desiredSlideAmount += difference;
|
||||||
|
state.snapRight =
|
||||||
|
viewInfo.TimeToPosition(newClipRight, xx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return desiredSlideAmount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct TemporaryClipRemover {
|
struct TemporaryClipRemover {
|
||||||
TemporaryClipRemover( ClipMoveState &clipMoveState )
|
TemporaryClipRemover( ClipMoveState &clipMoveState )
|
||||||
: state( clipMoveState )
|
: state( clipMoveState )
|
||||||
@@ -514,69 +585,10 @@ UIHandle::Result TimeShiftHandle::Drag
|
|||||||
}
|
}
|
||||||
mClipMoveState.hSlideAmount = 0.0;
|
mClipMoveState.hSlideAmount = 0.0;
|
||||||
|
|
||||||
double desiredSlideAmount;
|
double desiredSlideAmount =
|
||||||
if (mSlideUpDownOnly) {
|
FindDesiredSlideAmount( viewInfo, mRect.x, event, mSnapManager.get(),
|
||||||
desiredSlideAmount = 0.0;
|
mSlideUpDownOnly, mSnapPreferRightEdge, mClipMoveState,
|
||||||
}
|
*mCapturedTrack, *pTrack );
|
||||||
else {
|
|
||||||
desiredSlideAmount =
|
|
||||||
viewInfo.PositionToTime(event.m_x) -
|
|
||||||
viewInfo.PositionToTime(mMouseClickX);
|
|
||||||
double clipLeft = 0, clipRight = 0;
|
|
||||||
|
|
||||||
if (pTrack->GetKind() == Track::Wave) {
|
|
||||||
WaveTrack *const mtw = static_cast<WaveTrack*>(pTrack.get());
|
|
||||||
const double rate = mtw->GetRate();
|
|
||||||
// set it to a sample point
|
|
||||||
desiredSlideAmount = rint(desiredSlideAmount * rate) / rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adjust desiredSlideAmount using SnapManager
|
|
||||||
if (mSnapManager.get()) {
|
|
||||||
if (mClipMoveState.capturedClip) {
|
|
||||||
clipLeft = mClipMoveState.capturedClip->GetStartTime()
|
|
||||||
+ desiredSlideAmount;
|
|
||||||
clipRight = mClipMoveState.capturedClip->GetEndTime()
|
|
||||||
+ desiredSlideAmount;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
clipLeft = mCapturedTrack->GetStartTime() + desiredSlideAmount;
|
|
||||||
clipRight = mCapturedTrack->GetEndTime() + desiredSlideAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto results =
|
|
||||||
mSnapManager->Snap(mCapturedTrack.get(), clipLeft, false);
|
|
||||||
auto newClipLeft = results.outTime;
|
|
||||||
results =
|
|
||||||
mSnapManager->Snap(mCapturedTrack.get(), clipRight, false);
|
|
||||||
auto newClipRight = results.outTime;
|
|
||||||
|
|
||||||
// Only one of them is allowed to snap
|
|
||||||
if (newClipLeft != clipLeft && newClipRight != clipRight) {
|
|
||||||
// Un-snap the un-preferred edge
|
|
||||||
if (mSnapPreferRightEdge)
|
|
||||||
newClipLeft = clipLeft;
|
|
||||||
else
|
|
||||||
newClipRight = clipRight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Take whichever one snapped (if any) and compute the NEW desiredSlideAmount
|
|
||||||
mClipMoveState.snapLeft = -1;
|
|
||||||
mClipMoveState.snapRight = -1;
|
|
||||||
if (newClipLeft != clipLeft) {
|
|
||||||
const double difference = (newClipLeft - clipLeft);
|
|
||||||
desiredSlideAmount += difference;
|
|
||||||
mClipMoveState.snapLeft =
|
|
||||||
viewInfo.TimeToPosition(newClipLeft, mRect.x);
|
|
||||||
}
|
|
||||||
else if (newClipRight != clipRight) {
|
|
||||||
const double difference = (newClipRight - clipRight);
|
|
||||||
desiredSlideAmount += difference;
|
|
||||||
mClipMoveState.snapRight =
|
|
||||||
viewInfo.TimeToPosition(newClipRight, mRect.x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scroll during vertical drag.
|
// Scroll during vertical drag.
|
||||||
// EnsureVisible(pTrack); //vvv Gale says this has problems on Linux, per bug 393 thread. Revert for 2.0.2.
|
// EnsureVisible(pTrack); //vvv Gale says this has problems on Linux, per bug 393 thread. Revert for 2.0.2.
|
||||||
@@ -682,7 +694,7 @@ UIHandle::Result TimeShiftHandle::Drag
|
|||||||
}
|
}
|
||||||
// Make the offset permanent; start from a "clean slate"
|
// Make the offset permanent; start from a "clean slate"
|
||||||
if( ok ) {
|
if( ok ) {
|
||||||
mMouseClickX = event.m_x;
|
mClipMoveState.mMouseClickX = event.m_x;
|
||||||
if (mClipMoveState.capturedClipIsSelection) {
|
if (mClipMoveState.capturedClipIsSelection) {
|
||||||
// Slide the selection, too
|
// Slide the selection, too
|
||||||
viewInfo.selectedRegion.move( slide );
|
viewInfo.selectedRegion.move( slide );
|
||||||
@@ -697,7 +709,7 @@ UIHandle::Result TimeShiftHandle::Drag
|
|||||||
mDidSlideVertically = true;
|
mDidSlideVertically = true;
|
||||||
|
|
||||||
// Make the offset permanent; start from a "clean slate"
|
// Make the offset permanent; start from a "clean slate"
|
||||||
mMouseClickX = event.m_x;
|
mClipMoveState.mMouseClickX = event.m_x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not done yet, check for horizontal movement.
|
// Not done yet, check for horizontal movement.
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ struct ClipMoveState {
|
|||||||
TrackClipArray capturedClipArray {};
|
TrackClipArray capturedClipArray {};
|
||||||
wxInt64 snapLeft { -1 }, snapRight { -1 };
|
wxInt64 snapLeft { -1 }, snapRight { -1 };
|
||||||
|
|
||||||
|
int mMouseClickX{};
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
capturedClip = nullptr;
|
capturedClip = nullptr;
|
||||||
@@ -38,6 +40,7 @@ struct ClipMoveState {
|
|||||||
hSlideAmount = 0;
|
hSlideAmount = 0;
|
||||||
capturedClipArray.clear();
|
capturedClipArray.clear();
|
||||||
snapLeft = snapRight = -1;
|
snapLeft = snapRight = -1;
|
||||||
|
mMouseClickX = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -108,8 +111,6 @@ private:
|
|||||||
|
|
||||||
bool mSnapPreferRightEdge{};
|
bool mSnapPreferRightEdge{};
|
||||||
|
|
||||||
int mMouseClickX{};
|
|
||||||
|
|
||||||
// Handles snapping the selection boundaries or track boundaries to
|
// Handles snapping the selection boundaries or track boundaries to
|
||||||
// line up with existing tracks or labels. mSnapLeft and mSnapRight
|
// line up with existing tracks or labels. mSnapLeft and mSnapRight
|
||||||
// are the horizontal index of pixels to display user feedback
|
// are the horizontal index of pixels to display user feedback
|
||||||
|
|||||||
Reference in New Issue
Block a user