class Slider extends LayoutNode
{
constructor(cssClassName = "")
{
super(`<div class="slider ${cssClassName}">`);
this._fill = new LayoutNode(`<div class="fill">`);
this._input = new LayoutNode(`<input type="range" min="0" max="1" step="0.001">`);
this._input.element.addEventListener("change", this);
this._input.element.addEventListener("input", this);
this.value = 0;
this.children = [this._fill, this._input];
}
get value()
{
if (this._value !== undefined)
return this._value;
return parseFloat(this._input.element.value);
}
set value(value)
{
if (this._valueIsChanging)
return;
this._value = value;
this.markDirtyProperty("value");
this._updateFill();
}
get width()
{
return super.width;
}
set width(width)
{
super.width = width;
this._updateFill();
}
handleEvent(event)
{
switch (event.type) {
case "input":
this._handleInputEvent();
break;
case "change":
this._handleChangeEvent();
break;
}
}
commitProperty(propertyName)
{
if (propertyName === "value") {
this._input.element.value = this._value;
delete this._value;
} else
super.commitProperty(propertyName);
}
_handleInputEvent()
{
if (!this._valueIsChanging && this.uiDelegate && typeof this.uiDelegate.controlValueWillStartChanging === "function")
this.uiDelegate.controlValueWillStartChanging(this);
this._valueIsChanging = true;
if (this.uiDelegate && typeof this.uiDelegate.controlValueDidChange === "function")
this.uiDelegate.controlValueDidChange(this);
this._updateFill();
}
_handleChangeEvent()
{
delete this._valueIsChanging;
if (this.uiDelegate && typeof this.uiDelegate.controlValueDidStopChanging === "function")
this.uiDelegate.controlValueDidStopChanging(this);
this._updateFill();
}
_updateFill()
{
this._fill.width = Math.ceil(this.value * this.width);
}
}