diff --git a/addon/merge/merge.js b/addon/merge/merge.js index 688aeb99679a849af5292567dba5541119214276..c8115103de313bc7622bc5e344363c4d4d2e1afb 100644 --- a/addon/merge/merge.js +++ b/addon/merge/merge.js @@ -91,9 +91,13 @@ alignChunks(dv); updating = false; } - function set() { + function setDealign() { if (updating) return; dv.dealigned = true; + set(); + } + function set() { + if (updating) return; clearTimeout(debounceChange); debounceChange = setTimeout(update, 250); } @@ -102,14 +106,14 @@ dv.diffOutOfDate = true; edit.from = edit.to = orig.from = orig.to = 0; } - set(); + setDealign(); } dv.edit.on("change", change); dv.orig.on("change", change); - dv.edit.on("markerAdded", set); - dv.edit.on("markerCleared", set); - dv.orig.on("markerAdded", set); - dv.orig.on("markerCleared", set); + dv.edit.on("markerAdded", setDealign); + dv.edit.on("markerCleared", setDealign); + dv.orig.on("markerAdded", setDealign); + dv.orig.on("markerCleared", setDealign); dv.edit.on("viewportChange", set); dv.orig.on("viewportChange", set); update(); @@ -341,46 +345,29 @@ aligners[i].clear(); aligners.length = 0; - var cm = [dv.orig, dv.edit], vp = [], scroll = []; + var cm = [dv.orig, dv.edit], scroll = []; if (other) cm.push(other.orig); - for (var i = 0; i < cm.length; i++) { - vp.push(cm[i].getViewport()); + for (var i = 0; i < cm.length; i++) scroll.push(cm[i].getScrollInfo().top); - } - var spaceAbove = [0, 0, 0]; - for (var ln = 0; ln < linesToAlign.length; ln++) { - var lines = linesToAlign[ln]; - var above = true, below = true; - for (var i = 0; i < cm.length; i++) if (lines[i] != null) { - if (lines[i] >= vp[i].from) above = false; - if (lines[i] <= vp[i].to) below = false; - } - alignLines(cm, lines, aligners, spaceAbove, above); - if (below) break; - } - if (dv.lockScroll) - scroll[0] = scroll[1] = Math.max(scroll[0], scroll[1]); - for (var i = 0; i < cm.length; i++) { - if (spaceAbove[i]) - aligners.push(padAbove(cm[i], 0, spaceAbove[i])); + for (var ln = 0; ln < linesToAlign.length; ln++) + alignLines(cm, linesToAlign[ln], aligners); + + for (var i = 0; i < cm.length; i++) cm[i].scrollTo(null, scroll[i]); - } } - function alignLines(cm, lines, aligners, spaceAbove, isAboveViewport) { + function alignLines(cm, lines, aligners) { var maxOffset = 0, offset = []; for (var i = 0; i < cm.length; i++) if (lines[i] != null) { - var off = cm[i].heightAtLine(lines[i], "local") + spaceAbove[i]; + var off = cm[i].heightAtLine(lines[i], "local"); offset[i] = off; maxOffset = Math.max(maxOffset, off); } for (var i = 0; i < cm.length; i++) if (lines[i] != null) { var diff = maxOffset - offset[i]; - if (diff > 1) { - if (isAboveViewport) spaceAbove[i] += diff; - else aligners.push(padAbove(cm[i], lines[i], diff)); - } + if (diff > 1) + aligners.push(padAbove(cm[i], lines[i], diff)); } }