@@ -14,14 +14,15 @@ var d3 = require('d3');
1414var tinycolor = require ( 'tinycolor2' ) ;
1515var isNumeric = require ( 'fast-isnumeric' ) ;
1616var Events = require ( '../../lib/events' ) ;
17+ var prepSelect = require ( './select' ) ;
1718
1819var fx = module . exports = { } ;
1920
2021fx . layoutAttributes = {
2122 dragmode : {
2223 valType : 'enumerated' ,
2324 role : 'info' ,
24- values : [ 'zoom' , 'pan' , 'orbit' , 'turntable' ] ,
25+ values : [ 'zoom' , 'pan' , 'select' , 'lasso' , ' orbit', 'turntable' ] ,
2526 description : 'Determines the mode of drag interactions.'
2627 } ,
2728 hovermode : {
@@ -1370,16 +1371,39 @@ function dragBox(gd, plotinfo, x, y, w, h, ns, ew) {
13701371
13711372 var dragOptions = {
13721373 element : dragger ,
1374+ gd : gd ,
1375+ plotinfo : plotinfo ,
1376+ xaxes : xa ,
1377+ yaxes : ya ,
1378+ doubleclick : doubleClick ,
13731379 prepFn : function ( e , startX , startY ) {
1374- if ( ns + ew === 'nsew' && ( ( fullLayout . dragmode === 'zoom' ) ?
1375- ! e . shiftKey : e . shiftKey ) ) {
1380+ var dragModeNow = gd . _fullLayout . dragmode ;
1381+ if ( ns + ew === 'nsew' ) {
1382+ // main dragger handles all drag modes, and changes
1383+ // to pan (or to zoom if it already is pan) on shift
1384+ if ( e . shiftKey ) {
1385+ if ( dragModeNow === 'pan' ) dragModeNow = 'zoom' ;
1386+ else dragModeNow = 'pan' ;
1387+ }
1388+ }
1389+ // all other draggers just pan
1390+ else dragModeNow = 'pan' ;
1391+
1392+ if ( dragModeNow === 'lasso' ) dragOptions . minDrag = 1 ;
1393+ else dragOptions . minDrag = undefined ;
1394+
1395+ if ( dragModeNow === 'zoom' ) {
13761396 dragOptions . moveFn = zoomMove ;
13771397 dragOptions . doneFn = zoomDone ;
13781398 zoomPrep ( e , startX , startY ) ;
1379- } else {
1399+ }
1400+ else if ( dragModeNow === 'pan' ) {
13801401 dragOptions . moveFn = plotDrag ;
13811402 dragOptions . doneFn = dragDone ;
13821403 }
1404+ else if ( dragModeNow === 'select' || dragModeNow === 'lasso' ) {
1405+ prepSelect ( e , startX , startY , dragOptions , dragModeNow ) ;
1406+ }
13831407 }
13841408 } ;
13851409
@@ -2003,9 +2027,11 @@ fx.dragElement = function(options) {
20032027
20042028 function onMove ( e ) {
20052029 var dx = e . clientX - startX ,
2006- dy = e . clientY - startY ;
2007- if ( Math . abs ( dx ) < fx . MINDRAG ) dx = 0 ;
2008- if ( Math . abs ( dy ) < fx . MINDRAG ) dy = 0 ;
2030+ dy = e . clientY - startY ,
2031+ minDrag = options . minDrag || fx . MINDRAG ;
2032+
2033+ if ( Math . abs ( dx ) < minDrag ) dx = 0 ;
2034+ if ( Math . abs ( dy ) < minDrag ) dy = 0 ;
20092035 if ( dx || dy ) gd . _dragged = true ;
20102036
20112037 if ( options . moveFn ) options . moveFn ( dx , dy , gd . _dragged ) ;
0 commit comments