editXY: make cursor positionning correct over non editable inset

Instead of using complicated (and wrong) code, it is better to use
getPosNearX here.

Also simplify the code by removing temporary variables.

Fixes part of #10569.
This commit is contained in:
Jean-Marc Lasgouttes 2017-04-06 15:08:50 +02:00
parent e3d252cd62
commit 6a0c1c6573

View File

@ -1330,23 +1330,19 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
} }
pit_type pit = getPitNearY(y); pit_type pit = getPitNearY(y);
LASSERT(pit != -1, return 0); LASSERT(pit != -1, return 0);
Row const & row = getPitAndRowNearY(y, pit, assert_in_view, up);
int yy = y; // is modified by getPitAndRowNearY
Row const & row = getPitAndRowNearY(yy, pit, assert_in_view, up);
cur.pit() = pit; cur.pit() = pit;
// Do we cover an inset? // Do we cover an inset?
InsetList::InsetTable * it = checkInsetHit(pit, x, yy); InsetList::InsetTable * it = checkInsetHit(pit, x, y);
if (!it) { if (!it) {
// No inset, set position in the text // No inset, set position in the text
bool bound = false; // is modified by getPosNearX bool bound = false; // is modified by getPosNearX
int xx = x; // is modified by getPosNearX cur.pos() = getPosNearX(row, x, bound);
cur.pos() = getPosNearX(row, xx, bound);
cur.boundary(bound); cur.boundary(bound);
cur.setCurrentFont(); cur.setCurrentFont();
cur.setTargetX(xx); cur.setTargetX(x);
return 0; return 0;
} }
@ -1359,28 +1355,15 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
cur.setTargetX(x); cur.setTargetX(x);
// Try to descend recursively inside the inset. // Try to descend recursively inside the inset.
Inset * edited = inset->editXY(cur, x, yy); Inset * edited = inset->editXY(cur, x, y);
if (edited == inset && cur.pos() == it->pos) { if (edited == inset && cur.pos() == it->pos) {
// non-editable inset, set cursor after the inset if x is // non-editable inset, set cursor after the inset if x is
// nearer to that position (bug 9628) // nearer to that position (bug 9628)
// TODO: This should be replaced with an improvement of bool bound = false; // is modified by getPosNearX
// Cursor::moveToClosestEdge that handles rtl text. (Which could not cur.pos() = getPosNearX(row, x, bound);
// be tested because of #10569.) cur.boundary(bound);
CoordCache::Insets const & insetCache = bv_->coordCache().getInsets(); cur.setCurrentFont();
if (insetCache.has(inset)) { cur.setTargetX(x);
Dimension const & dim = insetCache.dim(inset);
Point p = insetCache.xy(inset);
bool const is_rtl = text_->isRTL(text_->getPar(pit));
if (is_rtl) {
// "in front of" == "right of"
if (abs(p.x_ - x) < abs(p.x_ + dim.wid - x))
cur.posForward();
} else {
// "in front of" == "left of"
if (abs(p.x_ + dim.wid - x) < abs(p.x_ - x))
cur.posForward();
}
}
} }
if (cur.top().text() == text_) if (cur.top().text() == text_)