From 527984ed2e0269861f5e1efc021fa0302d80819b 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. --- 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 292b0f6a01..3c35d75ec8 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 94a0a84be2..b4c412be6d 100644 --- a/src/frontends/qt/GuiView.cpp +++ b/src/frontends/qt/GuiView.cpp @@ -2119,6 +2119,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 d860d29b60..5935baaf77 100644 --- a/src/frontends/qt/GuiWorkArea.cpp +++ b/src/frontends/qt/GuiWorkArea.cpp @@ -455,33 +455,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())); } @@ -1393,7 +1393,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 86bbfda939..8cb0771c0f 100644 --- a/src/frontends/qt/GuiWorkArea.h +++ b/src/frontends/qt/GuiWorkArea.h @@ -63,6 +63,8 @@ public: /// BufferView const & bufferView() const override; /// + 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 42dcef836c..672cba2056 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