commit 654cded167a3d5ce3ee8ec171a698268ef2d589f
Author: Jean-Marc Lasgouttes <[email protected]>
Date:   Mon Jan 15 16:14:21 2018 +0100

    Partial cleanup of the row selection code
    
    This is preliminary work, this code still feels too complicated for
    its own good.
    
    Let Row::isMarginSelected return false when Row::selection() is false
    (the other changes are indentation).
    
    This allows to remove the test for selection() in
    setSelectionAndMargins, so that begin/end_margin_sel are always set
    correctly.
    
    Add clearSelectionAndMargins() instead of calling directly setSelection
    (which is now private) with arguments (-1, -1).
    
    Fixes bug #10972.
---
 src/Row.cpp         |   52 ++++++++++++++++++++++++++++----------------------
 src/Row.h           |   18 +++++++++-------
 src/TextMetrics.cpp |    2 +-
 3 files changed, 40 insertions(+), 32 deletions(-)

diff --git a/src/Row.cpp b/src/Row.cpp
index e105ae2..697e526 100644
--- a/src/Row.cpp
+++ b/src/Row.cpp
@@ -175,25 +175,24 @@ bool Row::isMarginSelected(bool left, DocIterator const & 
beg,
        pos_type const sel_pos = left ? sel_beg : sel_end;
        pos_type const margin_pos = left ? pos_ : end_;
 
-       // Is the chosen margin selected ?
-       if (sel_pos == margin_pos) {
-               if (beg.pos() == end.pos())
-                       // This is a special case in which the space between 
after
-                       // pos i-1 and before pos i is selected, i.e. the 
margins
-                       // (see DocIterator::boundary_).
-                       return beg.boundary() && !end.boundary();
-               else if (end.pos() == margin_pos)
-                       // If the selection ends around the margin, it is only
-                       // drawn if the cursor is after the margin.
-                       return !end.boundary();
-               else if (beg.pos() == margin_pos)
-                       // If the selection begins around the margin, it is
-                       // only drawn if the cursor is before the margin.
-                       return beg.boundary();
-               else
-                       return true;
-       }
-       return false;
+       // Is there a selection and is the chosen margin selected ?
+       if (!selection() || sel_pos != margin_pos)
+               return false;
+       else if (beg.pos() == end.pos())
+               // This is a special case in which the space between after
+               // pos i-1 and before pos i is selected, i.e. the margins
+               // (see DocIterator::boundary_).
+               return beg.boundary() && !end.boundary();
+       else if (end.pos() == margin_pos)
+               // If the selection ends around the margin, it is only
+               // drawn if the cursor is after the margin.
+               return !end.boundary();
+       else if (beg.pos() == margin_pos)
+               // If the selection begins around the margin, it is
+               // only drawn if the cursor is before the margin.
+               return beg.boundary();
+       else
+               return true;
 }
 
 
@@ -202,10 +201,17 @@ void Row::setSelectionAndMargins(DocIterator const & beg,
 {
        setSelection(beg.pos(), end.pos());
 
-       if (selection()) {
-               change(end_margin_sel, isMarginSelected(false, beg, end));
-               change(begin_margin_sel, isMarginSelected(true, beg, end));
-       }
+       change(end_margin_sel, isMarginSelected(false, beg, end));
+       change(begin_margin_sel, isMarginSelected(true, beg, end));
+}
+
+
+void Row::clearSelectionAndMargins() const
+{
+       change(sel_beg, -1);
+       change(sel_end, -1);
+       change(end_margin_sel, false);
+       change(begin_margin_sel, false);
 }
 
 
diff --git a/src/Row.h b/src/Row.h
index e45fa4e..a42d91d 100644
--- a/src/Row.h
+++ b/src/Row.h
@@ -163,18 +163,18 @@ public:
        bool changed() const { return changed_; }
        ///
        void changed(bool c) const { changed_ = c; }
-       /// Set the selection begin and end.
-       /**
-         * This is const because we update the selection status only at draw()
-         * time.
-         */
-       void setSelection(pos_type sel_beg, pos_type sel_end) const;
        ///
        bool selection() const;
-       /// Set the selection begin and end and whether the left and/or right
-       /// margins are selected.
+       /**
+        * Set the selection begin and end and whether the left and/or
+        * right margins are selected.
+        * This is const because we update the selection status only at
+        * draw() time.
+        */
        void setSelectionAndMargins(DocIterator const & beg,
                DocIterator const & end) const;
+       /// no selection on this row.
+       void clearSelectionAndMargins() const;
 
        ///
        void pit(pit_type p) { pit_ = p; }
@@ -323,6 +323,8 @@ private:
          */
        bool isMarginSelected(bool left, DocIterator const & beg,
                DocIterator const & end) const;
+       /// Set the selection begin and end.
+       void setSelection(pos_type sel_beg, pos_type sel_end) const;
 
        /**
         * Returns true if a char or string with font \c f and change
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 3b4e1ff..fedb773 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -1878,7 +1878,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, 
pit_type const pit, int const
                if (selection)
                        row.setSelectionAndMargins(sel_beg_par, sel_end_par);
                else
-                       row.setSelection(-1, -1);
+                       row.clearSelectionAndMargins();
 
                // The row knows nothing about the paragraph, so we have to 
check
                // whether this row is the first or last and update the margins.

Reply via email to