@@ -23,9 +23,10 @@ var LINE_SPACING = alignmentConstants.LINE_SPACING;
23
23
var FROM_TL = alignmentConstants . FROM_TL ;
24
24
var FROM_BR = alignmentConstants . FROM_BR ;
25
25
26
- module . exports = function draw ( gd ) {
26
+ function draw ( gd ) {
27
27
var fullLayout = gd . _fullLayout ;
28
- var sliderData = makeSliderData ( fullLayout , gd ) ;
28
+ var sliderData = makeSliderData ( gd ) ;
29
+ var gs = fullLayout . _size ;
29
30
30
31
// draw a container for *all* sliders:
31
32
var sliders = fullLayout . _infolayer
@@ -41,11 +42,6 @@ module.exports = function draw(gd) {
41
42
sliderOpts . _commandObserver . remove ( ) ;
42
43
delete sliderOpts . _commandObserver ;
43
44
}
44
-
45
- // Most components don't need to explicitly remove autoMargin, because
46
- // marginPushers does this - but slider updates don't go through
47
- // a full replot so we need to explicitly remove it.
48
- Plots . autoMargin ( gd , autoMarginId ( sliderOpts ) ) ;
49
45
}
50
46
51
47
sliders . exit ( ) . each ( function ( ) {
@@ -67,14 +63,18 @@ module.exports = function draw(gd) {
67
63
. each ( clearSlider )
68
64
. remove ( ) ;
69
65
70
- // Find the dimensions of the sliders:
71
- for ( var i = 0 ; i < sliderData . length ; i ++ ) {
72
- var sliderOpts = sliderData [ i ] ;
73
- findDimensions ( gd , sliderOpts ) ;
74
- }
75
-
76
66
sliderGroups . each ( function ( sliderOpts ) {
77
67
var gSlider = d3 . select ( this ) ;
68
+ var dims = sliderOpts . _dims ;
69
+
70
+ dims . lx = Math . round (
71
+ gs . l + gs . w * sliderOpts . x -
72
+ dims . outerLength * FROM_TL [ Lib . getXanchor ( sliderOpts ) ]
73
+ ) ;
74
+ dims . ly = Math . round (
75
+ gs . t + gs . h * ( 1 - sliderOpts . y ) -
76
+ dims . height * FROM_TL [ Lib . getYanchor ( sliderOpts ) ]
77
+ ) ;
78
78
79
79
computeLabelSteps ( sliderOpts ) ;
80
80
@@ -95,14 +95,11 @@ module.exports = function draw(gd) {
95
95
96
96
drawSlider ( gd , d3 . select ( this ) , sliderOpts ) ;
97
97
} ) ;
98
- } ;
99
-
100
- function autoMarginId ( sliderOpts ) {
101
- return constants . autoMarginIdRoot + sliderOpts . _index ;
102
98
}
103
99
104
100
// This really only just filters by visibility:
105
- function makeSliderData ( fullLayout , gd ) {
101
+ function makeSliderData ( gd ) {
102
+ var fullLayout = gd . _fullLayout ;
106
103
var contOpts = fullLayout [ constants . name ] ;
107
104
var sliderData = [ ] ;
108
105
@@ -121,8 +118,11 @@ function keyFunction(opts) {
121
118
return opts . _index ;
122
119
}
123
120
124
- // Compute the dimensions (mutates sliderOpts):
125
121
function findDimensions ( gd , sliderOpts ) {
122
+ var fullLayout = gd . _fullLayout ;
123
+ var gs = fullLayout . _size ;
124
+ var dims = sliderOpts . _dims = { } ;
125
+
126
126
var sliderLabels = Drawing . tester . selectAll ( 'g.' + constants . labelGroupClass )
127
127
. data ( sliderOpts . _visibleSteps ) ;
128
128
@@ -144,27 +144,16 @@ function findDimensions(gd, sliderOpts) {
144
144
maxLabelWidth = Math . max ( maxLabelWidth , bBox . width ) ;
145
145
}
146
146
} ) ;
147
-
148
147
sliderLabels . remove ( ) ;
149
148
150
- var dims = sliderOpts . _dims = { } ;
151
-
152
149
dims . inputAreaWidth = Math . max (
153
150
constants . railWidth ,
154
151
constants . gripHeight
155
152
) ;
156
153
157
- // calculate some overall dimensions - some of these are needed for
158
- // calculating the currentValue dimensions
159
- var graphSize = gd . _fullLayout . _size ;
160
- dims . lx = graphSize . l + graphSize . w * sliderOpts . x ;
161
- dims . ly = graphSize . t + graphSize . h * ( 1 - sliderOpts . y ) ;
162
-
163
154
if ( sliderOpts . lenmode === 'fraction' ) {
164
- // fraction:
165
- dims . outerLength = Math . round ( graphSize . w * sliderOpts . len ) ;
155
+ dims . outerLength = Math . round ( gs . w * sliderOpts . len ) ;
166
156
} else {
167
- // pixels:
168
157
dims . outerLength = sliderOpts . len ;
169
158
}
170
159
@@ -203,51 +192,10 @@ function findDimensions(gd, sliderOpts) {
203
192
dummyGroup . remove ( ) ;
204
193
}
205
194
206
- dims . height = dims . currentValueTotalHeight + constants . tickOffset + sliderOpts . ticklen + constants . labelOffset + dims . labelHeight + sliderOpts . pad . t + sliderOpts . pad . b ;
207
-
208
- var xanchor = 'left' ;
209
- if ( Lib . isRightAnchor ( sliderOpts ) ) {
210
- dims . lx -= dims . outerLength ;
211
- xanchor = 'right' ;
212
- }
213
- if ( Lib . isCenterAnchor ( sliderOpts ) ) {
214
- dims . lx -= dims . outerLength / 2 ;
215
- xanchor = 'center' ;
216
- }
217
-
218
- var yanchor = 'top' ;
219
- if ( Lib . isBottomAnchor ( sliderOpts ) ) {
220
- dims . ly -= dims . height ;
221
- yanchor = 'bottom' ;
222
- }
223
- if ( Lib . isMiddleAnchor ( sliderOpts ) ) {
224
- dims . ly -= dims . height / 2 ;
225
- yanchor = 'middle' ;
226
- }
227
-
195
+ dims . height = Math . ceil ( dims . currentValueTotalHeight + constants . tickOffset + sliderOpts . ticklen + constants . labelOffset + dims . labelHeight + sliderOpts . pad . t + sliderOpts . pad . b ) ;
228
196
dims . outerLength = Math . ceil ( dims . outerLength ) ;
229
- dims . height = Math . ceil ( dims . height ) ;
230
- dims . lx = Math . round ( dims . lx ) ;
231
- dims . ly = Math . round ( dims . ly ) ;
232
-
233
- var marginOpts = {
234
- y : sliderOpts . y ,
235
- b : dims . height * FROM_BR [ yanchor ] ,
236
- t : dims . height * FROM_TL [ yanchor ]
237
- } ;
238
197
239
- if ( sliderOpts . lenmode === 'fraction' ) {
240
- marginOpts . l = 0 ;
241
- marginOpts . xl = sliderOpts . x - sliderOpts . len * FROM_TL [ xanchor ] ;
242
- marginOpts . r = 0 ;
243
- marginOpts . xr = sliderOpts . x + sliderOpts . len * FROM_BR [ xanchor ] ;
244
- } else {
245
- marginOpts . x = sliderOpts . x ;
246
- marginOpts . l = dims . outerLength * FROM_TL [ xanchor ] ;
247
- marginOpts . r = dims . outerLength * FROM_BR [ xanchor ] ;
248
- }
249
-
250
- Plots . autoMargin ( gd , autoMarginId ( sliderOpts ) , marginOpts ) ;
198
+ return dims ;
251
199
}
252
200
253
201
function drawSlider ( gd , sliderGroup , sliderOpts ) {
@@ -628,3 +576,38 @@ function drawRail(sliderGroup, sliderOpts) {
628
576
( dims . inputAreaWidth - constants . railWidth ) * 0.5 + dims . currentValueTotalHeight
629
577
) ;
630
578
}
579
+
580
+ function pushMargin ( gd ) {
581
+ var sliderData = makeSliderData ( gd ) ;
582
+
583
+ for ( var i = 0 ; i < sliderData . length ; i ++ ) {
584
+ var sliderOpts = sliderData [ i ] ;
585
+ var xanchor = Lib . getXanchor ( sliderOpts ) ;
586
+ var yanchor = Lib . getYanchor ( sliderOpts ) ;
587
+ var dims = findDimensions ( gd , sliderOpts ) ;
588
+
589
+ var marginOpts = {
590
+ y : sliderOpts . y ,
591
+ b : dims . height * FROM_BR [ yanchor ] ,
592
+ t : dims . height * FROM_TL [ yanchor ]
593
+ } ;
594
+
595
+ if ( sliderOpts . lenmode === 'fraction' ) {
596
+ marginOpts . l = 0 ;
597
+ marginOpts . xl = sliderOpts . x - sliderOpts . len * FROM_TL [ xanchor ] ;
598
+ marginOpts . r = 0 ;
599
+ marginOpts . xr = sliderOpts . x + sliderOpts . len * FROM_BR [ xanchor ] ;
600
+ } else {
601
+ marginOpts . x = sliderOpts . x ;
602
+ marginOpts . l = dims . outerLength * FROM_TL [ xanchor ] ;
603
+ marginOpts . r = dims . outerLength * FROM_BR [ xanchor ] ;
604
+ }
605
+
606
+ Plots . autoMargin ( gd , constants . autoMarginIdRoot + sliderOpts . _index , marginOpts ) ;
607
+ }
608
+ }
609
+
610
+ module . exports = {
611
+ pushMargin : pushMargin ,
612
+ draw : draw
613
+ } ;
0 commit comments