Vincent van Ravesteijn wrote: > 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.
the compilable version attached. quick test showed that selection inside boxes are better now. pavel
diff --git a/src/BufferView.h b/src/BufferView.h index d418260..585792d 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -92,9 +92,11 @@ public: /// 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; diff --git a/src/ParagraphMetrics.cpp b/src/ParagraphMetrics.cpp index 15ed5f5..f794914 100644 --- a/src/ParagraphMetrics.cpp +++ b/src/ParagraphMetrics.cpp @@ -104,7 +104,7 @@ size_t ParagraphMetrics::computeRowSignature(Row const & row, Dimension const & d = row.dimension(); char_type const b[] = { row.sel_beg, row.sel_end, - row.left_margin_sel, row.right_margin_sel, d.wid, d.asc, d.des}; + row.begin_margin_sel, row.end_margin_sel, d.wid, d.asc, d.des}; // Each of the variable to process is 4 bytes: 4x7 = 28 crc.process_bytes(b, 28); diff --git a/src/Row.cpp b/src/Row.cpp index 87e0d92..597787f 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -29,7 +29,7 @@ namespace lyx { 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 @@ void Row::setSelectionAndMargins(DocIterator const & beg, 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); } } diff --git a/src/Row.h b/src/Row.h index e5343ee..0c39692 100644 --- a/src/Row.h +++ b/src/Row.h @@ -87,9 +87,9 @@ public: /// 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. diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 594b401..7d62354 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -2025,9 +2025,9 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type pit, int x, int y) co // 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 @@ void TextMetrics::drawRowSelection(PainterInfo & pi, int x, Row const & row, 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 @@ void TextMetrics::drawRowSelection(PainterInfo & pi, int x, Row const & row, // 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;