[LyX/master] Fix up 'Reduce metrics updates from 4 to 1 when loading file'

Jean-Marc Lasgouttes lasgouttes at lyx.org
Tue Apr 30 10:11:29 UTC 2024


commit 527984ed2e0269861f5e1efc021fa0302d80819b
Author: Jean-Marc Lasgouttes <lasgouttes at 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.
---
 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


More information about the lyx-cvs mailing list