diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-04-19 11:08:28 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-27 06:27:46 +0200 |
commit | 2a6e105f43885e0901c252bffc77bd1c9db87b67 (patch) | |
tree | fbab5df14ceeb7e3a798cdbe4e5c6d5effff331d /src | |
parent | 1770fa632facf2f1e4bb05e7689efc939d46cfef (diff) |
Fix bounding rects of text items.
Ensure the rectangles are correctly positioned with right
and center aligned text, not just sized correctly. Also add
padding to the clip rects so the cursor and styled text aren't
clipped at the item boundaries.
Change-Id: I03ef140589154ebd49b600b0a4c4fbeff845c10f
Reviewed-by: Yann Bodson <yann.bodson@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquicktext.cpp | 10 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 47 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 52 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 2 |
7 files changed, 100 insertions, 15 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 2407ade988..4d39f0baad 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -2039,6 +2039,16 @@ QRectF QQuickText::boundingRect() const return rect; } +QRectF QQuickText::clipRect() const +{ + Q_D(const QQuickText); + + QRectF rect = QQuickImplicitSizeItem::clipRect(); + if (d->style != Normal) + rect.adjust(-1, 0, 1, 2); + return rect; +} + /*! \internal */ void QQuickText::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h index e643d1dfb9..e69159eac9 100644 --- a/src/quick/items/qquicktext_p.h +++ b/src/quick/items/qquicktext_p.h @@ -197,6 +197,7 @@ public: qreal contentHeight() const; QRectF boundingRect() const; + QRectF clipRect() const; Q_INVOKABLE void doLayout(); Q_SIGNALS: diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 59d78acc4b..cd5f262f37 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -1818,7 +1818,48 @@ void QQuickTextEdit::updateSelectionMarkers() QRectF QQuickTextEdit::boundingRect() const { Q_D(const QQuickTextEdit); - QRectF r = QQuickImplicitSizeItem::boundingRect(); + QRectF r(0, -d->yoff, d->contentSize.width(), d->contentSize.height()); + int cursorWidth = 1; + if (d->cursor) + cursorWidth = 0; + else if (!d->document->isEmpty()) + cursorWidth += 3;// ### Need a better way of accounting for space between char and cursor + + // Could include font max left/right bearings to either side of rectangle. + + r.setRight(r.right() + cursorWidth); + + qreal h = height(); + switch (d->vAlign) { + case AlignTop: + break; + case AlignBottom: + r.moveTop(h - r.height()); + break; + case AlignVCenter: + r.moveTop((h - r.height()) / 2); + break; + } + + qreal w = width(); + switch (d->hAlign) { + case AlignLeft: + break; + case AlignRight: + r.moveLeft(w - r.width()); + break; + case AlignHCenter: + r.moveLeft((w - r.width()) / 2); + break; + } + + return r; +} + +QRectF QQuickTextEdit::clipRect() const +{ + Q_D(const QQuickTextEdit); + QRectF r = QQuickImplicitSizeItem::clipRect(); int cursorWidth = 1; if (d->cursor) cursorWidth = d->cursor->width(); @@ -1828,7 +1869,7 @@ QRectF QQuickTextEdit::boundingRect() const // Could include font max left/right bearings to either side of rectangle. r.setRight(r.right() + cursorWidth); - return r.translated(0,d->yoff); + return r; } qreal QQuickTextEditPrivate::getImplicitWidth() const @@ -1903,7 +1944,7 @@ void QQuickTextEdit::updateSize() if (!widthValid() && !d->requireImplicitWidth) iWidth = newWidth; - qreal newHeight = d->document->isEmpty() ? fm.height() : d->document->size().height(); + qreal newHeight = d->document->isEmpty() ? qCeil(fm.height()) : d->document->size().height(); if (iWidth > -1) setImplicitSize(iWidth, newHeight); diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h index b28ec9d7d7..9f904cae67 100644 --- a/src/quick/items/qquicktextedit_p.h +++ b/src/quick/items/qquicktextedit_p.h @@ -229,6 +229,7 @@ public: Q_INVOKABLE void moveCursorSelection(int pos, SelectionMode mode); QRectF boundingRect() const; + QRectF clipRect() const; bool isInputMethodComposing() const; diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 863729416d..c9019c6670 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1655,7 +1655,7 @@ void QQuickTextInputPrivate::updateVerticalScroll() Q_Q(QQuickTextInput); const int preeditLength = m_textLayout.preeditAreaText().length(); const qreal height = qMax<qreal>(0, q->height()); - qreal heightUsed = boundingRect.height(); + qreal heightUsed = contentSize.height(); qreal previousScroll = vscroll; if (!autoScroll || heightUsed <= height) { @@ -2265,7 +2265,7 @@ bool QQuickTextInput::canRedo() const qreal QQuickTextInput::contentWidth() const { Q_D(const QQuickTextInput); - return d->boundingRect.width(); + return d->contentSize.width(); } /*! @@ -2278,7 +2278,7 @@ qreal QQuickTextInput::contentWidth() const qreal QQuickTextInput::contentHeight() const { Q_D(const QQuickTextInput); - return d->boundingRect.height(); + return d->contentSize.height(); } void QQuickTextInput::moveCursorSelection(int position) @@ -2597,10 +2597,36 @@ QRectF QQuickTextInput::boundingRect() const { Q_D(const QQuickTextInput); + int cursorWidth = d->cursorItem ? 0 : 1; + + qreal hscroll = d->hscroll; + if (!d->autoScroll || d->contentSize.width() < width()) { + switch (effectiveHAlign()) { + case AlignLeft: + break; + case AlignRight: + hscroll += d->contentSize.width() - width(); + break; + case AlignHCenter: + hscroll += (d->contentSize.width() - width()) / 2; + break; + } + } + + // Could include font max left/right bearings to either side of rectangle. + QRectF r(-hscroll, -d->vscroll, d->contentSize.width(), d->contentSize.height()); + r.setRight(r.right() + cursorWidth); + return r; +} + +QRectF QQuickTextInput::clipRect() const +{ + Q_D(const QQuickTextInput); + int cursorWidth = d->cursorItem ? d->cursorItem->width() : 1; // Could include font max left/right bearings to either side of rectangle. - QRectF r = QQuickImplicitSizeItem::boundingRect(); + QRectF r = QQuickImplicitSizeItem::clipRect(); r.setRight(r.right() + cursorWidth); return r; } @@ -2727,7 +2753,6 @@ void QQuickTextInputPrivate::updateLayout() if (!q->isComponentComplete()) return; - const QRectF previousRect = boundingRect; QTextOption option = m_textLayout.textOption(); option.setTextDirection(layoutDirection()); @@ -2736,8 +2761,8 @@ void QQuickTextInputPrivate::updateLayout() m_textLayout.setTextOption(option); m_textLayout.setFont(font); - boundingRect = QRectF(); m_textLayout.beginLayout(); + QTextLine line = m_textLayout.createLine(); if (requireImplicitWidth) { line.setLineWidth(INT_MAX); @@ -2750,12 +2775,14 @@ void QQuickTextInputPrivate::updateLayout() } qreal lineWidth = q->widthValid() ? q->width() : INT_MAX; qreal height = 0; + qreal width = 0; do { line.setLineWidth(lineWidth); - line.setPosition(QPointF(line.position().x(), height)); - boundingRect = boundingRect.united(line.naturalTextRect()); + line.setPosition(QPointF(0, height)); height += line.height(); + width = qMax(width, line.naturalTextWidth()); + line = m_textLayout.createLine(); } while (line.isValid()); m_textLayout.endLayout(); @@ -2765,15 +2792,18 @@ void QQuickTextInputPrivate::updateLayout() textLayoutDirty = true; + const QSizeF previousSize = contentSize; + contentSize = QSizeF(width, height); + updateType = UpdatePaintNode; q->update(); if (!requireImplicitWidth && !q->widthValid()) - q->setImplicitSize(qCeil(boundingRect.width()), qCeil(boundingRect.height())); + q->setImplicitSize(width, height); else - q->setImplicitHeight(qCeil(boundingRect.height())); + q->setImplicitHeight(height); - if (previousRect != boundingRect) + if (previousSize != contentSize) emit q->contentSizeChanged(); } diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index 9d32eeec60..9a3be0f116 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -245,6 +245,8 @@ public: QVariant inputMethodQuery(Qt::InputMethodQuery property) const; QRectF boundingRect() const; + QRectF clipRect() const; + #ifndef QT_NO_CLIPBOARD bool canPaste() const; #endif diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 1bc2cf548b..d952b27b6f 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -172,7 +172,7 @@ public: }; QElapsedTimer tripleClickTimer; - QRectF boundingRect; + QSizeF contentSize; QPointF pressPos; QPointF tripleClickStartPoint; |