message scrolling: Extract _scroll_limit().

There's a subtle change here in how we handle the
hypothetical case that the selected message is above
the top of the feed.  Instead of early-exiting
from _maybe_autoscroll(), we just treat the limit
as zero, which will have the same effect.

We also change a var name be just `scroll_limit`
instead of `available_space_for_scroll`.  A longer
name would be valuable if it were somehow more
specific, but it was needlessly verbose.
This commit is contained in:
Steve Howell
2019-01-05 15:49:23 +00:00
committed by Tim Abbott
parent a7c92a2590
commit 0f75be3e8e

View File

@@ -773,6 +773,24 @@ MessageListView.prototype = {
return new_messages_height;
},
_scroll_limit: function (selected_row, viewport_info) {
// This scroll limit is driven by the TOP of the feed, and
// it's the max amount that we can scroll down (or "skooch
// up" the messages) before knocking the selected message
// out of the feed.
var selected_row_top = selected_row.offset().top;
var scroll_limit = selected_row_top - viewport_info.visible_top;
if (scroll_limit < 0) {
// This shouldn't happen, but if we're off by a pixel or
// something, we can deal with it, and just warn.
blueslip.warn('Selected row appears too high on screen.');
scroll_limit = 0;
}
return scroll_limit;
},
_maybe_autoscroll: function (new_messages_height) {
// If we are near the bottom of our feed (the bottom is visible) and can
// scroll up without moving the pointer out of the viewport, do so, by
@@ -786,14 +804,8 @@ MessageListView.prototype = {
return;
}
var selected_row_offset = selected_row.offset().top;
var info = message_viewport.message_viewport_info();
var available_space_for_scroll = selected_row_offset - info.visible_top;
// Don't scroll if we can't move the pointer up.
if (available_space_for_scroll <= 0) {
return;
}
var scroll_limit = this._scroll_limit(selected_row, info);
if (new_messages_height <= 0) {
return;
@@ -825,8 +837,8 @@ MessageListView.prototype = {
// to stay on the screen
var scroll_amount = new_messages_height;
if (scroll_amount > available_space_for_scroll) {
scroll_amount = available_space_for_scroll;
if (scroll_amount > scroll_limit) {
scroll_amount = scroll_limit;
}
// Let's work our way back to whether the user was already dealing