diff options
author | Joona Petrell <joona.t.petrell@nokia.com> | 2010-06-30 07:10:33 (GMT) |
---|---|---|
committer | Joona Petrell <joona.t.petrell@nokia.com> | 2010-07-02 04:12:40 (GMT) |
commit | 37792d20eeef870a0d695fc15bc943f20275be9a (patch) | |
tree | aa5ed14a44e8ab2edc7c3100f9c6226506c94e59 | |
parent | 3256aad1195e28509a89f217bcad8435f46fe1e5 (diff) | |
download | Qt-37792d20eeef870a0d695fc15bc943f20275be9a.zip Qt-37792d20eeef870a0d695fc15bc943f20275be9a.tar.gz Qt-37792d20eeef870a0d695fc15bc943f20275be9a.tar.bz2 |
Fix TextInput text getting improperly clipped
Task-number: QTBUG-11790
Reviewed-by: Martin Jones
-rw-r--r-- | src/declarative/graphicsitems/qdeclarativetextinput.cpp | 46 | ||||
-rw-r--r-- | src/declarative/graphicsitems/qdeclarativetextinput_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp | 5 | ||||
-rw-r--r-- | tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp | 5 | ||||
-rw-r--r-- | tests/auto/declarative/qdeclarativetextinput/data/halign_center.png | bin | 0 -> 293 bytes | |||
-rw-r--r-- | tests/auto/declarative/qdeclarativetextinput/data/halign_left.png | bin | 0 -> 291 bytes | |||
-rw-r--r-- | tests/auto/declarative/qdeclarativetextinput/data/halign_right.png | bin | 0 -> 292 bytes | |||
-rw-r--r-- | tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml | 22 | ||||
-rw-r--r-- | tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp | 53 |
9 files changed, 110 insertions, 22 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index ed999a2..374f371 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -100,8 +100,6 @@ void QDeclarativeTextInput::setText(const QString &s) if(s == text()) return; d->control->setText(s); - d->updateHorizontalScroll(); - //emit textChanged(); } /*! @@ -550,9 +548,9 @@ void QDeclarativeTextInput::setAutoScroll(bool b) return; d->autoScroll = b; - d->updateHorizontalScroll(); //We need to repaint so that the scrolling is taking into account. updateSize(true); + d->updateHorizontalScroll(); emit autoScrollChanged(d->autoScroll); } @@ -1020,27 +1018,43 @@ bool QDeclarativeTextInput::event(QEvent* ev) void QDeclarativeTextInput::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { - if (newGeometry.width() != oldGeometry.width()) + Q_D(QDeclarativeTextInput); + if (newGeometry.width() != oldGeometry.width()) { updateSize(); + d->updateHorizontalScroll(); + } QDeclarativePaintedItem::geometryChanged(newGeometry, oldGeometry); } +int QDeclarativeTextInputPrivate::calculateTextWidth() +{ + int cursorWidth = control->cursorWidth(); + if(cursorItem) + cursorWidth = cursorItem->width(); + + QFontMetrics fm = QFontMetrics(font); + int leftBearing = 0; + int rightBearing = 0; + if (!control->text().isEmpty()) { + leftBearing = qMax(0, -fm.leftBearing(control->text().at(0))); + rightBearing = qMax(0, -fm.rightBearing(control->text().at(control->text().count()-1))); + } + + return qRound(control->naturalTextWidth()) + qMax(cursorWidth, leftBearing) + rightBearing; +} + void QDeclarativeTextInputPrivate::updateHorizontalScroll() { Q_Q(QDeclarativeTextInput); - QFontMetrics fm = QFontMetrics(font); int cix = qRound(control->cursorToX()); QRect br(q->boundingRect().toRect()); - //###Is this using bearing appropriately? - int minLB = qMax(0, -fm.minLeftBearing()); - int minRB = qMax(0, -fm.minRightBearing()); - int widthUsed = qRound(control->naturalTextWidth()) + 1 + minRB; + int widthUsed = calculateTextWidth(); if (autoScroll) { - if ((minLB + widthUsed) <= br.width()) { + if (widthUsed <= br.width()) { // text fits in br; use hscroll for alignment switch (hAlign & ~(Qt::AlignAbsolute|Qt::AlignVertical_Mask)) { case Qt::AlignRight: - hscroll = widthUsed - br.width() + 1; + hscroll = widthUsed - br.width() - 1; break; case Qt::AlignHCenter: hscroll = (widthUsed - br.width()) / 2; @@ -1050,7 +1064,6 @@ void QDeclarativeTextInputPrivate::updateHorizontalScroll() hscroll = 0; break; } - hscroll -= minLB; } else if (cix - hscroll >= br.width()) { // text doesn't fit, cursor is to the right of br (scroll right) hscroll = cix - br.width() + 1; @@ -1070,7 +1083,6 @@ void QDeclarativeTextInputPrivate::updateHorizontalScroll() } else { hscroll = 0; } - hscroll -= minLB; } } @@ -1095,7 +1107,6 @@ void QDeclarativeTextInput::drawContents(QPainter *p, const QRect &r) offset = QPoint(d->hscroll, 0); } d->control->draw(p, offset, r, flags); - p->restore(); } @@ -1448,8 +1459,8 @@ void QDeclarativeTextInput::selectionChanged() void QDeclarativeTextInput::q_textChanged() { Q_D(QDeclarativeTextInput); - d->updateHorizontalScroll(); updateSize(); + d->updateHorizontalScroll(); updateMicroFocus(); emit textChanged(); emit displayTextChanged(); @@ -1475,10 +1486,7 @@ void QDeclarativeTextInput::updateSize(bool needsRedraw) int w = width(); int h = height(); setImplicitHeight(d->control->height()); - int cursorWidth = d->control->cursorWidth(); - if(d->cursorItem) - cursorWidth = d->cursorItem->width(); - setImplicitWidth(d->control->naturalTextWidth() + cursorWidth); + setImplicitWidth(d->calculateTextWidth()); setContentsSize(QSize(width(), height()));//Repaints if changed if(w==width() && h==height() && needsRedraw){ clearCache(); diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h index 8b74bcc..4ac5134 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h @@ -100,6 +100,7 @@ public: void startCreatingCursor(); void focusChanged(bool hasFocus); void updateHorizontalScroll(); + int calculateTextWidth(); QLineControl* control; diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp index 8a4f152..80198eb 100644 --- a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp +++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp @@ -48,6 +48,7 @@ #include <QGraphicsSceneMouseEvent> #include <qmath.h> #include <QDeclarativeView> +#include <private/qapplication_p.h> #include "../../../shared/util.h" #include "testhttpserver.h" @@ -452,7 +453,9 @@ void tst_qdeclarativetext::alignments() #ifdef Q_WS_X11 // Font-specific, but not likely platform-specific, so only test on one platform - QCOMPARE(actual,expect); + if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") { + QCOMPARE(actual,expect); + } #endif } diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index f1a367f..fc329c8 100644 --- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -55,6 +55,7 @@ #include <QDeclarativeView> #include <QStyle> #include <QInputContext> +#include <private/qapplication_p.h> #ifdef Q_OS_SYMBIAN // In Symbian OS test data is located in applications private dir @@ -353,7 +354,9 @@ void tst_qdeclarativetextedit::alignments() #ifdef Q_WS_X11 // Font-specific, but not likely platform-specific, so only test on one platform - QCOMPARE(actual,expect); + if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") { + QCOMPARE(actual,expect); + } #endif } diff --git a/tests/auto/declarative/qdeclarativetextinput/data/halign_center.png b/tests/auto/declarative/qdeclarativetextinput/data/halign_center.png Binary files differnew file mode 100644 index 0000000..53e09a8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/halign_center.png diff --git a/tests/auto/declarative/qdeclarativetextinput/data/halign_left.png b/tests/auto/declarative/qdeclarativetextinput/data/halign_left.png Binary files differnew file mode 100644 index 0000000..247acbc --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/halign_left.png diff --git a/tests/auto/declarative/qdeclarativetextinput/data/halign_right.png b/tests/auto/declarative/qdeclarativetextinput/data/halign_right.png Binary files differnew file mode 100644 index 0000000..691bc75 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/halign_right.png diff --git a/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml new file mode 100644 index 0000000..b97f18e --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml @@ -0,0 +1,22 @@ +import Qt 4.7 + +Rectangle { + id: top + width: 70; height: 70; + + property alias horizontalAlignment: text.horizontalAlignment + property string text: "Test" + + Rectangle { + anchors.centerIn: parent + width: 60 + height: 20 + color: "green" + + TextInput { + id: text + anchors.fill: parent + text: top.text + } + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp index a55b42e..a21630b 100644 --- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp +++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp @@ -49,6 +49,7 @@ #include <QDebug> #include <QStyle> #include <QInputContext> +#include <private/qapplication_p.h> #ifdef Q_OS_SYMBIAN // In Symbian OS test data is located in applications private dir @@ -63,12 +64,16 @@ public: tst_qdeclarativetextinput(); private slots: + void text(); void width(); void font(); void color(); void selection(); + void horizontalAlignment_data(); + void horizontalAlignment(); + void positionAt(); void maxLength(); @@ -153,7 +158,7 @@ void tst_qdeclarativetextinput::width() QDeclarativeTextInput *textinputObject = qobject_cast<QDeclarativeTextInput*>(textinputComponent.create()); QVERIFY(textinputObject != 0); - QCOMPARE(textinputObject->width(), 1.);//1 for the cursor + QCOMPARE(textinputObject->width(), 1.); // 1 for the cursor delete textinputObject; } @@ -370,6 +375,52 @@ void tst_qdeclarativetextinput::selection() delete textinputObject; } +void tst_qdeclarativetextinput::horizontalAlignment_data() +{ + QTest::addColumn<int>("hAlign"); + QTest::addColumn<QString>("expectfile"); + + QTest::newRow("L") << int(Qt::AlignLeft) << SRCDIR "/data/halign_left.png"; + QTest::newRow("R") << int(Qt::AlignRight) << SRCDIR "/data/halign_right.png"; + QTest::newRow("C") << int(Qt::AlignHCenter) << SRCDIR "/data/halign_center.png"; +} + +void tst_qdeclarativetextinput::horizontalAlignment() +{ + QFETCH(int, hAlign); + QFETCH(QString, expectfile); + +#ifdef Q_WS_X11 + // Font-specific, but not likely platform-specific, so only test on one platform + QFont fn; + fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*"); + QApplication::setFont(fn); +#endif + + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment.qml"); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas)); + QObject *ob = canvas->rootObject(); + QVERIFY(ob != 0); + ob->setProperty("horizontalAlignment",hAlign); + QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32); + actual.fill(qRgb(255,255,255)); + QPainter p(&actual); + canvas->render(&p); + + QImage expect(expectfile); + +#ifdef Q_WS_X11 + // Font-specific, but not likely platform-specific, so only test on one platform + if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") { + QCOMPARE(actual,expect); + } +#endif +} + void tst_qdeclarativetextinput::positionAt() { QDeclarativeView *canvas = createView(SRCDIR "/data/positionAt.qml"); |