]> git.lyx.org Git - features.git/commitdiff
Avoid full metrics computation with Update:FitCursor
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 30 Apr 2024 13:02:16 +0000 (15:02 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 30 Apr 2024 14:13:16 +0000 (16:13 +0200)
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.

(cherry picked from commit a4d9315bc49445e4419b3b59fd238a13c5f7be31)

src/BufferView.cpp

index dd2259747df2692dbeda383f09a35a8b3baa46c5..de82559485f14b141dd21be129c42b63eb627218 100644 (file)
@@ -549,36 +549,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