void MeasureBase::cleanupLayoutBreaks(bool undo) { // remove unneeded layout breaks std::vector<Element*> toDelete; for (Element* e : el()) { if (e->isLayoutBreak()) { switch (toLayoutBreak(e)->layoutBreakType()) { case LayoutBreak::LINE: if (!lineBreak()) toDelete.push_back(e); break; case LayoutBreak::PAGE: if (!pageBreak()) toDelete.push_back(e); break; case LayoutBreak::SECTION: if (!sectionBreak()) toDelete.push_back(e); break; case LayoutBreak::NOBREAK: if (!noBreak()) toDelete.push_back(e); break; } } } for (Element* e : toDelete) { if (undo) score()->undoRemoveElement(e); else _el.remove(e); } }
bool MeasureBase::readProperties(XmlReader& e) { const QStringRef& tag(e.name()); if (tag == "LayoutBreak") { LayoutBreak* lb = new LayoutBreak(score()); lb->read(e); bool doAdd = true; switch (lb->layoutBreakType()) { case LayoutBreak::LINE: if (lineBreak()) doAdd = false; break; case LayoutBreak::PAGE: if (pageBreak()) doAdd = false; break; case LayoutBreak::SECTION: if (sectionBreak()) doAdd = false; break; case LayoutBreak::NOBREAK: if (noBreak()) doAdd = false; break; } if (doAdd) { add(lb); cleanupLayoutBreaks(false); } else delete lb; } else if (tag == "StaffTypeChange") { StaffTypeChange* stc = new StaffTypeChange(score()); stc->setTrack(e.track()); stc->setParent(this); stc->read(e); add(stc); } else if (Element::readProperties(e)) ; else return false; return true; }
void MeasureBase::undoSetBreak(bool v, LayoutBreak::Type type) { switch (type) { case LayoutBreak::LINE: if (lineBreak() == v) return; setLineBreak(v); break; case LayoutBreak::PAGE: if (pageBreak() == v) return; if (v && lineBreak()) setLineBreak(false); setPageBreak(v); break; case LayoutBreak::SECTION: if (sectionBreak() == v) return; if (v && lineBreak()) setLineBreak(false); setSectionBreak(v); break; case LayoutBreak::NOBREAK: if (noBreak() == v) return; if (v) { setLineBreak(false); setPageBreak(false); setSectionBreak(false); } setNoBreak(v); break; } if (v) { LayoutBreak* lb = new LayoutBreak(score()); lb->setLayoutBreakType(type); lb->setTrack(-1); // this are system elements lb->setParent(this); score()->undoAddElement(lb); } cleanupLayoutBreaks(true); }