QTextEdit cursor position fix when moving left/right with selection
authorPasi Matilainen <pasi.matilainen@digia.com>
Mon, 16 Jan 2012 07:10:18 +0000 (09:10 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 8 Feb 2012 11:37:22 +0000 (12:37 +0100)
When text has been selected in a QTextEdit and the left or right arrow
key is pressed, the cursor moves one character beyond the start or end
of the selection, when it shouldn't move past the selection. Fixed by
moving the cursor to the right place when a selection is active.

Task-number: QTBUG-22853
Change-Id: I9ea1863436db98627a6fd041ce554cf10be26493
Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
(cherry picked from commit 1b031759ddfdab9703dfecac13f1ed318da3dafe)

src/gui/text/qtextcursor.cpp
tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp

index 25ec09d..ddf2fb0 100644 (file)
@@ -414,11 +414,18 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
         break;
     }
     case QTextCursor::PreviousCharacter:
-        newPosition = priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
+        if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+            newPosition = qMin(position, adjusted_anchor);
+        else
+            newPosition = priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
         break;
     case QTextCursor::Left:
-        newPosition = visualMovement ? priv->leftCursorPosition(position)
-                                     : priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
+        if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+            newPosition = visualMovement ? qMax(position, adjusted_anchor)
+                                         : qMin(position, adjusted_anchor);
+        else
+            newPosition = visualMovement ? priv->leftCursorPosition(position)
+                                         : priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
         break;
     case QTextCursor::StartOfWord: {
         if (relativePos == 0)
@@ -530,11 +537,18 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
         break;
     }
     case QTextCursor::NextCharacter:
-        newPosition = priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
+        if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+            newPosition = qMax(position, adjusted_anchor);
+        else
+            newPosition = priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
         break;
     case QTextCursor::Right:
-        newPosition = visualMovement ? priv->rightCursorPosition(position)
-                                     : priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
+        if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+            newPosition = visualMovement ? qMin(position, adjusted_anchor)
+                                         : qMax(position, adjusted_anchor);
+        else
+            newPosition = visualMovement ? priv->rightCursorPosition(position)
+                                         : priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
         break;
     case QTextCursor::NextWord:
     case QTextCursor::WordRight:
index 1b48351..615e445 100644 (file)
@@ -1474,11 +1474,11 @@ void tst_QPlainTextEdit::selectionChanged()
     QCOMPARE(selectionChangedSpy.count(), 3);
 
     QTest::keyClick(ed, Qt::Key_Right);
-    QCOMPARE(ed->textCursor().position(), 5);
+    QCOMPARE(ed->textCursor().position(), 4);
     QCOMPARE(selectionChangedSpy.count(), 4);
 
     QTest::keyClick(ed, Qt::Key_Right);
-    QCOMPARE(ed->textCursor().position(), 6);
+    QCOMPARE(ed->textCursor().position(), 5);
     QCOMPARE(selectionChangedSpy.count(), 4);
 }
 
index 47eb3a5..6253ef8 100644 (file)
@@ -1840,11 +1840,11 @@ void tst_QTextEdit::selectionChanged()
     QCOMPARE(selectionChangedSpy.count(), 3);
 
     QTest::keyClick(ed, Qt::Key_Right);
-    QCOMPARE(ed->textCursor().position(), 5);
+    QCOMPARE(ed->textCursor().position(), 4);
     QCOMPARE(selectionChangedSpy.count(), 4);
 
     QTest::keyClick(ed, Qt::Key_Right);
-    QCOMPARE(ed->textCursor().position(), 6);
+    QCOMPARE(ed->textCursor().position(), 5);
     QCOMPARE(selectionChangedSpy.count(), 4);
 }