Make sure cursor navigation in qtexttable works like user expects
Before the selection of cells NW of anchor showed some defects where cells would not be selected as the user expects Change-Id: Ia2b63f11b8d534e918ffb97b76339d60f1ca0389 Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
This commit is contained in:
parent
1ee9c0925b
commit
1222da803a
@ -269,25 +269,7 @@ void QTextCursorPrivate::adjustCursor(QTextCursor::MoveOperation m)
|
|||||||
QTextTableCell c_position = table->cellAt(position);
|
QTextTableCell c_position = table->cellAt(position);
|
||||||
QTextTableCell c_anchor = table->cellAt(adjusted_anchor);
|
QTextTableCell c_anchor = table->cellAt(adjusted_anchor);
|
||||||
if (c_position != c_anchor) {
|
if (c_position != c_anchor) {
|
||||||
bool before;
|
position = c_position.firstPosition();
|
||||||
int col_position = c_position.column();
|
|
||||||
int col_anchor = c_anchor.column();
|
|
||||||
if (col_position == col_anchor) {
|
|
||||||
before = c_position.row() < c_anchor.row();
|
|
||||||
} else {
|
|
||||||
before = col_position < col_anchor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// adjust to cell boundaries
|
|
||||||
if (m <= QTextCursor::WordLeft) {
|
|
||||||
position = c_position.firstPosition();
|
|
||||||
if (!before)
|
|
||||||
--position;
|
|
||||||
} else {
|
|
||||||
position = c_position.lastPosition();
|
|
||||||
if (before)
|
|
||||||
++position;
|
|
||||||
}
|
|
||||||
if (position < adjusted_anchor)
|
if (position < adjusted_anchor)
|
||||||
adjusted_anchor = c_anchor.lastPosition();
|
adjusted_anchor = c_anchor.lastPosition();
|
||||||
else
|
else
|
||||||
@ -391,6 +373,17 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
|
|||||||
|
|
||||||
int newPosition = position;
|
int newPosition = position;
|
||||||
|
|
||||||
|
if (mode == QTextCursor::KeepAnchor && complexSelectionTable() != 0) {
|
||||||
|
if ((op >= QTextCursor::EndOfLine && op <= QTextCursor::NextWord)
|
||||||
|
|| (op >= QTextCursor::Right && op <= QTextCursor::WordRight)) {
|
||||||
|
QTextTable *t = qobject_cast<QTextTable *>(priv->frameAt(position));
|
||||||
|
Q_ASSERT(t); // as we have already made sure we have a complex selection
|
||||||
|
QTextTableCell cell_pos = t->cellAt(position);
|
||||||
|
if (cell_pos.column() + cell_pos.columnSpan() != t->columns())
|
||||||
|
op = QTextCursor::NextCell;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (x == -1 && !priv->isInEditBlock() && (op == QTextCursor::Up || op == QTextCursor::Down))
|
if (x == -1 && !priv->isInEditBlock() && (op == QTextCursor::Up || op == QTextCursor::Down))
|
||||||
setX();
|
setX();
|
||||||
|
|
||||||
|
@ -872,27 +872,147 @@ void tst_QTextCursor::tableMovement()
|
|||||||
|
|
||||||
void tst_QTextCursor::selectionsInTable()
|
void tst_QTextCursor::selectionsInTable()
|
||||||
{
|
{
|
||||||
QTextTable *table = cursor.insertTable(2, 2);
|
QTextTable *table = cursor.insertTable(3, 3);
|
||||||
table->cellAt(0, 0).firstCursorPosition().insertText("First");
|
table->cellAt(0, 0).firstCursorPosition().insertText("A a"); // first = 1
|
||||||
table->cellAt(0, 1).firstCursorPosition().insertText("Second");
|
table->cellAt(0, 1).firstCursorPosition().insertText("B b"); // first = 5
|
||||||
table->cellAt(1, 0).firstCursorPosition().insertText("Third");
|
table->cellAt(0, 2).firstCursorPosition().insertText("C c"); // first = 9
|
||||||
table->cellAt(1, 1).firstCursorPosition().insertText("Fourth");
|
table->cellAt(1, 0).firstCursorPosition().insertText("D d"); // first = 13
|
||||||
|
table->cellAt(1, 1).firstCursorPosition().insertText("E e"); // first = 17
|
||||||
|
table->cellAt(1, 2).firstCursorPosition().insertText("F f"); // first = 21
|
||||||
|
table->cellAt(2, 0).firstCursorPosition().insertText("G g"); // first = 25
|
||||||
|
table->cellAt(2, 1).firstCursorPosition().insertText("H h"); // first = 29
|
||||||
|
table->cellAt(2, 2).firstCursorPosition().insertText("I i"); // first = 33
|
||||||
|
|
||||||
cursor = table->cellAt(0, 0).lastCursorPosition();
|
cursor = table->cellAt(0, 0).lastCursorPosition();
|
||||||
|
QCOMPARE(cursor.position(), 4);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor));
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor) == false);
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor) == false);
|
||||||
|
QCOMPARE(cursor.position(), 1);
|
||||||
|
|
||||||
cursor = table->cellAt(1, 0).lastCursorPosition();
|
cursor = table->cellAt(1, 0).lastCursorPosition();
|
||||||
|
QCOMPARE(cursor.position(), 16);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor));
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor) == false);
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor) == false);
|
||||||
|
QCOMPARE(cursor.position(), 13);
|
||||||
|
|
||||||
cursor = table->cellAt(0, 1).firstCursorPosition();
|
cursor = table->cellAt(0, 2).firstCursorPosition();
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor));
|
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor) == false);
|
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor) == false);
|
||||||
|
|
||||||
cursor = table->cellAt(1, 1).firstCursorPosition();
|
cursor = table->cellAt(1, 2).firstCursorPosition();
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor));
|
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor));
|
||||||
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor) == false);
|
QVERIFY(cursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor) == false);
|
||||||
|
|
||||||
|
// Next let's test selecting entire cells one at a time
|
||||||
|
cursor = table->cellAt(0, 0).firstCursorPosition();
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 9);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 13);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 17);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 21);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 25);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 29);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 33);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor) == false);
|
||||||
|
|
||||||
|
// And now lets walk all the way back
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 29);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 25);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 21);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 17);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 13);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 9);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 1);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::PreviousCell, QTextCursor::KeepAnchor) == false);
|
||||||
|
|
||||||
|
QTextCursor::MoveOperation leftMovements[5] = {
|
||||||
|
QTextCursor::PreviousBlock
|
||||||
|
, QTextCursor::PreviousCharacter
|
||||||
|
, QTextCursor::PreviousWord
|
||||||
|
, QTextCursor::Left
|
||||||
|
, QTextCursor::WordLeft
|
||||||
|
};
|
||||||
|
|
||||||
|
QTextCursor::MoveOperation rightMovements[5] = {
|
||||||
|
QTextCursor::NextBlock
|
||||||
|
, QTextCursor::NextCharacter
|
||||||
|
, QTextCursor::NextWord
|
||||||
|
, QTextCursor::Right
|
||||||
|
, QTextCursor::WordRight
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
QTextCursor::MoveOperation left = leftMovements[i];
|
||||||
|
QTextCursor::MoveOperation right = rightMovements[i];
|
||||||
|
|
||||||
|
// Lets walk circle around anchor placed at 1,1 using up, down, left and right
|
||||||
|
cursor = table->cellAt(1, 1).firstCursorPosition();
|
||||||
|
QCOMPARE(cursor.position(), 17);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 18); // First right should not jump more than one char
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 21); // Lets jump to the next cell
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 33);
|
||||||
|
QVERIFY(cursor.movePosition(left, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 29);
|
||||||
|
QVERIFY(cursor.movePosition(left, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 25);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::Up, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 13);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::Up, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 1);
|
||||||
|
QVERIFY(cursor.movePosition(right, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5);
|
||||||
|
QVERIFY(cursor.movePosition(right, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 9);
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 21);
|
||||||
|
|
||||||
|
// Lets walk to the side 2 cells and back, first right
|
||||||
|
cursor = table->cellAt(0, 0).firstCursorPosition();
|
||||||
|
QVERIFY(cursor.movePosition(QTextCursor::NextCell, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5); // Lets jump to the next cell
|
||||||
|
QVERIFY(cursor.movePosition(right, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 9);
|
||||||
|
QVERIFY(cursor.movePosition(left, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5);
|
||||||
|
QVERIFY(cursor.movePosition(left, QTextCursor::KeepAnchor));
|
||||||
|
QVERIFY(cursor.position() < 5);
|
||||||
|
|
||||||
|
// Then left
|
||||||
|
cursor = table->cellAt(0, 2).firstCursorPosition();
|
||||||
|
QCOMPARE(cursor.position(), 9);
|
||||||
|
QVERIFY(cursor.movePosition(left, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5); // A single left should do
|
||||||
|
QVERIFY(cursor.movePosition(left, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 1);
|
||||||
|
QVERIFY(cursor.movePosition(right, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 5);
|
||||||
|
QVERIFY(cursor.movePosition(right, QTextCursor::KeepAnchor));
|
||||||
|
QCOMPARE(cursor.position(), 9);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QTextCursor::selectedText()
|
void tst_QTextCursor::selectedText()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user