Skip to content

Commit

Permalink
Implements an algorithm for spreading staves/systems over a page to r…
Browse files Browse the repository at this point in the history
…educe empty page at the end of the page.
  • Loading branch information
njvdberg authored and vpereverzev committed Nov 14, 2020
1 parent 8a492c4 commit 4916486
Show file tree
Hide file tree
Showing 14 changed files with 1,318 additions and 340 deletions.
430 changes: 415 additions & 15 deletions libmscore/layout.cpp

Large diffs are not rendered by default.

55 changes: 55 additions & 0 deletions libmscore/layout.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,66 @@
#ifndef __LAYOUT_H__
#define __LAYOUT_H__

#include "system.h"

namespace Ms {

class Segment;
class Page;

//---------------------------------------------------------
// VerticalStretchData
// helper class for spreading staves over a page
//---------------------------------------------------------

class VerticalGapData {
private:
bool _systemSpace { false };
bool _fixedHeight { false };
qreal _spacing { 0.0 };
qreal _maxSpacing { 0.0 };
qreal _addedSpace { 0.0 };
qreal _copyAddedSpace { 0.0 };
public:
System* system { nullptr };
SysStaff* sysStaff { nullptr };
Staff* staff { nullptr };
qreal factor { 1.0 };

VerticalGapData(System* sys, Staff* st, SysStaff* sst, qreal y);

void setVBox();
void addSpaceBetweenSections();
void addSpaceAroundVBox(bool above);
void addSpaceAroundNormalBracket();
void addSpaceAroundCurlyBracket();
void insideCurlyBracket();
bool isSystemGap() const;

qreal normalisedSpacing() const;
qreal actualSpacing() const;
qreal addedSpace() const;

qreal nextYPos(bool first) const;
qreal yBottom() const;
qreal addSpacing(qreal step);
qreal addNormalisedSpacing(qreal step);
bool canAddSpace() const;
void restore();
};

//---------------------------------------------------------
// VerticalStretchDataList
// helper class for spreading staves over a page
//---------------------------------------------------------

class VerticalGapDataList : public QList<VerticalGapData*> {
public:
~VerticalGapDataList();
qreal sumStretchFactor() const;
qreal smallest(qreal limit=-1.0) const;
};

//---------------------------------------------------------
// LayoutContext
// temp values used during layout
Expand Down
3 changes: 3 additions & 0 deletions libmscore/read114.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3037,6 +3037,8 @@ Score::FileError MasterScore::read114(XmlReader& e)
return FileError::FILE_BAD_FORMAT;
}

setEnableVerticalSpread(false);

for (Staff* s : staves()) {
int idx = s->idx();
int track = idx * VOICES;
Expand Down Expand Up @@ -3262,6 +3264,7 @@ Score::FileError MasterScore::read114(XmlReader& e)
if (!excerpt->parts().isEmpty()) {
_excerpts.push_back(excerpt);
Score* nscore = new Score(this);
nscore->setEnableVerticalSpread(false);
excerpt->setPartScore(nscore);
nscore->style().set(Sid::createMultiMeasureRests, true);
Excerpt::createExcerpt(excerpt);
Expand Down
4 changes: 4 additions & 0 deletions libmscore/read206.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3878,6 +3878,7 @@ static bool readScore(Score* score, XmlReader& e)
e.clearUserTextStyles();
MasterScore* m = score->masterScore();
Score* s = new Score(m, MScore::baseStyle());
s->setEnableVerticalSpread(false);
Excerpt* ex = new Excerpt(m);

ex->setPartScore(s);
Expand Down Expand Up @@ -4082,6 +4083,9 @@ Score::FileError MasterScore::read206(XmlReader& e)
revisions()->add(revision);
}
}

setEnableVerticalSpread(false);

int id = 1;
for (LinkedElements* le : e.linkIds())
le->setLid(this, id++);
Expand Down
42 changes: 42 additions & 0 deletions libmscore/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3430,6 +3430,48 @@ void Score::selectSimilarInRange(Element* e)
score->select(ee, SelectType::ADD, 0);
}

//---------------------------------------------------------
// enableVerticalSpread
//---------------------------------------------------------

bool Score::enableVerticalSpread() const
{
return styleB(Sid::enableVerticalSpread) && (layoutMode() != LayoutMode::SYSTEM);
}

//---------------------------------------------------------
// setEnableVerticalSpread
//---------------------------------------------------------

void Score::setEnableVerticalSpread(bool val)
{
setStyleValue(Sid::enableVerticalSpread, val);
}

//---------------------------------------------------------
// minSystemDistance
//---------------------------------------------------------

qreal Score::minSystemDistance() const
{
if (enableVerticalSpread())
return styleP(Sid::minStaffSpread) * styleD(Sid::spreadSystem);
else
return styleP(Sid::minSystemDistance);
}

//---------------------------------------------------------
// maxSystemDistance
//---------------------------------------------------------

qreal Score::maxSystemDistance() const
{
if (enableVerticalSpread())
return styleP(Sid::maxSystemSpread);
else
return styleP(Sid::maxSystemDistance);
}

//---------------------------------------------------------
// lassoSelect
//---------------------------------------------------------
Expand Down
5 changes: 5 additions & 0 deletions libmscore/score.h
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,11 @@ class Score : public QObject, public ScoreElement {
bool isPalette() const { return _isPalette; }
void setPaletteMode(bool palette) { _isPalette = palette; }

bool enableVerticalSpread() const;
void setEnableVerticalSpread(bool val);
qreal minSystemDistance() const;
qreal maxSystemDistance() const;

void lassoSelect(const QRectF&);
void lassoSelectEnd();

Expand Down
9 changes: 9 additions & 0 deletions libmscore/style.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,15 @@ static const StyleType styleTypes[] {
{ Sid::minSystemDistance, "minSystemDistance", Spatium(8.5) },
{ Sid::maxSystemDistance, "maxSystemDistance", Spatium(15.0) },

{ Sid::enableVerticalSpread, "enableVerticalSpread", false },
{ Sid::spreadSystem, "spreadSystem", 2.5 },
{ Sid::spreadSquareBracket, "spreadSquareBracket", 1.0 },
{ Sid::spreadCurlyBracket, "spreadCurlyBracket", 1.0 },
{ Sid::maxSystemSpread, "maxSystemSpread", Spatium(35.0) },
{ Sid::minStaffSpread, "minSpreadSpread", Spatium(1.0) },
{ Sid::maxStaffSpread, "maxSpreadSpread", Spatium(20.0) },
{ Sid::maxAkkoladeDistance, "maxAkkoladeDistance", Spatium(6.5) },

{ Sid::lyricsPlacement, "lyricsPlacement", int(Placement::BELOW) },
{ Sid::lyricsPosAbove, "lyricsPosAbove", QPointF(0.0, -2.0) },
{ Sid::lyricsPosBelow, "lyricsPosBelow", QPointF(.0, 3.0) },
Expand Down
10 changes: 9 additions & 1 deletion libmscore/style.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,18 @@ enum class Sid {
staffLowerBorder,
staffDistance,
akkoladeDistance,

minSystemDistance,
maxSystemDistance,

enableVerticalSpread,
spreadSystem,
spreadSquareBracket,
spreadCurlyBracket,
maxSystemSpread,
minStaffSpread,
maxStaffSpread,
maxAkkoladeDistance,

lyricsPlacement,
lyricsPosAbove,
lyricsPosBelow,
Expand Down

0 comments on commit 4916486

Please sign in to comment.