[LyX/master] Improve handling of top and bottom margin

Jean-Marc Lasgouttes lasgouttes at lyx.org
Mon Jul 13 00:18:28 UTC 2020


commit 907f020724b4d73a75644642f3e097f74c75c3b5
Author: Jean-Marc Lasgouttes <lasgouttes at 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();


More information about the lyx-cvs mailing list