From 937de2c59fa6b4850a210086ca0ca0e4e6dd6faa Mon Sep 17 00:00:00 2001
From: Kevin Jahns <kevin.jahns@rwth-aachen.de>
Date: Thu, 15 Feb 2018 18:28:53 +0100
Subject: [PATCH] fix fast undo-redo bug

---
 src/Util/UndoManager.js | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/Util/UndoManager.js b/src/Util/UndoManager.js
index 83b37530..7fe07573 100644
--- a/src/Util/UndoManager.js
+++ b/src/Util/UndoManager.js
@@ -32,12 +32,10 @@ function applyReverseOperation (y, scope, reverseBuffer) {
       let undoOp = reverseBuffer.pop()
       // make sure that it is possible to iterate {from}-{to}
       if (undoOp.fromState !== null) {
-        let start = y.os.getItemCleanStart(undoOp.fromState)
+        y.os.getItemCleanStart(undoOp.fromState)
         y.os.getItemCleanEnd(undoOp.toState)
-        console.log(start)
         y.os.iterate(undoOp.fromState, undoOp.toState, op => {
-          debugger
-          if (op._deleted && op._redone !== null) {
+          while (op._deleted && op._redone !== null) {
             op = op._redone
           }
           if (op._deleted === false && isStructInScope(y, op, scope)) {
@@ -49,7 +47,13 @@ function applyReverseOperation (y, scope, reverseBuffer) {
       for (let op of undoOp.deletedStructs) {
         if (
           isStructInScope(y, op, scope) &&
-          op._parent !== y
+          op._parent !== y &&
+          (
+            op._id.user !== y.userID ||
+            undoOp.fromState === null ||
+            op._id.clock < undoOp.fromState ||
+            op._id.clock > undoOp.toState
+          )
         ) {
           performedUndo = true
           op._redo(y)
@@ -78,7 +82,12 @@ export default class UndoManager {
           let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null
           if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {
             lastUndoOp.created = reverseOperation.created
-            lastUndoOp.toState = reverseOperation.toState
+            if (reverseOperation.toState !== null) {
+              lastUndoOp.toState = reverseOperation.toState
+              if (lastUndoOp.fromState === null) {
+                lastUndoOp.fromState = reverseOperation.fromState
+              }
+            }
             reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs)
           } else {
             this._undoBuffer.push(reverseOperation)