]> git.lyx.org Git - lyx.git/blobdiff - src/RowPainter.cpp
Remove hardcoded values
[lyx.git] / src / RowPainter.cpp
index 0d92136bd21290f151af97c4fd5299f27c266f3a..fabfcddf2a38acf268289caaba2aaf94443e79a0 100644 (file)
@@ -614,39 +614,48 @@ void RowPainter::paintSelection() const
        bool const rtl = text_.isRTL(par_);
 
        // draw the margins
-       if ((row_.begin_margin_sel && !rtl) || (row_.end_margin_sel && rtl))
+       if (rtl ? row_.end_margin_sel : row_.begin_margin_sel)
                pi_.pain.fillRectangle(int(xo_), y1, row_.left_margin, y2 - y1,
                                       Color_selection);
-       if ((row_.begin_margin_sel && rtl) || (row_.end_margin_sel && !rtl))
-               pi_.pain.fillRectangle(int(xo_ + row_.width()), y1,
-                                      text_metrics_.width() - row_.width(), y2 - y1,
-                                      Color_selection);
 
        // go through row and draw from RTL boundary to RTL boundary
-       int x = xo_ + row_.left_margin;
+       double x = xo_ + row_.left_margin;
        for (auto const & e : row_) {
+               // These are the same tests as in paintStringAndSel, except
+               // that all_sel has an additional clause that triggers for end
+               // of paragraph markers. The clause was not used in
+               // paintStringAndSel to avoid changing the drawing color.
                // at least part of text selected?
-               bool const some_sel = (e.endpos >= row_.sel_beg && e.pos <= row_.sel_end)
+               bool const some_sel = (e.endpos >= row_.sel_beg && e.pos < row_.sel_end)
                        || pi_.selected;
                // all the text selected?
-               bool const all_sel = (e.pos >= row_.sel_beg && e.endpos <= row_.sel_end)
-                       || pi_.selected;
+               bool const all_sel = (e.pos >= row_.sel_beg && e.endpos < row_.sel_end)
+                   || (e.isVirtual() && e.pos == row_.endpos() && row_.end_margin_sel)
+                   || pi_.selected;
 
                if (all_sel) {
-                       pi_.pain.fillRectangle(x, y1, e.full_width(), y2 - y1,
+                       // the 3rd argument is written like that to avoid rounding issues
+                       pi_.pain.fillRectangle(int(x), y1,
+                                              int(x + e.full_width()) - int(x), y2 - y1,
                                               Color_selection);
                } else if (some_sel) {
                        pos_type const from = min(max(row_.sel_beg, e.pos), e.endpos);
                        pos_type const to = max(min(row_.sel_end, e.endpos), e.pos);
-                       int x1 = e.pos2x(from);
-                       int x2 = e.pos2x(to);
+                       double x1 = e.pos2x(from);
+                       double x2 = e.pos2x(to);
                        if (x1 > x2)
                                swap(x1, x2);
-                       pi_.pain.fillRectangle(x + x1, y1, x2 - x1, y2 - y1,
+                       pi_.pain.fillRectangle(int(x + x1), y1, int(x2 - x1), y2 - y1,
                                               Color_selection);
                }
                x += e.full_width();
        }
+
+       if (rtl ? row_.begin_margin_sel : row_.end_margin_sel)
+               pi_.pain.fillRectangle(int(x), y1,
+                                      int(xo_ + text_metrics_.width()) - int(x), y2 - y1,
+                                      Color_selection);
+
 }