From 0b6105b9245350e428c73deee88af2cd7c0d4732 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 25 Jul 2023 16:31:13 +0200 Subject: [PATCH] Introduce new helpers ParagraphMetrics::top/bottom This avoids code with position/ascent/descent that is difficult to follow. No change in function intended. --- 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(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 3612143019..dd312739b5 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -641,8 +641,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) { @@ -2726,7 +2726,7 @@ int BufferView::scrollDown(int pixels) int const ymax = height_ + pixels; while (true) { pair 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())) { @@ -2751,7 +2751,7 @@ int BufferView::scrollUp(int pixels) int ymin = - pixels; while (true) { pair 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; @@ -3102,10 +3102,8 @@ bool BufferView::singleParUpdate() tm.updatePosCache(pit); - 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; } @@ -3653,7 +3651,7 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret) // and possibly grey out below pair 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() @@ -3674,7 +3672,7 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret) pair 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 0d186f158b..805d056541 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 06e00f4220..837ad5766f 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); } @@ -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); } @@ -1466,9 +1464,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. @@ -1481,9 +1477,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. @@ -1500,9 +1494,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(); } @@ -1519,7 +1511,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 341fddc3b8..7999dceda9 100644 --- a/src/frontends/qt/GuiWorkArea.cpp +++ b/src/frontends/qt/GuiWorkArea.cpp @@ -971,7 +971,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)