From 6aca98ac9a07b6f1efae00bd64629ea5266c3e59 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Thu, 27 Feb 2025 02:39:14 +0100 Subject: [PATCH 1/2] Fix extending range selection to the left for the first time Resolves: https://github.com/musescore/MuseScore/issues/26720 --- src/engraving/dom/score.cpp | 10 +++++++--- src/engraving/dom/select.cpp | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/engraving/dom/score.cpp b/src/engraving/dom/score.cpp index 575da12bdedd6..fcbb65006566e 100644 --- a/src/engraving/dom/score.cpp +++ b/src/engraving/dom/score.cpp @@ -3647,10 +3647,10 @@ void Score::selectRange(EngravingItem* e, staff_idx_t staffIdx) if (startSegment) { Segment* endSegment = findElementEndSegment(this, e, m_selection.endSegment()); staff_idx_t elementStaffIdx = e->staffIdx(); - Fraction tick = startSegment->tick(); - Fraction etick = endSegment->tick(); - if (endSegment && elementStaffIdx != muse::nidx) { + Fraction tick = startSegment->tick(); + Fraction etick = endSegment->tick(); + m_selection.extendRangeSelection(startSegment, endSegment, elementStaffIdx, tick, etick); m_selection.updateSelectedElements(); @@ -3751,6 +3751,7 @@ bool Score::tryExtendSingleSelectionToRange(EngravingItem* newElement, staff_idx staff_idx_t endStaffIdx = startStaffIdx + 1; track_idx_t activeTrack = newElement->track(); + bool activeSegmentIsStart = false; if (newElement->isMeasure()) { Measure* m = toMeasure(newElement); @@ -3758,6 +3759,7 @@ bool Score::tryExtendSingleSelectionToRange(EngravingItem* newElement, staff_idx if (tick < startSegment->tick()) { startSegment = m->first(SegmentType::ChordRest); + activeSegmentIsStart = true; } if (m == lastMeasure()) { endSegment = nullptr; @@ -3773,6 +3775,7 @@ bool Score::tryExtendSingleSelectionToRange(EngravingItem* newElement, staff_idx Segment* newStartSegment = findElementStartSegment(this, newElement); if (newStartSegment && newStartSegment->tick() < startSegment->tick()) { startSegment = newStartSegment; + activeSegmentIsStart = true; } Segment* newEndSegment = findElementEndSegment(this, newElement, newStartSegment); @@ -3791,6 +3794,7 @@ bool Score::tryExtendSingleSelectionToRange(EngravingItem* newElement, staff_idx m_selection.updateSelectedElements(); m_selection.setActiveTrack(activeTrack); + m_selection.setActiveSegment(activeSegmentIsStart ? startSegment : endSegment); return true; } diff --git a/src/engraving/dom/select.cpp b/src/engraving/dom/select.cpp index bcdb974d2fc30..c7e9e74b20a90 100644 --- a/src/engraving/dom/select.cpp +++ b/src/engraving/dom/select.cpp @@ -1545,7 +1545,7 @@ void Selection::extendRangeSelection(ChordRest* cr) void Selection::extendRangeSelection(Segment* seg, Segment* segAfter, staff_idx_t staffIdx, const Fraction& tick, const Fraction& etick) { - bool activeIsFirst = false; + bool activeSegmentIsStart = false; staff_idx_t activeStaff = m_activeTrack / VOICES; if (staffIdx < m_staffStart) { @@ -1562,18 +1562,18 @@ void Selection::extendRangeSelection(Segment* seg, Segment* segAfter, staff_idx_ if (tick < tickStart()) { m_startSegment = seg; - activeIsFirst = true; + activeSegmentIsStart = true; } else if (etick >= tickEnd()) { m_endSegment = segAfter; } else { if (m_activeSegment == m_startSegment) { m_startSegment = seg; - activeIsFirst = true; + activeSegmentIsStart = true; } else { m_endSegment = segAfter; } } - activeIsFirst ? m_activeSegment = m_startSegment : m_activeSegment = m_endSegment; + m_activeSegment = activeSegmentIsStart ? m_startSegment : m_endSegment; m_score->setSelectionChanged(true); assert(!(m_endSegment && !m_startSegment)); } From 37e4a81a612e217dc8061d9163267ce526f4c0be Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:42:19 +0100 Subject: [PATCH 2/2] Fix "unextending" range selection from two notes to one from left to right Addresses https://github.com/musescore/MuseScore/pull/26788#issuecomment-2689141178 --- src/engraving/dom/select.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engraving/dom/select.cpp b/src/engraving/dom/select.cpp index c7e9e74b20a90..f11c4da39b84d 100644 --- a/src/engraving/dom/select.cpp +++ b/src/engraving/dom/select.cpp @@ -1563,7 +1563,7 @@ void Selection::extendRangeSelection(Segment* seg, Segment* segAfter, staff_idx_ if (tick < tickStart()) { m_startSegment = seg; activeSegmentIsStart = true; - } else if (etick >= tickEnd()) { + } else if (etick > tickEnd()) { m_endSegment = segAfter; } else { if (m_activeSegment == m_startSegment) {