From e8ec26c8c377deddaece05c42b0085417d42d2d4 Mon Sep 17 00:00:00 2001 From: James Mizen Date: Thu, 13 Feb 2025 16:23:42 +0000 Subject: [PATCH] Remove empty systems before laying out a page --- src/engraving/rendering/score/pagelayout.cpp | 40 +++++++++++++++++++ src/engraving/rendering/score/pagelayout.h | 1 + .../rendering/score/scorepageviewlayout.cpp | 1 + 3 files changed, 42 insertions(+) diff --git a/src/engraving/rendering/score/pagelayout.cpp b/src/engraving/rendering/score/pagelayout.cpp index afd5e15dfbddd..98c87070823b2 100644 --- a/src/engraving/rendering/score/pagelayout.cpp +++ b/src/engraving/rendering/score/pagelayout.cpp @@ -496,6 +496,46 @@ void PageLayout::layoutArticAndFingeringOnCrossStaffBeams(LayoutContext& ctx, Sy } } +void PageLayout::removeEmptySystems(LayoutContext& ctx) +{ + Page* page = ctx.mutState().page(); + + auto removeSystem = [&](System* system) -> void { + // erase system from page + std::vector& pageSystems = page->systems(); + auto pageFoundSystem = std::find(pageSystems.begin(), pageSystems.end(), system); + if (pageFoundSystem != pageSystems.end()) { + pageSystems.erase(pageFoundSystem); + } + + // erase system from score + std::vector& scoreSystems = ctx.mutDom().systems(); + auto scoreFoundSystem = std::find(scoreSystems.begin(), scoreSystems.end(), system); + if (scoreFoundSystem != scoreSystems.end()) { + scoreSystems.erase(scoreFoundSystem); + } + + // erase system from layoutcontext + std::vector& ctxSystems = ctx.mutState().systemList(); + auto ctxFoundSystem = std::find(ctxSystems.begin(), ctxSystems.end(), system); + if (ctxFoundSystem != ctxSystems.end()) { + ctxSystems.erase(ctxFoundSystem); + } + + // finally delete system + delete system; + }; + + std::vector systems = ctx.state().systemList(); + + for (System* sys : systems) { + if (!sys->measures().empty()) { + continue; + } + removeSystem(sys); + } +} + //--------------------------------------------------------- // layoutPage // restHeight - vertical space which has to be distributed diff --git a/src/engraving/rendering/score/pagelayout.h b/src/engraving/rendering/score/pagelayout.h index 91810a6d24191..4652dd29f7054 100644 --- a/src/engraving/rendering/score/pagelayout.h +++ b/src/engraving/rendering/score/pagelayout.h @@ -34,6 +34,7 @@ class PageLayout { public: + static void removeEmptySystems(LayoutContext& ctx); static void getNextPage(LayoutContext& ctx); static void collectPage(LayoutContext& ctx); diff --git a/src/engraving/rendering/score/scorepageviewlayout.cpp b/src/engraving/rendering/score/scorepageviewlayout.cpp index bc15c5278af79..918b0705560f8 100644 --- a/src/engraving/rendering/score/scorepageviewlayout.cpp +++ b/src/engraving/rendering/score/scorepageviewlayout.cpp @@ -205,6 +205,7 @@ void ScorePageViewLayout::doLayout(LayoutContext& ctx) const MeasureBase* lmb = nullptr; do { + PageLayout::removeEmptySystems(ctx); PageLayout::getNextPage(ctx); PageLayout::collectPage(ctx);