@@ -110,17 +110,15 @@ var syncscroll = true;
110110var preventSyncScrollToEdit = false ;
111111var preventSyncScrollToView = false ;
112112
113- var editScrollThrottle = 1 ;
113+ var editScrollThrottle = 2 ;
114114var viewScrollThrottle = 10 ;
115115var buildMapThrottle = 100 ;
116116
117117var viewScrolling = false ;
118- var viewScrollingDelay = 200 ;
119- var viewScrollingTimer = null ;
118+ var viewScrollingDebounce = 200 ;
120119
121120var editScrolling = false ;
122- var editScrollingDelay = 100 ;
123- var editScrollingTimer = null ;
121+ var editScrollingDebounce = 200 ;
124122
125123if ( editor . getOption ( 'scrollbarStyle' ) === 'native' ) {
126124 ui . area . codemirrorScroll . on ( 'scroll' , _ . throttle ( syncScrollToView , editScrollThrottle ) ) ;
@@ -145,7 +143,7 @@ var buildMap = _.throttle(buildMapInner, buildMapThrottle);
145143// Build offsets for each line (lines can be wrapped)
146144// That's a bit dirty to process each line everytime, but ok for demo.
147145// Optimizations are required only for big texts.
148- function buildMapInner ( syncBack ) {
146+ function buildMapInner ( callback ) {
149147 var i , offset , nonEmptyList , pos , a , b , _lineHeightMap , linesCount ,
150148 acc , _scrollMap ;
151149
@@ -217,12 +215,15 @@ function buildMapInner(syncBack) {
217215 scrollMap = _scrollMap ;
218216 lineHeightMap = _lineHeightMap ;
219217
220- if ( loaded && syncBack ) {
221- syncScrollToView ( ) ;
222- syncScrollToEdit ( ) ;
223- }
218+ if ( loaded && callback ) callback ( ) ;
224219}
225220
221+ // sync view scroll progress to edit
222+ var viewScrollingTimeout = _ . debounce ( viewScrollingTimeoutInner , viewScrollingDebounce ) ;
223+
224+ function viewScrollingTimeoutInner ( ) {
225+ viewScrolling = false ;
226+ }
226227
227228function syncScrollToEdit ( e ) {
228229 if ( currentMode != modeType . both || ! syncscroll ) return ;
@@ -235,7 +236,7 @@ function syncScrollToEdit(e) {
235236 return ;
236237 }
237238 if ( ! scrollMap || ! lineHeightMap ) {
238- buildMap ( true ) ;
239+ buildMap ( syncScrollToEdit ) ;
239240 return ;
240241 }
241242 if ( editScrolling ) return ;
@@ -272,21 +273,30 @@ function syncScrollToEdit(e) {
272273 if ( scrollInfo . height > scrollInfo . clientHeight && scrollTop >= preLastLinePos ) {
273274 posTo = preLastLineHeight ;
274275 topDiffPercent = ( scrollTop - preLastLinePos ) / ( viewBottom - preLastLinePos ) ;
275- posToNextDiff = Math . ceil ( textHeight * topDiffPercent ) ;
276+ posToNextDiff = textHeight * topDiffPercent ;
277+ posTo += Math . floor ( posToNextDiff ) ;
276278 } else {
277279 posTo = lineNo * textHeight ;
278280 topDiffPercent = ( scrollTop - scrollMap [ lineNo ] ) / ( scrollMap [ lineNo + lineDiff ] - scrollMap [ lineNo ] ) ;
279- posToNextDiff = Math . ceil ( textHeight * lineDiff * topDiffPercent ) ;
281+ posToNextDiff = textHeight * lineDiff * topDiffPercent ;
282+ posTo += Math . floor ( posToNextDiff ) ;
280283 }
281284
282- editor . scrollTo ( 0 , posTo + posToNextDiff ) ;
283- preventSyncScrollToView = true ;
285+ var posDiff = Math . abs ( scrollInfo . top - posTo ) ;
286+ var duration = posDiff / 50 ;
287+ ui . area . codemirrorScroll . stop ( true , true ) . animate ( {
288+ scrollTop : posTo
289+ } , duration >= 100 ? duration : 100 , "linear" ) ;
284290
285291 viewScrolling = true ;
286- clearTimeout ( viewScrollingTimer ) ;
287- viewScrollingTimer = setTimeout ( function ( ) {
288- viewScrolling = false ;
289- } , viewScrollingDelay ) ;
292+ viewScrollingTimeout ( ) ;
293+ }
294+
295+ // sync edit scroll progress to view
296+ var editScrollingTimeout = _ . debounce ( editScrollingTimeoutInner , editScrollingDebounce ) ;
297+
298+ function editScrollingTimeoutInner ( ) {
299+ editScrolling = false ;
290300}
291301
292302function syncScrollToView ( event , _lineNo ) {
@@ -300,7 +310,7 @@ function syncScrollToView(event, _lineNo) {
300310 return ;
301311 }
302312 if ( ! scrollMap || ! lineHeightMap ) {
303- buildMap ( true ) ;
313+ buildMap ( syncScrollToView ) ;
304314 return ;
305315 }
306316 if ( viewScrolling ) return ;
@@ -328,12 +338,12 @@ function syncScrollToView(event, _lineNo) {
328338 posTo = scrollMap [ lineHeightMap [ _lineNo ] ] ;
329339 }
330340
331- ui . area . view . stop ( true , true ) . scrollTop ( posTo ) ;
332- preventSyncScrollToEdit = true ;
341+ var posDiff = Math . abs ( ui . area . view . scrollTop ( ) - posTo ) ;
342+ var duration = posDiff / 50 ;
343+ ui . area . view . stop ( true , true ) . animate ( {
344+ scrollTop : posTo
345+ } , duration >= 100 ? duration : 100 , "linear" ) ;
333346
334347 editScrolling = true ;
335- clearTimeout ( editScrollingTimer ) ;
336- editScrollingTimer = setTimeout ( function ( ) {
337- editScrolling = false ;
338- } , editScrollingDelay ) ;
348+ editScrollingTimeout ( ) ;
339349}
0 commit comments