commit b8c0c408597a45ca26f313c043be39af3ca1cff9
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Wed Apr 9 15:43:05 2025 +0200

    Move fixBiblio to updateBuffer (1/4) : Add new method helper method
    
    Introduce new method DocIterator::updateAfterInsertion. This method
    updates the DocIterator after a modification happened at another
    DocIterator position.
    
    It is not used yet. Eventually, it will be used to update cursors in
    all views.
---
 src/DocIterator.cpp | 25 +++++++++++++++++++++++++
 src/DocIterator.h   |  5 +++++
 2 files changed, 30 insertions(+)

diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp
index 131a403c13..7d18c36547 100644
--- a/src/DocIterator.cpp
+++ b/src/DocIterator.cpp
@@ -649,6 +649,31 @@ void DocIterator::sanitize()
 }
 
 
+void DocIterator::updateAfterInsertion(DocIterator const & dit, int const 
count)
+{
+       LASSERT(dit.inTexted(), return);
+       size_type const n = find(&dit.inset());
+       if (n == lyx::npos)
+               // we do not point to the inset where this happened.
+               return;
+       CursorSlice & sl = slices_[n];
+       if (sl.idx() != dit.idx() || sl.pit() != dit.pit() || sl.pos() < 
dit.pos())
+               // the change has been happening in a place that we do not care 
about.
+               return;
+
+       if (count < 0 && sl.pos() < dit.pos() - count) {
+               if (n + 1 < slices_.size())
+                       // the inset we pointed to has been chopped-off.
+                       resize(n + 1);
+               else
+                       // set cursor at the start of deleted part.
+                       sl.pos() = dit.pos();
+       } else
+               // adapt cursor position.
+               sl.pos() += count;
+}
+
+
 bool DocIterator::isInside(Inset const * p) const
 {
        for (CursorSlice const & sl : slices_)
diff --git a/src/DocIterator.h b/src/DocIterator.h
index 06be32fba1..f46d57598f 100644
--- a/src/DocIterator.h
+++ b/src/DocIterator.h
@@ -251,6 +251,11 @@ public:
        /// Repopulate the slices insets from bottom to top. Useful
        /// for stable iterators or Undo data.
        void sanitize();
+       /**  Update the iterator after an  insertion or a deletion
+        * \param dit : the place where the insertion happened.
+        * \param count : the number of characters added (or deleted if 
negative).
+        */
+       void updateAfterInsertion(DocIterator const & dit, int count = 1);
        ///
        bool isInside(Inset const *) const;
        /// make sure we are outside of given inset
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
https://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to