[LyX features/biginset] Introduce new helpers ParagraphMetrics::top/bottom

Jean-Marc Lasgouttes lasgouttes at lyx.org
Tue Jul 25 13:20:50 UTC 2023


The branch, biginset, has been updated.

- Log -----------------------------------------------------------------

commit 40a352b27a3f4ca0a1328676058acfbbfaa927e2
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Tue Jul 25 16:31:13 2023 +0200

    Introduce new helpers ParagraphMetrics::top/bottom
    
    This avoids code with position/ascent/descent that is difficult to follow.
    
    No change in function intended.

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 13a0d6f..2ed4794 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -629,8 +629,8 @@ void BufferView::updateScrollbarParameters()
 			<< d->par_height_[pit]);
 	}
 
-	int top_pos = first.second->position() - first.second->ascent();
-	int bottom_pos = last.second->position() + last.second->descent();
+	int top_pos = first.second->top();
+	int bottom_pos = last.second->bottom();
 	bool first_visible = first.first == 0 && top_pos >= 0;
 	bool last_visible = last.first + 1 == int(parsize) && bottom_pos <= height_;
 	if (first_visible && last_visible) {
@@ -2709,7 +2709,7 @@ int BufferView::scrollDown(int pixels)
 	int const ymax = height_ + pixels;
 	while (true) {
 		pair<pit_type, ParagraphMetrics const *> last = tm.last();
-		int bottom_pos = last.second->position() + last.second->descent();
+		int bottom_pos = last.second->bottom();
 		if (lyxrc.scroll_below_document)
 			bottom_pos += height_ - minVisiblePart();
 		if (last.first + 1 == int(text->paragraphs().size())) {
@@ -2734,7 +2734,7 @@ int BufferView::scrollUp(int pixels)
 	int ymin = - pixels;
 	while (true) {
 		pair<pit_type, ParagraphMetrics const *> first = tm.first();
-		int top_pos = first.second->position() - first.second->ascent();
+		int top_pos = first.second->top();
 		if (first.first == 0) {
 			if (top_pos >= 0)
 				return 0;
@@ -3066,10 +3066,8 @@ bool BufferView::singleParUpdate()
 
 	tm.updatePosCache(pit, true);
 
-	LYXERR(Debug::PAINTING, "\ny1: " << pm.position() - pm.ascent()
-		<< " y2: " << pm.position() + pm.descent()
-		<< " pit: " << pit
-		<< " singlepar: 1");
+	LYXERR(Debug::PAINTING, "\ny1: " << pm.top() << " y2: " << pm.bottom()
+		<< " pit: " << pit << " singlepar: 1");
 	return true;
 }
 
@@ -3618,7 +3616,7 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
 
 		// and possibly grey out below
 		pair<pit_type, ParagraphMetrics const *> lastpm = tm.last();
-		int const y2 = lastpm.second->position() + lastpm.second->descent();
+		int const y2 = lastpm.second->bottom();
 
 		if (y2 < height_) {
 			Color color = buffer().isInternal()
@@ -3639,7 +3637,7 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
 	pair<pit_type, ParagraphMetrics const *> lastpm = tm.last();
 	for (pit_type pit = firstpm.first; pit <= lastpm.first; ++pit) {
 		ParagraphMetrics const & pm = tm.parMetrics(pit);
-		if (pm.position() + pm.descent() > 0) {
+		if (pm.bottom() > 0) {
 			if (d->anchor_pit_ != pit
 			    || d->anchor_ypos_ != pm.position())
 				LYXERR(Debug::PAINTING, "Found new anchor pit = " << d->anchor_pit_
diff --git a/src/ParagraphMetrics.h b/src/ParagraphMetrics.h
index 0d186f1..805d056 100644
--- a/src/ParagraphMetrics.h
+++ b/src/ParagraphMetrics.h
@@ -69,9 +69,13 @@ public:
 	///
 	bool hfillExpansion(Row const & row, pos_type pos) const;
 
-	///
+	/// The vertical position of the baseline of the first line of the paragraph
 	int position() const { return position_; }
 	void setPosition(int position);
+	/// The vertical position of the top of the paragraph
+	int top() const { return position_ - dim_.ascent(); }
+	/// The vertical position of the bottom of the paragraph
+	int bottom() const { return position_ + dim_.descent(); }
 	///
 	int id() const { return id_; }
 
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index bcf1248..cc5b8e6 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -191,8 +191,7 @@ void TextMetrics::newParMetricsDown()
 
 	// do it and update its position.
 	redoParagraph(pit);
-	par_metrics_[pit].setPosition(last.second.position()
-		+ last.second.descent() + par_metrics_[pit].ascent());
+	par_metrics_[pit].setPosition(last.second.bottom() + par_metrics_[pit].ascent());
 	updatePosCache(pit, false);
 }
 
@@ -206,8 +205,7 @@ void TextMetrics::newParMetricsUp()
 	pit_type const pit = first.first - 1;
 	// do it and update its position.
 	redoParagraph(pit);
-	par_metrics_[pit].setPosition(first.second.position()
-		- first.second.ascent() - par_metrics_[pit].descent());
+	par_metrics_[pit].setPosition(first.second.top() - par_metrics_[pit].descent());
 	updatePosCache(pit, false);
 }
 
@@ -1436,9 +1434,7 @@ pit_type TextMetrics::getPitNearY(int y)
 	ParMetricsCache::const_iterator last = et;
 	--last;
 
-	ParagraphMetrics const & pm = it->second;
-
-	if (y < it->second.position() - pm.ascent()) {
+	if (y < it->second.top()) {
 		// We are looking for a position that is before the first paragraph in
 		// the cache (which is in priciple off-screen, that is before the
 		// visible part.
@@ -1451,9 +1447,7 @@ pit_type TextMetrics::getPitNearY(int y)
 		return pit;
 	}
 
-	ParagraphMetrics const & pm_last = par_metrics_[last->first];
-
-	if (y >= last->second.position() + pm_last.descent()) {
+	if (y >= par_metrics_[last->first].bottom()) {
 		// We are looking for a position that is after the last paragraph in
 		// the cache (which is in priciple off-screen), that is before the
 		// visible part.
@@ -1470,9 +1464,7 @@ pit_type TextMetrics::getPitNearY(int y)
 		LYXERR(Debug::PAINTING, "examining: pit: " << it->first
 			<< " y: " << it->second.position());
 
-		ParagraphMetrics const & pm2 = par_metrics_[it->first];
-
-		if (it->first >= pit && it->second.position() - pm2.ascent() <= y) {
+		if (it->first >= pit && it->second.top() <= y) {
 			pit = it->first;
 			yy = it->second.position();
 		}
@@ -1489,7 +1481,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.top();
 	LBUFERR(!pm.rows().empty());
 	RowList::const_iterator rit = pm.rows().begin();
 	RowList::const_iterator rlast = pm.rows().end();
diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index ef91e0b..56c1690 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -964,7 +964,7 @@ void GuiWorkArea::generateSyntheticMouseEvent()
 	// Find the row at which we set the cursor.
 	RowList::const_iterator rit = pm.rows().begin();
 	RowList::const_iterator rlast = pm.rows().end();
-	int yy = pm.position() - pm.ascent();
+	int yy = pm.top();
 	for (--rlast; rit != rlast; ++rit) {
 		int h = rit->height();
 		if ((up && yy + h > 0)

-----------------------------------------------------------------------

Summary of changes:
 src/BufferView.cpp               |   18 ++++++++----------
 src/ParagraphMetrics.h           |    6 +++++-
 src/TextMetrics.cpp              |   20 ++++++--------------
 src/frontends/qt/GuiWorkArea.cpp |    2 +-
 4 files changed, 20 insertions(+), 26 deletions(-)


hooks/post-receive
-- 
Repository for new features


More information about the lyx-cvs mailing list