aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/qquicktext.cpp10
-rw-r--r--src/quick/items/qquicktext_p.h1
-rw-r--r--src/quick/items/qquicktextedit.cpp47
-rw-r--r--src/quick/items/qquicktextedit_p.h1
-rw-r--r--src/quick/items/qquicktextinput.cpp52
-rw-r--r--src/quick/items/qquicktextinput_p.h2
-rw-r--r--src/quick/items/qquicktextinput_p_p.h2
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;