mirror of
https://github.com/esiur/iui.git
synced 2026-04-04 15:08:21 +00:00
188 lines
5.9 KiB
JavaScript
188 lines
5.9 KiB
JavaScript
import IUIElement from "../Core/IUIElement.js";
|
|
import { IUI } from "../Core/IUI.js";
|
|
|
|
export default IUI.module(class Range extends IUIElement {
|
|
constructor() {
|
|
super({
|
|
getItem: function (index, data) {
|
|
var item = data[index];
|
|
return item == null ? index : item;
|
|
},
|
|
getIndex: function (x, width, data) {
|
|
if (x < 0) x = 0;
|
|
var p = x / width;
|
|
var index = Math.floor(p * data.length);
|
|
return index;
|
|
},
|
|
getPreview: function (index, data, x, width, el) {
|
|
return null;
|
|
},
|
|
getPosition: function (index, data, width) {
|
|
var itemSize = width / data.length;
|
|
return (index * itemSize) + (itemSize / 2);
|
|
},
|
|
layout: {
|
|
render: function () {
|
|
return true;
|
|
},
|
|
initialize: function () {
|
|
return true;
|
|
}
|
|
},
|
|
data: []
|
|
});
|
|
|
|
var self = this;
|
|
|
|
|
|
this._register("select");
|
|
this._register("userSelect");
|
|
|
|
this.preview = document.createElement("div");
|
|
this.preview.className = this.customClass + "-preview";
|
|
|
|
|
|
if (this.layout)
|
|
this.layout.initialize.apply(this);
|
|
|
|
|
|
this.thumb = document.createElement("div");
|
|
this.thumb.classList.add(this.customClass + "-thumb");
|
|
|
|
this.classList.add(this.customClass);
|
|
this.appendChild(this.preview);
|
|
this.appendChild(this.thumb);
|
|
|
|
this.addEventListener("mousedown", function (e) {
|
|
self._startDragging(e.clientX, e.clientY);
|
|
});
|
|
|
|
this.addEventListener("mouseleave", function (e) {
|
|
self.preview.classList.remove(self.customClass + "-preview-visible");
|
|
});
|
|
|
|
this.addEventListener("mouseenter", function (e) {
|
|
var rect = self.getBoundingClientRect();
|
|
self._offset = {
|
|
top: rect.top + document.body.scrollTop,
|
|
left: rect.left + document.body.scrollLeft
|
|
};
|
|
});
|
|
|
|
this.addEventListener("mousemove", function (e) {
|
|
|
|
|
|
self._drag(e.clientX, e.clientY);
|
|
|
|
var x = e.clientX - self._offset.left;
|
|
var index = self.getIndex(x, self.offsetWidth, self.data);
|
|
var preview = self.getPreview.call(self, index, self.data, x, self.offsetWidth, self.preview);
|
|
|
|
if (preview == null || preview == false) {
|
|
self.preview.classList.remove(self.customClass + "-preview-visible");
|
|
return;
|
|
}
|
|
else if (preview instanceof HTMLElement) {
|
|
while (self.preview.children.length > 0)
|
|
self.preview.removeChild(self.preview.children[0]);
|
|
self.preview.appendChild(preview);
|
|
}
|
|
else if (preview != true) {
|
|
self.preview.innerHTML = preview;
|
|
}
|
|
|
|
var index = self.getIndex((e.clientX - self._offset.left), self.offsetWidth, self.data);
|
|
var dx = self.getPosition(index, self.data, self.offsetWidth);
|
|
|
|
self.preview.style.setProperty("--x", dx + "px");
|
|
self.preview.classList.add(self.customClass + "-preview-visible");
|
|
|
|
});
|
|
|
|
document.addEventListener("mouseup", function (e) {
|
|
if (self._dragging)
|
|
self._endDragging(e.clientX, e.clientY);
|
|
});
|
|
|
|
this.addEventListener("touchstart", function (e) {
|
|
self._startDragging(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
|
|
});
|
|
|
|
this.addEventListener("touchmove", function (e) {
|
|
self._drag(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
|
|
});
|
|
|
|
this.addEventListener("touchend", function (e) {
|
|
self._endDragging(e.changedTouches[0].clientX, e.changedTouches[0].clientY);
|
|
});
|
|
|
|
this.setData(this.data);
|
|
}
|
|
|
|
_startDragging(x, y) {
|
|
this._dragging = true;
|
|
|
|
document.onselectstart = function () { return false };
|
|
|
|
var rect = this.getBoundingClientRect();
|
|
var body = document.body.getBoundingClientRect();
|
|
|
|
this._offset = {
|
|
top: rect.top + body.top,// document.body.scrollTop,
|
|
left: rect.left + body.left,
|
|
};
|
|
|
|
var index = this.getIndex((x - this._offset.left), this.offsetWidth, this.data);
|
|
this.set(index, true, true);
|
|
}
|
|
|
|
set(index, moveThumb = true, byUser = false) {
|
|
|
|
var item = this.getItem(index, this.data);
|
|
|
|
if (item != null) {
|
|
if (moveThumb) {
|
|
var dx = this.getPosition(index, this.data, this.offsetWidth);
|
|
this.thumb.style.setProperty("--x", dx + "px");
|
|
}
|
|
|
|
this._emit("select", { item, index });
|
|
|
|
if (byUser)
|
|
this._emit("userSelect", { item, index });
|
|
|
|
this.selected = item;
|
|
this.selectedIndex = index;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
_drag(x, y) {
|
|
if (this._dragging) {
|
|
this.thumb.classList.add(this.customClass + "-thumb-dragging");
|
|
var dx = (x - this._offset.left);
|
|
var index = this.getIndex(dx, this.offsetWidth, this.data);
|
|
this.thumb.style.setProperty("--x", dx + "px");
|
|
this.set(index, false, true);
|
|
}
|
|
}
|
|
|
|
_endDragging(x, y) {
|
|
document.onselectstart = function () { return true };
|
|
this.thumb.classList.remove(this.customClass + "-thumb-dragging");
|
|
var index = this.getIndex((x - this._offset.left), this.offsetWidth, this.data);
|
|
this.set(index, true, true);
|
|
this._dragging = false;
|
|
}
|
|
|
|
clear() {
|
|
return this.setData([]);
|
|
}
|
|
|
|
render() {
|
|
if (this.layout && this.layout.render)
|
|
this.layout.render.apply(this);
|
|
return this;
|
|
}
|
|
}); |