54 lines
2.1 KiB
Plaintext
54 lines
2.1 KiB
Plaintext
define(function (require) {
|
|
|
|
/**
|
|
* Calculate slider move result.
|
|
*
|
|
* @param {number} delta Move length.
|
|
* @param {Array.<number>} handleEnds handleEnds[0] and be bigger then handleEnds[1].
|
|
* handleEnds will be modified in this method.
|
|
* @param {Array.<number>} extent handleEnds is restricted by extent.
|
|
* extent[0] should less or equals than extent[1].
|
|
* @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged,
|
|
* 'cross' handleEnds[0] can be bigger then handleEnds[1],
|
|
* 'push' handleEnds[0] can not be bigger then handleEnds[1],
|
|
* when they touch, one push other.
|
|
* @param {number} handleIndex If mode is 'rigid', handleIndex is not required.
|
|
* @param {Array.<number>} The input handleEnds.
|
|
*/
|
|
return function (delta, handleEnds, extent, mode, handleIndex) {
|
|
if (!delta) {
|
|
return handleEnds;
|
|
}
|
|
|
|
if (mode === 'rigid') {
|
|
delta = getRealDelta(delta, handleEnds, extent);
|
|
handleEnds[0] += delta;
|
|
handleEnds[1] += delta;
|
|
}
|
|
else {
|
|
delta = getRealDelta(delta, handleEnds[handleIndex], extent);
|
|
handleEnds[handleIndex] += delta;
|
|
|
|
if (mode === 'push' && handleEnds[0] > handleEnds[1]) {
|
|
handleEnds[1 - handleIndex] = handleEnds[handleIndex];
|
|
}
|
|
}
|
|
|
|
return handleEnds;
|
|
|
|
function getRealDelta(delta, handleEnds, extent) {
|
|
var handleMinMax = !handleEnds.length
|
|
? [handleEnds, handleEnds]
|
|
: handleEnds.slice();
|
|
handleEnds[0] > handleEnds[1] && handleMinMax.reverse();
|
|
|
|
if (delta < 0 && handleMinMax[0] + delta < extent[0]) {
|
|
delta = extent[0] - handleMinMax[0];
|
|
}
|
|
if (delta > 0 && handleMinMax[1] + delta > extent[1]) {
|
|
delta = extent[1] - handleMinMax[1];
|
|
}
|
|
return delta;
|
|
}
|
|
};
|
|
}); |