commit 8851645799ef67015e49fd75b9dfeed65d685e85
Author: Jean-Marc Lasgouttes <[email protected]>
Date:   Sun May 1 01:27:13 2016 +0200

    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.

diff --git a/src/Row.cpp b/src/Row.cpp
index d0694f7..58a2380 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 f0c5b72..0bd4597 100644
--- a/src/Row.h
+++ b/src/Row.h
@@ -145,6 +145,10 @@ public:
                DocIterator const & end) const;
 
        ///
+       void pit(pit_type p) { pit_ = p; }
+       ///
+       pit_type pit() const { return pit_; }
+       ///
        void pos(pos_type p) { pos_ = p; }
        ///
        pos_type pos() const { return pos_; }
@@ -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 816f4ba..fdf0da6 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<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();
        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 f0abcb5..6f5cf68 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.

Reply via email to