From f7a11ca7115064710b98bedc64d724ca15362527 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 15 Apr 2019 11:12:25 +0200 Subject: [PATCH] Allow to undo partly math autocorrect To this end, introduce Undo::splitUndoGroup, which ends currently group and creates a new one with same nesting level. --- src/Cursor.cpp | 6 ++++++ src/Cursor.h | 2 ++ src/Undo.cpp | 10 ++++++++++ src/Undo.h | 2 ++ src/mathed/MathAutoCorrect.cpp | 13 +++++++++++-- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 56a9dd8722..735ee34066 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -607,6 +607,12 @@ void CursorData::endUndoGroup() const } +void CursorData::splitUndoGroup() const +{ + buffer()->undo().splitUndoGroup(*this); +} + + void CursorData::recordUndo(pit_type from, pit_type to) const { buffer()->undo().recordUndo(*this, from, to); diff --git a/src/Cursor.h b/src/Cursor.h index 38ddad3502..3d3db5daa2 100644 --- a/src/Cursor.h +++ b/src/Cursor.h @@ -183,6 +183,8 @@ public: void beginUndoGroup() const; /// end the current undo group void endUndoGroup() const; + /// end abruptly the current group and create a new one wih the same nesting level + void splitUndoGroup() const; /// The general case: prepare undo for an arbitrary range. void recordUndo(pit_type from, pit_type to) const; diff --git a/src/Undo.cpp b/src/Undo.cpp index 5d613f2e0d..a9e0bba8e2 100644 --- a/src/Undo.cpp +++ b/src/Undo.cpp @@ -610,6 +610,16 @@ void Undo::endUndoGroup(CursorData const & cur_after) } +void Undo::splitUndoGroup(CursorData const & cur) +{ + size_t const level = d->group_level_; + d->group_level_ = 1; + endUndoGroup(cur); + beginUndoGroup(cur); + d->group_level_ = level; +} + + bool Undo::activeUndoGroup() const { return d->group_level_ > 0 diff --git a/src/Undo.h b/src/Undo.h index dd7035816d..c2b9b5d074 100644 --- a/src/Undo.h +++ b/src/Undo.h @@ -96,6 +96,8 @@ public: void endUndoGroup(); /// end the current undo group and set UndoElement::cur_after if necessary. void endUndoGroup(CursorData const & cur_after); + /// end abruptly the current group and create a new one wih the same nesting level + void splitUndoGroup(CursorData const & cur); /// return true if an undo group is open and contains at least one element bool activeUndoGroup() const; diff --git a/src/mathed/MathAutoCorrect.cpp b/src/mathed/MathAutoCorrect.cpp index be5aeb42d0..77e5fefbd4 100644 --- a/src/mathed/MathAutoCorrect.cpp +++ b/src/mathed/MathAutoCorrect.cpp @@ -90,8 +90,17 @@ bool Correction::correct(Cursor & cur, char_type c) const LYXERR(Debug::MATHED, "match found! subst in " << cur.cell() << " from: '" << from1_ << "' to '" << to_ << '\''); - cur.cell().erase(cur.pos() - n, cur.pos()); - cur.pos() -= n; + /* To allow undoing the completion, we proceed in 4 steps + * - inset the raw character + * - split undo group so that we have two separate undo actions + * - record undo, delete the character we just entered and the from1_ part + * - finally, do the insertion of the correction. + */ + cur.insert(c); + cur.splitUndoGroup(); + cur.recordUndoSelection(); + cur.cell().erase(cur.pos() - n - 1, cur.pos()); + cur.pos() -= n + 1; cur.insert(to_); return true; -- 2.39.2