@@ -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,69 @@ 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 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+
317387proto . updateFramework = function ( fullLayout ) {
318388 var domain = fullLayout [ this . id ] . domain ,
319389 size = fullLayout . _size ;
0 commit comments