When selecting text with the mouse, inset selection happens in the middle

This commit is contained in:
Guillaume Munch 2017-02-18 23:03:53 +01:00
parent 86d9abeea7
commit eb4a2a190f
5 changed files with 21 additions and 14 deletions

View File

@ -95,7 +95,7 @@ double Row::Element::pos2x(pos_type const i) const
} }
pos_type Row::Element::x2pos(int &x) const pos_type Row::Element::x2pos(int &x, bool const select) const
{ {
//lyxerr << "x2pos: x=" << x << " w=" << width() << " " << *this; //lyxerr << "x2pos: x=" << x << " w=" << width() << " " << *this;
size_t i = 0; size_t i = 0;
@ -112,17 +112,18 @@ pos_type Row::Element::x2pos(int &x) const
x = isRTL() ? int(full_width()) : 0; x = isRTL() ? int(full_width()) : 0;
break; break;
case INSET: case INSET:
case SPACE: case SPACE: {
int const boundary = select ? (full_width() + 1) / 2 : full_width();
// those elements contain only one position. Round to // those elements contain only one position. Round to
// the closest side. // the closest side.
if (x > full_width()) { if (x > boundary) {
x = int(full_width()); x = int(full_width());
i = !isRTL(); i = !isRTL();
} else { } else {
x = 0; x = 0;
i = isRTL(); i = isRTL();
} }
}
} }
//lyxerr << "=> p=" << pos + i << " x=" << x << endl; //lyxerr << "=> p=" << pos + i << " x=" << x << endl;
return pos + i; return pos + i;

View File

@ -80,12 +80,13 @@ public:
/** Return position in pixels (from the left) of position /** Return position in pixels (from the left) of position
* \param i in the row element. * \param i in the row element.
*/ */
double pos2x(pos_type const i) const; double pos2x(pos_type i) const;
/** Return character position that is the closest to /** Return character position that is the closest to
* pixel position \param x. The value \param x is * pixel position \param x. The value \param x is
* adjusted to the actual pixel position. * adjusted to the actual pixel position.
* \param select if true, return the right edge when closer.
*/ */
pos_type x2pos(int &x) const; pos_type x2pos(int & x, bool select = false) const;
/** Break the element if possible, so that its width is less /** Break the element if possible, so that its width is less
* than \param w. Returns true on success. When \param force * than \param w. Returns true on success. When \param force
* is true, the string is cut at any place, other wise it * is true, the string is cut at any place, other wise it

View File

@ -1690,7 +1690,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
int const wh = bv->workHeight(); int const wh = bv->workHeight();
int const y = max(0, min(wh - 1, cmd.y())); int const y = max(0, min(wh - 1, cmd.y()));
tm->setCursorFromCoordinates(cur, cmd.x(), y); tm->setCursorFromCoordinates(cur, cmd.x(), y, true);
cur.setTargetX(cmd.x()); cur.setTargetX(cmd.x());
// Don't allow selecting a separator inset // Don't allow selecting a separator inset
if (cur.pos() && cur.paragraph().isEnvSeparator(cur.pos() - 1)) if (cur.pos() && cur.paragraph().isEnvSeparator(cur.pos() - 1))

View File

@ -1094,7 +1094,7 @@ void TextMetrics::setRowHeight(Row & row) const
// returns the column near the specified x-coordinate of the row // returns the column near the specified x-coordinate of the row
// x is set to the real beginning of this column // x is set to the real beginning of this column
pos_type TextMetrics::getPosNearX(Row const & row, int & x, pos_type TextMetrics::getPosNearX(Row const & row, int & x,
bool & boundary) const bool & boundary, bool const select) const
{ {
//LYXERR0("getPosNearX(" << x << ") row=" << row); //LYXERR0("getPosNearX(" << x << ") row=" << row);
/// For the main Text, it is possible that this pit is not /// For the main Text, it is possible that this pit is not
@ -1124,7 +1124,7 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x,
for ( ; cit != cend; ++cit) { for ( ; cit != cend; ++cit) {
if (w <= x && w + cit->full_width() > x) { if (w <= x && w + cit->full_width() > x) {
int x_offset = int(x - w); int x_offset = int(x - w);
pos = cit->x2pos(x_offset); pos = cit->x2pos(x_offset, select);
x = int(x_offset + w); x = int(x_offset + w);
break; break;
} }
@ -1382,7 +1382,8 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
} }
void TextMetrics::setCursorFromCoordinates(Cursor & cur, int const x, int const y) void TextMetrics::setCursorFromCoordinates(Cursor & cur, int const x,
int const y, bool const select)
{ {
LASSERT(text_ == cur.text(), return); LASSERT(text_ == cur.text(), return);
pit_type const pit = getPitNearY(y); pit_type const pit = getPitNearY(y);
@ -1409,7 +1410,7 @@ void TextMetrics::setCursorFromCoordinates(Cursor & cur, int const x, int const
bool bound = false; bool bound = false;
int xx = x; int xx = x;
pos_type const pos = getPosNearX(row, xx, bound); pos_type const pos = getPosNearX(row, xx, bound, select);
LYXERR(Debug::DEBUG, "setting cursor pit: " << pit << " pos: " << pos); LYXERR(Debug::DEBUG, "setting cursor pit: " << pit << " pos: " << pos);

View File

@ -150,7 +150,8 @@ public:
/// returns the position near the specified x-coordinate of the row. /// returns the position near the specified x-coordinate of the row.
/// x is an absolute screen coord, it is set to the real beginning /// x is an absolute screen coord, it is set to the real beginning
/// of this column. This takes in account horizontal cursor row scrolling. /// of this column. This takes in account horizontal cursor row scrolling.
pos_type getPosNearX(Row const & row, int & x, bool & boundary) const; pos_type getPosNearX(Row const & row, int & x, bool & boundary,
bool select = false) const;
/// returns pos in given par at given x coord. /// returns pos in given par at given x coord.
pos_type x2pos(pit_type pit, int row, int x) const; pos_type x2pos(pit_type pit, int row, int x) const;
@ -188,7 +189,10 @@ public:
/// sets cursor only within this Text. /// sets cursor only within this Text.
/// x,y are screen coordinates /// x,y are screen coordinates
void setCursorFromCoordinates(Cursor & cur, int x, int y); /// If select is true, move to the next position if closer to the right
/// edge.
void setCursorFromCoordinates(Cursor & cur, int x, int y,
bool select = false);
/// ///
int cursorX(CursorSlice const & cursor, bool boundary) const; int cursorX(CursorSlice const & cursor, bool boundary) const;