From 1639abb8edaa492c649e69d093436f8a96f07bec Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 1 May 2016 01:27:13 +0200 Subject: [PATCH] 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. --- src/Row.cpp | 3 ++- src/Row.h | 6 ++++++ src/TextMetrics.cpp | 15 ++++++++++++++- src/TextMetrics.h | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Row.cpp b/src/Row.cpp index d0694f7d2e..58a23805f2 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -148,7 +148,8 @@ Row::Row() : separator(0), label_hfill(0), left_margin(0), right_margin(0), sel_beg(-1), sel_end(-1), 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) {} diff --git a/src/Row.h b/src/Row.h index f0c5b72ca1..0bd4597746 100644 --- a/src/Row.h +++ b/src/Row.h @@ -144,6 +144,10 @@ public: void setSelectionAndMargins(DocIterator const & beg, DocIterator const & end) const; + /// + void pit(pit_type p) { pit_ = p; } + /// + pit_type pit() const { return pit_; } /// void pos(pos_type p) { pos_ = p; } /// @@ -286,6 +290,8 @@ private: mutable bool changed_; /// CRC of row contents. mutable size_type crc_; + /// Index of the paragraph that contains this row + pit_type pit_; /// first pos covered by this row pos_type pos_; /// one behind last pos covered by this row diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 816f4bacd6..fdf0da6926 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -443,6 +443,7 @@ bool TextMetrics::redoParagraph(pit_type const pit) if (row_index == pm.rows().size()) pm.rows().push_back(Row()); Row & row = pm.rows()[row_index]; + row.pit(pit); row.pos(first); breakRow(row, right_margin, pit); setRowHeight(row, pit); @@ -1113,6 +1114,16 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x, int const xo = origin_.x_; x -= xo; + int offset = 0; + CursorSlice rowSlice(const_cast(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(); boundary = false; if (row.empty()) @@ -1166,8 +1177,10 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x, else boundary = row.right_boundary(); } - x += xo; + + x += xo - offset; //LYXERR0("getPosNearX ==> pos=" << pos << ", boundary=" << boundary); + return pos; } diff --git a/src/TextMetrics.h b/src/TextMetrics.h index f0abcb5201..6f5cf68733 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -150,7 +150,7 @@ private: public: /// returns the position near the specified x-coordinate of the row. /// 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; /// returns pos in given par at given x coord.