-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Slider component #986
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Slider component #986
Changes from 1 commit
f5bccd5
83483fd
f69a328
82ea558
ca5f9f5
c6a3e11
5b74652
e13e0ee
8fe1842
05ac586
4604341
8558be8
c673afe
304174a
fce36fa
52b4a2a
b161d55
8d7c40d
30b5f2d
19442d9
ecb7e87
9c0f9ac
2a6f987
5bd6bdd
4520a48
88d6728
6da5b0f
1cad8a4
4a9edd0
6cb6d42
4775a47
a08f084
5816c24
2cfa81b
1d52b51
892583d
5015710
582c643
70610ec
f25127c
4b608ee
6c9034d
21e2f99
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -208,7 +208,7 @@ function drawSlider(gd, sliderGroup, sliderOpts) { | |
| removeListeners(gd, sliderGroup, sliderOpts); | ||
| attachListeners(gd, sliderGroup, sliderOpts); | ||
|
|
||
| setActive(gd, sliderGroup, sliderOpts, sliderOpts.active, true); | ||
| setActive(gd, sliderGroup, sliderOpts, sliderOpts.active, true, false); | ||
| } | ||
|
|
||
| function removeListeners(gd, sliderGroup, sliderOpts) { | ||
|
|
@@ -224,22 +224,22 @@ function attachListeners(gd, sliderGroup, sliderOpts) { | |
| var listeners = sliderOpts._input.listeners = []; | ||
| var eventNames = sliderOpts._input.eventNames = []; | ||
|
|
||
| function makeListener(updatevalue) { | ||
| function makeListener(eventname, updatevalue) { | ||
| return function(data) { | ||
| var value = data; | ||
| if(updatevalue) { | ||
| value = Lib.nestedProperty(data, updatevalue).get(); | ||
|
||
| } | ||
|
|
||
| setActiveByLabel(gd, sliderGroup, sliderOpts, value, false); | ||
| setActiveByLabel(gd, sliderGroup, sliderOpts, value, false, true); | ||
| }; | ||
| } | ||
|
|
||
| for(var i = 0; i < sliderOpts.updateevent.length; i++) { | ||
| var updateEventName = sliderOpts.updateevent[i]; | ||
| var updatevalue = sliderOpts.updatevalue; | ||
|
|
||
| var updatelistener = makeListener(updatevalue); | ||
| var updatelistener = makeListener(updateEventName, updatevalue); | ||
|
|
||
| gd._internalEv.on(updateEventName, updatelistener); | ||
|
|
||
|
|
@@ -312,15 +312,16 @@ function drawLabelGroup(sliderGroup, sliderOpts) { | |
|
|
||
| } | ||
|
|
||
| function handleInput(gd, sliderGroup, sliderOpts, normalizedPosition) { | ||
| function handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, doTransition) { | ||
| var quantizedPosition = Math.round(normalizedPosition * (sliderOpts.steps.length - 1)); | ||
|
|
||
|
|
||
| if(quantizedPosition !== sliderOpts.active) { | ||
| setActive(gd, sliderGroup, sliderOpts, quantizedPosition, true); | ||
| setActive(gd, sliderGroup, sliderOpts, quantizedPosition, true, doTransition); | ||
| } | ||
| } | ||
|
|
||
| function setActiveByLabel(gd, sliderGroup, sliderOpts, label, doCallback) { | ||
| function setActiveByLabel(gd, sliderGroup, sliderOpts, label, doCallback, doTransition) { | ||
| var index; | ||
| for(var i = 0; i < sliderOpts.steps.length; i++) { | ||
| var step = sliderOpts.steps[i]; | ||
|
|
@@ -331,14 +332,14 @@ function setActiveByLabel(gd, sliderGroup, sliderOpts, label, doCallback) { | |
| } | ||
|
|
||
| if(index !== undefined) { | ||
| setActive(gd, sliderGroup, sliderOpts, index, doCallback); | ||
| setActive(gd, sliderGroup, sliderOpts, index, doCallback, doTransition); | ||
| } | ||
| } | ||
|
|
||
| function setActive(gd, sliderGroup, sliderOpts, index, doCallback) { | ||
| function setActive(gd, sliderGroup, sliderOpts, index, doCallback, doTransition) { | ||
| sliderOpts._input.active = sliderOpts.active = index; | ||
|
|
||
| sliderGroup.call(setGripPosition, sliderOpts, sliderOpts.active / (sliderOpts.steps.length - 1)); | ||
| sliderGroup.call(setGripPosition, sliderOpts, sliderOpts.active / (sliderOpts.steps.length - 1), doTransition); | ||
|
|
||
| var step = sliderOpts.steps[sliderOpts.active]; | ||
|
|
||
|
|
@@ -364,11 +365,11 @@ function attachGripEvents(item, gd, sliderGroup, sliderOpts) { | |
| grip.call(Color.fill, constants.gripBgActiveColor); | ||
|
|
||
| var normalizedPosition = positionToNormalizedValue(sliderOpts, d3.mouse(node)[0]); | ||
| handleInput(gd, sliderGroup, sliderOpts, normalizedPosition); | ||
| handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, true); | ||
|
|
||
| $gd.on('mousemove', function() { | ||
| var normalizedPosition = positionToNormalizedValue(sliderOpts, d3.mouse(node)[0]); | ||
| handleInput(gd, sliderGroup, sliderOpts, normalizedPosition); | ||
| handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, false); | ||
| }); | ||
|
|
||
| $gd.on('mouseup', function() { | ||
|
|
@@ -422,11 +423,21 @@ function computeLabelSteps(sliderOpts) { | |
| } | ||
| } | ||
|
|
||
| function setGripPosition(sliderGroup, sliderOpts, position) { | ||
| function setGripPosition(sliderGroup, sliderOpts, position, doTransition) { | ||
| var grip = sliderGroup.select('rect.' + constants.gripRectClass); | ||
|
|
||
| var x = normalizedValueToPosition(sliderOpts, position); | ||
| Lib.setTranslate(grip, x - constants.gripWidth * 0.5, 0); | ||
|
|
||
| var el = grip; | ||
| if(doTransition && sliderOpts.transition.duration > 0) { | ||
| el = el.transition() | ||
| .duration(sliderOpts.transition.duration) | ||
| .ease(sliderOpts.transition.easing); | ||
| } | ||
|
|
||
| // Lib.setTranslate doesn't work here becasue of the transition duck-typing. | ||
| // It's also not necessary because there are no other transitions to preserve. | ||
| el.attr('transform', 'translate(' + (x - constants.gripWidth * 0.5) + ',' + 0 + ')'); | ||
|
||
| } | ||
|
|
||
| // Convert a number from [0-1] to a pixel position relative to the slider group container: | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I kept this nested format so that it perfectly mirrors the way you'd define transition config for an animation. Otherwise it would need to be
transitionduration:andtransitioneasing:, which isn't bad. Open to thoughts here.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 plotly.js is a big fan of nested attributes.