Skip to content

Commit 10dca83

Browse files
authored
Merge pull request #3617 from ibdafna/fix_slider
Fix slider change event issue with tapping
2 parents 113f9f3 + 1dd694a commit 10dca83

File tree

3 files changed

+81
-27
lines changed

3 files changed

+81
-27
lines changed

packages/controls/src/widget_float.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import { CoreDescriptionModel } from './widget_core';
55

66
import {
7-
IntSliderView,
7+
BaseIntSliderView,
88
IntRangeSliderView,
9+
IntSliderView,
910
IntTextView,
10-
BaseIntSliderView,
1111
} from './widget_int';
1212

1313
import { format } from 'd3-format';
@@ -166,13 +166,14 @@ export class FloatLogSliderView extends BaseIntSliderView {
166166
},
167167
});
168168

169-
// Using noUiSlider's event handler
169+
// Using noUiSlider's 'update' and 'change' events.
170+
// See reference: https://refreshless.com/nouislider/events-callbacks/
170171
this.$slider.noUiSlider.on('update', (values: any, handle: any) => {
171-
this.handleSliderChange(values, handle);
172+
this.handleSliderUpdateEvent(values, handle);
172173
});
173174

174-
this.$slider.noUiSlider.on('end', (values: any, handle: any) => {
175-
this.handleSliderChanged(values, handle);
175+
this.$slider.noUiSlider.on('change', (values: any, handle: any) => {
176+
this.handleSliderChangeEvent(values, handle);
176177
});
177178
}
178179

@@ -222,10 +223,11 @@ export class FloatLogSliderView extends BaseIntSliderView {
222223
}
223224
}
224225
}
226+
225227
/**
226-
* Called when the slider value is changing.
228+
* Called whilst the slider is dragged, tapped or moved by the arrow keys.
227229
*/
228-
handleSliderChange(values: number[], handle: number): void {
230+
handleSliderUpdateEvent(values: number[], handle: number): void {
229231
const base = this.model.get('base');
230232
const actual_value = Math.pow(base, this._validate_slide_value(values[0]));
231233
this.readout.textContent = this.valueToString(actual_value);
@@ -237,6 +239,18 @@ export class FloatLogSliderView extends BaseIntSliderView {
237239
}
238240
}
239241

242+
/**
243+
* Called when the slider handle is released after dragging,
244+
* or by tapping or moving by the arrow keys.
245+
*/
246+
handleSliderChangeEvent(values: number[], handle: number): void {
247+
const base = this.model.get('base');
248+
const actual_value = Math.pow(base, this._validate_slide_value(values[0]));
249+
this.readout.textContent = this.valueToString(actual_value);
250+
251+
this.handleSliderChanged(values, handle);
252+
}
253+
240254
/**
241255
* Called when the slider value has changed.
242256
*

packages/controls/src/widget_int.ts

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import { CoreDescriptionModel } from './widget_core';
55

6-
import { DescriptionView, DescriptionStyleModel } from './widget_description';
6+
import { DescriptionStyleModel, DescriptionView } from './widget_description';
77

88
import { DOMWidgetView, WidgetView } from '@jupyter-widgets/base';
99

@@ -223,13 +223,14 @@ export abstract class BaseIntSliderView extends DescriptionView {
223223
},
224224
});
225225

226-
// Using noUiSlider's event handler
226+
// Using noUiSlider's 'update' and 'change' events.
227+
// See reference: https://refreshless.com/nouislider/events-callbacks/
227228
this.$slider.noUiSlider.on('update', (values: any, handle: any) => {
228-
this.handleSliderChange(values, handle);
229+
this.handleSliderUpdateEvent(values, handle);
229230
});
230231

231-
this.$slider.noUiSlider.on('end', (values: any, handle: any) => {
232-
this.handleSliderChanged(values, handle);
232+
this.$slider.noUiSlider.on('change', (values: any, handle: any) => {
233+
this.handleSliderChangeEvent(values, handle);
233234
});
234235
}
235236

@@ -268,9 +269,15 @@ export abstract class BaseIntSliderView extends DescriptionView {
268269
abstract handleTextChange(): void;
269270

270271
/**
271-
* Called when the slider value is changing.
272+
* Called when the slider handle is released after dragging,
273+
* or by tapping or moving by the arrow keys.
272274
*/
273-
abstract handleSliderChange(value: any, handle: any): void;
275+
abstract handleSliderChangeEvent(value: any, handle: any): void;
276+
277+
/**
278+
* Called whilst the slider is dragged, tapped or moved by the arrow keys.
279+
*/
280+
abstract handleSliderUpdateEvent(value: any, handle: any): void;
274281

275282
/**
276283
* Called when the slider value has changed.
@@ -366,7 +373,21 @@ export class IntRangeSliderView extends BaseIntSliderView {
366373
}
367374
}
368375

369-
handleSliderChange(values: any, handle: any): void {
376+
/**
377+
* Called when the slider handle is released after dragging,
378+
* or by tapping or moving by the arrow keys.
379+
*/
380+
handleSliderChangeEvent(values: any, handle: any): void {
381+
const actual_value = values.map(this._validate_slide_value);
382+
this.readout.textContent = this.valueToString(actual_value);
383+
384+
this.handleSliderChanged(values, handle);
385+
}
386+
387+
/**
388+
* Called whilst the slider is dragged, tapped or moved by the arrow keys.
389+
*/
390+
handleSliderUpdateEvent(values: any, handle: any): void {
370391
const actual_value = values.map(this._validate_slide_value);
371392
this.readout.textContent = this.valueToString(actual_value);
372393

@@ -460,8 +481,15 @@ export class IntSliderView extends BaseIntSliderView {
460481
}
461482
}
462483

463-
handleSliderChange(values: any, handle: any): void {
464-
const actual_value = this._validate_slide_value(values[handle]);
484+
handleSliderChangeEvent(values: any, handle: any): void {
485+
const actual_value = values.map(this._validate_slide_value);
486+
this.readout.textContent = this.valueToString(actual_value);
487+
488+
this.handleSliderChanged(values, handle);
489+
}
490+
491+
handleSliderUpdateEvent(values: any, handle: any): void {
492+
const actual_value = values.map(this._validate_slide_value);
465493
this.readout.textContent = this.valueToString(actual_value);
466494

467495
// Only persist the value while sliding if the continuous_update

packages/controls/src/widget_selection.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import { WidgetView } from '@jupyter-widgets/base';
55

66
import { CoreDescriptionModel } from './widget_core';
77

8-
import { DescriptionView, DescriptionStyleModel } from './widget_description';
8+
import { DescriptionStyleModel, DescriptionView } from './widget_description';
99

1010
import { uuid } from './utils';
1111

12-
import * as utils from './utils';
1312
import noUiSlider from 'nouislider';
13+
import * as utils from './utils';
1414

1515
export class SelectionModel extends CoreDescriptionModel {
1616
defaults(): Backbone.ObjectHash {
@@ -769,13 +769,14 @@ export class SelectionSliderView extends DescriptionView {
769769
},
770770
});
771771

772-
// Using noUiSlider's event handler
772+
// Using noUiSlider's 'update' and 'change' events.
773+
// See reference: https://refreshless.com/nouislider/events-callbacks/
773774
this.$slider.noUiSlider.on('update', (values: number[], handle: number) => {
774-
this.handleSliderChange(values, handle);
775+
this.handleSliderUpdateEvent(values, handle);
775776
});
776777

777-
this.$slider.noUiSlider.on('end', (values: number[], handle: number) => {
778-
this.handleSliderChanged(values, handle);
778+
this.$slider.noUiSlider.on('change', (values: number[], handle: number) => {
779+
this.handleSliderChangeEvent(values, handle);
779780
});
780781
}
781782

@@ -797,9 +798,9 @@ export class SelectionSliderView extends DescriptionView {
797798
}
798799

799800
/**
800-
* Called when the slider value is changing.
801+
* Called whilst the slider is dragged, tapped or moved by the arrow keys.
801802
*/
802-
handleSliderChange(values: number[], handle: number): void {
803+
handleSliderUpdateEvent(values: number[], handle: number): void {
803804
const index = values[0];
804805
this.updateReadout(index);
805806

@@ -810,6 +811,17 @@ export class SelectionSliderView extends DescriptionView {
810811
}
811812
}
812813

814+
/**
815+
* Called when the slider handle is released after dragging,
816+
* or by tapping or moving by the arrow keys.
817+
*/
818+
handleSliderChangeEvent(values: number[], handle: number): void {
819+
const index = values[0];
820+
this.updateReadout(index);
821+
822+
this.handleSliderChanged(values, handle);
823+
}
824+
813825
/**
814826
* Called when the slider value has changed.
815827
*
@@ -951,7 +963,7 @@ export class SelectionRangeSliderView extends SelectionSliderView {
951963
/**
952964
* Called when the slider value is changing.
953965
*/
954-
handleSliderChange(values: number[], handle: any): void {
966+
handleSliderUpdateEvent(values: number[], handle: any): void {
955967
const intValues = values.map(Math.trunc);
956968
this.updateReadout(intValues);
957969

0 commit comments

Comments
 (0)