mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 10:00:33 +00:00
Enable Update::SinglePar in nested insets too
The idea of single par update is to try to re-break only the paragraph containing the cursor (if this paragraph contains insets etc., re-breaking will recursively descend). The existing single paragraph update mechanism was tailored to work only at top level. Indeed changing a paragraph nested into an inset may lead to larger changes. This commit tries a rather naive approach that seems to work well: we need a full redraw if either 1/ the height has changed or 2/ the width has changed and it was equal to the text metrics width; the goal is to catch the case of a one-row inset that grows with its contents, but optimize the case of typing in a short paragraph part of a larger inset. NOTE: if only the height has changed, then it should be possible to update all metrics at minimal cost. However, since this is risky, we do not try that right now. Part of bug #12297.
This commit is contained in:
parent
f5bbadbad9
commit
9a96726bcd
@ -3063,24 +3063,36 @@ Cursor const & BufferView::cursor() const
|
|||||||
|
|
||||||
bool BufferView::singleParUpdate()
|
bool BufferView::singleParUpdate()
|
||||||
{
|
{
|
||||||
Text & buftext = buffer_.text();
|
CursorSlice const & its = d->cursor_.innerTextSlice();
|
||||||
pit_type const bottom_pit = d->cursor_.bottom().pit();
|
pit_type const pit = its.pit();
|
||||||
TextMetrics & tm = textMetrics(&buftext);
|
TextMetrics & tm = textMetrics(its.text());
|
||||||
Dimension const old_dim = tm.parMetrics(bottom_pit).dim();
|
Dimension const old_dim = tm.parMetrics(pit).dim();
|
||||||
|
|
||||||
// make sure inline completion pointer is ok
|
// make sure inline completion pointer is ok
|
||||||
if (d->inlineCompletionPos_.fixIfBroken())
|
if (d->inlineCompletionPos_.fixIfBroken())
|
||||||
d->inlineCompletionPos_ = DocIterator();
|
d->inlineCompletionPos_ = DocIterator();
|
||||||
|
|
||||||
// In Single Paragraph mode, rebreak only
|
/* Try to rebreak only the paragraph containing the cursor (if
|
||||||
// the (main text, not inset!) paragraph containing the cursor.
|
* this paragraph contains insets etc., rebreaking will
|
||||||
// (if this paragraph contains insets etc., rebreaking will
|
* recursively descend). We need a full redraw if either
|
||||||
// recursively descend)
|
* 1/ the height has changed
|
||||||
tm.redoParagraph(bottom_pit);
|
* or
|
||||||
ParagraphMetrics & pm = tm.parMetrics(bottom_pit);
|
* 2/ the width has changed and it was equal to the textmetrics
|
||||||
if (pm.height() != old_dim.height()) {
|
* width; the goal is to catch the case of a one-row inset that
|
||||||
// Paragraph height has changed so we cannot proceed to
|
* grows with its contents, but optimize the case of typing at
|
||||||
// the singlePar optimisation.
|
* the end of a mmultiple-row paragraph.
|
||||||
|
*
|
||||||
|
* NOTE: if only the height has changed, then it should be
|
||||||
|
* possible to update all metrics at minimal cost. However,
|
||||||
|
* since this is risky, we do not try that right now.
|
||||||
|
*/
|
||||||
|
tm.redoParagraph(pit);
|
||||||
|
ParagraphMetrics & pm = tm.parMetrics(pit);
|
||||||
|
if (pm.height() != old_dim.height()
|
||||||
|
|| (pm.width() != old_dim.width() && old_dim.width() == tm.width())) {
|
||||||
|
// Paragraph height or width has changed so we cannot proceed
|
||||||
|
// to the singlePar optimisation.
|
||||||
|
LYXERR(Debug::PAINTING, "SinglePar optimization failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Since position() points to the baseline of the first row, we
|
// Since position() points to the baseline of the first row, we
|
||||||
@ -3088,11 +3100,11 @@ bool BufferView::singleParUpdate()
|
|||||||
// the height does not change but the ascent does.
|
// the height does not change but the ascent does.
|
||||||
pm.setPosition(pm.position() - old_dim.ascent() + pm.ascent());
|
pm.setPosition(pm.position() - old_dim.ascent() + pm.ascent());
|
||||||
|
|
||||||
tm.updatePosCache(bottom_pit);
|
tm.updatePosCache(pit);
|
||||||
|
|
||||||
LYXERR(Debug::PAINTING, "\ny1: " << pm.position() - pm.ascent()
|
LYXERR(Debug::PAINTING, "\ny1: " << pm.position() - pm.ascent()
|
||||||
<< " y2: " << pm.position() + pm.descent()
|
<< " y2: " << pm.position() + pm.descent()
|
||||||
<< " pit: " << bottom_pit
|
<< " pit: " << pit
|
||||||
<< " singlepar: 1");
|
<< " singlepar: 1");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user