Пример #1
0
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);
    }
}
Пример #2
0
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);
    }
}