From fe0d579d565ce9a3312bd17c11dec13d199fd317 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 8 Nov 2018 12:06:39 +0100 Subject: [PATCH] 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();