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.
This commit is contained in:
Jean-Marc Lasgouttes 2024-04-29 14:22:57 +02:00
parent 23c45f76ad
commit 527984ed2e
5 changed files with 17 additions and 17 deletions

View File

@ -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),

View File

@ -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 =

View File

@ -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();

View File

@ -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

View File

@ -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