diff options
Diffstat (limited to 'src/quick')
-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; |