Skip to content

Commit

Permalink
Fixes bug with pasting of TCOs (LMMS#5840) (LMMS#5847)
Browse files Browse the repository at this point in the history
* Fixes bug with pasting of TCOs (LMMS#5840)

	TimePos::quantize works for negative values, but ends
up snapping the TCO to the opposite direction. This is because the
snapping happens in the direction of the origin, which is left for
positive values and right for negative values.
	That wasn't accounted for in the pasteSelection method
and we ended up with wrong positions when pasting before the
TCO(s) we copied.
	This PR fixes the issue by ensuring that we snap in the same direction when halfway through an interval, regardless of negative or positive offset.

* Fixes a calculation on TimePos::quantize

	Since we are working with integers, using "offset /
(interval/2)" would be problematic if interval was odd. We instead
multiply both sides by two and use "(2 * offset) / interval" to obtain
the result for snapUp.
  • Loading branch information
IanCaio committed Mar 28, 2021
1 parent ea4bac2 commit c1bcb65
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
7 changes: 6 additions & 1 deletion src/core/TimePos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,12 @@ TimePos TimePos::quantize(float bars) const
//Offset from the lower position
int offset = m_ticks % interval;
//1 if we should snap up, 0 if we shouldn't
int snapUp = offset / (interval / 2);
// 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)
? 0
: (2 * offset) / interval;

return (lowPos + snapUp) * interval;
}
Expand Down
2 changes: 1 addition & 1 deletion src/gui/widgets/TrackContentWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ bool TrackContentWidget::pasteSelection( TimePos tcoPos, const QMimeData * md, b
// All patterns should be offset the same amount as the grabbed pattern
TimePos offset = TimePos(tcoPos - grabbedTCOPos);
// Users expect clips to "fall" backwards, so bias the offset
offset = offset - TimePos::ticksPerBar() * snapSize / 2;
offset -= TimePos::ticksPerBar() * snapSize / 2;
// The offset is quantized (rather than the positions) to preserve fine adjustments
offset = offset.quantize(snapSize);

Expand Down

0 comments on commit c1bcb65

Please sign in to comment.