commit eb7b3c08f712fd0bc410aac56e80ba541d9de44c
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Mon Apr 29 14:22:57 2024 +0200

    Fix up 'Reduce metrics updates from 4 to 1 when loading file'
    
    The missing metrics computation meant that, when loading a file, the
    workarea would not be scrolled correctly to show the cursor.
    
    The resizeBufferView does not create an additional metrics
    computation, it just triggers it earlier.
    
    The default value 10000 in anchor_pos_ constructor ensures that the
    first row is shown entirely.
    
    (cherry picked from commit 527984ed2e0269861f5e1efc021fa0302d80819b)
---
 src/BufferView.cpp                     |  2 +-
 src/frontends/qt/GuiView.cpp           |  1 +
 src/frontends/qt/GuiWorkArea.cpp       | 26 +++++++++++++-------------
 src/frontends/qt/GuiWorkArea.h         |  2 ++
 src/frontends/qt/GuiWorkArea_Private.h |  3 ---
 5 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index e1527b6548..dd2259747d 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -214,7 +214,7 @@ struct BufferView::Private
        Private(BufferView & bv) :
                update_strategy_(FullScreenUpdate),
                update_flags_(Update::Force),
-               cursor_(bv), anchor_pit_(0), anchor_ypos_(0),
+               cursor_(bv), anchor_pit_(0), anchor_ypos_(10000),
                wh_(0), inlineCompletionUniqueChars_(0),
                last_inset_(nullptr), mouse_position_cache_(),
                gui_(nullptr), bookmark_edit_position_(-1),
diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp
index facdb81b67..06818e58fe 100644
--- a/src/frontends/qt/GuiView.cpp
+++ b/src/frontends/qt/GuiView.cpp
@@ -2099,6 +2099,7 @@ void GuiView::setBuffer(Buffer * newBuffer, bool 
switch_to)
                newBuffer->masterBuffer()->updateBuffer();
                setBusy(false);
                wa = addWorkArea(*newBuffer);
+               wa->resizeBufferView();
                // scroll to the position when the BufferView was last closed
                if (lyxrc.use_lastfilepos) {
                        LastFilePosSection::FilePos filepos =
diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index de8241c21f..0f847303c5 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -446,33 +446,33 @@ void GuiWorkArea::Private::dispatch(FuncRequest const & 
cmd)
 }
 
 
-void GuiWorkArea::Private::resizeBufferView()
+void GuiWorkArea::resizeBufferView()
 {
        // WARNING: Please don't put any code that will trigger a repaint here!
        // We are already inside a paint event.
-       p->stopBlinkingCaret();
+       stopBlinkingCaret();
        // Warn our container (GuiView).
-       p->busy(true);
+       busy(true);
 
-       bool const caret_in_view = buffer_view_->caretInView();
-       buffer_view_->resize(p->viewport()->width(), p->viewport()->height());
+       bool const caret_in_view = d->buffer_view_->caretInView();
+       d->buffer_view_->resize(viewport()->width(), viewport()->height());
        if (caret_in_view)
-               buffer_view_->showCursor();
-       resetCaret();
+               d->buffer_view_->showCursor();
+       d->resetCaret();
 
        // Update scrollbars which might have changed due different
        // BufferView dimension. This is especially important when the
        // BufferView goes from zero-size to the real-size for the first time,
        // as the scrollbar parameters are then set for the first time.
-       updateScrollbar();
+       d->updateScrollbar();
 
-       need_resize_ = false;
-       p->busy(false);
+       d->need_resize_ = false;
+       busy(false);
        // Eventually, restart the caret after the resize event.
        // We might be resizing even if the focus is on another widget so we 
only
        // restart the caret if we have the focus.
-       if (p->hasFocus())
-               QTimer::singleShot(50, p, SLOT(startBlinkingCaret()));
+       if (hasFocus())
+               QTimer::singleShot(50, this, SLOT(startBlinkingCaret()));
 }
 
 
@@ -1317,7 +1317,7 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev)
 
        if (d->need_resize_ || pixelRatio() != d->last_pixel_ratio_) {
                d->resetScreen();
-               d->resizeBufferView();
+               resizeBufferView();
        }
 
        d->last_pixel_ratio_ = pixelRatio();
diff --git a/src/frontends/qt/GuiWorkArea.h b/src/frontends/qt/GuiWorkArea.h
index 6f24ff313c..7731914249 100644
--- a/src/frontends/qt/GuiWorkArea.h
+++ b/src/frontends/qt/GuiWorkArea.h
@@ -63,6 +63,8 @@ public:
        ///
        BufferView const & bufferView() const;
        ///
+       void resizeBufferView();
+       ///
        void scheduleRedraw(bool update_metrics) override;
 
        /// return true if the key is part of a shortcut
diff --git a/src/frontends/qt/GuiWorkArea_Private.h 
b/src/frontends/qt/GuiWorkArea_Private.h
index 9da4cfaead..d3941905b9 100644
--- a/src/frontends/qt/GuiWorkArea_Private.h
+++ b/src/frontends/qt/GuiWorkArea_Private.h
@@ -77,9 +77,6 @@ struct GuiWorkArea::Private
        ///
        ~Private();
 
-       ///
-       void resizeBufferView();
-
        ///
        void dispatch(FuncRequest const & cmd0);
        /// Make caret visible and signal that its geometry needs to be updated
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to