commit 907f020724b4d73a75644642f3e097f74c75c3b5 Author: Jean-Marc Lasgouttes <lasgout...@lyx.org> Date: Mon Jul 13 02:25:51 2020 +0200
Improve handling of top and bottom margin The 20px space on top and bottom of document have traditionally been obtained by adding them to the ascent/descent of the first/last row. This leads to annoyances like selections that are drawn in these margins and issues with the nesting marker. The change is to add the value to the ParagraphMetrics ascent/descent only and to correct one place where the ascent of the first row may be different from the ascent of the ParagraphMetrcs object. There may be other places where this should be done. Fixes bug #9545. --- src/BufferView.cpp | 14 ++++++++++++++ src/BufferView.h | 5 ++++- src/TextMetrics.cpp | 36 +++++++++++++----------------------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 2eaa434..769d1a9 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -360,6 +360,20 @@ int BufferView::leftMargin() const } +int BufferView::topMargin() const +{ + // original value was 20px, which is 0.2in at 100dpi + return zoomedPixels(20); +} + + +int BufferView::bottomMargin() const +{ + // original value was 20px, which is 0.2in at 100dpi + return zoomedPixels(20); +} + + int BufferView::inPixels(Length const & len) const { Font const font = buffer().params().getFont(); diff --git a/src/BufferView.h b/src/BufferView.h index 3cfd623..fbbd1e7 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -104,9 +104,12 @@ public: /// right margin int rightMargin() const; - /// left margin int leftMargin() const; + /// top margin + int topMargin() const; + /// bottom margin + int bottomMargin() const; /// return the on-screen size of this length /* diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 9f55c5a..95c9f83 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -557,28 +557,6 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) if (row_index < pm.rows().size()) pm.rows().resize(row_index); - // 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; - } - } - // The space above and below the paragraph. int const top = parTopSpacing(pit); pm.rows().front().dim().asc += top; @@ -589,6 +567,18 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) pm.dim().asc += pm.rows()[0].ascent(); pm.dim().des -= pm.rows()[0].ascent(); + // 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. + if (text_->isMainText()) { + if (pit == 0) + pm.dim().asc += bv_->topMargin(); + ParagraphList const & pars = text_->paragraphs(); + if (pit + 1 == pit_type(pars.size())) { + pm.dim().des += bv_->bottomMargin(); + } + } + changed |= old_dim.height() != pm.dim().height(); return changed; @@ -1333,7 +1323,7 @@ Row const & TextMetrics::getPitAndRowNearY(int & y, pit_type & pit, { ParagraphMetrics const & pm = par_metrics_[pit]; - int yy = pm.position() - pm.ascent(); + int yy = pm.position() - pm.rows().front().ascent(); LBUFERR(!pm.rows().empty()); RowList::const_iterator rit = pm.rows().begin(); RowList::const_iterator rlast = pm.rows().end(); -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs