fix #271450: double-click to set breaks on frames
This commit is contained in:
parent
903817537c
commit
db751e93ea
1 changed files with 48 additions and 13 deletions
|
@ -3154,7 +3154,7 @@ void Score::cmdPadNoteDecreaseTAB()
|
|||
void Score::cmdToggleLayoutBreak(LayoutBreak::Type type)
|
||||
{
|
||||
// find measure(s)
|
||||
QList<Measure*> ml;
|
||||
QList<MeasureBase*> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue