11
11
12
12
var d3 = require ( 'd3' ) ;
13
13
14
- var Plotly = require ( '../../plotly' ) ;
15
14
var Plots = require ( '../../plots/plots' ) ;
16
15
var Lib = require ( '../../lib' ) ;
17
16
var Color = require ( '../color' ) ;
@@ -52,6 +51,9 @@ module.exports = function draw(gd) {
52
51
sliderGroups . exit ( ) . each ( function ( sliderOpts ) {
53
52
d3 . select ( this ) . remove ( ) ;
54
53
54
+ sliderOpts . _commandObserver . remove ( ) ;
55
+ delete sliderOpts . _commandObserver ;
56
+
55
57
Plots . autoMargin ( gd , constants . autoMarginIdRoot + sliderOpts . _index ) ;
56
58
} ) ;
57
59
@@ -65,12 +67,20 @@ module.exports = function draw(gd) {
65
67
// If it has fewer than two options, it's not really a slider:
66
68
if ( sliderOpts . steps . length < 2 ) return ;
67
69
70
+ var gSlider = d3 . select ( this ) ;
71
+
68
72
computeLabelSteps ( sliderOpts ) ;
69
73
74
+ Plots . manageCommandObserver ( gd , sliderOpts , sliderOpts . steps , function ( data ) {
75
+ if ( sliderOpts . active === data . index ) return ;
76
+ if ( sliderOpts . _dragging ) return ;
77
+
78
+ setActive ( gd , gSlider , sliderOpts , data . index , false , true ) ;
79
+ } ) ;
80
+
70
81
drawSlider ( gd , d3 . select ( this ) , sliderOpts ) ;
71
82
72
83
// makeInputProxy(gd, d3.select(this), sliderOpts);
73
-
74
84
} ) ;
75
85
} ;
76
86
@@ -227,7 +237,9 @@ function drawSlider(gd, sliderGroup, sliderOpts) {
227
237
// Position the rectangle:
228
238
Lib . setTranslate ( sliderGroup , sliderOpts . lx + sliderOpts . pad . l , sliderOpts . ly + sliderOpts . pad . t ) ;
229
239
230
- setActive ( gd , sliderGroup , sliderOpts , sliderOpts . active , false , false ) ;
240
+ sliderGroup . call ( setGripPosition , sliderOpts , sliderOpts . active / ( sliderOpts . steps . length - 1 ) , false ) ;
241
+ sliderGroup . call ( drawCurrentValue , sliderOpts ) ;
242
+
231
243
}
232
244
233
245
function drawCurrentValue ( sliderGroup , sliderOpts , valueOverride ) {
@@ -371,19 +383,9 @@ function setActive(gd, sliderGroup, sliderOpts, index, doCallback, doTransition)
371
383
sliderGroup . _nextMethod = { step : step , doCallback : doCallback , doTransition : doTransition } ;
372
384
sliderGroup . _nextMethodRaf = window . requestAnimationFrame ( function ( ) {
373
385
var _step = sliderGroup . _nextMethod . step ;
374
- var args = _step . args ;
375
386
if ( ! _step . method ) return ;
376
387
377
- sliderOpts . _invokingCommand = true ;
378
- Plotly [ _step . method ] ( gd , args [ 0 ] , args [ 1 ] , args [ 2 ] ) . then ( function ( ) {
379
- sliderOpts . _invokingCommand = false ;
380
- } , function ( ) {
381
- sliderOpts . _invokingCommand = false ;
382
-
383
- // This is not a disaster. Some methods like `animate` reject if interrupted
384
- // and *should* nicely log a warning.
385
- Lib . warn ( 'Warning: Plotly.' + _step . method + ' was called and rejected.' ) ;
386
- } ) ;
388
+ Plots . executeAPICommand ( gd , _step . method , _step . args ) ;
387
389
388
390
sliderGroup . _nextMethod = null ;
389
391
sliderGroup . _nextMethodRaf = null ;
@@ -405,13 +407,15 @@ function attachGripEvents(item, gd, sliderGroup, sliderOpts) {
405
407
406
408
var normalizedPosition = positionToNormalizedValue ( sliderOpts , d3 . mouse ( node ) [ 0 ] ) ;
407
409
handleInput ( gd , sliderGroup , sliderOpts , normalizedPosition , true ) ;
410
+ sliderOpts . _dragging = true ;
408
411
409
412
$gd . on ( 'mousemove' , function ( ) {
410
413
var normalizedPosition = positionToNormalizedValue ( sliderOpts , d3 . mouse ( node ) [ 0 ] ) ;
411
414
handleInput ( gd , sliderGroup , sliderOpts , normalizedPosition , false ) ;
412
415
} ) ;
413
416
414
417
$gd . on ( 'mouseup' , function ( ) {
418
+ sliderOpts . _dragging = false ;
415
419
grip . call ( Color . fill , sliderOpts . bgcolor ) ;
416
420
$gd . on ( 'mouseup' , null ) ;
417
421
$gd . on ( 'mousemove' , null ) ;
@@ -467,8 +471,12 @@ function setGripPosition(sliderGroup, sliderOpts, position, doTransition) {
467
471
468
472
var x = normalizedValueToPosition ( sliderOpts , position ) ;
469
473
474
+ // If this is true, then *this component* is already invoking its own command
475
+ // and has triggered its own animation.
476
+ if ( sliderOpts . _invokingCommand ) return ;
477
+
470
478
var el = grip ;
471
- if ( doTransition && sliderOpts . transition . duration > 0 && ! sliderOpts . _invokingCommand ) {
479
+ if ( doTransition && sliderOpts . transition . duration > 0 ) {
472
480
el = el . transition ( )
473
481
. duration ( sliderOpts . transition . duration )
474
482
. ease ( sliderOpts . transition . easing ) ;
0 commit comments