/**
|
|
A control that presents a range of selection options in the form of a
|
|
horizontal slider with a control knob. The knob may be tapped and dragged
|
|
to the desired location.
|
|
|
|
{kind: "onyx.Slider", value: 30}
|
|
|
|
The *onChanging* event is fired when dragging the control knob.
|
|
The *onChange* event is fired when the position is set, either by finishing
|
|
a drag or by tapping the bar.
|
|
*/
|
|
enyo.kind({
|
|
name: "onyx.Slider",
|
|
kind: "onyx.ProgressBar",
|
|
classes: "onyx-slider",
|
|
published: {
|
|
value: 0,
|
|
lockBar: true,
|
|
tappable: true
|
|
},
|
|
events: {
|
|
onChange: "",
|
|
onChanging: "",
|
|
onAnimateFinish: ""
|
|
},
|
|
showStripes: false,
|
|
//* @protected
|
|
handlers: {
|
|
ondragstart: "dragstart",
|
|
ondrag: "drag",
|
|
ondragfinish: "dragfinish"
|
|
},
|
|
moreComponents: [
|
|
{kind: "Animator", onStep: "animatorStep", onEnd: "animatorComplete"},
|
|
{classes: "onyx-slider-taparea"},
|
|
{name: "knob", classes: "onyx-slider-knob"}
|
|
],
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.createComponents(this.moreComponents);
|
|
this.valueChanged();
|
|
},
|
|
valueChanged: function() {
|
|
this.value = this.clampValue(this.min, this.max, this.value);
|
|
var p = this.calcPercent(this.value);
|
|
this.updateKnobPosition(p);
|
|
if (this.lockBar) {
|
|
this.setProgress(this.value);
|
|
}
|
|
},
|
|
updateKnobPosition: function(inPercent) {
|
|
this.$.knob.applyStyle("left", inPercent + "%");
|
|
},
|
|
calcKnobPosition: function(inEvent) {
|
|
var x = inEvent.clientX - this.hasNode().getBoundingClientRect().left;
|
|
return (x / this.getBounds().width) * (this.max - this.min) + this.min;
|
|
},
|
|
dragstart: function(inSender, inEvent) {
|
|
if (inEvent.horizontal) {
|
|
inEvent.preventDefault();
|
|
this.dragging = true;
|
|
return true;
|
|
}
|
|
},
|
|
drag: function(inSender, inEvent) {
|
|
if (this.dragging) {
|
|
var v = this.calcKnobPosition(inEvent);
|
|
this.setValue(v);
|
|
this.doChanging({value: this.value});
|
|
return true;
|
|
}
|
|
},
|
|
dragfinish: function(inSender, inEvent) {
|
|
this.dragging = false;
|
|
inEvent.preventTap();
|
|
this.doChange({value: this.value});
|
|
return true;
|
|
},
|
|
tap: function(inSender, inEvent) {
|
|
if (this.tappable) {
|
|
var v = this.calcKnobPosition(inEvent);
|
|
this.tapped = true;
|
|
this.animateTo(v);
|
|
return true;
|
|
}
|
|
},
|
|
//* @public
|
|
//* Animates to the given value.
|
|
animateTo: function(inValue) {
|
|
this.$.animator.play({
|
|
startValue: this.value,
|
|
endValue: inValue,
|
|
node: this.hasNode()
|
|
});
|
|
},
|
|
//* @protected
|
|
animatorStep: function(inSender) {
|
|
this.setValue(inSender.value);
|
|
return true;
|
|
},
|
|
animatorComplete: function(inSender) {
|
|
if (this.tapped) {
|
|
this.tapped = false;
|
|
this.doChange({value: this.value});
|
|
}
|
|
this.doAnimateFinish(inSender);
|
|
return true;
|
|
}
|
|
});
|