From 9db075e671de4e336339193980a095d84307aa9d Mon Sep 17 00:00:00 2001 From: bakajikara <102702868+bakajikara@users.noreply.github.com> Date: Fri, 24 Oct 2025 01:30:42 +0900 Subject: [PATCH] Allow ignoring snapped items via Alt key (fixes #28022) --- src/engraving/dom/line.cpp | 11 ++++++----- src/engraving/dom/line.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/engraving/dom/line.cpp b/src/engraving/dom/line.cpp index 6b3f5028112c8..24ff525cd63f4 100644 --- a/src/engraving/dom/line.cpp +++ b/src/engraving/dom/line.cpp @@ -265,7 +265,7 @@ bool LineSegment::edit(EditData& ed) return true; } - undoMoveStartEndAndSnappedItems(moveStart, moveEnd, s1, s2); + undoMoveStartEndAndSnappedItems(ed, moveStart, moveEnd, s1, s2); EditTimeTickAnchors::updateAnchors(this); } @@ -698,7 +698,7 @@ void LineSegment::rebaseAnchors(EditData& ed, Grip grip) PointF oldStartPos = line()->linePos(Grip::START, &sys); PointF oldEndPos = line()->linePos(Grip::END, &sys); - undoMoveStartEndAndSnappedItems(true, true, seg1, seg2); + undoMoveStartEndAndSnappedItems(ed, true, true, seg1, seg2); rebaseOffsetsOnAnchorChanged(Grip::START, oldStartPos, sys); rebaseOffsetsOnAnchorChanged(Grip::END, oldEndPos, sys); @@ -855,12 +855,13 @@ double LineSegment::absoluteFromSpatium(const Spatium& sp) const return line()->absoluteFromSpatium(sp); } -void LineSegment::undoMoveStartEndAndSnappedItems(bool moveStart, bool moveEnd, Segment* s1, Segment* s2) +void LineSegment::undoMoveStartEndAndSnappedItems(EditData& ed, bool moveStart, bool moveEnd, Segment* s1, Segment* s2) { + bool moveSnapped = !(ed.modifiers & AltModifier); SLine* thisLine = line(); if (moveStart) { Fraction tickDiff = s1->tick() - thisLine->tick(); - if (EngravingItem* itemSnappedBefore = ldata()->itemSnappedBefore()) { + if (EngravingItem* itemSnappedBefore = ldata()->itemSnappedBefore(); itemSnappedBefore && moveSnapped) { if (itemSnappedBefore->isTextBase()) { MoveElementAnchors::moveSegment(itemSnappedBefore, s1, tickDiff); } else if (itemSnappedBefore->isLineSegment()) { @@ -873,7 +874,7 @@ void LineSegment::undoMoveStartEndAndSnappedItems(bool moveStart, bool moveEnd, } if (moveEnd) { Fraction tickDiff = s2->tick() - thisLine->tick2(); - if (EngravingItem* itemSnappedAfter = thisLine->backSegment()->ldata()->itemSnappedAfter()) { + if (EngravingItem* itemSnappedAfter = thisLine->backSegment()->ldata()->itemSnappedAfter(); itemSnappedAfter && moveSnapped) { if (itemSnappedAfter->isTextBase()) { MoveElementAnchors::moveSegment(itemSnappedAfter, s2, tickDiff); } else if (itemSnappedAfter->isLineSegment()) { diff --git a/src/engraving/dom/line.h b/src/engraving/dom/line.h index 5d7173b30baa4..a696b15657be1 100644 --- a/src/engraving/dom/line.h +++ b/src/engraving/dom/line.h @@ -81,7 +81,7 @@ class LineSegment : public SpannerSegment virtual void rebaseOffsetsOnAnchorChanged(Grip grip, const PointF& oldPos, System* sys); private: - void undoMoveStartEndAndSnappedItems(bool moveStart, bool moveEnd, Segment* s1, Segment* s2); + void undoMoveStartEndAndSnappedItems(EditData& ed, bool moveStart, bool moveEnd, Segment* s1, Segment* s2); PointF leftAnchorPosition(const double& systemPositionY) const; PointF rightAnchorPosition(const double& systemPositionY) const;