Blob Blame History Raw
From 9bb03b5dcc21275986df3d8b0efb6f28cdc583ec Mon Sep 17 00:00:00 2001
From: Wang Chuan <ouchuanm@outlook.com>
Date: Mon, 5 Apr 2021 11:41:48 +0800
Subject: [PATCH 18/20] QQuickTextInput: update cursor rectangle after padding
 changed

The position of cursor delegate needs to be updated when we change
padding, otherwise it will be in a wrong position.

Fixes: QTBUG-91867
Pick-to: 5.12 5.15 6.0 6.1
Change-Id: I89ca84fe893ebf517ab67890196eede14a4055d7
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit d98694c4023881673259ba040c10df7e71ec3d37)
---
 src/quick/items/qquicktextinput.cpp           |  5 ++++
 .../checkCursorDelegateWhenPaddingChanged.qml | 16 ++++++++++
 .../qquicktextinput/tst_qquicktextinput.cpp   | 30 +++++++++++++++++++
 3 files changed, 51 insertions(+)
 create mode 100644 tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml

diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp
index 079bf58abe..7d0d05700a 100644
--- a/src/quick/items/qquicktextinput.cpp
+++ b/src/quick/items/qquicktextinput.cpp
@@ -2952,6 +2952,7 @@ void QQuickTextInputPrivate::setTopPadding(qreal value, bool reset)
     }
     if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
+        q->updateCursorRectangle();
         emit q->topPaddingChanged();
     }
 }
@@ -2966,6 +2967,7 @@ void QQuickTextInputPrivate::setLeftPadding(qreal value, bool reset)
     }
     if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
+        q->updateCursorRectangle();
         emit q->leftPaddingChanged();
     }
 }
@@ -2980,6 +2982,7 @@ void QQuickTextInputPrivate::setRightPadding(qreal value, bool reset)
     }
     if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
+        q->updateCursorRectangle();
         emit q->rightPaddingChanged();
     }
 }
@@ -2994,6 +2997,7 @@ void QQuickTextInputPrivate::setBottomPadding(qreal value, bool reset)
     }
     if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
+        q->updateCursorRectangle();
         emit q->bottomPaddingChanged();
     }
 }
@@ -4712,6 +4716,7 @@ void QQuickTextInput::setPadding(qreal padding)
 
     d->extra.value().padding = padding;
     d->updateLayout();
+    updateCursorRectangle();
     emit paddingChanged();
     if (!d->extra.isAllocated() || !d->extra->explicitTopPadding)
         emit topPaddingChanged();
diff --git a/tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml b/tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml
new file mode 100644
index 0000000000..e6f07b4687
--- /dev/null
+++ b/tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml
@@ -0,0 +1,16 @@
+import QtQuick 2.12
+
+Rectangle {
+    width: 200
+    height: 200
+    TextInput {
+        objectName: "textInput"
+        leftPadding: 10
+        focus: true
+        cursorDelegate: Rectangle {
+            objectName: "cursorDelegate"
+            width: 5
+            color: "red"
+        }
+    }
+}
diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
index 2e64c80b85..ac502bcb28 100644
--- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
+++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
@@ -236,6 +236,7 @@ private slots:
     void QTBUG_51115_readOnlyResetsSelection();
     void QTBUG_77814_InsertRemoveNoSelection();
 
+    void checkCursorDelegateWhenPaddingChanged();
 private:
     void simulateKey(QWindow *, int key);
 
@@ -7054,6 +7055,35 @@ void tst_qquicktextinput::QTBUG_77814_InsertRemoveNoSelection()
     QCOMPARE(textInput->selectedText(), QString());
 }
 
+void tst_qquicktextinput::checkCursorDelegateWhenPaddingChanged()
+{
+    QQuickView view;
+    view.setSource(testFileUrl("checkCursorDelegateWhenPaddingChanged.qml"));
+    view.show();
+    QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+    QQuickTextInput *textInput = view.rootObject()->findChild<QQuickTextInput *>("textInput");
+    QVERIFY(textInput);
+
+    QQuickItem *cursorDelegate = textInput->findChild<QQuickItem *>("cursorDelegate");
+    QVERIFY(cursorDelegate);
+
+    QCOMPARE(cursorDelegate->x(), textInput->leftPadding());
+    QCOMPARE(cursorDelegate->y(), textInput->topPadding());
+
+    textInput->setPadding(5);
+    QCOMPARE(cursorDelegate->x(), textInput->leftPadding());
+    QCOMPARE(cursorDelegate->y(), textInput->topPadding());
+
+    textInput->setTopPadding(10);
+    QCOMPARE(cursorDelegate->x(), textInput->leftPadding());
+    QCOMPARE(cursorDelegate->y(), textInput->topPadding());
+
+    textInput->setLeftPadding(10);
+    QCOMPARE(cursorDelegate->x(), textInput->leftPadding());
+    QCOMPARE(cursorDelegate->y(), textInput->topPadding());
+}
+
 QTEST_MAIN(tst_qquicktextinput)
 
 #include "tst_qquicktextinput.moc"
-- 
2.35.1