fix undo/redo cursor pos

This commit is contained in:
ed 2020-05-13 23:27:27 +02:00
parent da3f68c363
commit 5d6a740947

View file

@ -368,10 +368,7 @@ function setsel(s) {
} }
dom_src.value = [s.pre, s.sel, s.post].join(''); dom_src.value = [s.pre, s.sel, s.post].join('');
dom_src.setSelectionRange(s.car, s.cdr); dom_src.setSelectionRange(s.car, s.cdr);
try { dom_src.oninput();
draw_md();
}
catch (ex) { }
} }
@ -504,12 +501,12 @@ document.getElementById('help').onclick = function (e) {
action_stack = (function () { action_stack = (function () {
var undos = []; var undos = [];
var redos = []; var redos = [];
var sched_txt = ''; var sched_cpos = 0;
var sched_timer = null; var sched_timer = null;
var ignore = false; var ignore = false;
var ref = dom_src.value; var ref = dom_src.value;
function diff(from, to) { function diff(from, to, cpos) {
if (from === to) if (from === to)
return null; return null;
@ -535,14 +532,15 @@ action_stack = (function () {
return { return {
car: car, car: car,
cdr: ++p2, cdr: ++p2,
txt: txt txt: txt,
cpos: cpos
}; };
} }
function undiff(from, change) { function undiff(from, change) {
return { return {
txt: from.substring(0, change.car) + change.txt + from.substring(change.cdr), txt: from.substring(0, change.car) + change.txt + from.substring(change.cdr),
cursor: change.car + change.txt.length cpos: change.cpos
}; };
} }
@ -552,17 +550,19 @@ action_stack = (function () {
if (src.length === 0) if (src.length === 0)
return false; return false;
var state = undiff(ref, src.pop()), var patch = src.pop(),
change = diff(ref, state.txt); applied = undiff(ref, patch),
cpos = patch.cpos - (patch.cdr - patch.car) + patch.txt.length,
reverse = diff(ref, applied.txt, cpos);
if (change === null) if (reverse === null)
return false; return false;
dst.push(change); dst.push(reverse);
ref = state.txt; ref = applied.txt;
ignore = true; // just some browsers ignore = true; // just some browsers
dom_src.value = ref; dom_src.value = ref;
dom_src.setSelectionRange(state.cursor, state.cursor); dom_src.setSelectionRange(cpos, cpos);
ignore = true; // all browsers ignore = true; // all browsers
draw_md(); draw_md();
return true; return true;
@ -574,8 +574,8 @@ action_stack = (function () {
return; return;
} }
redos = []; redos = [];
sched_txt = dom_src.value;
clearTimeout(sched_timer); clearTimeout(sched_timer);
sched_cpos = dom_src.selectionEnd;
sched_timer = setTimeout(push, 500); sched_timer = setTimeout(push, 500);
} }
@ -592,11 +592,12 @@ action_stack = (function () {
} }
function push() { function push() {
var change = diff(ref, sched_txt, dom_src.selectionStart); var newtxt = dom_src.value;
var change = diff(ref, newtxt, sched_cpos);
if (change !== null) if (change !== null)
undos.push(change); undos.push(change);
ref = sched_txt; ref = newtxt;
dbg('undos(%d) redos(%d)', undos.length, redos.length); dbg('undos(%d) redos(%d)', undos.length, redos.length);
if (undos.length > 0) if (undos.length > 0)
dbg(undos.slice(-1)[0]); dbg(undos.slice(-1)[0]);