From db751e93ead7b16d8ab59087da9368c083ce089d Mon Sep 17 00:00:00 2001 From: MarcSabatella Date: Wed, 18 Apr 2018 14:53:23 -0600 Subject: [PATCH] fix #271450: double-click to set breaks on frames --- libmscore/cmd.cpp | 61 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/libmscore/cmd.cpp b/libmscore/cmd.cpp index 5c005ced27..17ee0f266a 100644 --- a/libmscore/cmd.cpp +++ b/libmscore/cmd.cpp @@ -3154,7 +3154,7 @@ void Score::cmdPadNoteDecreaseTAB() void Score::cmdToggleLayoutBreak(LayoutBreak::Type type) { // find measure(s) - QList ml; + QList mbl; if (selection().isRange()) { Measure* startMeasure = nullptr; Measure* endMeasure = nullptr; @@ -3164,33 +3164,68 @@ void Score::cmdToggleLayoutBreak(LayoutBreak::Type type) return; #if 1 // toggle break on the last measure of the range - ml.append(endMeasure); + mbl.append(endMeasure); // if more than one measure selected, // also toggle break *before* the range (to try to fit selection on a single line) - if (startMeasure != endMeasure && startMeasure->prevMeasure()) - ml.append(startMeasure->prevMeasure()); + if (startMeasure != endMeasure && startMeasure->prev()) + mbl.append(startMeasure->prev()); #else // toggle breaks throughout the selection for (Measure* m = startMeasure; m; m = m->nextMeasure()) { - ml.append(m); + mbl.append(m); if (m == endMeasure) break; } #endif } else { + MeasureBase* mb = nullptr; for (Element* el : selection().elements()) { - Measure* measure = toMeasure(el->findMeasure()); - if (measure) - ml.append(measure); + switch (el->type()) { + case ElementType::HBOX: + case ElementType::VBOX: + case ElementType::TBOX: + mb = toMeasureBase(el); + break; + default: { + // find measure + Measure* measure = toMeasure(el->findMeasure()); + // if measure is mmrest, then propagate to last original measure + if (measure) + mb = measure->isMMRest() ? measure->mmRestLast() : measure; + } + } } + if (mb) + mbl.append(mb); } // toggle the breaks - for (Measure* measure : ml) { - // if measure is mm rest, then propagate to last original measure - measure = measure->isMMRest() ? measure->mmRestLast() : measure; - if (measure) - measure->undoSetBreak(!measure->lineBreak(), type); + for (MeasureBase* mb: mbl) { + if (mb) { + bool val = false; + switch (type) { + case LayoutBreak::Type::LINE: + val = !mb->lineBreak(); + mb->undoSetBreak(val, type); + // remove page break if appropriate + if (val && mb->pageBreak()) + mb->undoSetBreak(false, LayoutBreak::Type::PAGE); + break; + case LayoutBreak::Type::PAGE: + val = !mb->pageBreak(); + mb->undoSetBreak(val, type); + // remove line break if appropriate + if (val && mb->lineBreak()) + mb->undoSetBreak(false, LayoutBreak::Type::LINE); + break; + case LayoutBreak::Type::SECTION: + val = !mb->sectionBreak(); + mb->undoSetBreak(val, type); + break; + default: + break; + } + } } }