diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 11cdda66..f0cc2fa3 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -1209,7 +1209,17 @@ var Editor = function(renderer, session) { var range = this.$search.find(this.session); if (range) { this.session.unfold(range); + this.$blockScrolling += 1; this.selection.setSelectionRange(range); // this scrolls selection into view + this.$blockScrolling -= 1; + + var cursor = this.getCursorPosition(); + if (!this.isRowFullyVisible(cursor.row)) + this.scrollToLine(cursor.row, true); + + //@todo scroll X + //if (!this.isRowFullyVisible(cursor.row)) + //this.scrollToLine(cursor.row, true); } }; diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 0ac360f5..8310cdfa 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -698,13 +698,41 @@ var VirtualRenderer = function(container, theme) { this.session.setScrollTop(row * this.lineHeight); }; + //@todo I would like to make this animation a setting. How? + + var STEPS = 10; + function calcSteps(fromValue, toValue){ + var i = 0, + l = STEPS - 1, + steps = [fromValue], + func = function(t, x_min, dx) { + if ((t /= .5) < 1) + return dx / 2 * Math.pow(t, 3) + x_min; + return dx / 2 * (Math.pow(t - 2, 3) + 2) + x_min; + }; + + for (i = 0; i < l; ++i) + steps.push(func(i / STEPS, fromValue, toValue - fromValue)); + steps.push(toValue); + + return steps; + } + this.scrollToLine = function(line, center) { var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); var offset = pos.top; if (center) offset -= this.$size.scrollerHeight / 2; - this.session.setScrollTop(offset); + var i = 0, _self = this, + steps = calcSteps(this.scrollTop, offset); + clearInterval(_self.$timer); + this.$timer = setInterval(function(){ + _self.session.setScrollTop(steps[i]); + + if (++i == STEPS) + clearInterval(_self.$timer); + }, 10); }; this.scrollToY = function(scrollTop) {