void Glissando::draw(QPainter* painter) const { painter->save(); qreal _spatium = spatium(); QPen pen(curColor()); pen.setWidthF(_spatium * .15); pen.setCapStyle(Qt::RoundCap); painter->setPen(pen); qreal w = line.dx(); qreal h = line.dy(); qreal l = sqrt(w * w + h * h); painter->translate(line.p1()); qreal wi = asin(-h / l) * 180.0 / M_PI; painter->rotate(-wi); if (glissandoType() == GlissandoType::STRAIGHT) { painter->drawLine(QLineF(0.0, 0.0, l, 0.0)); } else if (glissandoType() == GlissandoType::WAVY) { qreal mags = magS(); QRectF b = symbols[score()->symIdx()][trillelementSym].bbox(mags); qreal w = symbols[score()->symIdx()][trillelementSym].width(mags); int n = (int)(l / w); // always round down (truncate) to avoid overlap qreal x = (l - n*w) * 0.5; // centre line in available space symbols[score()->symIdx()][trillelementSym].draw(painter, mags, QPointF(x, b.height()*.5), n); } if (_showText) { const TextStyle& st = score()->textStyle(TEXT_STYLE_GLISSANDO); QFont f = st.fontPx(_spatium); QRectF r = QFontMetricsF(f).boundingRect(_text); // if text longer than available space, skip it if (r.width() < l) { qreal yOffset = r.height() + r.y(); // find text descender height // raise text slightly above line and slightly more with WAVY than with STRAIGHT yOffset += _spatium * (glissandoType() == GlissandoType::WAVY ? 0.3 : 0.05); painter->setFont(f); qreal x = (l - r.width()) * 0.5; painter->drawText(QPointF(x, -yOffset), _text); } } painter->restore(); }
void Glissando::draw(QPainter* painter) const { painter->save(); qreal _spatium = spatium(); QPen pen(curColor()); pen.setWidthF(_spatium * .15); pen.setCapStyle(Qt::RoundCap); painter->setPen(pen); qreal w = line.dx(); qreal h = line.dy(); qreal l = sqrt(w * w + h * h); painter->translate(line.p1()); qreal wi = asin(-h / l) * 180.0 / M_PI; painter->rotate(-wi); if (glissandoType() == GlissandoType::STRAIGHT) { painter->drawLine(QLineF(0.0, 0.0, l, 0.0)); } else if (glissandoType() == GlissandoType::WAVY) { qreal mags = magS(); QRectF b = symbols[score()->symIdx()][trillelementSym].bbox(mags); qreal w = symbols[score()->symIdx()][trillelementSym].width(mags); int n = lrint(l / w); symbols[score()->symIdx()][trillelementSym].draw(painter, mags, QPointF(0.0, b.height()*.5), n); } if (_showText) { const TextStyle& st = score()->textStyle(TEXT_STYLE_GLISSANDO); QFont f = st.fontPx(_spatium); QRectF r = QFontMetricsF(f).boundingRect(_text); if (r.width() < l) { painter->setFont(f); qreal x = (l - r.width()) * .5; painter->drawText(QPointF(x, -_spatium * .5), _text); } } painter->restore(); }
QVariant Glissando::getProperty(P_ID propertyId) const { switch (propertyId) { case P_ID::GLISS_TYPE: return int(glissandoType()); case P_ID::GLISS_TEXT: return text(); case P_ID::GLISS_SHOW_TEXT: return showText(); default: break; } return SLine::getProperty(propertyId); }