mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
Avoid full metrics computation with Update:FitCursor
The handling of Update::FitCursor traditionnally recomputes all metrics once or twice. Now that updateMetrics(false) ensures that all paragraphs that require it have a metrics, we might as well use that. Take this occasion to move handling of Update::SinglePar earlier, before the check for Update::ForceDraw.
This commit is contained in:
parent
527984ed2e
commit
a4d9315bc4
@ -556,36 +556,40 @@ void BufferView::processUpdateFlags(Update::flags flags)
|
||||
updateMetrics(true);
|
||||
// metrics is done, full drawing is necessary now
|
||||
flags = (flags & ~Update::Force) | Update::ForceDraw;
|
||||
} else if (flags & Update::ForceDraw)
|
||||
}
|
||||
/* If a single paragraph update has been requested and we are not
|
||||
* already repainting all, check whether this update changes the
|
||||
* paragraph metrics. If it does, then compute all metrics (in
|
||||
* case the paragraph is in an inset)
|
||||
*
|
||||
* We handle this before FitCursor because the later will require
|
||||
* correct metrics at cursor position.
|
||||
*/
|
||||
else if ((flags & Update::SinglePar) && !(flags & Update::ForceDraw)) {
|
||||
if (!singleParUpdate())
|
||||
updateMetrics(true);
|
||||
}
|
||||
else if (flags & Update::ForceDraw)
|
||||
// This will compute only the needed metrics and update positions.
|
||||
updateMetrics(false);
|
||||
|
||||
// Detect whether we can only repaint a single paragraph (if we
|
||||
// are not already redrawing all).
|
||||
// We handle this before FitCursor because the later will require
|
||||
// correct metrics at cursor position.
|
||||
if (!(flags & Update::ForceDraw)
|
||||
&& (flags & Update::SinglePar)
|
||||
&& !singleParUpdate())
|
||||
updateMetrics(true);
|
||||
|
||||
// Then make sure that the screen contains the cursor if needed
|
||||
if (flags & Update::FitCursor) {
|
||||
if (needsFitCursor()) {
|
||||
// First try to make the selection start visible
|
||||
// (which is just the cursor when there is no selection)
|
||||
scrollToCursor(d->cursor_.selectionBegin(), SCROLL_VISIBLE);
|
||||
// Metrics have to be recomputed (maybe again)
|
||||
updateMetrics(true);
|
||||
// Metrics have to be updated
|
||||
updateMetrics(false);
|
||||
// Is the cursor visible? (only useful if cursor is at end of selection)
|
||||
if (needsFitCursor()) {
|
||||
// then try to make cursor visible instead
|
||||
scrollToCursor(d->cursor_, SCROLL_VISIBLE);
|
||||
// Metrics have to be recomputed (maybe again)
|
||||
updateMetrics(true);
|
||||
updateMetrics(false);
|
||||
}
|
||||
}
|
||||
flags = flags & ~Update::FitCursor;
|
||||
flags = (flags & ~Update::FitCursor) | Update::ForceDraw;
|
||||
}
|
||||
|
||||
// Add flags to the the update flags. These will be reset to None
|
||||
|
Loading…
Reference in New Issue
Block a user