void KoVariable::resize(const QTextDocument *document, QTextInlineObject object, int posInDocument, const QTextCharFormat &format, QPaintDevice *pd) { Q_D(KoVariable); Q_UNUSED(document); Q_UNUSED(posInDocument); if (d->modified == false) return; if (object.isValid() == false) return; d->modified = true; Q_ASSERT(format.isCharFormat()); QFontMetricsF fm(format.font(), pd); qreal width = qMax(qreal(0.0), fm.width(d->value)); qreal ascent = fm.ascent(); qreal descent = fm.descent(); if (object.width() != width) { object.setWidth(width); } if (object.ascent() != ascent) { object.setAscent(ascent); } if (object.descent() != descent) { object.setDescent(descent); } }
void KoAnchorInlineObject::resize(const QTextDocument *document, QTextInlineObject &object, int posInDocument, const QTextCharFormat &format, QPaintDevice *pd) { Q_UNUSED(document); Q_UNUSED(posInDocument); Q_D(KoAnchorInlineObject); if (!d->parent->shape()->isVisible()) { // Per default the shape this anchor presents is hidden and we only make it visible once an explicit resize-request // was made. This prevents shapes that are anchored at e.g. hidden textboxes to not become visible as long as they // are not asked to resize. d->parent->shape()->setVisible(true); } // important detail; top of anchored shape is at the baseline. QFontMetricsF fm(format.font(), pd); if (d->parent->anchorType() == KoShapeAnchor::AnchorAsCharacter) { QPointF offset = d->parent->offset(); offset.setX(0); d->parent->setOffset(offset); object.setWidth(d->parent->shape()->size().width()); if (d->parent->verticalRel() == KoShapeAnchor::VBaseline) { // baseline implies special meaning of the position attribute: switch (d->parent->verticalPos()) { case KoShapeAnchor::VFromTop: object.setAscent(qMax((qreal) 0, -offset.y())); object.setDescent(qMax((qreal) 0, d->parent->shape()->size().height() + offset.y())); break; case KoShapeAnchor::VTop: object.setAscent(d->parent->shape()->size().height()); object.setDescent(0); break; case KoShapeAnchor::VMiddle: object.setAscent(d->parent->shape()->size().height()/2); object.setDescent(d->parent->shape()->size().height()/2); break; case KoShapeAnchor::VBottom: object.setAscent(0); object.setDescent(d->parent->shape()->size().height()); break; default: break; } } else { qreal boundTop = fm.ascent(); switch (d->parent->verticalPos()) { case KoShapeAnchor::VFromTop: object.setAscent(qMax((qreal) 0, -offset.y())); object.setDescent(qMax((qreal) 0, d->parent->shape()->size().height() + offset.y())); break; case KoShapeAnchor::VTop: object.setAscent(boundTop); object.setDescent(qMax((qreal) 0, d->parent->shape()->size().height() - boundTop)); break; case KoShapeAnchor::VMiddle: object.setAscent(d->parent->shape()->size().height()/2); object.setDescent(d->parent->shape()->size().height()/2); break; case KoShapeAnchor::VBottom: object.setAscent(0); object.setDescent(d->parent->shape()->size().height()); break; default: break; } } d->inlineObjectAscent = object.ascent(); d->inlineObjectDescent = object.descent(); } else { object.setWidth(0); object.setAscent(0); object.setDescent(0); } }