mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-29 05:01:49 +00:00
10b8861d10
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 commit145af7c2ac
) (cherry picked from commit05bb851adf
) (cherry picked from commit8bc3799b35
)
102 lines
2.6 KiB
C++
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
|