LayoutBreak* MeasureBase::sectionBreakElement() const { if (sectionBreak()) { for (Element* e : el()) { if (e->isLayoutBreak() && toLayoutBreak(e)->isSectionBreak()) return toLayoutBreak(e); } } return 0; }
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); } }
void MeasureBase::layout() { int breakCount = 0; for (Element* element : _el) { if (!score()->tagIsValid(element->tag())) continue; if (element->isLayoutBreak()) { qreal _spatium = spatium(); qreal x; qreal y; if (toLayoutBreak(element)->isNoBreak()) { x = width() - element->width() * .5; y = -(_spatium + element->height()); } else { x = -_spatium - element->width() + width() - breakCount * (element->width() + _spatium * .8); y = -2 * _spatium - element->height(); breakCount++; } element->setPos(x, y); } else element->layout(); } }
void MeasureBase::remove(Element* el) { if (el->isLayoutBreak()) { LayoutBreak* lb = toLayoutBreak(el); switch (lb->layoutBreakType()) { case LayoutBreak::PAGE: setPageBreak(false); break; case LayoutBreak::LINE: setLineBreak(false); break; case LayoutBreak::SECTION: setSectionBreak(false); score()->setPause(endTick(), 0); score()->setLayoutAll(); break; case LayoutBreak::NOBREAK: setNoBreak(false); break; } } if (!_el.remove(el)) { qDebug("MeasureBase(%p)::remove(%s,%p) not found", this, el->name(), el); } }
void MeasureBase::add(Element* e) { e->setParent(this); if (e->isLayoutBreak()) { LayoutBreak* b = toLayoutBreak(e); switch (b->layoutBreakType()) { case LayoutBreak::PAGE: setPageBreak(true); setLineBreak(false); setNoBreak(false); break; case LayoutBreak::LINE: setPageBreak(false); setLineBreak(true); setSectionBreak(false); setNoBreak(false); break; case LayoutBreak::SECTION: setLineBreak(false); setSectionBreak(true); setNoBreak(false); //does not work with repeats: score()->tempomap()->setPause(endTick(), b->pause()); score()->setLayoutAll(); break; case LayoutBreak::NOBREAK: setPageBreak(false); setLineBreak(false); setSectionBreak(false); setNoBreak(true); break; } } triggerLayout(); _el.push_back(e); }
bool LayoutBreak::acceptDrop(EditData& data) const { return data.dropElement->type() == ElementType::LAYOUT_BREAK && toLayoutBreak(data.dropElement)->layoutBreakType() != layoutBreakType(); }