Skip to content

Commit

Permalink
Fix extending range selection to the left for the first time
Browse files Browse the repository at this point in the history
Resolves: musescore#26720
  • Loading branch information
cbjeukendrup committed Feb 27, 2025
1 parent 0de0784 commit 6aca98a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
10 changes: 7 additions & 3 deletions src/engraving/dom/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -3751,13 +3751,15 @@ 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);
const Fraction tick = m->tick();

if (tick < startSegment->tick()) {
startSegment = m->first(SegmentType::ChordRest);
activeSegmentIsStart = true;
}
if (m == lastMeasure()) {
endSegment = nullptr;
Expand All @@ -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);
Expand All @@ -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;
}
Expand Down
8 changes: 4 additions & 4 deletions src/engraving/dom/select.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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));
}
Expand Down

0 comments on commit 6aca98a

Please sign in to comment.