From 5b36d3bc45f26e9945031070b254197cf6a448cc Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Wed, 13 Jul 2022 22:02:16 -0400 Subject: [PATCH 1/4] fix mapbox multi-select error with shiftKey --- src/plots/geo/geo.js | 14 +++++--------- src/plots/mapbox/mapbox.js | 15 ++++++--------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/plots/geo/geo.js b/src/plots/geo/geo.js index 2ea14430e41..8665e0162f4 100644 --- a/src/plots/geo/geo.js +++ b/src/plots/geo/geo.js @@ -429,22 +429,18 @@ proto.updateFx = function(fullLayout, geoLayout) { ]); } - var fillRangeItems; - - if(dragMode === 'select') { - fillRangeItems = function(eventData, poly) { + var fillRangeItems = function(eventData, poly) { + if(poly.isRect) { var ranges = eventData.range = {}; ranges[_this.id] = [ invert([poly.xmin, poly.ymin]), invert([poly.xmax, poly.ymax]) ]; - }; - } else if(dragMode === 'lasso') { - fillRangeItems = function(eventData, poly) { + } else { var dataPts = eventData.lassoPoints = {}; dataPts[_this.id] = poly.map(invert); - }; - } + } + }; // Note: dragOptions is needed to be declared for all dragmodes because // it's the object that holds persistent selection state. diff --git a/src/plots/mapbox/mapbox.js b/src/plots/mapbox/mapbox.js index e72e9b724de..a4a42a9ab41 100644 --- a/src/plots/mapbox/mapbox.js +++ b/src/plots/mapbox/mapbox.js @@ -10,7 +10,6 @@ var dragElement = require('../../components/dragelement'); var Fx = require('../../components/fx'); var dragHelpers = require('../../components/dragelement/helpers'); -var rectMode = dragHelpers.rectMode; var drawMode = dragHelpers.drawMode; var selectMode = dragHelpers.selectMode; @@ -550,20 +549,18 @@ proto.updateFx = function(fullLayout) { var dragMode = fullLayout.dragmode; var fillRangeItems; - if(rectMode(dragMode)) { - fillRangeItems = function(eventData, poly) { + fillRangeItems = function(eventData, poly) { + if(poly.isRect) { var ranges = eventData.range = {}; ranges[self.id] = [ invert([poly.xmin, poly.ymin]), invert([poly.xmax, poly.ymax]) ]; - }; - } else { - fillRangeItems = function(eventData, pts) { + } else { var dataPts = eventData.lassoPoints = {}; - dataPts[self.id] = pts.map(invert); - }; - } + dataPts[self.id] = poly.map(invert); + } + }; // Note: dragOptions is needed to be declared for all dragmodes because // it's the object that holds persistent selection state. From e252cc837b9e3ce549a0f11a2719be25e4dbecb2 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Wed, 13 Jul 2022 22:25:04 -0400 Subject: [PATCH 2/4] refactor emit calls to be on gd --- src/components/selections/select.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/selections/select.js b/src/components/selections/select.js index 1995d85fa20..e2d226da389 100644 --- a/src/components/selections/select.js +++ b/src/components/selections/select.js @@ -350,7 +350,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) { fillRangeItems(eventData, poly); - dragOptions.gd.emit('plotly_selecting', eventData); + gd.emit('plotly_selecting', eventData); } ); } @@ -452,7 +452,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) { } eventData.selections = gd.layout.selections; - dragOptions.gd.emit('plotly_selected', eventData); + gd.emit('plotly_selected', eventData); }).catch(Lib.error); }; } From f9325a4737fde96c00b65d8645dcef273b72c832 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Wed, 13 Jul 2022 22:32:21 -0400 Subject: [PATCH 3/4] add functions to centralize select emit events --- src/components/selections/select.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/components/selections/select.js b/src/components/selections/select.js index e2d226da389..b6caaa4d76d 100644 --- a/src/components/selections/select.js +++ b/src/components/selections/select.js @@ -350,7 +350,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) { fillRangeItems(eventData, poly); - gd.emit('plotly_selecting', eventData); + emitSelecting(gd, eventData); } ); } @@ -381,7 +381,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) { clearSelectionsCache(dragOptions); - gd.emit('plotly_deselect', null); + emitDeselect(gd); if(searchTraces.length) { var clickedXaxis = searchTraces[0].xaxis; @@ -419,7 +419,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) { // but in case anyone depends on it we don't want to break it now. // Note that click-to-select introduced pre v3 also emitts proper // event data when clickmode is having 'select' in its flag list. - gd.emit('plotly_selected', undefined); + emitSelected(gd, undefined); } } @@ -452,7 +452,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) { } eventData.selections = gd.layout.selections; - gd.emit('plotly_selected', eventData); + emitSelected(gd, eventData); }).catch(Lib.error); }; } @@ -491,7 +491,7 @@ function selectOnClick(evt, gd, xAxes, yAxes, subplot, dragOptions, polygonOutli clearSelectionsCache(dragOptions); if(sendEvents) { - gd.emit('plotly_deselect', null); + emitDeselect(gd); } } else { subtract = evt.shiftKey && @@ -531,7 +531,7 @@ function selectOnClick(evt, gd, xAxes, yAxes, subplot, dragOptions, polygonOutli if(sendEvents) { eventData.selections = gd.layout.selections; - gd.emit('plotly_selected', eventData); + emitSelected(gd, eventData); } } } @@ -1196,7 +1196,7 @@ function reselect(gd, selectionTesters, searchTraces, dragOptions) { } eventData.selections = gd.layout.selections; - gd.emit('plotly_selected', eventData); + emitSelected(gd, eventData); } fullLayout._reselect = false; @@ -1217,7 +1217,7 @@ function reselect(gd, selectionTesters, searchTraces, dragOptions) { if(sendEvents) { if(eventData.points.length) { eventData.selections = gd.layout.selections; - gd.emit('plotly_selected', eventData); + emitSelected(gd, eventData); } else { gd.emit('plotly_deselect', null); } @@ -1506,6 +1506,17 @@ function getFillRangeItems(dragOptions) { ); } +function emitSelecting(gd, eventData) { + gd.emit('plotly_selecting', eventData); +} + +function emitSelected(gd, eventData) { + gd.emit('plotly_selected', eventData); +} + +function emitDeselect(gd) { + gd.emit('plotly_deselect', null); +} module.exports = { reselect: reselect, From 4ca4423c266f028e8950b3b79cb291da1234b6c2 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Thu, 14 Jul 2022 12:07:53 -0400 Subject: [PATCH 4/4] avoid polygon name conflicts in select.js --- src/components/selections/select.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/selections/select.js b/src/components/selections/select.js index b6caaa4d76d..cafe1394a32 100644 --- a/src/components/selections/select.js +++ b/src/components/selections/select.js @@ -1,7 +1,7 @@ 'use strict'; var polybool = require('polybooljs'); -var pointInPolygon = require('point-in-polygon/nested'); +var pointInPolygon = require('point-in-polygon/nested'); // could we use contains lib/polygon instead? var Registry = require('../../registry'); var dashStyle = require('../drawing').dashStyle; @@ -32,7 +32,7 @@ var activateLastSelection = require('./draw').activateLastSelection; var Lib = require('../../lib'); var ascending = Lib.sorterAsc; -var polygon = require('../../lib/polygon'); +var libPolygon = require('../../lib/polygon'); var throttle = require('../../lib/throttle'); var getFromId = require('../../plots/cartesian/axis_ids').getFromId; var clearGlCanvases = require('../../lib/clear_gl_canvases'); @@ -42,8 +42,8 @@ var redrawReglTraces = require('../../plot_api/subroutines').redrawReglTraces; var constants = require('./constants'); var MINSELECT = constants.MINSELECT; -var filteredPolygon = polygon.filter; -var polygonTester = polygon.tester; +var filteredPolygon = libPolygon.filter; +var polygonTester = libPolygon.tester; var helpers = require('./helpers'); var p2r = helpers.p2r; @@ -596,7 +596,7 @@ function multiTester(list) { if(isPointSelectionDef(list[i])) { testers.push(newPointNumTester(list[i])); } else { - var tester = polygon.tester(list[i]); + var tester = polygonTester(list[i]); tester.subtract = !!list[i].subtract; testers.push(tester);