@@ -13,6 +13,8 @@ var mapboxgl = require('mapbox-gl');
13
13
14
14
var Fx = require ( '../../components/fx' ) ;
15
15
var Lib = require ( '../../lib' ) ;
16
+ var dragElement = require ( '../../components/dragelement' ) ;
17
+ var prepSelect = require ( '../cartesian/select' ) ;
16
18
var constants = require ( './constants' ) ;
17
19
var layoutAttributes = require ( './layout_attributes' ) ;
18
20
var createMapboxLayer = require ( './layers' ) ;
@@ -86,9 +88,9 @@ proto.plot = function(calcData, fullLayout, promises) {
86
88
} ;
87
89
88
90
proto . createMap = function ( calcData , fullLayout , resolve , reject ) {
89
- var self = this ,
90
- gd = self . gd ,
91
- opts = self . opts ;
91
+ var self = this ;
92
+ var gd = self . gd ;
93
+ var opts = self . opts ;
92
94
93
95
// store style id and URL or object
94
96
var styleObj = self . styleObj = getStyleObj ( opts . style ) ;
@@ -107,7 +109,9 @@ proto.createMap = function(calcData, fullLayout, resolve, reject) {
107
109
pitch : opts . pitch ,
108
110
109
111
interactive : ! self . isStatic ,
110
- preserveDrawingBuffer : self . isStatic
112
+ preserveDrawingBuffer : self . isStatic ,
113
+
114
+ boxZoom : false
111
115
} ) ;
112
116
113
117
// clear navigation container
@@ -128,6 +132,8 @@ proto.createMap = function(calcData, fullLayout, resolve, reject) {
128
132
self . resolveOnRender ( resolve ) ;
129
133
} ) ;
130
134
135
+ if ( self . isStatic ) return ;
136
+
131
137
// keep track of pan / zoom in user layout and emit relayout event
132
138
map . on ( 'moveend' , function ( eventData ) {
133
139
if ( ! self . map ) return ;
@@ -261,6 +267,7 @@ proto.updateLayout = function(fullLayout) {
261
267
262
268
this . updateLayers ( ) ;
263
269
this . updateFramework ( fullLayout ) ;
270
+ this . updateFx ( fullLayout ) ;
264
271
this . map . resize ( ) ;
265
272
} ;
266
273
@@ -314,6 +321,69 @@ proto.createFramework = function(fullLayout) {
314
321
self . updateFramework ( fullLayout ) ;
315
322
} ;
316
323
324
+ proto . updateFx = function ( fullLayout ) {
325
+ var self = this ;
326
+ var map = self . map ;
327
+ var gd = self . gd ;
328
+
329
+ if ( self . isStatic ) return ;
330
+
331
+ function invert ( pxpy ) {
332
+ var obj = self . map . unproject ( pxpy ) ;
333
+ return [ obj . lng , obj . lat ] ;
334
+ }
335
+
336
+ var dragMode = fullLayout . dragmode ;
337
+ var fillRangeItems ;
338
+
339
+ if ( dragMode === 'select' ) {
340
+ fillRangeItems = function ( eventData , poly ) {
341
+ var ranges = eventData . range = { } ;
342
+ ranges [ self . id ] = [
343
+ invert ( [ poly . xmin , poly . ymin ] ) ,
344
+ invert ( [ poly . xmax , poly . ymax ] )
345
+ ] ;
346
+ } ;
347
+ } else {
348
+ fillRangeItems = function ( eventData , poly , pts ) {
349
+ var dataPts = eventData . lassoPoints = { } ;
350
+ dataPts [ self . id ] = pts . filtered . map ( invert ) ;
351
+ } ;
352
+ }
353
+
354
+ if ( dragMode === 'select' || dragMode === 'lasso' ) {
355
+ map . dragPan . disable ( ) ;
356
+
357
+ var dragOptions = {
358
+ element : self . div ,
359
+ gd : gd ,
360
+ plotinfo : {
361
+ xaxis : self . xaxis ,
362
+ yaxis : self . yaxis ,
363
+ fillRangeItems : fillRangeItems
364
+ } ,
365
+ xaxes : [ self . xaxis ] ,
366
+ yaxes : [ self . yaxis ] ,
367
+ subplot : self . id
368
+ } ;
369
+
370
+ dragOptions . prepFn = function ( e , startX , startY ) {
371
+ prepSelect ( e , startX , startY , dragOptions , dragMode ) ;
372
+ } ;
373
+
374
+ dragOptions . doneFn = function ( dragged , numClicks ) {
375
+ if ( numClicks === 2 ) {
376
+ fullLayout . _zoomlayer . selectAll ( '.select-outline' ) . remove ( ) ;
377
+ }
378
+ } ;
379
+
380
+ dragElement . init ( dragOptions ) ;
381
+ } else {
382
+ map . dragPan . enable ( ) ;
383
+ self . div . onmousedown = null ;
384
+ }
385
+ } ;
386
+
317
387
proto . updateFramework = function ( fullLayout ) {
318
388
var domain = fullLayout [ this . id ] . domain ,
319
389
size = fullLayout . _size ;
0 commit comments