]> git.lyx.org Git - lyx.git/commitdiff
Fix word selection expansion when going to the left
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 6 Nov 2023 10:53:03 +0000 (11:53 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 6 Nov 2023 10:53:03 +0000 (11:53 +0100)
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
src/Text.cpp

index 50a633ba989958d7d9635b95803dcc806f464ba7..e362073ef44d7168bb6205d653248beeaa339c69 100644 (file)
@@ -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_; }
index 93ccf2ac99fff94a29577b854e28dde8d9363985..8c8c0bf40ad0480d542962900303e25b23a6c849 100644 (file)
@@ -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();
+       }
 }