X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=0b3bfc1d16a79ce057eb979d2231dda30cfd9974;hb=dd1a85a2baf0aeb867a634ade47275b952d38354;hp=d3242f9ea4ffbb1b6d88a4eed5f898383307e52a;hpb=a40ca1430ebe844790c69d0a4f8a1509c255a878;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index d3242f9ea4..0b3bfc1d16 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -581,37 +581,29 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) } } + // The space above and below the paragraph. + int top = parTopSpacing(pit); + int bottom = parBottomSpacing(pit); + + // Top and bottom margin of the document (only at top-level) // FIXME: It might be better to move this in another method // specially tailored for the main text. - // Top and bottom margin of the document (only at top-level) if (text_->isMainText()) { - // original value was 20px, which is 0.2in at 100dpi - int const margin = bv_->zoomedPixels(20); - if (pit == 0) { - pm.rows().front().dim().asc += margin; - /* coverity thinks that we should update pm.dim().asc - * below, but all the rows heights are actually counted as - * part of the paragraph metric descent see loop above). - */ - // coverity[copy_paste_error] - pm.dim().des += margin; - } - ParagraphList const & pars = text_->paragraphs(); - if (pit + 1 == pit_type(pars.size())) { - pm.rows().back().dim().des += margin; - pm.dim().des += margin; + if (pit == 0) + top += bv_->topMargin(); + if (pit + 1 == pit_type(text_->paragraphs().size())) { + bottom += bv_->bottomMargin(); } } - // The space above and below the paragraph. - int const top = parTopSpacing(pit); + // Add the top/bottom space to rows and paragraph metrics pm.rows().front().dim().asc += top; - int const bottom = parBottomSpacing(pit); pm.rows().back().dim().des += bottom; pm.dim().des += top + bottom; - pm.dim().asc += pm.rows()[0].ascent(); - pm.dim().des -= pm.rows()[0].ascent(); + // Move the pm ascent to be the same as the first row ascent + pm.dim().asc += pm.rows().front().ascent(); + pm.dim().des -= pm.rows().front().ascent(); changed |= old_dim.height() != pm.dim().height(); @@ -921,14 +913,15 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const // The real stopping condition is a few lines below. while (true) { // Firstly, check whether there is a bookmark here. - for (auto const & bp_p : bpl) - if (bp_p.second == i) { - Font f = *fi; - f.fontInfo().setColor(Color_bookmark); - // ❶ U+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE - char_type const ch = 0x2775 + bp_p.first; - row.addVirtual(i, docstring(1, ch), f, Change()); - } + if (lyxrc.bookmarks_visibility == LyXRC::BMK_INLINE) + for (auto const & bp_p : bpl) + if (bp_p.second == i) { + Font f = *fi; + f.fontInfo().setColor(Color_bookmark); + // ❶ U+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE + char_type const ch = 0x2775 + bp_p.first; + row.addVirtual(i, docstring(1, ch), f, Change()); + } // The stopping condition is here so that the display of a // bookmark can take place at paragraph start too. @@ -1193,6 +1186,9 @@ void TextMetrics::setRowHeight(Row & row) const row.dim().asc = maxasc; row.dim().des = maxdes; + + // This is useful for selections + row.contents_dim() = row.dim(); } @@ -1626,8 +1622,9 @@ void TextMetrics::deleteLineForward(Cursor & cur) int TextMetrics::leftMargin(pit_type pit) const { - // the + 1 is useful when the paragraph is empty - return leftMargin(pit, text_->paragraphs()[pit].size() + 1); + // FIXME: what is the semantics? It depends on whether the + // paragraph is empty! + return leftMargin(pit, text_->paragraphs()[pit].size()); } @@ -1640,7 +1637,7 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const Paragraph const & par = pars[pit]; LASSERT(pos >= 0, return 0); // We do not really care whether pos > par.size(), since we do not - // access the data. It can be actially useful, when querying the + // access the data. It can be actually useful, when querying the // margin without indentation (see leftMargin(pit_type). Buffer const & buffer = bv_->buffer(); @@ -1880,6 +1877,9 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const if (text_->isRTL(pit)) swap(pi.leftx, pi.rightx); + BookmarksSection::BookmarkPosList bpl = + theSession().bookmarks().bookmarksInPar(bv_->buffer().fileName(), pm.par().id()); + for (size_t i = 0; i != nrows; ++i) { Row const & row = pm.rows()[i]; @@ -1924,6 +1924,9 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const // Paint only the insets if the text itself is // unchanged. rp.paintOnlyInsets(); + rp.paintTooLargeMarks( + row_x + row.left_x() < bv_->leftMargin(), + row_x + row.right_x() > bv_->workWidth() - bv_->rightMargin()); row.changed(false); y += row.descent(); continue; @@ -1966,8 +1969,15 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const if (i == nrows - 1) rp.paintLast(); rp.paintText(); - rp.paintTooLargeMarks(row_x + row.left_x() < 0, - row_x + row.right_x() > bv_->workWidth()); + rp.paintTooLargeMarks( + row_x + row.left_x() < bv_->leftMargin(), + row_x + row.right_x() > bv_->workWidth() - bv_->rightMargin()); + // indicate bookmarks presence in margin + if (lyxrc.bookmarks_visibility == LyXRC::BMK_MARGIN) + for (auto const & bp_p : bpl) + if (bp_p.second >= row.pos() && bp_p.second < row.endpos()) + rp.paintBookmark(bp_p.first); + y += row.descent(); #if 0