Index: autotests/src/kateview_test.h =================================================================== --- autotests/src/kateview_test.h +++ autotests/src/kateview_test.h @@ -33,18 +33,14 @@ private Q_SLOTS: void testReloadMultipleViews(); void testTabCursorOnReload(); - void testLowerCaseBlockSelection(); - void testCoordinatesToCursor(); void testCursorToCoordinates(); - void testSelection(); + void testDeselectByArrowKeys(); void testKillline(); void testScrollPastEndOfDocument(); - void testFoldFirstLine(); - void testDragAndDrop(); void testGotoMatchingBracket(); }; Index: autotests/src/kateview_test.cpp =================================================================== --- autotests/src/kateview_test.cpp +++ autotests/src/kateview_test.cpp @@ -267,6 +267,46 @@ QCOMPARE(view->selectionRange(), Range(1, 1, 2, 1)); } +void KateViewTest::testDeselectByArrowKeys() +{ + KTextEditor::DocumentPrivate doc; + doc.setText("foobarhaz"); + + KTextEditor::ViewPrivate *view = new KTextEditor::ViewPrivate(&doc, nullptr); + KTextEditor::Cursor cur1(0, 3); // Start of bar: foo|barhaz + KTextEditor::Cursor cur2(0, 6); // End of bar: foobar|haz + KTextEditor::Cursor curDelta(0, 1); + Range range(cur1, cur2); // Select "bar" + + view->setSelection(range); + QCOMPARE(view->selectionText(), QLatin1String("bar")); + + view->setCursorPositionInternal(cur1); + view->cursorLeft(); + QCOMPARE(view->cursorPosition(), cur1); // Be at begin: foo|barhaz + QCOMPARE(view->selection(), false); + + view->setSelection(range); + view->setCursorPositionInternal(cur1); + view->cursorRight(); + QCOMPARE(view->cursorPosition(), cur2); // Be at end: foobar|haz + QCOMPARE(view->selection(), false); + + view->config()->setPersistentSelection(true); + + view->setSelection(range); + view->setCursorPositionInternal(cur1); + view->cursorLeft(); + QCOMPARE(view->cursorPosition(), cur1 - curDelta); // Be one left: fo|obarhaz + QCOMPARE(view->selection(), true); + + view->setSelection(range); + view->setCursorPositionInternal(cur1); + view->cursorRight(); + QCOMPARE(view->cursorPosition(), cur1 + curDelta); // Be one right: foob|arhaz + QCOMPARE(view->selection(), true); +} + void KateViewTest::testKillline() { KTextEditor::DocumentPrivate doc; Index: src/view/kateview.cpp =================================================================== --- src/view/kateview.cpp +++ src/view/kateview.cpp @@ -2789,6 +2789,12 @@ void KTextEditor::ViewPrivate::cursorLeft() { + if (selection() && !config()->persistentSelection()) { + m_viewInternal->updateCursor(selectionRange().start()); + setSelection(KTextEditor::Range::invalid()); + return; + } + if (m_viewInternal->m_view->currentTextLine().isRightToLeft()) { m_viewInternal->cursorNextChar(); } else { @@ -2807,6 +2813,12 @@ void KTextEditor::ViewPrivate::cursorRight() { + if (selection() && !config()->persistentSelection()) { + m_viewInternal->updateCursor(selectionRange().end()); + setSelection(KTextEditor::Range::invalid()); + return; + } + if (m_viewInternal->m_view->currentTextLine().isRightToLeft()) { m_viewInternal->cursorPrevChar(); } else {