From fe0d579d565ce9a3312bd17c11dec13d199fd317 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 8 Nov 2018 12:06:39 +0100 Subject: [PATCH 1/2] Cursor improvements in pad (Beta) --- www/common/cursor.js | 26 ++++++++++++++++++++++++++ www/pad/inner.js | 17 ++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/www/common/cursor.js b/www/common/cursor.js index e72585bb8..b19c02850 100644 --- a/www/common/cursor.js +++ b/www/common/cursor.js @@ -124,6 +124,7 @@ define([ cursor.pushDelta = function (oldVal, newVal) { if (oldVal === newVal) { return; } + var commonStart = 0; while (oldVal.charAt(commonStart) === newVal.charAt(commonStart)) { commonStart++; @@ -156,6 +157,31 @@ define([ }; }; + cursor.transformRange = function (cursorRange, ops) { + var transformCursor = function (cursor, op) { + if (!op) { return cursor; } + + var pos = op.offset; + var remove = op.toRemove; + var insert = op.toInsert.length; + if (typeof cursor === 'undefined') { return; } + if (typeof remove === 'number' && pos < cursor) { + cursor -= Math.min(remove, cursor - pos); + } + if (typeof insert === 'number' && pos < cursor) { + cursor += insert; + } + return cursor; + }; + var c = cursorRange.offset; + if (Array.isArray(ops)) { + for (var i = ops.length - 1; i >= 0; i--) { + c = transformCursor(c, ops[i]); + } + cursorRange.offset = c; + } + }; + cursor.brFix = function () { cursor.update(); var start = Range.start; diff --git a/www/pad/inner.js b/www/pad/inner.js index 7df4b45f9..40f2f5906 100644 --- a/www/pad/inner.js +++ b/www/pad/inner.js @@ -318,20 +318,23 @@ define([ if (!frame) { return; } - if (typeof info.diff.oldValue === 'string' && typeof info.diff.newValue === 'string') { - var pushes = cursor.pushDelta(info.diff.oldValue, info.diff.newValue); + if (frame && typeof info.diff.oldValue === 'string' && typeof info.diff.newValue === 'string') { + //var pushes = cursor.pushDelta(info.diff.oldValue, info.diff.newValue); + var ops = ChainPad.Diff.diff(info.diff.oldValue, info.diff.newValue); if (frame & 1) { // push cursor start if necessary - if (pushes.commonStart < cursor.Range.start.offset) { + cursor.transformRange(cursor.Range.start, ops); + /*if (pushes.commonStart < cursor.Range.start.offset) { cursor.Range.start.offset += pushes.delta; - } + }*/ } if (frame & 2) { // push cursor end if necessary - if (pushes.commonStart < cursor.Range.end.offset) { + cursor.transformRange(cursor.Range.end, ops); + /*if (pushes.commonStart < cursor.Range.end.offset) { cursor.Range.end.offset += pushes.delta; - } + }*/ } } }, @@ -698,7 +701,7 @@ define([ // terminate the test like `test.cancel()` window.easyTest = function () { cursor.update(); - var start = cursor.Range.start; + //var start = cursor.Range.start; //var test = TypingTest.testInput(inner, start.el, start.offset, framework.localChange); var test = TypingTest.testInput2(editor); framework.localChange(); From b166c70a5f798ef61572cdc9565867685b19aa48 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 9 Nov 2018 16:38:16 +0100 Subject: [PATCH 2/2] Fix conflict when a user was reverting the latest patch from someone else --- www/common/sframe-app-framework.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/www/common/sframe-app-framework.js b/www/common/sframe-app-framework.js index b26c60583..a19979c5b 100644 --- a/www/common/sframe-app-framework.js +++ b/www/common/sframe-app-framework.js @@ -259,6 +259,9 @@ define([ if (content === UNINITIALIZED) { return; } throw new Error("Content must be an object or array, type is " + typeof(content)); } + + oldContent = content; + if (Array.isArray(content)) { // Pad content.push({ metadata: cpNfInner.metadataMgr.getMetadataLazy() });