From e4c600df87d5efe0857fdb5c2d87961329ed6ab0 Mon Sep 17 00:00:00 2001 From: Nick Mazuk Date: Thu, 23 Sep 2021 18:31:06 -0700 Subject: [PATCH 1/2] align left margins of staves --- src/engraving/libmscore/system.cpp | 109 ++++++++++++++++++----------- src/engraving/libmscore/system.h | 6 +- src/engraving/style/styledef.cpp | 1 + src/engraving/style/styledef.h | 1 + 4 files changed, 77 insertions(+), 40 deletions(-) diff --git a/src/engraving/libmscore/system.cpp b/src/engraving/libmscore/system.cpp index b2aa213d4f8d1..b2e09fdc1d10c 100644 --- a/src/engraving/libmscore/system.cpp +++ b/src/engraving/libmscore/system.cpp @@ -254,53 +254,41 @@ void System::adjustStavesNumber(int nstaves) } //--------------------------------------------------------- -// layoutSystem -/// Layout the System +// systemNamesWidth //--------------------------------------------------------- -void System::layoutSystem(const LayoutContext& ctx, qreal xo1, const bool isFirstSystem, bool firstSystemIndent) -{ - if (_staves.empty()) { // ignore vbox - return; - } +qreal System::systemNamesWidth(bool getTotalWidth) { + qreal instrumentNameOffset = score()->styleP(Sid::instrumentNameOffset); - static const Spatium instrumentNameOffset(1.0); // TODO: make style value + qreal namesWidth = 0.0; - int nstaves = _staves.size(); - - //--------------------------------------------------- - // find x position of staves - //--------------------------------------------------- - qreal xoff2 = 0.0; // x offset for instrument name - - for (const Part* p : score()->parts()) { - if (firstVisibleSysStaffOfPart(p) < 0) { + for (const Part* part : score()->parts()) { + if (!getTotalWidth && firstVisibleSysStaffOfPart(part) < 0) { continue; } - for (int staffIdx = firstSysStaffOfPart(p); staffIdx <= lastSysStaffOfPart(p); ++staffIdx) { + for (int staffIdx = firstSysStaffOfPart(part); staffIdx <= lastSysStaffOfPart(part); ++staffIdx) { SysStaff* staff = this->staff(staffIdx); if (!staff) { continue; } - for (InstrumentName* t : qAsConst(staff->instrumentNames)) { - t->layout(); - qreal w = t->width() + point(instrumentNameOffset); - if (w > xoff2) { - xoff2 = w; - } + for (InstrumentName* name : qAsConst(staff->instrumentNames)) { + name->layout(); + qreal width = name->width() + instrumentNameOffset; + namesWidth = qMax(namesWidth, width); } } } - if (isFirstSystem && firstSystemIndent) { - xoff2 = qMax(xoff2, styleP(Sid::firstSystemIndentationValue) * mag()); - } + return namesWidth; +} - //--------------------------------------------------- - // create brackets - //--------------------------------------------------- +//--------------------------------------------------------- +// layoutBrackets +//--------------------------------------------------------- +qreal System::layoutBrackets(const LayoutContext& ctx) { + int nstaves = _staves.size(); int columns = getBracketsColumnsCount(); #if (!defined (_MSCVER) && !defined (_MSC_VER)) @@ -336,19 +324,62 @@ void System::layoutSystem(const LayoutContext& ctx, qreal xo1, const bool isFirs delete b; } - //--------------------------------------------------- - // layout SysStaff and StaffLines - //--------------------------------------------------- - - _leftMargin = xoff2; + qreal totalBracketWidth = 0.0; qreal bd = score()->styleP(Sid::bracketDistance); if (!_brackets.empty()) { for (int w : bracketWidth) { - _leftMargin += w + bd; + totalBracketWidth += w + bd; } } + return totalBracketWidth; +} + +//--------------------------------------------------------- +// totalBracketOffset +//--------------------------------------------------------- + +qreal System::totalBracketOffset(const LayoutContext& ctx) { + bool hideEmptyStaves = score()->styleB(Sid::hideEmptyStaves); + score()->setStyleValue(Sid::hideEmptyStaves, false); + + qreal offset = layoutBrackets(ctx); + + score()->setStyleValue(Sid::hideEmptyStaves, hideEmptyStaves); + return offset; +} + +//--------------------------------------------------------- +// layoutSystem +/// Layout the System +//--------------------------------------------------------- + +void System::layoutSystem(const LayoutContext& ctx, qreal xo1, const bool isFirstSystem, bool firstSystemIndent) +{ + if (_staves.empty()) { // ignore vbox + return; + } + + qreal instrumentNameOffset = score()->styleP(Sid::instrumentNameOffset); + + int nstaves = _staves.size(); + + //--------------------------------------------------- + // find x position of staves + //--------------------------------------------------- + qreal maxNamesWidth = systemNamesWidth(true); + + if (isFirstSystem && firstSystemIndent) { + maxNamesWidth = qMax(maxNamesWidth, styleP(Sid::firstSystemIndentationValue) * mag()); + } + + qreal maxBracketsWidth = totalBracketOffset(ctx); + qreal bracketsWidth = layoutBrackets(ctx); + qreal bracketWidthDifference = maxBracketsWidth - bracketsWidth; + _leftMargin = maxNamesWidth + bracketWidthDifference + instrumentNameOffset; + qreal nameOffset = _leftMargin - bracketsWidth - instrumentNameOffset; + int nVisible = 0; for (int staffIdx = 0; staffIdx < nstaves; ++staffIdx) { SysStaff* s = _staves[staffIdx]; @@ -386,14 +417,14 @@ void System::layoutSystem(const LayoutContext& ctx, qreal xo1, const bool isFirs for (InstrumentName* t : qAsConst(s->instrumentNames)) { switch (int(t->align()) & int(Align::HMASK)) { case int(Align::LEFT): - t->rxpos() = 0; + t->rxpos() = t->width() - maxNamesWidth + nameOffset + xo1; break; case int(Align::HCENTER): - t->rxpos() = (xoff2 - point(instrumentNameOffset) + xo1) * .5; + t->rxpos() = (t->width() - maxNamesWidth) / 2 + nameOffset + xo1; break; case int(Align::RIGHT): default: - t->rxpos() = xoff2 - point(instrumentNameOffset) + xo1; + t->rxpos() = nameOffset + xo1; break; } } diff --git a/src/engraving/libmscore/system.h b/src/engraving/libmscore/system.h index c66f163383b81..6dc9946101f12 100644 --- a/src/engraving/libmscore/system.h +++ b/src/engraving/libmscore/system.h @@ -126,6 +126,10 @@ class System final : public EngravingItem void setBracketsXPosition(const qreal xOffset); Bracket* createBracket(const mu::engraving::LayoutContext& ctx, Ms::BracketItem* bi, int column, int staffIdx, QList& bl, Measure* measure); + + qreal systemNamesWidth(bool getTotalWidth); + qreal layoutBrackets(const mu::engraving::LayoutContext& ctx); + qreal totalBracketOffset(const mu::engraving::LayoutContext& ctx); public: @@ -154,7 +158,7 @@ class System final : public EngravingItem Page* page() const { return (Page*)parent(); } - void layoutSystem(const mu::engraving::LayoutContext& ctx, qreal, const bool isFirstSystem = false, bool firstSystemIndent = false); + void layoutSystem(const mu::engraving::LayoutContext& ctx, qreal xo1, const bool isFirstSystem = false, bool firstSystemIndent = false); void setMeasureHeight(qreal height); void layoutBracketsVertical(); diff --git a/src/engraving/style/styledef.cpp b/src/engraving/style/styledef.cpp index f18c8f4ee341c..2585a8024480c 100644 --- a/src/engraving/style/styledef.cpp +++ b/src/engraving/style/styledef.cpp @@ -58,6 +58,7 @@ const std::array StyleDef::styleValue { Sid::staffUpperBorder, "staffUpperBorder", Spatium(7.0) }, { Sid::staffLowerBorder, "staffLowerBorder", Spatium(7.0) }, { Sid::staffDistance, "staffDistance", Spatium(6.5) }, + { Sid::instrumentNameOffset, "instrumentNameOffset", Spatium(1.0) }, { Sid::akkoladeDistance, "akkoladeDistance", Spatium(6.5) }, { Sid::minSystemDistance, "minSystemDistance", Spatium(8.5) }, { Sid::maxSystemDistance, "maxSystemDistance", Spatium(15.0) }, diff --git a/src/engraving/style/styledef.h b/src/engraving/style/styledef.h index 13e7732ca08f1..471fc5c83e6ac 100644 --- a/src/engraving/style/styledef.h +++ b/src/engraving/style/styledef.h @@ -73,6 +73,7 @@ enum class Sid { staffUpperBorder, staffLowerBorder, staffDistance, + instrumentNameOffset, akkoladeDistance, minSystemDistance, maxSystemDistance, From d9b54c160989b5075c43f9cf9829a4b0d4ff29a7 Mon Sep 17 00:00:00 2001 From: Nick Mazuk Date: Fri, 24 Sep 2021 10:29:21 -0700 Subject: [PATCH 2/2] align system to margin (ignoring brackets) Remove unused code path fix codestyle --- src/engraving/libmscore/system.cpp | 27 ++++++++++++++++++--------- src/engraving/libmscore/system.h | 4 ++-- src/engraving/style/styledef.cpp | 3 ++- src/engraving/style/styledef.h | 1 + 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/engraving/libmscore/system.cpp b/src/engraving/libmscore/system.cpp index b2e09fdc1d10c..fced0d8eb63d7 100644 --- a/src/engraving/libmscore/system.cpp +++ b/src/engraving/libmscore/system.cpp @@ -257,15 +257,13 @@ void System::adjustStavesNumber(int nstaves) // systemNamesWidth //--------------------------------------------------------- -qreal System::systemNamesWidth(bool getTotalWidth) { +qreal System::systemNamesWidth() +{ qreal instrumentNameOffset = score()->styleP(Sid::instrumentNameOffset); qreal namesWidth = 0.0; for (const Part* part : score()->parts()) { - if (!getTotalWidth && firstVisibleSysStaffOfPart(part) < 0) { - continue; - } for (int staffIdx = firstSysStaffOfPart(part); staffIdx <= lastSysStaffOfPart(part); ++staffIdx) { SysStaff* staff = this->staff(staffIdx); if (!staff) { @@ -287,7 +285,8 @@ qreal System::systemNamesWidth(bool getTotalWidth) { // layoutBrackets //--------------------------------------------------------- -qreal System::layoutBrackets(const LayoutContext& ctx) { +qreal System::layoutBrackets(const LayoutContext& ctx) +{ int nstaves = _staves.size(); int columns = getBracketsColumnsCount(); @@ -340,7 +339,8 @@ qreal System::layoutBrackets(const LayoutContext& ctx) { // totalBracketOffset //--------------------------------------------------------- -qreal System::totalBracketOffset(const LayoutContext& ctx) { +qreal System::totalBracketOffset(const LayoutContext& ctx) +{ bool hideEmptyStaves = score()->styleB(Sid::hideEmptyStaves); score()->setStyleValue(Sid::hideEmptyStaves, false); @@ -368,7 +368,7 @@ void System::layoutSystem(const LayoutContext& ctx, qreal xo1, const bool isFirs //--------------------------------------------------- // find x position of staves //--------------------------------------------------- - qreal maxNamesWidth = systemNamesWidth(true); + qreal maxNamesWidth = systemNamesWidth(); if (isFirstSystem && firstSystemIndent) { maxNamesWidth = qMax(maxNamesWidth, styleP(Sid::firstSystemIndentationValue) * mag()); @@ -377,8 +377,17 @@ void System::layoutSystem(const LayoutContext& ctx, qreal xo1, const bool isFirs qreal maxBracketsWidth = totalBracketOffset(ctx); qreal bracketsWidth = layoutBrackets(ctx); qreal bracketWidthDifference = maxBracketsWidth - bracketsWidth; - _leftMargin = maxNamesWidth + bracketWidthDifference + instrumentNameOffset; - qreal nameOffset = _leftMargin - bracketsWidth - instrumentNameOffset; + qreal nameOffset = 0.0; + if (maxNamesWidth == 0.0) { + if (score()->styleB(Sid::alignSystemToMargin)) { + _leftMargin = bracketWidthDifference; + } else { + _leftMargin = maxBracketsWidth; + } + } else { + _leftMargin = maxNamesWidth + bracketWidthDifference + instrumentNameOffset; + nameOffset = _leftMargin - bracketsWidth - instrumentNameOffset; + } int nVisible = 0; for (int staffIdx = 0; staffIdx < nstaves; ++staffIdx) { diff --git a/src/engraving/libmscore/system.h b/src/engraving/libmscore/system.h index 6dc9946101f12..e6f5cb46a3244 100644 --- a/src/engraving/libmscore/system.h +++ b/src/engraving/libmscore/system.h @@ -126,8 +126,8 @@ class System final : public EngravingItem void setBracketsXPosition(const qreal xOffset); Bracket* createBracket(const mu::engraving::LayoutContext& ctx, Ms::BracketItem* bi, int column, int staffIdx, QList& bl, Measure* measure); - - qreal systemNamesWidth(bool getTotalWidth); + + qreal systemNamesWidth(); qreal layoutBrackets(const mu::engraving::LayoutContext& ctx); qreal totalBracketOffset(const mu::engraving::LayoutContext& ctx); diff --git a/src/engraving/style/styledef.cpp b/src/engraving/style/styledef.cpp index 2585a8024480c..e63a672c74c25 100644 --- a/src/engraving/style/styledef.cpp +++ b/src/engraving/style/styledef.cpp @@ -58,10 +58,11 @@ const std::array StyleDef::styleValue { Sid::staffUpperBorder, "staffUpperBorder", Spatium(7.0) }, { Sid::staffLowerBorder, "staffLowerBorder", Spatium(7.0) }, { Sid::staffDistance, "staffDistance", Spatium(6.5) }, - { Sid::instrumentNameOffset, "instrumentNameOffset", Spatium(1.0) }, + { Sid::instrumentNameOffset, "instrumentNameOffset", Spatium(1.0) }, { Sid::akkoladeDistance, "akkoladeDistance", Spatium(6.5) }, { Sid::minSystemDistance, "minSystemDistance", Spatium(8.5) }, { Sid::maxSystemDistance, "maxSystemDistance", Spatium(15.0) }, + { Sid::alignSystemToMargin, "alignSystemToMargin", true }, { Sid::enableVerticalSpread, "enableVerticalSpread", false }, { Sid::spreadSystem, "spreadSystem", 2.5 }, diff --git a/src/engraving/style/styledef.h b/src/engraving/style/styledef.h index 471fc5c83e6ac..70fa318c45e65 100644 --- a/src/engraving/style/styledef.h +++ b/src/engraving/style/styledef.h @@ -77,6 +77,7 @@ enum class Sid { akkoladeDistance, minSystemDistance, maxSystemDistance, + alignSystemToMargin, enableVerticalSpread, spreadSystem,