mirror of
https://github.com/9001/copyparty.git
synced 2025-08-17 09:02:15 -06:00
fix undo/redo cursor pos
This commit is contained in:
parent
da3f68c363
commit
5d6a740947
|
@ -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]);
|
||||||
|
|
Loading…
Reference in a new issue