Skip to content

Commit

Permalink
add padding inside parentheses for bracketed accidentals
Browse files Browse the repository at this point in the history
  • Loading branch information
ecstrema committed Dec 4, 2020
1 parent c4fb8f5 commit 4cc54da
Show file tree
Hide file tree
Showing 22 changed files with 5,667 additions and 24 deletions.
69 changes: 63 additions & 6 deletions libmscore/accidental.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -346,11 +346,10 @@ void Accidental::layout()
{
el.clear();

QRectF r;
// TODO: remove Accidental in layout()
// don't show accidentals for tab or slash notation
if (onTabStaff() || (note() && note()->fixed())) {
setbbox(r);
setbbox(QRectF());
return;
}

Expand All @@ -359,9 +358,67 @@ void Accidental::layout()
m *= score()->styleD(Sid::smallNoteMag);
setMag(m);

m = magS();
// if the accidental is standard (doubleflat, flat, natural, sharp or double sharp)
// and it has either no bracket or parentheses, then we have glyphs straight from smufl.
if (_bracket == AccidentalBracket::NONE
|| (_bracket == AccidentalBracket::PARENTHESIS
&& (_accidentalType == AccidentalType::FLAT
|| _accidentalType == AccidentalType::NATURAL
|| _accidentalType == AccidentalType::SHARP
|| _accidentalType == AccidentalType::SHARP2
|| _accidentalType == AccidentalType::FLAT2))) {
layoutSingleGlyphAccidental();
}
else {
layoutMultiGlyphAccidental();
}
}

void Accidental::layoutSingleGlyphAccidental()
{
QRectF r;

SymId s = symbol();
if (_bracket == AccidentalBracket::PARENTHESIS) {
switch (_accidentalType) {
case AccidentalType::FLAT2:
s = SymId::accidentalDoubleFlatParens;
break;
case AccidentalType::FLAT:
s = SymId::accidentalFlatParens;
break;
case AccidentalType::NATURAL:
s = SymId::accidentalNaturalParens;
break;
case AccidentalType::SHARP:
s = SymId::accidentalSharpParens;
break;
case AccidentalType::SHARP2:
s = SymId::accidentalDoubleSharpParens;
break;
default:
break;
}
if (!score()->scoreFont()->isValid(s)) {
layoutMultiGlyphAccidental();
return;
}
}

SymElement e(s, 0.0, 0.0);
el.append(e);
r |= symBbox(s);
setbbox(r);
}


void Accidental::layoutMultiGlyphAccidental()
{
qreal margin = score()->styleP(Sid::bracketedAccidentalPadding);
QRectF r;
qreal x = 0.0;

// should always be true
if (_bracket != AccidentalBracket::NONE) {
SymId id = SymId::noSym;
switch (_bracket) {
Expand All @@ -380,16 +437,17 @@ void Accidental::layout()
SymElement se(id, 0.0, _bracket == AccidentalBracket::BRACE ? spatium() * 0.4 : 0.0);
el.append(se);
r |= symBbox(id);
x += symAdvance(id);
x += symAdvance(id) + margin;
}

SymId s = symbol();
SymElement e(s, x, 0.0);
el.append(e);
r |= symBbox(s).translated(x, 0.0);

// should always be true
if (_bracket != AccidentalBracket::NONE) {
x += symAdvance(s);
x += symAdvance(s) + margin;
SymId id = SymId::noSym;
switch (_bracket) {
case AccidentalBracket::PARENTHESIS:
Expand Down Expand Up @@ -588,4 +646,3 @@ QString Accidental::accessibleInfo() const
}

}

3 changes: 2 additions & 1 deletion libmscore/accidental.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ class Accidental final : public Element {
bool acceptDrop(EditData&) const override;
Element* drop(EditData&) override;
void layout() override;
void layoutMultiGlyphAccidental();
void layoutSingleGlyphAccidental();
void draw(QPainter*) const override;
bool isEditable() const override { return true; }
void startEdit(EditData&) override { setGenerated(false); }
Expand Down Expand Up @@ -138,4 +140,3 @@ Q_DECLARE_METATYPE(Ms::AccidentalRole);


#endif

56 changes: 43 additions & 13 deletions libmscore/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -759,7 +759,7 @@ static bool resolveAccidentals(AcEl* left, AcEl* right, qreal& lx, qreal pd, qre
// layoutAccidental
//---------------------------------------------------------

static qreal layoutAccidental(AcEl* me, AcEl* above, AcEl* below, qreal colOffset, QVector<Note*>& leftNotes, qreal pnd, qreal pd, qreal sp)
static QPair<qreal, qreal> layoutAccidental(AcEl* me, AcEl* above, AcEl* below, qreal colOffset, QVector<Note*>& leftNotes, qreal pnd, qreal pd, qreal sp, bool forceLedgerLineSpace = false)
{
qreal lx = colOffset;
Accidental* acc = me->note->accidental();
Expand All @@ -768,8 +768,8 @@ static qreal layoutAccidental(AcEl* me, AcEl* above, AcEl* below, qreal colOffse
pd *= mag;

// extra space for ledger lines
if (me->line <= -2 || me->line >= me->note->staff()->lines(me->note->chord()->tick()) * 2)
lx = qMin(lx, -0.2 * sp);
if (forceLedgerLineSpace || me->line <= -2 || me->line >= me->note->staff()->lines(me->note->chord()->tick()) * 2)
lx = qMin(lx, -acc->staff()->spatium(acc->tick()) * acc->score()->styleS(Sid::ledgerLineLength).val());

// clear left notes
int lns = leftNotes.size();
Expand Down Expand Up @@ -804,7 +804,7 @@ static qreal layoutAccidental(AcEl* me, AcEl* above, AcEl* below, qreal colOffse
else
me->x = lx - pnd - acc->width() - acc->bbox().x();

return me->x;
return QPair<qreal, qreal> (me->x, me->x + me->width);
}

//---------------------------------------------------------
Expand Down Expand Up @@ -1011,6 +1011,7 @@ void Score::layoutChords3(std::vector<Note*>& notes, const Staff* staff, Segment
// starting to the left of the octave columns

qreal minX = 0.0;
qreal maxX = 0.0;
int columnTop[7] = { -1, -1, -1, -1, -1, -1, -1 };

// find columns of octaves
Expand Down Expand Up @@ -1094,24 +1095,53 @@ void Score::layoutChords3(std::vector<Note*>& notes, const Staff* staff, Segment
if (nAcc > 1)
std::sort(umi.begin(), umi.end());

bool alignLeft = score()->styleB(Sid::alignAccidentalsLeft);

// lay out columns
for (int i = 0; i < nColumns; ++i) {
int pc = column[i];

// determine if an accidental gets shifted left because of a ledger line
// because if that's the case, they should all be shifted left
bool forceLedgerLineSpace = false;
if (!i) { // only check for first column
for (int j = columnBottom[pc]; j != -1; j = aclist[j].next) {
AcEl* me = &aclist[j];
if (me->line <= -2 || me->line >= me->note->staff()->lines(me->note->chord()->tick()) * 2) {
forceLedgerLineSpace = true;
break;
}
}
}
AcEl* below = 0;
// lay out accidentals
for (int j = columnBottom[pc]; j != -1; j = aclist[j].next) {
qreal x = layoutAccidental(&aclist[j], 0, below, colOffset, leftNotes, pnd, pd, sp);
minX = qMin(minX, x);
QPair<qreal, qreal> x = layoutAccidental(&aclist[j], 0, below, colOffset, leftNotes, pnd, pd, sp, forceLedgerLineSpace);
minX = qMin(minX, x.first);
maxX = qMin(maxX, x.second);
below = &aclist[j];
}
// align within column
int next = -1;
for (int j = columnBottom[pc]; j != -1; j = next) {
next = aclist[j].next;
if (next != -1 && aclist[j].line == aclist[next].line)
continue;
aclist[j].x = minX;

if (alignLeft) {
int next = -1;
for (int j = columnBottom[pc]; j != -1; j = next) {
AcEl current = aclist[j];
next = current.next;
if (next != -1 && current.line == aclist[next].line)
continue;
current.x = minX;
}
}
else {
int next = -1;
for (int j = columnBottom[pc]; j != -1; j = next) {
AcEl current = aclist[j];
next = current.next;
if (next != -1 && current.line == aclist[next].line)
continue;
current.x = maxX - current.width;
}
}
// move to next column
colOffset = minX;
}
Expand Down
2 changes: 2 additions & 0 deletions libmscore/style.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ static const StyleType styleTypes[] {
{ Sid::ledgerLineLength, "ledgerLineLength", Spatium(0.35) }, // notehead width + this value
{ Sid::accidentalDistance, "accidentalDistance", Spatium(0.22) },
{ Sid::accidentalNoteDistance, "accidentalNoteDistance", Spatium(0.25) },
{ Sid::bracketedAccidentalPadding, "bracketedAccidentalPadding", Spatium(0.175) }, // Padding inside parentheses for bracketed accidentals
{ Sid::alignAccidentalsLeft, "alignAccidentalsLeft", QVariant(false) }, // When laid out in columns, whether accidentals align left or right. Musescore <= 3.5 uses left alignment.

{ Sid::beamWidth, "beamWidth", Spatium(0.5) }, // was 0.48
{ Sid::beamDistance, "beamDistance", QVariant(0.5) },
Expand Down
2 changes: 2 additions & 0 deletions libmscore/style.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@ enum class Sid {
ledgerLineLength,
accidentalDistance,
accidentalNoteDistance,
bracketedAccidentalPadding,
alignAccidentalsLeft,
beamWidth,
beamDistance,
beamMinLen,
Expand Down
13 changes: 11 additions & 2 deletions libmscore/sym.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2877,6 +2877,11 @@ const std::array<const char*, int(SymId::lastSym)+1> Sym::symNames = { {
"ornamentLinePrall", // ornamentPRecompAppoggTrill ?

// additional symbols
"accidentalDoubleFlatParens",
"accidentalFlatParens",
"accidentalNaturalParens",
"accidentalSharpParens",
"accidentalDoubleSharpParens",

"noteLongaUp",
"noteLongaDown",
Expand Down Expand Up @@ -5714,6 +5719,12 @@ const std::array<const char*, int(SymId::lastSym)+1> Sym::symUserNames = { {

// additional symbols

"Parenthesised double flat accidental",
"Parenthesised flat accidental",
"Parenthesised natural accidental",
"Parenthesised sharp accidental",
"Parenthesised double sharp accidental",

"noteLongaUp",
"noteLongaDown",
"noteLongaSquareUp",
Expand Down Expand Up @@ -6853,5 +6864,3 @@ ScoreFont::~ScoreFont()
}

}


6 changes: 6 additions & 0 deletions libmscore/sym.h
Original file line number Diff line number Diff line change
Expand Up @@ -2871,6 +2871,12 @@ enum class SymId {

// additional symbols

accidentalDoubleFlatParens,
accidentalFlatParens,
accidentalNaturalParens,
accidentalSharpParens,
accidentalDoubleSharpParens,

noteLongaUp,
noteLongaDown,
noteLongaSquareUp,
Expand Down
Loading

0 comments on commit 4cc54da

Please sign in to comment.