Fix TextEdit::lineCount to update as appropriate
authorJ-P Nurmi <jpnurmi@digia.com>
Thu, 6 Mar 2014 12:37:41 +0000 (13:37 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 10 Mar 2014 14:11:51 +0000 (15:11 +0100)
The total line count needs to be updated when geometry,
document size or wrapping mode changes.

Task-number: QTBUG-37263
Change-Id: If58a2f77022475e8bcb7cca0f2a091ee837b39a5
Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
Reviewed-by: Caroline Chao <caroline.chao@digia.com>
src/quick/items/qquicktextedit.cpp
tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp

index 810a47c..6655720 100644 (file)
@@ -2029,7 +2029,6 @@ void QQuickTextEdit::q_textChanged()
     d->determineHorizontalAlignment();
     d->updateDefaultTextOption();
     updateSize();
-    updateTotalLines();
     emit textChanged();
 }
 
@@ -2225,6 +2224,7 @@ void QQuickTextEdit::updateSize()
     if (d->contentSize != size) {
         d->contentSize = size;
         emit contentSizeChanged();
+        updateTotalLines();
     }
 }
 
index e6a83b3..83fa496 100644 (file)
@@ -108,6 +108,8 @@ private slots:
     void width();
     void wrap();
     void textFormat();
+    void lineCount_data();
+    void lineCount();
 
     // ### these tests may be trivial
     void hAlign();
@@ -613,6 +615,55 @@ void tst_qquicktextedit::textFormat()
     }
 }
 
+static int calcLineCount(QTextDocument* doc)
+{
+    int subLines = 0;
+    for (QTextBlock it = doc->begin(); it != doc->end(); it = it.next()) {
+        QTextLayout *layout = it.layout();
+        if (!layout)
+            continue;
+        subLines += layout->lineCount()-1;
+    }
+    return doc->lineCount() + subLines;
+}
+
+void tst_qquicktextedit::lineCount_data()
+{
+    QTest::addColumn<QStringList>("texts");
+    QTest::newRow("plaintext") << standard;
+    QTest::newRow("richtext") << richText;
+}
+
+void tst_qquicktextedit::lineCount()
+{
+    QFETCH(QStringList, texts);
+
+    foreach (const QString& text, texts) {
+        QQmlComponent component(&engine);
+        component.setData("import QtQuick 2.0\nTextEdit { }", QUrl());
+
+        QQuickTextEdit *textedit = qobject_cast<QQuickTextEdit*>(component.create());
+        QVERIFY(textedit);
+
+        QTextDocument *doc = QQuickTextEditPrivate::get(textedit)->document;
+        QVERIFY(doc);
+
+        textedit->setText(text);
+
+        textedit->setWidth(100.0);
+        QCOMPARE(textedit->lineCount(), calcLineCount(doc));
+
+        textedit->setWrapMode(QQuickTextEdit::Wrap);
+        QCOMPARE(textedit->lineCount(), calcLineCount(doc));
+
+        textedit->setWidth(50.0);
+        QCOMPARE(textedit->lineCount(), calcLineCount(doc));
+
+        textedit->setWrapMode(QQuickTextEdit::NoWrap);
+        QCOMPARE(textedit->lineCount(), calcLineCount(doc));
+    }
+}
+
 //the alignment tests may be trivial o.oa
 void tst_qquicktextedit::hAlign()
 {