lyx_mirror/src/ParagraphMetrics.h
Jean-Marc Lasgouttes 10b8861d10 Handle metrics of not visible paragraphs
The code is not ready for situations where some paragraphs that are
not visible have metrics available.

In PararagraphMetrics, some methods are added to be able to handle the
fact that paragraphs have or do not have a position.

In TextMetrics, a new method returns the first visible paragraph.

Finally, in BufferView::updateMetrics, the paragraphs' positions are
reset (in the case where everything is not cleared) and some care is
taken to skip the ones that are not relevant.

The assumption outside of this method is that all the paragraphs that
are in the TextMetrics are visible (we are talking about top-level
TextMetrics here). This could be changed (in order to avoid
recomputing paragraph metrics), but the cost is high in terms of
complexity and it is not clear that the gain in terms of performance
would be important.

NOTE: contrary to the code in master which returns npos = -10000, this
code still returns -1 when the position of a paragraph is unknown.

(cherry picked from commit 145af7c2ac)
(cherry picked from commit 05bb851adf)
(cherry picked from commit 8bc3799b35)
2024-07-10 17:18:47 +02:00

102 lines
2.6 KiB
C++

// -*- C++ -*-
/**
* \file ParagraphMetrics.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Asger Alstrup
* \author Lars Gullik Bjønnes
* \author John Levon
* \author André Pönitz
* \author Jürgen Vigna
* \author Abdelrazak Younes
*
* Full author contact details are available in file CREDITS.
*/
#ifndef PARAGRAPH_METRICS_H
#define PARAGRAPH_METRICS_H
#include "Dimension.h"
#include "Row.h"
namespace lyx {
class BufferView;
class Paragraph;
/// Helper class for paragraph metrics.
class ParagraphMetrics {
public:
/// Default constructor (only here for STL containers).
ParagraphMetrics() {}
/// The only useful constructor.
explicit ParagraphMetrics(Paragraph const & par);
/// Copy operator.
ParagraphMetrics & operator=(ParagraphMetrics const &);
void reset(Paragraph const & par);
///
Row const & getRow(pos_type pos, bool boundary) const;
///
size_t pos2row(pos_type pos) const;
/// TextMetrics::redoParagraph updates this
Dimension const & dim() const { return dim_; }
Dimension & dim() { return dim_; }
/// total height of paragraph
int height() const { return dim_.height(); }
/// total width of paragraph, may differ from workwidth
int width() const { return dim_.width(); }
/// ascend of paragraph above baseline
int ascent() const { return dim_.ascent(); }
/// descend of paragraph below baseline
int descent() const { return dim_.descent(); }
/// Text updates the rows using this access point
RowList & rows() { return rows_; }
/// The painter and others use this
RowList const & rows() const { return rows_; }
///
int rightMargin(BufferView const & bv) const;
///
Paragraph const & par() const { return *par_; }
/// dump some information to lyxerr
void dump() const;
///
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;
void setPosition(int position);
/// Set position to unknown
void resetPosition();
/// Return true when the position of the paragraph is known
bool hasPosition() const;
/// 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_; }
private:
///
int position_ = 0;
///
int id_ = -1;
///
mutable RowList rows_;
/// cached dimensions of paragraph
Dimension dim_;
///
Paragraph const * par_ = nullptr;
};
} // namespace lyx
#endif // PARAGRAPH_METRICS_H