This patch solves some problems with painting selections in Insets. These are: - multiline selections paint in left margin of the main text (bug 5270), - the margins to the left and right side of the inset are not correct, - wrong painting of e.g. a multiline selection of a caption in a float.
I renamed the Row::left_margin_sel back to Row::begin_margin_sel because of RTL text. I added a FIXME to BufferView::leftMargin and ::rightMargin that they are different for RTL texts. I did some cosmetics (lines <= 80 char, consts). Vincent
Index: src/BufferView.h =================================================================== --- src/BufferView.h (revision 26708) +++ src/BufferView.h (working copy) @@ -92,9 +92,11 @@ /// void setFullScreen(bool full_screen) { full_screen_ = full_screen; } + //FIXME: In RTL text this is the left-margin /// right margin int rightMargin() const; + //FIXME: In RTL text this is the right-margin /// left margin int leftMargin() const; Index: src/TextMetrics.cpp =================================================================== --- src/TextMetrics.cpp (revision 26708) +++ src/TextMetrics.cpp (working copy) @@ -2025,9 +2025,9 @@ // whether this row is the first or last and update the margins. if (row.selection()) { if (row.sel_beg == 0) - row.left_margin_sel = sel_beg.pit() < pit; + row.begin_margin_sel = sel_beg.pit() < pit; if (row.sel_end == sel_end_par.lastpos()) - row.right_margin_sel = sel_end.pit() > pit; + row.end_margin_sel = sel_end.pit() > pit; } // Row signature; has row changed since last paint? @@ -2108,27 +2108,30 @@ cur.boundary(begin_boundary); int x1 = cursorX(beg.top(), begin_boundary); int x2 = cursorX(end.top(), end_boundary); - int y1 = bv_->getPos(cur, cur.boundary()).y_ - row.ascent(); - int y2 = y1 + row.height(); + int const y1 = bv_->getPos(cur, cur.boundary()).y_ - row.ascent(); + int const y2 = y1 + row.height(); + int const rm = text_->isMainText(buffer) ? bv_->rightMargin() : 0; + int const lm = text_->isMainText(buffer) ? bv_->leftMargin() : 0; + // draw the margins - if (row.left_margin_sel) { + if (row.begin_margin_sel) { if (text_->isRTL(buffer, beg.paragraph())) { - int const w = width() - bv_->leftMargin() - x1; - pi.pain.fillRectangle(x + x1, y1, w, y2 - y1, Color_selection); + pi.pain.fillRectangle(x + x1, y1, width() - rm - x1, y2 - y1, + Color_selection); } else { - int const rm = bv_->rightMargin(); - pi.pain.fillRectangle(rm, y1, x1 - rm, y2 - y1, Color_selection); + pi.pain.fillRectangle(x + lm, y1, x1 - lm, y2 - y1, + Color_selection); } } - if (row.right_margin_sel) { + if (row.end_margin_sel) { if (text_->isRTL(buffer, beg.paragraph())) { - int rm = bv_->rightMargin(); - pi.pain.fillRectangle(x + rm, y1, x2 - rm, y2 - y1, Color_selection); + pi.pain.fillRectangle(x + lm, y1, x2 - lm, y2 - y1, + Color_selection); } else { - int lm = bv_->leftMargin(); - pi.pain.fillRectangle(x + x2, y1, width() - lm - x2, y2 - y1, Color_selection); + pi.pain.fillRectangle(x + x2, y1, width() - rm - x2, y2 - y1, + Color_selection); } } @@ -2146,13 +2149,13 @@ // descend into insets and which does not go into the // next line. Compare the logic with the original cursorForward - // if left of boundary -> just jump to right side - // but for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi + // if left of boundary -> just jump to right side, but + // for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi if (cur.boundary()) { cur.boundary(false); } else if (isRTLBoundary(cur.pit(), cur.pos() + 1)) { - // in front of RTL boundary -> Stay on this side of the boundary because: - // ab|cDDEEFFghi -> abc|DDEEFFghi + // in front of RTL boundary -> Stay on this side of the boundary + // because: ab|cDDEEFFghi -> abc|DDEEFFghi ++cur.pos(); cur.boundary(true); drawNow = true; Index: src/Row.h =================================================================== --- src/Row.h (revision 26708) +++ src/Row.h (working copy) @@ -87,9 +87,9 @@ /// mutable pos_type sel_end; /// - mutable bool left_margin_sel; + mutable bool begin_margin_sel; /// - mutable bool right_margin_sel; + mutable bool end_margin_sel; private: /// Decides whether the margin is selected. Index: src/Row.cpp =================================================================== --- src/Row.cpp (revision 26708) +++ src/Row.cpp (working copy) @@ -29,7 +29,7 @@ Row::Row() : separator(0), label_hfill(0), x(0), sel_beg(-1), sel_end(-1), - left_margin_sel(false), right_margin_sel(false), + begin_margin_sel(false), end_margin_sel(false), changed_(false), crc_(0), pos_(0), end_(0) {} @@ -93,8 +93,8 @@ setSelection(beg.pos(), end.pos()); if (selection()) { - right_margin_sel = isMarginSelected(false, beg, end); - left_margin_sel = isMarginSelected(true, beg, end); + end_margin_sel = isMarginSelected(false, beg, end); + begin_margin_sel = isMarginSelected(true, beg, end); } }