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

Reply via email to