From ebafdd419dcf4ba072195861e15a87af016ab8cb Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 14 May 2013 19:18:59 +0400 Subject: [PATCH] fix animated scroll in multiselect mode --- lib/ace/editor.js | 2 ++ lib/ace/multi_select.js | 6 +++++- lib/ace/virtual_renderer.js | 8 ++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 049f63d8..5ddd14f2 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -1799,6 +1799,8 @@ var Editor = function(renderer, session) { this.session.unfold({row: lineNumber - 1, column: column || 0}); this.$blockScrolling += 1; + // todo: find a way to automatically exit multiselect mode + this.exitMultiSelectMode && this.exitMultiSelectMode() this.moveCursorTo(lineNumber - 1, column || 0); this.$blockScrolling -= 1; diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index 9d063837..d1b226f0 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -499,9 +499,13 @@ var Editor = require("./editor").Editor; this.inVirtualSelectionMode = false; selection._eventRegistry = reg; selection.mergeOverlappingRanges(); - + + var anim = this.renderer.$scrollAnimation; this.onCursorChange(); this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + return result; }; diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 5fc902ac..9d0d1b1d 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -105,7 +105,7 @@ var VirtualRenderer = function(container, theme) { this.scrollBar = new ScrollBar(this.container); this.scrollBar.addEventListener("scroll", function(e) { - if (!_self.$inScrollAnimation) + if (!_self.$scrollAnimation) _self.session.setScrollTop(e.data); }); @@ -1063,10 +1063,10 @@ var VirtualRenderer = function(container, theme) { this.animateScrolling = function(fromValue, callback) { var toValue = this.scrollTop; - if (this.$animatedScroll && Math.abs(fromValue - toValue) < 100000) { + if (this.$animatedScroll) { var _self = this; var steps = _self.$calcSteps(fromValue, toValue); - this.$inScrollAnimation = true; + this.$scrollAnimation = {from: fromValue, to: toValue}; clearInterval(this.$timer); @@ -1083,7 +1083,7 @@ var VirtualRenderer = function(container, theme) { } else { // do this on separate step to not get spurious scroll event from scrollbar _self.$timer = clearInterval(_self.$timer); - _self.$inScrollAnimation = false; + _self.$scrollAnimation = null; callback && callback(); } }, 10);