mirror of https://github.com/friendica/friendica
104 lines
3.1 KiB
JavaScript
104 lines
3.1 KiB
JavaScript
'use strict';
|
|
|
|
var _ = require('../../lib/helper');
|
|
var dom = require('../../lib/dom');
|
|
var instances = require('../instances');
|
|
var updateGeometry = require('../update-geometry');
|
|
var updateScroll = require('../update-scroll');
|
|
|
|
function bindMouseScrollXHandler(element, i) {
|
|
var currentLeft = null;
|
|
var currentPageX = null;
|
|
|
|
function updateScrollLeft(deltaX) {
|
|
var newLeft = currentLeft + (deltaX * i.railXRatio);
|
|
var maxLeft = Math.max(0, i.scrollbarXRail.getBoundingClientRect().left) + (i.railXRatio * (i.railXWidth - i.scrollbarXWidth));
|
|
|
|
if (newLeft < 0) {
|
|
i.scrollbarXLeft = 0;
|
|
} else if (newLeft > maxLeft) {
|
|
i.scrollbarXLeft = maxLeft;
|
|
} else {
|
|
i.scrollbarXLeft = newLeft;
|
|
}
|
|
|
|
var scrollLeft = _.toInt(i.scrollbarXLeft * (i.contentWidth - i.containerWidth) / (i.containerWidth - (i.railXRatio * i.scrollbarXWidth))) - i.negativeScrollAdjustment;
|
|
updateScroll(element, 'left', scrollLeft);
|
|
}
|
|
|
|
var mouseMoveHandler = function (e) {
|
|
updateScrollLeft(e.pageX - currentPageX);
|
|
updateGeometry(element);
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
};
|
|
|
|
var mouseUpHandler = function () {
|
|
_.stopScrolling(element, 'x');
|
|
i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
|
|
};
|
|
|
|
i.event.bind(i.scrollbarX, 'mousedown', function (e) {
|
|
currentPageX = e.pageX;
|
|
currentLeft = _.toInt(dom.css(i.scrollbarX, 'left')) * i.railXRatio;
|
|
_.startScrolling(element, 'x');
|
|
|
|
i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
|
|
i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
|
|
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
});
|
|
}
|
|
|
|
function bindMouseScrollYHandler(element, i) {
|
|
var currentTop = null;
|
|
var currentPageY = null;
|
|
|
|
function updateScrollTop(deltaY) {
|
|
var newTop = currentTop + (deltaY * i.railYRatio);
|
|
var maxTop = Math.max(0, i.scrollbarYRail.getBoundingClientRect().top) + (i.railYRatio * (i.railYHeight - i.scrollbarYHeight));
|
|
|
|
if (newTop < 0) {
|
|
i.scrollbarYTop = 0;
|
|
} else if (newTop > maxTop) {
|
|
i.scrollbarYTop = maxTop;
|
|
} else {
|
|
i.scrollbarYTop = newTop;
|
|
}
|
|
|
|
var scrollTop = _.toInt(i.scrollbarYTop * (i.contentHeight - i.containerHeight) / (i.containerHeight - (i.railYRatio * i.scrollbarYHeight)));
|
|
updateScroll(element, 'top', scrollTop);
|
|
}
|
|
|
|
var mouseMoveHandler = function (e) {
|
|
updateScrollTop(e.pageY - currentPageY);
|
|
updateGeometry(element);
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
};
|
|
|
|
var mouseUpHandler = function () {
|
|
_.stopScrolling(element, 'y');
|
|
i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
|
|
};
|
|
|
|
i.event.bind(i.scrollbarY, 'mousedown', function (e) {
|
|
currentPageY = e.pageY;
|
|
currentTop = _.toInt(dom.css(i.scrollbarY, 'top')) * i.railYRatio;
|
|
_.startScrolling(element, 'y');
|
|
|
|
i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
|
|
i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
|
|
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
});
|
|
}
|
|
|
|
module.exports = function (element) {
|
|
var i = instances.get(element);
|
|
bindMouseScrollXHandler(element, i);
|
|
bindMouseScrollYHandler(element, i);
|
|
};
|