From cb8badc0bb9e3ee448df1ae6f538ec2777fe7331 Mon Sep 17 00:00:00 2001 From: regulus79 <117475203+regulus79@users.noreply.github.com> Date: Sat, 19 Apr 2025 15:08:15 -0400 Subject: [PATCH] Fix Clip Creation Quantization in Song Editor (#7763) Previously, clicking on a track or dragging in a sample would always create a clip on the closest/previous bar, no matter what the Song Editor's snap size was. This fixes that issue by using the Song Editor's quantization when placing new clips, so for example if the snap size is 1/4 bar, the clip will be added at the closest/previous 1/4 bar mark. --- include/TimePos.h | 2 +- src/core/TimePos.cpp | 4 ++-- src/gui/tracks/SampleTrackView.cpp | 4 +++- src/gui/tracks/TrackContentWidget.cpp | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/TimePos.h b/include/TimePos.h index ab41832b3..02338c6e7 100644 --- a/include/TimePos.h +++ b/include/TimePos.h @@ -70,7 +70,7 @@ public: TimePos( const bar_t bar, const tick_t ticks ); TimePos( const tick_t ticks = 0 ); - TimePos quantize(float) const; + TimePos quantize(float bars, bool forceRoundDown = false) const; TimePos toAbsoluteBar() const { return getBar() * s_ticksPerBar; } TimePos& operator+=(const TimePos& time) diff --git a/src/core/TimePos.cpp b/src/core/TimePos.cpp index 6e5e034fd..6cf657c72 100644 --- a/src/core/TimePos.cpp +++ b/src/core/TimePos.cpp @@ -53,7 +53,7 @@ TimePos::TimePos( const tick_t ticks ) : { } -TimePos TimePos::quantize(float bars) const +TimePos TimePos::quantize(float bars, bool forceRoundDown) const { //The intervals we should snap to, our new position should be a factor of this int interval = s_ticksPerBar * bars; @@ -65,7 +65,7 @@ TimePos TimePos::quantize(float bars) const // Ternary expression is making sure that the snap happens in the direction to // the right even if m_ticks is negative and the offset is exactly half-way // More details on issue #5840 and PR #5847 - int snapUp = ((2 * offset) == -interval) + int snapUp = forceRoundDown || ((2 * offset) == -interval) ? 0 : (2 * offset) / interval; diff --git a/src/gui/tracks/SampleTrackView.cpp b/src/gui/tracks/SampleTrackView.cpp index 064cc5206..2c7fde8c6 100644 --- a/src/gui/tracks/SampleTrackView.cpp +++ b/src/gui/tracks/SampleTrackView.cpp @@ -37,6 +37,7 @@ #include "Knob.h" #include "SampleClip.h" #include "SampleTrackWindow.h" +#include "SongEditor.h" #include "StringPairDrag.h" #include "TrackContainerView.h" #include "TrackLabelButton.h" @@ -211,11 +212,12 @@ void SampleTrackView::dropEvent(QDropEvent *de) ? trackHeadWidth : de->pos().x(); + const float snapSize = getGUI()->songEditor()->m_editor->getSnapSize(); TimePos clipPos = trackContainerView()->fixedClips() ? TimePos(0) : TimePos(((xPos - trackHeadWidth) / trackContainerView()->pixelsPerBar() * TimePos::ticksPerBar()) + trackContainerView()->currentPosition() - ).quantize(1.0); + ).quantize(snapSize, true); auto sClip = static_cast(getTrack()->createClip(clipPos)); if (sClip) { sClip->setSampleFile(value); } diff --git a/src/gui/tracks/TrackContentWidget.cpp b/src/gui/tracks/TrackContentWidget.cpp index 1d39f97b3..397d9feee 100644 --- a/src/gui/tracks/TrackContentWidget.cpp +++ b/src/gui/tracks/TrackContentWidget.cpp @@ -598,8 +598,8 @@ void TrackContentWidget::mousePressEvent( QMouseEvent * me ) so.at( i )->setSelected( false); } getTrack()->addJournalCheckPoint(); - const TimePos pos = getPosition( me->x() ).getBar() * - TimePos::ticksPerBar(); + const float snapSize = getGUI()->songEditor()->m_editor->getSnapSize(); + const TimePos pos = TimePos(getPosition(me->x())).quantize(snapSize, true); getTrack()->createClip(pos); } }