aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-04-19 11:08:28 +1000
committerQt by Nokia <qt-info@nokia.com>2012-04-27 06:27:46 +0200
commit2a6e105f43885e0901c252bffc77bd1c9db87b67 (patch)
treefbab5df14ceeb7e3a798cdbe4e5c6d5effff331d /src/quick
parent1770fa632facf2f1e4bb05e7689efc939d46cfef (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/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;