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.
This commit is contained in:
Jean-Marc Lasgouttes 2023-11-06 11:53:03 +01:00
parent 1677bc5fcd
commit 04a24211a6
2 changed files with 16 additions and 4 deletions

View 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_; }

View 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();
}
}