]> git.lyx.org Git - features.git/commitdiff
Better handling of multiple buffers in UndoGroupHelper
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Wed, 29 Nov 2017 13:10:33 +0000 (14:10 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 15 Feb 2018 09:33:17 +0000 (10:33 +0100)
It may happen that the buffers are visited in order buffer1,
buffer2, buffer1. In this case, we want to have only one undo group
in buffer1. The solution is to replace buffer_ with a set<Buffer*>.

A use case among others is InsetLabel::updateReferences.

(cherry picked from commit cc7364dfc50c399e99158fd9efe2f3eb0e6f4570)

src/Undo.cpp
src/Undo.h

index f7ee48205f91c29e6554ed9d911518425568a774..49f636cbb9eb87fbe99a2b88b224b92f483be6fb 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <algorithm>
 #include <deque>
+#include <set>
 
 using namespace std;
 using namespace lyx::support;
@@ -645,22 +646,31 @@ void Undo::recordUndoFullBuffer(CursorData const & cur)
 
 /// UndoGroupHelper class stuff
 
-/** FIXME: handle restarted groups
- * It may happen that the buffers are visited in order buffer1,
- * buffer2, buffer1. In this case, we want to have only one undo group
- * in buffer1. One solution is to replace buffer_ with a set<Buffer*>,
- * but I am not sure yet how to do it. A use case is
- * InsetLabel::updateReferences.
- */
+class UndoGroupHelper::Impl {
+       friend class UndoGroupHelper;
+       set<Buffer *> buffers_;
+};
+
+
+UndoGroupHelper::UndoGroupHelper(Buffer * buf) : d(new UndoGroupHelper::Impl)
+{
+       resetBuffer(buf);
+}
+
+
+UndoGroupHelper::~UndoGroupHelper()
+{
+       for (Buffer * buf : d->buffers_)
+               buf->undo().endUndoGroup();
+       delete d;
+}
+
 void UndoGroupHelper::resetBuffer(Buffer * buf)
 {
-       if (buf == buffer_)
-               return;
-       if (buffer_)
-               buffer_->undo().endUndoGroup();
-       buffer_ = buf;
-       if (buffer_)
-               buffer_->undo().beginUndoGroup();
+       if (buf && d->buffers_.count(buf) == 0) {
+               d->buffers_.insert(buf);
+               buf->undo().beginUndoGroup();
+       }
 }
 
 
index 70897bfa28fe336f21d428b27ea62c4708bed3af..b1908a25b322d798980faca3a803c001cf56f8cd 100644 (file)
@@ -135,15 +135,9 @@ private:
  */
 class UndoGroupHelper {
 public:
-       UndoGroupHelper(Buffer * buf = 0) : buffer_(0)
-       {
-               resetBuffer(buf);
-       }
+       UndoGroupHelper(Buffer * buf = 0);
 
-       ~UndoGroupHelper()
-       {
-               resetBuffer(0);
-       }
+       ~UndoGroupHelper();
 
        /** Close the current undo group if necessary and create a new one
         * for buffer \c buf.
@@ -151,7 +145,8 @@ public:
        void resetBuffer(Buffer * buf);
 
 private:
-       Buffer * buffer_;
+       class Impl;
+       Impl * const d;
 };