Merge pull request #1285 from MarcSabatella/32441-empty-key
fix #32441: bad layout with empty key signature
This commit is contained in:
commit
957d26e98b
3 changed files with 26 additions and 15 deletions
|
@ -3525,7 +3525,7 @@ qreal Score::computeMinWidth(Segment* fs)
|
|||
}
|
||||
else {
|
||||
// if (pt & (Segment::Type::KeySig | Segment::Type::Clef))
|
||||
bool firstClef = (segmentIdx == 1) && (pt == Segment::Type::Clef);
|
||||
bool firstClef = (pt == Segment::Type::Clef) && (pSeg && pSeg->rtick() == 0);
|
||||
if ((pt & Segment::Type::KeySig) || firstClef)
|
||||
minDistance = qMax(minDistance, clefKeyRightMargin);
|
||||
}
|
||||
|
@ -3601,6 +3601,10 @@ qreal Score::computeMinWidth(Segment* fs)
|
|||
minDistance = styleP(StyleIdx::clefLeftMargin);
|
||||
else if (segType == Segment::Type::StartRepeatBarLine)
|
||||
minDistance = .5 * _spatium;
|
||||
else if (segType == Segment::Type::TimeSig && pt == Segment::Type::Clef) {
|
||||
// missing key signature, but allocate default margin anyhow
|
||||
minDistance = styleP(StyleIdx::keysigLeftMargin);
|
||||
}
|
||||
else if ((segType == Segment::Type::EndBarLine) && segmentIdx) {
|
||||
if (pt == Segment::Type::Clef)
|
||||
minDistance = styleP(StyleIdx::clefBarlineDistance);
|
||||
|
|
|
@ -3165,7 +3165,7 @@ void Measure::layoutX(qreal stretch)
|
|||
minDistance = qMax(minDistance, minNoteDistance);
|
||||
}
|
||||
else {
|
||||
bool firstClef = (segmentIdx == 1) && (pt == Segment::Type::Clef);
|
||||
bool firstClef = (pt == Segment::Type::Clef) && (pSeg && pSeg->rtick() == 0);
|
||||
if ((pt & Segment::Type::KeySig) || firstClef)
|
||||
minDistance = qMax(minDistance, clefKeyRightMargin);
|
||||
}
|
||||
|
@ -3253,6 +3253,10 @@ void Measure::layoutX(qreal stretch)
|
|||
minDistance = score()->styleS(StyleIdx::clefLeftMargin).val() * _spatium;
|
||||
else if (segType == Segment::Type::StartRepeatBarLine)
|
||||
minDistance = .5 * _spatium;
|
||||
else if (segType == Segment::Type::TimeSig && pt == Segment::Type::Clef) {
|
||||
// missing key signature, but allocate default margin anyhow
|
||||
minDistance = score()->styleS(StyleIdx::keysigLeftMargin).val() * _spatium;
|
||||
}
|
||||
else if ((segType == Segment::Type::EndBarLine) && segmentIdx) {
|
||||
if (pt == Segment::Type::Clef)
|
||||
minDistance = score()->styleS(StyleIdx::clefBarlineDistance).val() * _spatium;
|
||||
|
@ -3484,8 +3488,7 @@ void Measure::layoutX(qreal stretch)
|
|||
continue;
|
||||
Element::Type t = e->type();
|
||||
Rest* rest = static_cast<Rest*>(e);
|
||||
if (((track % VOICES) == 0) &&
|
||||
(t == Element::Type::REPEAT_MEASURE || (t == Element::Type::REST && (isMMRest() || rest->isFullMeasureRest())))) {
|
||||
if (t == Element::Type::REPEAT_MEASURE || (t == Element::Type::REST && (isMMRest() || rest->isFullMeasureRest()))) {
|
||||
//
|
||||
// element has to be centered in free space
|
||||
// x1 - left measure position of free space
|
||||
|
@ -3497,11 +3500,13 @@ void Measure::layoutX(qreal stretch)
|
|||
//
|
||||
qreal x1 = 0.0, x2;
|
||||
Segment* ss = first();
|
||||
for (; ss->segmentType() != Segment::Type::ChordRest; ss = ss->next())
|
||||
;
|
||||
// if (s != first()) {
|
||||
if (ss != first()) {
|
||||
ss = ss->prev();
|
||||
Segment* ps = nullptr;
|
||||
for (; ss->segmentType() != Segment::Type::ChordRest; ss = ss->next()) {
|
||||
if (!ss->isEmpty())
|
||||
ps = ss;
|
||||
}
|
||||
if (ps) {
|
||||
ss = ps;
|
||||
for (int staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) {
|
||||
int track = staffIdx * VOICES;
|
||||
Element* e = ss->element(track);
|
||||
|
@ -3538,10 +3543,13 @@ void Measure::layoutX(qreal stretch)
|
|||
qreal x1 = 0.0;
|
||||
qreal x2 = this->width();
|
||||
Segment* ss = first();
|
||||
for (; ss->segmentType() != Segment::Type::ChordRest; ss = ss->next())
|
||||
;
|
||||
if (ss != first()) {
|
||||
ss = ss->prev();
|
||||
Segment* ps = nullptr;
|
||||
for (; ss->segmentType() != Segment::Type::ChordRest; ss = ss->next()) {
|
||||
if (!ss->isEmpty())
|
||||
ps = ss;
|
||||
}
|
||||
if (ps) {
|
||||
ss = ps;
|
||||
for (int staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) {
|
||||
int track = staffIdx * VOICES;
|
||||
Element* e = ss->element(track);
|
||||
|
@ -3557,7 +3565,7 @@ void Measure::layoutX(qreal stretch)
|
|||
if (ns)
|
||||
x2 = ns->x();
|
||||
|
||||
rest->rxpos() = (x2 - x1 - e->width()) * .5 + x1 - s->x();
|
||||
rest->rxpos() = (x2 - x1 - e->width()) * .5 + x1 - s->x() - e->bbox().x();
|
||||
rest->adjustReadPos();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -591,7 +591,6 @@ void Segment::remove(Element* el)
|
|||
_elist[track] = 0;
|
||||
if (!el->generated())
|
||||
el->staff()->removeKey(tick());
|
||||
empty = false;
|
||||
break;
|
||||
|
||||
case Element::Type::CLEF:
|
||||
|
|
Loading…
Reference in a new issue