mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 23:13:25 +00:00
The main point of this fix is to move some more scroll-related code into viewport.js, but it also fixes a bug where the size of #main_div was not accurately representing the full height of the message list. Making the calculation more accurate narrows the window where we do pointer adjustements on mousewheel moves. (imported from commit 5d821f459284c4dbd5ff8056001e54caf4355f1d)
98 lines
2.6 KiB
JavaScript
98 lines
2.6 KiB
JavaScript
var viewport = (function () {
|
|
var exports = {};
|
|
|
|
var jwindow;
|
|
var height;
|
|
var width;
|
|
var in_stoppable_autoscroll = false;
|
|
|
|
exports.at_top = function () {
|
|
return (jwindow.scrollTop() <= 0);
|
|
};
|
|
|
|
exports.at_bottom = function () {
|
|
// outerHeight(true): Include margin
|
|
var bottom = jwindow.scrollTop() + jwindow.height();
|
|
var window_size = $(document).height();
|
|
|
|
return bottom >= window_size;
|
|
};
|
|
|
|
exports.scrollTop = function viewport_scrollTop () {
|
|
return jwindow.scrollTop.apply(jwindow, arguments);
|
|
};
|
|
|
|
exports.height = function viewport_height() {
|
|
if (arguments.length !== 0) {
|
|
height = undefined;
|
|
return jwindow.height.apply(jwindow, arguments);
|
|
}
|
|
if (height === undefined) {
|
|
height = $(window).height();
|
|
}
|
|
return height;
|
|
};
|
|
|
|
exports.width = function viewport_width() {
|
|
if (arguments.length !== 0) {
|
|
width = undefined;
|
|
return jwindow.width.apply(jwindow, arguments);
|
|
}
|
|
if (width === undefined) {
|
|
width = jwindow.width();
|
|
}
|
|
return width;
|
|
};
|
|
|
|
|
|
exports.stop_auto_scrolling = function() {
|
|
if (in_stoppable_autoscroll) {
|
|
$("html, body").stop();
|
|
}
|
|
};
|
|
|
|
exports.system_initiated_animate_scroll = function (scroll_amount) {
|
|
suppress_scroll_pointer_update = true; // Gets set to false in the scroll handler.
|
|
var viewport_offset = exports.scrollTop();
|
|
in_stoppable_autoscroll = true;
|
|
$("html, body").animate({
|
|
scrollTop: viewport_offset + scroll_amount,
|
|
always: function () {
|
|
in_stoppable_autoscroll = false;
|
|
}
|
|
});
|
|
};
|
|
|
|
exports.user_initiated_animate_scroll = function (scroll_amount) {
|
|
disable_pointer_movement = true;
|
|
in_stoppable_autoscroll = false; // defensive
|
|
|
|
// We use $('html, body') because you can't animate window.scrollTop
|
|
// on Chrome (http://bugs.jquery.com/ticket/10419).
|
|
$('html, body').animate({
|
|
scrollTop: viewport.scrollTop() + scroll_amount
|
|
}, {
|
|
complete: function () {
|
|
// The complete callback is actually called before the
|
|
// scrolling has completed, so we try to let scrolling
|
|
// finish before allowing pointer movements again or the
|
|
// pointer may still move.
|
|
setTimeout(function () {
|
|
disable_pointer_movement = false;
|
|
}, 50);
|
|
}
|
|
});
|
|
};
|
|
|
|
$(function () {
|
|
jwindow = $(window);
|
|
// This handler must be placed before all resize handlers in our application
|
|
jwindow.resize(function () {
|
|
height = undefined;
|
|
width = undefined;
|
|
});
|
|
});
|
|
|
|
return exports;
|
|
}());
|