@@ -89,7 +89,7 @@ proto.plot = function(polarCalcData, fullLayout) {
89
89
_this . updateLayers ( fullLayout , polarLayout ) ;
90
90
_this . updateLayout ( fullLayout , polarLayout ) ;
91
91
Plots . generalUpdatePerTraceModule ( _this . gd , _this , polarCalcData , polarLayout ) ;
92
- _this . updateFx ( fullLayout ) ;
92
+ _this . updateFx ( fullLayout , polarLayout ) ;
93
93
} ;
94
94
95
95
proto . updateLayers = function ( fullLayout , polarLayout ) {
@@ -606,10 +606,11 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
606
606
. call ( Color . stroke , angularLayout . linecolor ) ;
607
607
} ;
608
608
609
- proto . updateFx = function ( fullLayout ) {
609
+ proto . updateFx = function ( fullLayout , polarLayout ) {
610
610
if ( ! this . gd . _context . staticPlot ) {
611
611
this . updateAngularDrag ( fullLayout ) ;
612
- this . updateRadialDrag ( fullLayout ) ;
612
+ this . updateRadialDrag ( fullLayout , polarLayout , 1 ) ;
613
+ if ( this . innerRadius ) this . updateRadialDrag ( fullLayout , polarLayout , 0 ) ;
613
614
this . updateMainDrag ( fullLayout ) ;
614
615
}
615
616
} ;
@@ -913,40 +914,47 @@ proto.updateMainDrag = function(fullLayout) {
913
914
dragElement . init ( dragOpts ) ;
914
915
} ;
915
916
916
- proto . updateRadialDrag = function ( fullLayout ) {
917
+ proto . updateRadialDrag = function ( fullLayout , polarLayout , rngIndex ) {
917
918
var _this = this ;
918
919
var gd = _this . gd ;
919
920
var layers = _this . layers ;
920
921
var radius = _this . radius ;
922
+ var innerRadius = _this . innerRadius ;
921
923
var cx = _this . cx ;
922
924
var cy = _this . cy ;
923
925
var radialAxis = _this . radialAxis ;
924
926
925
927
if ( ! radialAxis . visible ) return ;
926
928
927
929
var angle0 = deg2rad ( _this . radialAxisAngle ) ;
928
- var rl0 = radialAxis . _rl [ 0 ] ;
929
- var rl1 = radialAxis . _rl [ 1 ] ;
930
- var drl = rl1 - rl0 ;
930
+ var rl = radialAxis . _rl ;
931
+ var rl0 = rl [ 0 ] ;
932
+ var rl1 = rl [ 1 ] ;
933
+ var rbase = rl [ rngIndex ] ;
934
+ var m = 0.75 * ( rl [ 1 ] - rl [ 0 ] ) / ( 1 - polarLayout . hole ) / radius ;
931
935
932
936
var bl = constants . radialDragBoxSize ;
933
937
var bl2 = bl / 2 ;
934
- var radialDrag = dragBox . makeRectDragger ( layers , 'radialdrag' , 'crosshair' , - bl2 , - bl2 , bl , bl ) ;
938
+ var className = 'radialdrag' + ( rngIndex ? '' : '-inner' ) ;
939
+ var radialDrag = dragBox . makeRectDragger ( layers , className , 'crosshair' , - bl2 , - bl2 , bl , bl ) ;
935
940
var dragOpts = { element : radialDrag , gd : gd } ;
936
- var tx = cx + ( radius + bl2 ) * Math . cos ( angle0 ) ;
937
- var ty = cy - ( radius + bl2 ) * Math . sin ( angle0 ) ;
938
941
939
- // TODO add 'inner' drag box when innerRadius > 0 !!
940
-
941
- d3 . select ( radialDrag )
942
- . attr ( 'transform' , strTranslate ( tx , ty ) ) ;
942
+ var tx , ty ;
943
+ if ( rngIndex ) {
944
+ tx = cx + ( radius + bl2 ) * Math . cos ( angle0 ) ;
945
+ ty = cy - ( radius + bl2 ) * Math . sin ( angle0 ) ;
946
+ } else {
947
+ tx = cx + ( innerRadius - bl2 ) * Math . cos ( angle0 ) ;
948
+ ty = cy - ( innerRadius - bl2 ) * Math . sin ( angle0 ) ;
949
+ }
950
+ d3 . select ( radialDrag ) . attr ( 'transform' , strTranslate ( tx , ty ) ) ;
943
951
944
952
// move function (either rotate or re-range flavor)
945
953
var moveFn2 ;
946
954
// rotate angle on done
947
955
var angle1 ;
948
- // re-range range[1] on done
949
- var rng1 ;
956
+ // re-range range[1] (or range[0]) on done
957
+ var rprime ;
950
958
951
959
function moveFn ( dx , dy ) {
952
960
if ( moveFn2 ) {
@@ -967,12 +975,15 @@ proto.updateRadialDrag = function(fullLayout) {
967
975
function doneFn ( ) {
968
976
if ( angle1 !== null ) {
969
977
Registry . call ( 'relayout' , gd , _this . id + '.radialaxis.angle' , angle1 ) ;
970
- } else if ( rng1 !== null ) {
971
- Registry . call ( 'relayout' , gd , _this . id + '.radialaxis.range[1 ]' , rng1 ) ;
978
+ } else if ( rprime !== null ) {
979
+ Registry . call ( 'relayout' , gd , _this . id + '.radialaxis.range[' + rngIndex + ' ]', rprime ) ;
972
980
}
973
981
}
974
982
975
983
function rotateMove ( dx , dy ) {
984
+ // disable for inner drag boxes
985
+ if ( rngIndex === 0 ) return ;
986
+
976
987
var x1 = tx + dx ;
977
988
var y1 = ty + dy ;
978
989
@@ -992,14 +1003,17 @@ proto.updateRadialDrag = function(fullLayout) {
992
1003
function rerangeMove ( dx , dy ) {
993
1004
// project (dx, dy) unto unit radial axis vector
994
1005
var dr = Lib . dot ( [ dx , - dy ] , [ Math . cos ( angle0 ) , Math . sin ( angle0 ) ] ) ;
995
- rng1 = rl1 - drl * dr / radius * 0.75 ;
1006
+ rprime = rbase - m * dr ;
996
1007
997
- // make sure new range[1] does not change the range[0] -> range[1] sign
998
- if ( ( drl > 0 ) !== ( rng1 > rl0 ) ) return ;
1008
+ // make sure rprime does not change the range[0] -> range[1] sign
1009
+ if ( ( m > 0 ) !== ( rngIndex ? rprime > rl0 : rprime < rl1 ) ) {
1010
+ rprime = null ;
1011
+ return ;
1012
+ }
999
1013
1000
1014
// update radial range -> update c2g -> update _m,_b
1001
- radialAxis . range [ 1 ] = rng1 ;
1002
- radialAxis . _rl [ 1 ] = rng1 ;
1015
+ radialAxis . range [ rngIndex ] = rprime ;
1016
+ radialAxis . _rl [ rngIndex ] = rprime ;
1003
1017
radialAxis . setGeometry ( ) ;
1004
1018
radialAxis . setScale ( ) ;
1005
1019
@@ -1027,7 +1041,7 @@ proto.updateRadialDrag = function(fullLayout) {
1027
1041
dragOpts . prepFn = function ( ) {
1028
1042
moveFn2 = null ;
1029
1043
angle1 = null ;
1030
- rng1 = null ;
1044
+ rprime = null ;
1031
1045
1032
1046
dragOpts . moveFn = moveFn ;
1033
1047
dragOpts . doneFn = doneFn ;
0 commit comments