Merge pull request #4031 from dmitrio95/refactor-layout-1

Refactor layout: extract getNextPage, refactor page collecting loop
This commit is contained in:
anatoly-os 2018-11-14 14:36:44 +02:00 committed by GitHub
commit d73426367a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 81 deletions

View file

@ -1629,35 +1629,44 @@ void Score::respace(std::vector<ChordRest*>* elements)
}
//---------------------------------------------------------
// getEmptyPage
// getNextPage
//---------------------------------------------------------
void LayoutContext::getEmptyPage()
void LayoutContext::getNextPage()
{
if (curPage >= score->npages()) {
Page* newPage = new Page(score);
newPage->setNo(score->pages().size());
score->pages().push_back(newPage);
if (!page || curPage >= score->npages()) {
page = new Page(score);
score->pages().push_back(page);
prevSystem = nullptr;
}
else {
page = score->pages()[curPage];
QList<System*>& systems = page->systems();
const int i = systems.indexOf(curSystem);
if (i <= -1) // system is not on the current page
systems.clear();
else {
// system is on the current page,
// erase only the current and the following systems
systems.erase(systems.begin() + i, systems.end());
}
prevSystem = systems.empty() ? nullptr : systems.back();
}
page->bbox().setRect(0.0, 0.0, score->loWidth(), score->loHeight());
page->setNo(curPage);
page->layout();
qreal x, y;
if (MScore::verticalOrientation()) {
x = 0.0;
y = (curPage == 0) ? 0.0 : score->pages()[curPage - 1]->pos().y() + page->height() + MScore::verticalPageGap;
}
else {
y = 0.0;
x = (curPage == 0) ? 0.0 : score->pages()[curPage - 1]->pos().x()
+ page->width()
+ (((curPage+score->pageNumberOffset()) & 1) ? MScore::horizontalPageGapOdd : MScore::horizontalPageGapEven);
qreal x = 0.0;
qreal y = 0.0;
if (curPage) {
Page* prevPage = score->pages()[curPage - 1];
if (MScore::verticalOrientation())
y = prevPage->pos().y() + page->height() + MScore::verticalPageGap;
else {
qreal gap = (curPage + score->pageNumberOffset()) & 1 ? MScore::horizontalPageGapOdd : MScore::horizontalPageGapEven;
x = prevPage->pos().x() + page->width() + gap;
}
}
++curPage;
page->setPos(x, y);
page->systems().clear();
}
//---------------------------------------------------------
@ -3823,38 +3832,6 @@ void Score::doLayoutRange(int stick, int etick)
getNextMeasure(lc);
lc.curSystem = collectSystem(lc);
if (!lc.page) {
lc.page = new Page(this);
pages().push_back(lc.page);
lc.prevSystem = 0;
}
else {
QList<System*>& systems = lc.page->systems();
int i = systems.indexOf(lc.curSystem);
// qDebug("clear page systems from %d", i);
if (i <= -1)
systems.clear();
else {
systems.erase(systems.begin() + i, systems.end());
lc.prevSystem = systems.empty() ? 0 : systems.back();
}
}
lc.page->bbox().setRect(0.0, 0.0, loWidth(), loHeight());
lc.page->setNo(lc.curPage);
qreal x = 0.0;
qreal y = 0.0;
if (lc.curPage) {
Page* prevPage = pages()[lc.curPage-1];
if (MScore::verticalOrientation())
y = prevPage->pos().y() + lc.page->height() + MScore::verticalPageGap;
else {
qreal gap = (lc.curPage + pageNumberOffset()) & 1 ? MScore::horizontalPageGapOdd : MScore::horizontalPageGapEven;
x = prevPage->pos().x() + lc.page->width() + gap;
}
}
++lc.curPage;
lc.page->setPos(x, y);
lc.layout();
for (MuseScoreView* v : viewer)
@ -3867,37 +3844,10 @@ void Score::doLayoutRange(int stick, int etick)
void LayoutContext::layout()
{
for (;;) {
do {
getNextPage();
collectPage();
System* s = page->system(0);
MeasureBase* m = s->measures().back();
if (!curSystem || (rangeDone && m->tick() > endTick))
break;
Page* prevPage = page;
if (curPage >= score->npages()) {
page = new Page(score);
score->pages().push_back(page);
}
else {
page = score->pages()[curPage];
page->systems().clear();
}
page->bbox().setRect(0.0, 0.0, score->loWidth(), score->loHeight());
page->setNo(curPage);
qreal x = 0.0;
qreal y = 0.0;
if (curPage) {
if (MScore::verticalOrientation())
y = prevPage->pos().y() + page->height() + MScore::verticalPageGap;
else {
qreal gap = (curPage + score->pageNumberOffset()) & 1 ? MScore::horizontalPageGapOdd : MScore::horizontalPageGapEven;
x = prevPage->pos().x() + page->width() + gap;
}
}
++curPage;
page->setPos(x, y);
prevSystem = 0;
}
} while (curSystem && !(rangeDone && page->system(0)->measures().back()->tick() > endTick)); // FIXME: perhaps the first measure was meant? Or last system?
if (!curSystem) {
// The end of the score. The remaining systems are not needed...
qDeleteAll(systemList);

View file

@ -51,7 +51,7 @@ struct LayoutContext {
void layout();
int adjustMeasureNo(MeasureBase*);
void getEmptyPage();
void getNextPage();
void collectPage();
};