From: Jean-Marc Lasgouttes Date: Wed, 29 Nov 2017 13:10:33 +0000 (+0100) Subject: Better handling of multiple buffers in UndoGroupHelper X-Git-Tag: 2.3.1~133^2~96 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=51e80361b2880a9f2e3b9d888891ffd9498713a6;p=features.git Better handling of multiple buffers in UndoGroupHelper 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. A use case among others is InsetLabel::updateReferences. (cherry picked from commit cc7364dfc50c399e99158fd9efe2f3eb0e6f4570) --- diff --git a/src/Undo.cpp b/src/Undo.cpp index f7ee48205f..49f636cbb9 100644 --- a/src/Undo.cpp +++ b/src/Undo.cpp @@ -40,6 +40,7 @@ #include #include +#include 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, - * but I am not sure yet how to do it. A use case is - * InsetLabel::updateReferences. - */ +class UndoGroupHelper::Impl { + friend class UndoGroupHelper; + set 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(); + } } diff --git a/src/Undo.h b/src/Undo.h index 70897bfa28..b1908a25b3 100644 --- a/src/Undo.h +++ b/src/Undo.h @@ -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; };