From 04a24211a6e5d98c982dcc8b2b4e22f9c2ca27e2 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 6 Nov 2023 11:53:03 +0100 Subject: [PATCH] Fix word selection expansion when going to the left The proper way to do word-wise selection is to compute the words around both the cursor and the anchor. Note that code is uglier than it should because CursorData::normalAnchor() returns a CursorSlice instead of a DocIterator. Fixes bug #12533. --- src/Cursor.h | 1 + src/Text.cpp | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Cursor.h b/src/Cursor.h index 50a633ba98..e362073ef4 100644 --- a/src/Cursor.h +++ b/src/Cursor.h @@ -137,6 +137,7 @@ public: int countInsetsInSelection(InsetCode const & inset) const; /// access to normalized selection anchor + // FIXME: this should return a full DocIterator CursorSlice normalAnchor() const; /// access to real selection anchor DocIterator const & realAnchor() const { return anchor_; } diff --git a/src/Text.cpp b/src/Text.cpp index 93ccf2ac99..8c8c0bf40a 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -1410,11 +1410,22 @@ void Text::expandWordSel(Cursor & cur) Cursor c = cur; c.selection(false); c.text()->selectWord(c, WHOLE_WORD); + // get selection around anchor too. + // FIXME: this cursor is not a proper one. normalAnchor() should + // return a DocIterator. + Cursor a(cur.bv()); + a.push_back(cur.normalAnchor()); + a.text()->selectWord(a, WHOLE_WORD); // use the correct word boundary, depending on selection direction - if (cur.top() > cur.normalAnchor()) - cur.pos() = c.selEnd().pos(); - else - cur.pos() = c.selBegin().pos(); + if (cur.top() > cur.normalAnchor()) { + cur.top() = a.selBegin(); + cur.resetAnchor(); + cur.top() = c.selEnd(); + } else { + cur.top() = a.selEnd(); + cur.resetAnchor(); + cur.top() = c.selBegin(); + } }