From eb7b3c08f712fd0bc410aac56e80ba541d9de44c Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 29 Apr 2024 14:22:57 +0200 Subject: [PATCH] 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 -- 2.39.5