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.
This commit is contained in:
Jean-Marc Lasgouttes 2020-07-13 02:25:51 +02:00
parent 32f06d01ec
commit 907f020724
3 changed files with 31 additions and 24 deletions

View File

@ -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();

View File

@ -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
/*

View File

@ -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();