QLineF FretDiagram::dragAnchor() const { if (parent()->type() == Element::Type::SEGMENT) { Segment* s = static_cast<Segment*>(parent()); Measure* m = s->measure(); System* system = m->system(); qreal yp = system->staff(staffIdx())->y() + system->y(); qreal xp = m->tick2pos(s->tick()) + m->pagePos().x(); QPointF p1(xp, yp); qreal x = 0.0; qreal y = 0.0; #if 0 // TODOxx qreal tw = width(); qreal th = height(); if (_align & AlignmentFlags::BOTTOM) y = th; else if (_align & AlignmentFlags::VCENTER) y = (th * .5); else if (_align & AlignmentFlags::BASELINE) y = baseLine(); if (_align & AlignmentFlags::RIGHT) x = tw; else if (_align & AlignmentFlags::HCENTER) x = (tw * .5); #endif return QLineF(p1, abbox().topLeft() + QPointF(x, y)); } return QLineF(parent()->pagePos(), abbox().topLeft()); }
QRectF Rest::drag(const QPointF& s) { QRectF r(abbox()); // Limit horizontal drag range const qreal xDragRange = 250.0; qreal xoff = (fabs(s.x()) > xDragRange) ? xDragRange : fabs(s.x()); if (s.x() < 0) xoff *= -1; setUserOffset(xoff, s.y()); layout(); return abbox() | r; }
QRectF Rest::drag(const EditData& data) { QPointF s(data.pos); QRectF r(abbox()); // Limit horizontal drag range static const qreal xDragRange = spatium() * 5; if (fabs(s.x()) > xDragRange) s.rx() = xDragRange * (s.x() < 0 ? -1.0 : 1.0); setUserOffset(s.x(), s.y()); layout(); score()->rebuildBspTree(); return abbox() | r; }
void Page::doRebuildBspTree() { QList<Element*> el; for (System* s : _systems) { for (MeasureBase* m : s->measures()) m->scanElements(&el, collectElements, false); } scanElements(&el, collectElements, false); int n = el.size(); if (score()->layoutMode() == LayoutMode::LINE) { if (_systems.isEmpty()) return; if (_systems.front()->measures().isEmpty()) return; qreal h = _systems.front()->height(); MeasureBase* mb = _systems.front()->measures().back(); qreal w = mb->x() + mb->width(); bspTree.initialize(QRectF(0.0, 0.0, w, h), n); } else bspTree.initialize(abbox(), n); for (int i = 0; i < n; ++i) bspTree.insert(el.at(i)); bspTreeValid = true; }
void Box::editDrag(const EditData& ed) { if (type() == VBOX) { _boxHeight = Spatium((ed.pos.y() - abbox().y()) / spatium()); if (ed.vRaster) { qreal vRaster = 1.0 / MScore::vRaster(); int n = lrint(_boxHeight.val() / vRaster); _boxHeight = Spatium(vRaster * n); } bbox().setRect(0.0, 0.0, system()->width(), point(boxHeight())); system()->setHeight(height()); score()->doLayoutPages(); } else { _boxWidth += Spatium(ed.delta.x() / spatium()); if (ed.hRaster) { qreal hRaster = 1.0 / MScore::hRaster(); int n = lrint(_boxWidth.val() / hRaster); _boxWidth = Spatium(hRaster * n); } foreach(Element* e, _el) { if (e->type() == TEXT) { static_cast<Text*>(e)->setModified(true); // force relayout } } score()->setLayoutAll(true); } layout(); }
Glyph::Glyph( const FT_Face& face, const FT_Glyph& glyph, size_t ind) : glyphInd(ind) { _VERBOSE("Glyph::Glyph"); FT_BBox bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_subpixels, &bbox ); setattr("width", Py::Int( face->glyph->metrics.width) ); setattr("height", Py::Int( face->glyph->metrics.height) ); setattr("horiBearingX", Py::Int( face->glyph->metrics.horiBearingX) ); setattr("horiBearingY", Py::Int( face->glyph->metrics.horiBearingY) ); setattr("horiAdvance", Py::Int( face->glyph->metrics.horiAdvance) ); setattr("vertBearingX", Py::Int( face->glyph->metrics.vertBearingX) ); setattr("vertBearingY", Py::Int( face->glyph->metrics.vertBearingY) ); setattr("vertAdvance", Py::Int( face->glyph->metrics.vertAdvance) ); Py::Tuple abbox(4); abbox[0] = Py::Int(bbox.xMin); abbox[1] = Py::Int(bbox.yMin); abbox[2] = Py::Int(bbox.xMax); abbox[3] = Py::Int(bbox.yMax); setattr("bbox", abbox); }
QLineF FretDiagram::dragAnchor() const { Measure* m = measure(); System* system = m->system(); qreal yp = system->staff(staffIdx())->y() + system->y(); qreal xp = m->tick2pos(segment()->tick()) + m->pagePos().x(); QPointF p1(xp, yp); qreal x = 0.0; qreal y = 0.0; #if 0 // TODOxx qreal tw = width(); qreal th = height(); if (_align & ALIGN_BOTTOM) y = th; else if (_align & ALIGN_VCENTER) y = (th * .5); else if (_align & ALIGN_BASELINE) y = baseLine(); if (_align & ALIGN_RIGHT) x = tw; else if (_align & ALIGN_HCENTER) x = (tw * .5); #endif return QLineF(p1, abbox().topLeft() + QPointF(x, y)); }
void Page::doRebuildBspTree() { int n = 0; scanElements(&n, countElements, false); QRectF r; if (score()->layoutMode() == LayoutMode::LINE) { qreal w = 0.0; qreal h = 0.0; if (!_systems.empty()) { h = _systems.front()->height(); if (!_systems.front()->measures().empty()) { MeasureBase* mb = _systems.front()->measures().back(); w = mb->x() + mb->width(); } } r = QRectF(0.0, 0.0, w, h); } else r = abbox(); bspTree.initialize(r, n); scanElements(&bspTree, &bspInsert, false); bspTreeValid = true; }
void Box::updateGrips(Grip* defaultGrip, QVector<QRectF>& grip) const { *defaultGrip = Grip::START; QRectF r(abbox()); if (type() == Element::Type::HBOX) grip[0].translate(QPointF(r.right(), r.top() + r.height() * .5)); else if (type() == Element::Type::VBOX) grip[0].translate(QPointF(r.x() + r.width() * .5, r.bottom())); }
void Box::updateGrips(int* grips, QRectF* grip) const { *grips = 1; QRectF r(abbox()); if (type() == HBOX) grip[0].translate(QPointF(r.right(), r.top() + r.height() * .5)); else if (type() == VBOX) grip[0].translate(QPointF(r.x() + r.width() * .5, r.bottom())); }
void Box::updateGrips(int* grips, int* defaultGrip, QRectF* grip) const { *grips = 1; *defaultGrip = 0; QRectF r(abbox()); if (type() == Element::Type::HBOX) grip[0].translate(QPointF(r.right(), r.top() + r.height() * .5)); else if (type() == Element::Type::VBOX) grip[0].translate(QPointF(r.x() + r.width() * .5, r.bottom())); }
QLineF FretDiagram::dragAnchor() const { qreal xp = 0.0; for (Element* e = parent(); e; e = e->parent()) xp += e->x(); qreal yp; if (parent()->isSegment()) { System* system = toSegment(parent())->measure()->system(); yp = system->staffCanvasYpage(staffIdx()); } else yp = parent()->canvasPos().y(); QPointF p1(xp, yp); return QLineF(p1, canvasPos()); #if 0 // TODOxx if (parent()->type() == ElementType::SEGMENT) { Segment* s = toSegment(parent()); Measure* m = s->measure(); System* system = m->system(); qreal yp = system->staff(staffIdx())->y() + system->y(); qreal xp = m->tick2pos(s->tick()) + m->pagePos().x(); QPointF p1(xp, yp); qreal x = 0.0; qreal y = 0.0; qreal tw = width(); qreal th = height(); if (_align & Align::BOTTOM) y = th; else if (_align & Align::VCENTER) y = (th * .5); else if (_align & Align::BASELINE) y = baseLine(); if (_align & Align::RIGHT) x = tw; else if (_align & Align::HCENTER) x = (tw * .5); return QLineF(p1, abbox().topLeft() + QPointF(x, y)); } return QLineF(parent()->pagePos(), abbox().topLeft()); #endif }
void Cursor::draw(Painter* p) const { if (!visible()) return; int v = track() == -1 ? 0 : voice(); Color c(preferences.selectColor[v]); c.setAlpha(50); p->setBrush(c); QRectF r(abbox()); p->fillRect(r.x(), r.y(), r.width(), r.height()); }
QRectF Text::pageRectangle() const { if (parent() && (parent()->type() == HBOX || parent()->type() == VBOX || parent()->type() == TBOX)) { QRectF r = parent()->abbox(); Box* box = static_cast<Box*>(parent()); qreal x = r.x() + box->leftMargin() * MScore::DPMM; qreal y = r.y() + box->topMargin() * MScore::DPMM; qreal h = r.height() - (box->topMargin() + box->bottomMargin()) * MScore::DPMM; qreal w = r.width() - (box->leftMargin() + box->rightMargin()) * MScore::DPMM; // QSizeF ps = _doc->pageSize(); // return QRectF(x, y, ps.width(), ps.height()); return QRectF(x, y, w, h); } else return abbox(); }
void ShadowNote::draw(QPainter* painter) const { if (!visible() || sym == SymId::noSym) return; QPointF ap(pagePos()); #if 0 // yet(?) unused QRect r(abbox().toRect()); #endif painter->translate(ap); qreal lw = point(score()->styleS(StyleIdx::ledgerLineWidth)); InputState ps = score()->inputState(); int voice; if (ps.drumNote() != -1 && ps.drumset() && ps.drumset()->isValid(ps.drumNote())) voice = ps.drumset()->voice(ps.drumNote()); else voice = ps.voice(); QPen pen(MScore::selectColor[voice].lighter(140), lw); painter->setPen(pen); drawSymbol(sym, painter); qreal ms = spatium(); qreal x1 = symWidth(sym) * .5 - (ms * mag()); qreal x2 = x1 + 2 * ms * mag(); ms *= .5; if (_line < 100 && _line > -100 && !ps.rest()) { for (int i = -2; i >= _line; i -= 2) { qreal y = ms * mag() * (i - _line); painter->drawLine(QLineF(x1, y, x2, y)); } for (int i = 10; i <= _line; i += 2) { qreal y = ms * mag() * (i - _line); painter->drawLine(QLineF(x1, y, x2, y)); } } painter->translate(-ap); }
void ShadowNote::draw(QPainter* painter) const { if (!visible() || sym == 0) return; QPointF ap(pagePos()); QRect r(abbox().toRect()); painter->translate(ap); qreal lw = point(score()->styleS(ST_ledgerLineWidth)); InputState ps = score()->inputState(); int voice; if (ps.drumNote() != -1 && ps.drumset() && ps.drumset()->isValid(ps.drumNote())) voice = ps.drumset()->voice(ps.drumNote()); else voice = ps.voice(); QPen pen(MScore::selectColor[voice].light(140), lw); painter->setPen(pen); sym->draw(painter, magS()); qreal ms = spatium(); qreal x1 = sym->width(magS())*.5 - ms; qreal x2 = x1 + 2 * ms; ms *= .5; if (_line < 100 && _line > -100 && !ps.rest) { for (int i = -2; i >= _line; i -= 2) { qreal y = ms * (i - _line); painter->drawLine(QLineF(x1, y, x2, y)); } for (int i = 10; i <= _line; i += 2) { qreal y = ms * (i - _line); painter->drawLine(QLineF(x1, y, x2, y)); } } painter->translate(-ap); }
void Box::editDrag(const EditData& ed) { if (type() == Element::Type::VBOX) { _boxHeight = Spatium((ed.pos.y() - abbox().y()) / spatium()); if (ed.vRaster) { qreal vRaster = 1.0 / MScore::vRaster(); int n = lrint(_boxHeight.val() / vRaster); _boxHeight = Spatium(vRaster * n); } bbox().setRect(0.0, 0.0, system()->width(), point(boxHeight())); system()->setHeight(height()); score()->doLayoutPages(); } else { _boxWidth += Spatium(ed.delta.x() / spatium()); if (ed.hRaster) { qreal hRaster = 1.0 / MScore::hRaster(); int n = lrint(_boxWidth.val() / hRaster); _boxWidth = Spatium(hRaster * n); } score()->setLayoutAll(true); } layout(); }