@@ -263,35 +263,68 @@ module.exports = function draw(gd) {
263263
264264 scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
265265
266+ // scroll legend by mousewheel or touchpad swipe up/down
266267 legend . on ( 'wheel' , function ( ) {
267268 scrollBoxY = Lib . constrain (
268269 opts . _scrollY +
269- d3 . event . deltaY / scrollBarYMax * scrollBoxYMax ,
270+ ( ( d3 . event . deltaY / scrollBarYMax ) * scrollBoxYMax ) ,
270271 0 , scrollBoxYMax ) ;
271272 scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
272273 if ( scrollBoxY !== 0 && scrollBoxY !== scrollBoxYMax ) {
273274 d3 . event . preventDefault ( ) ;
274275 }
275276 } ) ;
276277
277- var eventY0 , scrollBoxY0 ;
278+ var eventY0 , eventY1 , scrollBoxY0 ;
278279
279- var drag = d3 . behavior . drag ( )
280+ var getScrollBoxDragY = function ( scrollBoxY0 , eventY0 , eventY1 ) {
281+ var y = ( ( eventY1 - eventY0 ) / scrollRatio ) + scrollBoxY0 ;
282+ return Lib . constrain ( y , 0 , scrollBoxYMax ) ;
283+ } ;
284+
285+ // scroll legend by dragging scrollBAR
286+ var scrollBarDrag = d3 . behavior . drag ( )
280287 . on ( 'dragstart' , function ( ) {
281- eventY0 = d3 . event . sourceEvent . clientY ;
288+ var e = d3 . event . sourceEvent ;
289+ if ( e . type === 'touchstart' ) {
290+ eventY0 = e . changedTouches [ 0 ] . clientY ;
291+ } else {
292+ eventY0 = e . clientY ;
293+ }
282294 scrollBoxY0 = scrollBoxY ;
283295 } )
284296 . on ( 'drag' , function ( ) {
285297 var e = d3 . event . sourceEvent ;
286298 if ( e . buttons === 2 || e . ctrlKey ) return ;
287-
288- scrollBoxY = Lib . constrain (
289- ( e . clientY - eventY0 ) / scrollRatio + scrollBoxY0 ,
290- 0 , scrollBoxYMax ) ;
299+ if ( e . type === 'touchmove' ) {
300+ eventY1 = e . changedTouches [ 0 ] . clientY ;
301+ } else {
302+ eventY1 = e . clientY ;
303+ }
304+ scrollBoxY = getScrollBoxDragY ( scrollBoxY0 , eventY0 , eventY1 ) ;
291305 scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
292306 } ) ;
307+ scrollBar . call ( scrollBarDrag ) ;
293308
294- scrollBar . call ( drag ) ;
309+ // scroll legend by touch-dragging scrollBOX
310+ var scrollBoxTouchDrag = d3 . behavior . drag ( )
311+ . on ( 'dragstart' , function ( ) {
312+ var e = d3 . event . sourceEvent ;
313+ if ( e . type === 'touchstart' ) {
314+ eventY0 = e . changedTouches [ 0 ] . clientY ;
315+ scrollBoxY0 = scrollBoxYMax - scrollBoxY ; // inverted for natural-scroll
316+ }
317+ } )
318+ . on ( 'drag' , function ( ) {
319+ var e = d3 . event . sourceEvent ;
320+ if ( e . type === 'touchmove' ) {
321+ eventY1 = e . changedTouches [ 0 ] . clientY ;
322+ scrollBoxY = getScrollBoxDragY ( scrollBoxY0 , eventY0 , eventY1 ) ;
323+ var naturalScrollBoxY = scrollBoxYMax - scrollBoxY ; // inverted for natural-scroll
324+ scrollHandler ( naturalScrollBoxY , scrollBarHeight , scrollRatio ) ;
325+ }
326+ } ) ;
327+ scrollBox . call ( scrollBoxTouchDrag ) ;
295328 }
296329
297330
0 commit comments