@@ -277,6 +277,35 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
277277 selectionTesters = _res . selectionTesters ;
278278 eventData = _res . eventData ;
279279
280+ var poly ;
281+ if ( filterPoly ) {
282+ poly = filterPoly . filtered ;
283+ } else {
284+ poly = castMultiPolygon ( mergedPolygons ) ;
285+ poly . isRect = poly . length === 5 &&
286+ poly [ 0 ] [ 0 ] === poly [ 4 ] [ 0 ] &&
287+ poly [ 0 ] [ 1 ] === poly [ 4 ] [ 1 ] &&
288+ (
289+ poly [ 0 ] [ 0 ] === poly [ 1 ] [ 0 ] &&
290+ poly [ 2 ] [ 0 ] === poly [ 3 ] [ 0 ] &&
291+ poly [ 0 ] [ 1 ] === poly [ 3 ] [ 1 ] &&
292+ poly [ 1 ] [ 1 ] === poly [ 2 ] [ 1 ]
293+ ) ||
294+ (
295+ poly [ 0 ] [ 1 ] === poly [ 1 ] [ 1 ] &&
296+ poly [ 2 ] [ 1 ] === poly [ 3 ] [ 1 ] &&
297+ poly [ 0 ] [ 0 ] === poly [ 3 ] [ 0 ] &&
298+ poly [ 1 ] [ 0 ] === poly [ 2 ] [ 0 ]
299+ ) ;
300+
301+ if ( poly . isRect ) {
302+ poly . xmin = Math . min ( poly [ 0 ] [ 0 ] , poly [ 2 ] [ 0 ] ) ;
303+ poly . xmax = Math . max ( poly [ 0 ] [ 0 ] , poly [ 2 ] [ 0 ] ) ;
304+ poly . ymin = Math . min ( poly [ 0 ] [ 1 ] , poly [ 2 ] [ 1 ] ) ;
305+ poly . ymax = Math . max ( poly [ 0 ] [ 1 ] , poly [ 2 ] [ 1 ] ) ;
306+ }
307+ }
308+
280309 throttle . throttle (
281310 throttleID ,
282311 constants . SELECTDELAY ,
@@ -285,13 +314,6 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
285314
286315 eventData = { points : selection } ;
287316
288- var poly ;
289- if ( filterPoly ) {
290- poly = filterPoly . filtered ;
291- } else {
292- poly = currentPolygon ;
293- poly . isRect = selectionTesters . isRect ;
294- }
295317 fillRangeItems ( eventData , poly ) ;
296318
297319 dragOptions . gd . emit ( 'plotly_selecting' , eventData ) ;
@@ -1127,14 +1149,7 @@ function reselect(gd, selectionTesters, searchTraces, dragOptions) {
11271149 var xref = activePolygons [ 0 ] . xref ;
11281150 var yref = activePolygons [ 0 ] . yref ;
11291151 if ( xref && yref ) {
1130- var activePolygon = activePolygons [ 0 ] ;
1131- // handle active shape with multiple polygons
1132- for ( var n = 1 ; n < activePolygons . length ; n ++ ) {
1133- // close previous polygon
1134- activePolygon . push ( activePolygon [ 0 ] ) ;
1135- // add this polygon
1136- activePolygon = activePolygon . concat ( activePolygons [ n ] ) ;
1137- }
1152+ var activePolygon = castMultiPolygon ( activePolygons ) ;
11381153
11391154 var fillRangeItems = makeFillRangeItems ( [
11401155 getFromId ( gd , xref , 'x' ) ,
@@ -1309,6 +1324,22 @@ function convert(ax, d) {
13091324 return ax . type === 'log' ? ax . c2p ( d ) : ax . r2p ( d , null , ax . calendar ) ;
13101325}
13111326
1327+ function castMultiPolygon ( allPolygons ) {
1328+ var len = allPolygons . length ;
1329+
1330+ // descibe multi polygons in one polygon
1331+ var p = [ ] ;
1332+ for ( var i = 0 ; i < len ; i ++ ) {
1333+ var polygon = allPolygons [ i ] ;
1334+ p = p . concat ( polygon ) ;
1335+
1336+ // add starting vertex to close
1337+ // which indicates next polygon
1338+ p = p . concat ( [ polygon [ 0 ] ] ) ;
1339+ }
1340+ return p ;
1341+ }
1342+
13121343function makeFillRangeItems ( allAxes ) {
13131344 return function ( eventData , poly ) {
13141345 var range ;
0 commit comments