mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
143 lines
3.8 KiB
JavaScript
143 lines
3.8 KiB
JavaScript
import Control from './Control';
|
|
|
|
/**
|
|
* 数字
|
|
* @author tengge / https://github.com/tengge1
|
|
* @param {*} options
|
|
*/
|
|
function Number(options) {
|
|
Control.call(this, options);
|
|
options = options || {};
|
|
|
|
this.value = options.value === undefined ? 0 : options.value;
|
|
|
|
this.min = options.range ? options.range[0] : -Infinity;
|
|
this.max = options.range ? options.range[1] : Infinity;
|
|
|
|
this.precision = options.precision === undefined ? 2 : options.precision; // 显示时保留几位小数
|
|
this.step = options.step === undefined ? 0.1 : options.step; // 步长
|
|
this.unit = options.unit === undefined ? '' : options.unit; // 单位(显示时跟在数字后面)
|
|
this.cls = options.cls || 'Number';
|
|
this.style = options.style || null;
|
|
|
|
this.onChange = options.onChange || null;
|
|
};
|
|
|
|
Number.prototype = Object.create(Control.prototype);
|
|
Number.prototype.constructor = Number;
|
|
|
|
Number.prototype.render = function () {
|
|
this.dom = document.createElement('input');
|
|
|
|
this.dom.className = this.cls;
|
|
|
|
this.dom.value = '0.00';
|
|
|
|
if (this.style) {
|
|
Object.assign(this.dom.style, this.style);
|
|
}
|
|
|
|
var _this = this;
|
|
|
|
// 回车事件
|
|
this.dom.addEventListener('keydown', function (event) {
|
|
event.stopPropagation();
|
|
|
|
if (event.keyCode === 13) {
|
|
_this.dom.blur();
|
|
}
|
|
}, false);
|
|
|
|
this.setValue(this.value);
|
|
|
|
var changeEvent = document.createEvent('HTMLEvents');
|
|
changeEvent.initEvent('change', true, true);
|
|
|
|
var distance = 0;
|
|
var onMouseDownValue = 0;
|
|
|
|
var pointer = [0, 0];
|
|
var prevPointer = [0, 0];
|
|
|
|
function onMouseDown(event) {
|
|
event.preventDefault();
|
|
distance = 0;
|
|
onMouseDownValue = _this.value;
|
|
prevPointer = [event.clientX, event.clientY];
|
|
document.addEventListener('mousemove', onMouseMove, false);
|
|
document.addEventListener('mouseup', onMouseUp, false);
|
|
}
|
|
|
|
function onMouseMove(event) {
|
|
var currentValue = _this.value;
|
|
pointer = [event.clientX, event.clientY];
|
|
distance += (pointer[0] - prevPointer[0]) - (pointer[1] - prevPointer[1]);
|
|
var value = onMouseDownValue + (distance / (event.shiftKey ? 5 : 50)) * _this.step;
|
|
value = Math.min(_this.max, Math.max(_this.min, value));
|
|
|
|
if (currentValue !== value) {
|
|
_this.setValue(value);
|
|
_this.dom.dispatchEvent(changeEvent);
|
|
}
|
|
|
|
prevPointer = [event.clientX, event.clientY];
|
|
}
|
|
|
|
function onMouseUp(event) {
|
|
document.removeEventListener('mousemove', onMouseMove, false);
|
|
document.removeEventListener('mouseup', onMouseUp, false);
|
|
|
|
if (Math.abs(distance) < 2) {
|
|
_this.dom.focus();
|
|
_this.dom.select();
|
|
}
|
|
}
|
|
|
|
function onChange(event) {
|
|
_this.setValue(_this.dom.value);
|
|
|
|
if (_this.onChange) {
|
|
_this.onChange.call(_this, _this.dom.value);
|
|
}
|
|
}
|
|
|
|
function onFocus(event) {
|
|
_this.dom.style.backgroundColor = '';
|
|
_this.dom.style.cursor = '';
|
|
}
|
|
|
|
function onBlur(event) {
|
|
_this.dom.style.backgroundColor = 'transparent';
|
|
_this.dom.style.cursor = 'col-resize';
|
|
}
|
|
|
|
onBlur();
|
|
|
|
this.dom.addEventListener('mousedown', onMouseDown, false);
|
|
this.dom.addEventListener('change', onChange, false);
|
|
this.dom.addEventListener('focus', onFocus, false);
|
|
this.dom.addEventListener('blur', onBlur, false);
|
|
|
|
this.parent.appendChild(this.dom);
|
|
};
|
|
|
|
Number.prototype.getValue = function () {
|
|
return this.value;
|
|
};
|
|
|
|
Number.prototype.setValue = function (value) {
|
|
value = parseFloat(value);
|
|
|
|
if (value < this.min) {
|
|
value = this.min;
|
|
}
|
|
|
|
if (value > this.max) {
|
|
value = this.max;
|
|
}
|
|
|
|
this.value = value;
|
|
this.dom.value = value.toFixed(this.precision) + this.unit;
|
|
};
|
|
|
|
export default Number; |