@@ -13,6 +13,8 @@ var mapboxgl = require('mapbox-gl');
1313
1414var Fx = require ( '../../components/fx' ) ;
1515var Lib = require ( '../../lib' ) ;
16+ var dragElement = require ( '../../components/dragelement' ) ;
17+ var prepSelect = require ( '../cartesian/select' ) ;
1618var constants = require ( './constants' ) ;
1719var layoutAttributes = require ( './layout_attributes' ) ;
1820var createMapboxLayer = require ( './layers' ) ;
@@ -86,9 +88,9 @@ proto.plot = function(calcData, fullLayout, promises) {
8688} ;
8789
8890proto . 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 ;
9294
9395 // store style id and URL or object
9496 var styleObj = self . styleObj = getStyleObj ( opts . style ) ;
@@ -107,7 +109,9 @@ proto.createMap = function(calcData, fullLayout, resolve, reject) {
107109 pitch : opts . pitch ,
108110
109111 interactive : ! self . isStatic ,
110- preserveDrawingBuffer : self . isStatic
112+ preserveDrawingBuffer : self . isStatic ,
113+
114+ boxZoom : false
111115 } ) ;
112116
113117 // clear navigation container
@@ -128,6 +132,8 @@ proto.createMap = function(calcData, fullLayout, resolve, reject) {
128132 self . resolveOnRender ( resolve ) ;
129133 } ) ;
130134
135+ if ( self . isStatic ) return ;
136+
131137 // keep track of pan / zoom in user layout and emit relayout event
132138 map . on ( 'moveend' , function ( eventData ) {
133139 if ( ! self . map ) return ;
@@ -261,6 +267,7 @@ proto.updateLayout = function(fullLayout) {
261267
262268 this . updateLayers ( ) ;
263269 this . updateFramework ( fullLayout ) ;
270+ this . updateFx ( fullLayout ) ;
264271 this . map . resize ( ) ;
265272} ;
266273
@@ -314,6 +321,73 @@ proto.createFramework = function(fullLayout) {
314321 self . updateFramework ( fullLayout ) ;
315322} ;
316323
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 clearSelect ( ) {
332+ fullLayout . _zoomlayer . selectAll ( '.select-outline' ) . remove ( ) ;
333+ }
334+
335+ function invert ( pxpy ) {
336+ var obj = self . map . unproject ( pxpy ) ;
337+ return [ obj . lng , obj . lat ] ;
338+ }
339+
340+ var dragMode = fullLayout . dragmode ;
341+ var fillRangeItems ;
342+
343+ if ( dragMode === 'select' ) {
344+ fillRangeItems = function ( eventData , poly ) {
345+ var ranges = eventData . range = { } ;
346+ ranges [ self . id ] = [
347+ invert ( [ poly . xmin , poly . ymin ] ) ,
348+ invert ( [ poly . xmax , poly . ymax ] )
349+ ] ;
350+ } ;
351+ } else {
352+ fillRangeItems = function ( eventData , poly , pts ) {
353+ var dataPts = eventData . lassoPoints = { } ;
354+ dataPts [ self . id ] = pts . filtered . map ( invert ) ;
355+ } ;
356+ }
357+
358+ if ( dragMode === 'select' || dragMode === 'lasso' ) {
359+ map . dragPan . disable ( ) ;
360+
361+ var dragOptions = {
362+ element : self . div ,
363+ gd : gd ,
364+ plotinfo : {
365+ xaxis : self . xaxis ,
366+ yaxis : self . yaxis ,
367+ fillRangeItems : fillRangeItems
368+ } ,
369+ xaxes : [ self . xaxis ] ,
370+ yaxes : [ self . yaxis ] ,
371+ subplot : self . id
372+ } ;
373+
374+ dragOptions . prepFn = function ( e , startX , startY ) {
375+ prepSelect ( e , startX , startY , dragOptions , dragMode ) ;
376+ } ;
377+
378+ dragOptions . doneFn = function ( dragged , numClicks ) {
379+ if ( numClicks === 2 ) clearSelect ( ) ;
380+ } ;
381+
382+ dragElement . init ( dragOptions ) ;
383+ } else {
384+ map . dragPan . enable ( ) ;
385+ self . div . onmousedown = null ;
386+ }
387+
388+ clearSelect ( ) ;
389+ } ;
390+
317391proto . updateFramework = function ( fullLayout ) {
318392 var domain = fullLayout [ this . id ] . domain ,
319393 size = fullLayout . _size ;
0 commit comments