X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FUndo.cpp;h=95eb160d60c9c19494cf3646fac858b90964db48;hb=52fee3556e63859f3ba52609e8f025a491767a81;hp=b305edef7909bbe1ab761e2884d769bdd5e1ca7c;hpb=7021f4c3421afc74ca0c52c038743dad4a222aa9;p=lyx.git diff --git a/src/Undo.cpp b/src/Undo.cpp index b305edef79..95eb160d60 100644 --- a/src/Undo.cpp +++ b/src/Undo.cpp @@ -33,6 +33,7 @@ #include "support/debug.h" #include "support/gettext.h" #include "support/lassert.h" +#include "support/lyxtime.h" #include #include @@ -72,7 +73,7 @@ struct UndoElement bool lc, size_t gid) : kind(kin), cur_before(cb), cell(cel), from(fro), end(en), pars(pl), array(ar), bparams(0), - lyx_clean(lc), group_id(gid) + lyx_clean(lc), group_id(gid), time(current_time()) { } /// @@ -80,11 +81,11 @@ struct UndoElement bool lc, size_t gid) : kind(ATOMIC_UNDO), cur_before(cb), cell(), from(0), end(0), pars(0), array(0), bparams(new BufferParams(bp)), - lyx_clean(lc), group_id(gid) + lyx_clean(lc), group_id(gid), time(current_time()) { } /// - UndoElement(UndoElement const & ue) + UndoElement(UndoElement const & ue) : time(current_time()) { kind = ue.kind; cur_before = ue.cur_before; @@ -121,12 +122,14 @@ struct UndoElement ParagraphList * pars; /// the contents of the saved MathData (for mathed) MathData * array; - /// Only used in case of full backups + /// Only used in case of params undo BufferParams const * bparams; /// Was the buffer clean at this point? bool lyx_clean; /// the element's group id size_t group_id; + /// timestamp + time_t time; private: /// Protect construction UndoElement(); @@ -321,12 +324,17 @@ void Undo::Private::doRecordUndo(UndoKind kind, if (!undo_finished_ && kind != ATOMIC_UNDO && !stack.empty() + && !stack.top().bparams && samePar(stack.top().cell, cell) && stack.top().kind == kind && stack.top().from == from - && stack.top().end == end) { + && stack.top().end == end + && stack.top().cur_after == cur_before + && current_time() - stack.top().time <= 2) { // reset cur_after; it will be filled correctly by endUndoGroup. stack.top().cur_after = CursorData(); + // update the timestamp of the undo element + stack.top().time = current_time(); return; } @@ -567,40 +575,15 @@ void Undo::endUndoGroup(CursorData const & cur) } -// FIXME: remove these convenience functions and make -// Private::recordUndo public as sole interface. The code in the -// convenience functions can move to Cursor.cpp. - void Undo::recordUndo(CursorData const & cur, UndoKind kind) { d->recordUndo(kind, cur, cur.pit(), cur.pit(), cur); } -void Undo::recordUndoInset(CursorData const & cur, UndoKind kind, - Inset const * inset) -{ - if (!inset || inset == &cur.inset()) { - DocIterator c = cur; - c.pop_back(); - d->recordUndo(kind, c, c.pit(), c.pit(), cur); - } else if (inset == cur.nextInset()) - recordUndo(cur, kind); - else - LYXERR0("Inset not found, no undo stack added."); -} - - -void Undo::recordUndo(CursorData const & cur, UndoKind kind, pit_type from) -{ - d->recordUndo(kind, cur, cur.pit(), from, cur); -} - - -void Undo::recordUndo(CursorData const & cur, UndoKind kind, - pit_type from, pit_type to) +void Undo::recordUndo(CursorData const & cur, pit_type from, pit_type to) { - d->recordUndo(kind, cur, from, to, cur); + d->recordUndo(ATOMIC_UNDO, cur, from, to, cur); }