commit fe0ef5c02abde14d2a7d309c1e0f4d455884d4eb Author: Jean-Marc Lasgouttes <lasgout...@lyx.org> Date: Sun Sep 14 20:48:43 2025 +0200
Force metrics calculation when entering a previewed inset The safe part: - change notifyCursorEnters to use two parameters (it was not yet used) - in previewed insets, force a metrics computation when entering the inset The less obvious part: - in BufferView::dispatch(), copy the cursor screenUpdate() flags to the DispatchResult parameter of the method after calling notifyCursorLeavesOrEnters(). - In BufferView::processUpdateFlags() do the SinglePar update thing even when ForceDraw is required. I *think* this made sense when ForceDraw was added after computing metrics with Force, but that this is not needed anymore because we use if/else. Fixes bug #13225. --- src/BufferView.cpp | 3 ++- src/Cursor.cpp | 2 +- src/insets/Inset.h | 2 +- src/insets/InsetIPA.cpp | 7 +++++++ src/insets/InsetIPA.h | 2 ++ src/insets/InsetPreview.cpp | 7 +++++++ src/insets/InsetPreview.h | 2 ++ src/mathed/InsetMathHull.cpp | 17 +++++++++++++++++ src/mathed/InsetMathHull.h | 2 ++ 9 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index c498d29248..8e7186db03 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -581,7 +581,7 @@ void BufferView::processUpdateFlags(Update::flags flags) * We handle this before FitCursor because the later will require * correct metrics at cursor position. */ - else if ((flags & Update::SinglePar) && !(flags & Update::ForceDraw)) { + else if (flags & Update::SinglePar) { if (singleParUpdate()) updateMetrics(false); else @@ -2686,6 +2686,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) cursor().fixIfBroken(); resetInlineCompletionPos(); } + dr.screenUpdate(dr.screenUpdate() | cursor().result().screenUpdate()); old.endUndoGroup(); } } diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 9eff395746..656ee90dce 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -2475,7 +2475,7 @@ bool notifyCursorLeavesOrEnters(Cursor const & old, Cursor & cur) // notify everything on top of the common part in new cursor, // but stop if the inset claims the cursor to be invalid now for (; i < cur.depth(); ++i) { - if (cur[i].inset().notifyCursorEnters(cur)) + if (cur[i].inset().notifyCursorEnters(old, cur)) return true; } diff --git a/src/insets/Inset.h b/src/insets/Inset.h index 5a47be6a7a..653fffa729 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -325,7 +325,7 @@ public: /// anymore. /// \c cur is the new cursor, some slice points to this. Use the update /// flags to cause a redraw. - virtual bool notifyCursorEnters(Cursor & /*cur*/) + virtual bool notifyCursorEnters(Cursor const & /*old*/, Cursor & /*cur*/) { return false; } /// is called when the mouse enters or leaves this inset /// return true if this inset needs a repaint diff --git a/src/insets/InsetIPA.cpp b/src/insets/InsetIPA.cpp index e13b3ef6e7..6e38bf7614 100644 --- a/src/insets/InsetIPA.cpp +++ b/src/insets/InsetIPA.cpp @@ -208,6 +208,13 @@ void InsetIPA::metrics(MetricsInfo & mi, Dimension & dim) const } +bool InsetIPA::notifyCursorEnters(Cursor const & old, Cursor & cur) +{ + cur.screenUpdateFlags(Update::Force); + return InsetText::notifyCursorLeaves(old, cur); +} + + bool InsetIPA::notifyCursorLeaves(Cursor const & old, Cursor & cur) { reloadPreview(old); diff --git a/src/insets/InsetIPA.h b/src/insets/InsetIPA.h index a1b73b4d57..c7a5fd44e4 100644 --- a/src/insets/InsetIPA.h +++ b/src/insets/InsetIPA.h @@ -66,6 +66,8 @@ public: void addPreview(DocIterator const & inset_pos, graphics::PreviewLoader & ploader) const override; + bool notifyCursorEnters(Cursor const & old, Cursor & cur) override; + bool notifyCursorLeaves(Cursor const & old, Cursor & cur) override; void write(std::ostream & os) const override; diff --git a/src/insets/InsetPreview.cpp b/src/insets/InsetPreview.cpp index dabbf5ece2..9f3f7d1a15 100644 --- a/src/insets/InsetPreview.cpp +++ b/src/insets/InsetPreview.cpp @@ -215,6 +215,13 @@ Inset * InsetPreview::editXY(Cursor & cur, int x, int y) } +bool InsetPreview::notifyCursorEnters(Cursor const & old, Cursor & cur) +{ + cur.screenUpdateFlags(Update::Force); + return InsetText::notifyCursorEnters(old, cur); +} + + bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur) { reloadPreview(old); diff --git a/src/insets/InsetPreview.h b/src/insets/InsetPreview.h index 32f2335dc3..6bd30f2217 100644 --- a/src/insets/InsetPreview.h +++ b/src/insets/InsetPreview.h @@ -67,6 +67,8 @@ public: Inset * editXY(Cursor & cur, int x, int y) override; + bool notifyCursorEnters(Cursor const & old, Cursor & cur) override; + bool notifyCursorLeaves(Cursor const & old, Cursor & cur) override; void write(std::ostream & os) const override; diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index 70b0df7165..230de78a6f 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -943,6 +943,23 @@ bool InsetMathHull::notifyCursorLeaves(Cursor const & old, Cursor & cur) } +bool InsetMathHull::notifyCursorEnters(Cursor const & old, Cursor & cur) +{ + if (RenderPreview::previewMath()) { + /** FIXME: currently, SinglePar operates on the current + * paragraph at processUpdateFlags time (here cur) and not the + * paragraph where the change happened (old). When this is + * fixed, the following test will become useless. + */ + if (&old.innerParagraph() == &cur.innerParagraph()) + cur.screenUpdateFlags(Update::SinglePar); + else + cur.screenUpdateFlags(Update::Force); + } + return false; +} + + bool InsetMathHull::insetAllowed(InsetCode code) const { switch (code) { diff --git a/src/mathed/InsetMathHull.h b/src/mathed/InsetMathHull.h index 905d5d9d40..1a4eeec8d4 100644 --- a/src/mathed/InsetMathHull.h +++ b/src/mathed/InsetMathHull.h @@ -157,6 +157,8 @@ public: /// void forOutliner(docstring &, size_t const, bool const) const override; + /// get notification when the cursor enters this inset + bool notifyCursorEnters(Cursor const & old, Cursor & cur) override; /// get notification when the cursor leaves this inset bool notifyCursorLeaves(Cursor const & old, Cursor & cur) override; /// -- lyx-cvs mailing list lyx-cvs@lists.lyx.org https://lists.lyx.org/mailman/listinfo/lyx-cvs