Let getPosNearX take horizontal scrolling into account

If we do not do that, it is not possible to position the cursor after
a long inset with the mouse.

To do this, it is necessary to add the pit information to the Row
object. This is a good idea in any case, and will allow to simplify
some code later on.

Fixes bug #10094.
(cherry picked from commit 8851645799ef67015e49fd75b9dfeed65d685e85)
This commit is contained in:
Jean-Marc Lasgouttes 2016-05-01 01:27:13 +02:00
parent 390adf75c5
commit 79be66bdf1
5 changed files with 26 additions and 3 deletions

View File

@ -148,7 +148,8 @@ Row::Row()
: separator(0), label_hfill(0), left_margin(0), right_margin(0), : separator(0), label_hfill(0), left_margin(0), right_margin(0),
sel_beg(-1), sel_end(-1), sel_beg(-1), sel_end(-1),
begin_margin_sel(false), end_margin_sel(false), begin_margin_sel(false), end_margin_sel(false),
changed_(false), crc_(0), pos_(0), end_(0), right_boundary_(false) changed_(false), crc_(0),
pit_(0), pos_(0), end_(0), right_boundary_(false)
{} {}

View File

@ -144,6 +144,10 @@ public:
void setSelectionAndMargins(DocIterator const & beg, void setSelectionAndMargins(DocIterator const & beg,
DocIterator const & end) const; DocIterator const & end) const;
///
void pit(pit_type p) { pit_ = p; }
///
pit_type pit() const { return pit_; }
/// ///
void pos(pos_type p) { pos_ = p; } void pos(pos_type p) { pos_ = p; }
/// ///
@ -286,6 +290,8 @@ private:
mutable bool changed_; mutable bool changed_;
/// CRC of row contents. /// CRC of row contents.
mutable size_type crc_; mutable size_type crc_;
/// Index of the paragraph that contains this row
pit_type pit_;
/// first pos covered by this row /// first pos covered by this row
pos_type pos_; pos_type pos_;
/// one behind last pos covered by this row /// one behind last pos covered by this row

View File

@ -443,6 +443,7 @@ bool TextMetrics::redoParagraph(pit_type const pit)
if (row_index == pm.rows().size()) if (row_index == pm.rows().size())
pm.rows().push_back(Row()); pm.rows().push_back(Row());
Row & row = pm.rows()[row_index]; Row & row = pm.rows()[row_index];
row.pit(pit);
row.pos(first); row.pos(first);
breakRow(row, right_margin, pit); breakRow(row, right_margin, pit);
setRowHeight(row, pit); setRowHeight(row, pit);
@ -1113,6 +1114,16 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x,
int const xo = origin_.x_; int const xo = origin_.x_;
x -= xo; x -= xo;
int offset = 0;
CursorSlice rowSlice(const_cast<InsetText &>(text_->inset()));
rowSlice.pit() = row.pit();
rowSlice.pos() = row.pos();
// Adapt to cursor row scroll offset if applicable.
if (bv_->currentRowSlice() == rowSlice)
offset = bv_->horizScrollOffset();
x += offset;
pos_type pos = row.pos(); pos_type pos = row.pos();
boundary = false; boundary = false;
if (row.empty()) if (row.empty())
@ -1166,8 +1177,10 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x,
else else
boundary = row.right_boundary(); boundary = row.right_boundary();
} }
x += xo;
x += xo - offset;
//LYXERR0("getPosNearX ==> pos=" << pos << ", boundary=" << boundary); //LYXERR0("getPosNearX ==> pos=" << pos << ", boundary=" << boundary);
return pos; return pos;
} }

View File

@ -150,7 +150,7 @@ private:
public: 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. /// 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) const;
/// returns pos in given par at given x coord. /// returns pos in given par at given x coord.

View File

@ -57,6 +57,9 @@ What's new
- Fix horizontal scrolling feature when inside a collapsable inset - Fix horizontal scrolling feature when inside a collapsable inset
with several paragraphs. with several paragraphs.
- Fix selection of large formula with the mouse when horizontal
scrolling kicks in (but 10094).
- Fix display of collapsable insets when the same document is shown in - Fix display of collapsable insets when the same document is shown in
two views with different width (bug 9756). two views with different width (bug 9756).