1111
1212var d3 = require ( 'd3' ) ;
1313
14- var Plotly = require ( '../../plotly' ) ;
1514var Plots = require ( '../../plots/plots' ) ;
1615var Lib = require ( '../../lib' ) ;
1716var Color = require ( '../color' ) ;
@@ -52,6 +51,9 @@ module.exports = function draw(gd) {
5251 sliderGroups . exit ( ) . each ( function ( sliderOpts ) {
5352 d3 . select ( this ) . remove ( ) ;
5453
54+ sliderOpts . _commandObserver . remove ( ) ;
55+ delete sliderOpts . _commandObserver ;
56+
5557 Plots . autoMargin ( gd , constants . autoMarginIdRoot + sliderOpts . _index ) ;
5658 } ) ;
5759
@@ -65,12 +67,20 @@ module.exports = function draw(gd) {
6567 // If it has fewer than two options, it's not really a slider:
6668 if ( sliderOpts . steps . length < 2 ) return ;
6769
70+ var gSlider = d3 . select ( this ) ;
71+
6872 computeLabelSteps ( sliderOpts ) ;
6973
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+
7081 drawSlider ( gd , d3 . select ( this ) , sliderOpts ) ;
7182
7283 // makeInputProxy(gd, d3.select(this), sliderOpts);
73-
7484 } ) ;
7585} ;
7686
@@ -227,7 +237,9 @@ function drawSlider(gd, sliderGroup, sliderOpts) {
227237 // Position the rectangle:
228238 Lib . setTranslate ( sliderGroup , sliderOpts . lx + sliderOpts . pad . l , sliderOpts . ly + sliderOpts . pad . t ) ;
229239
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+
231243}
232244
233245function drawCurrentValue ( sliderGroup , sliderOpts , valueOverride ) {
@@ -371,19 +383,9 @@ function setActive(gd, sliderGroup, sliderOpts, index, doCallback, doTransition)
371383 sliderGroup . _nextMethod = { step : step , doCallback : doCallback , doTransition : doTransition } ;
372384 sliderGroup . _nextMethodRaf = window . requestAnimationFrame ( function ( ) {
373385 var _step = sliderGroup . _nextMethod . step ;
374- var args = _step . args ;
375386 if ( ! _step . method ) return ;
376387
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 ) ;
387389
388390 sliderGroup . _nextMethod = null ;
389391 sliderGroup . _nextMethodRaf = null ;
@@ -405,13 +407,15 @@ function attachGripEvents(item, gd, sliderGroup, sliderOpts) {
405407
406408 var normalizedPosition = positionToNormalizedValue ( sliderOpts , d3 . mouse ( node ) [ 0 ] ) ;
407409 handleInput ( gd , sliderGroup , sliderOpts , normalizedPosition , true ) ;
410+ sliderOpts . _dragging = true ;
408411
409412 $gd . on ( 'mousemove' , function ( ) {
410413 var normalizedPosition = positionToNormalizedValue ( sliderOpts , d3 . mouse ( node ) [ 0 ] ) ;
411414 handleInput ( gd , sliderGroup , sliderOpts , normalizedPosition , false ) ;
412415 } ) ;
413416
414417 $gd . on ( 'mouseup' , function ( ) {
418+ sliderOpts . _dragging = false ;
415419 grip . call ( Color . fill , sliderOpts . bgcolor ) ;
416420 $gd . on ( 'mouseup' , null ) ;
417421 $gd . on ( 'mousemove' , null ) ;
@@ -467,8 +471,12 @@ function setGripPosition(sliderGroup, sliderOpts, position, doTransition) {
467471
468472 var x = normalizedValueToPosition ( sliderOpts , position ) ;
469473
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+
470478 var el = grip ;
471- if ( doTransition && sliderOpts . transition . duration > 0 && ! sliderOpts . _invokingCommand ) {
479+ if ( doTransition && sliderOpts . transition . duration > 0 ) {
472480 el = el . transition ( )
473481 . duration ( sliderOpts . transition . duration )
474482 . ease ( sliderOpts . transition . easing ) ;
0 commit comments