summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPasi Matilainen <pasi.matilainen@digia.com>2012-01-16 09:10:18 +0200
committerQt by Nokia <qt-info@nokia.com>2012-02-08 12:37:22 +0100
commit6dc85408cdf2341f8b7c0911abfb3bb6a37021a8 (patch)
tree70a0199c26aefb207785298d9be658577440ded8
parent0a8671fe502396e7c527dd82c3ec2e9daa4bf513 (diff)
QTextEdit cursor position fix when moving left/right with selection
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)
-rw-r--r--src/gui/text/qtextcursor.cpp26
-rw-r--r--tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp4
-rw-r--r--tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp4
3 files changed, 24 insertions, 10 deletions
diff --git a/src/gui/text/qtextcursor.cpp b/src/gui/text/qtextcursor.cpp
index 25ec09d9db..ddf2fb080e 100644
--- a/src/gui/text/qtextcursor.cpp
+++ b/src/gui/text/qtextcursor.cpp
@@ -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:
diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
index 1b483512e3..615e4453bc 100644
--- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
+++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
@@ -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);
}
diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
index 47eb3a59a3..6253ef89e4 100644
--- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
+++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
@@ -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);
}