2013-07-24 22:51:13 +02:00
|
|
|
var navigate = (function () {
|
|
|
|
|
|
|
|
var exports = {};
|
|
|
|
|
2013-07-24 23:41:49 +02:00
|
|
|
|
|
|
|
function go_to_row(row) {
|
|
|
|
current_msg_list.select_id(rows.id(row),
|
|
|
|
{then_scroll: true,
|
|
|
|
from_scroll: true});
|
|
|
|
}
|
|
|
|
|
2013-07-24 22:51:13 +02:00
|
|
|
exports.up = function () {
|
2017-03-10 23:48:51 +01:00
|
|
|
message_viewport.last_movement_direction = -1;
|
2013-07-24 22:51:13 +02:00
|
|
|
var next_row = rows.prev_visible(current_msg_list.selected_row());
|
|
|
|
if (next_row.length !== 0) {
|
2013-07-24 23:41:49 +02:00
|
|
|
go_to_row(next_row);
|
2013-07-24 22:51:13 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-08-05 21:52:38 +02:00
|
|
|
exports.down = function (with_centering) {
|
2017-03-10 23:48:51 +01:00
|
|
|
message_viewport.last_movement_direction = 1;
|
2013-07-24 22:51:13 +02:00
|
|
|
var next_row = rows.next_visible(current_msg_list.selected_row());
|
|
|
|
if (next_row.length !== 0) {
|
2013-07-24 23:41:49 +02:00
|
|
|
go_to_row(next_row);
|
2013-07-24 22:51:13 +02:00
|
|
|
}
|
2013-08-05 21:52:38 +02:00
|
|
|
if (with_centering && (next_row.length === 0)) {
|
|
|
|
// At the last message, scroll to the bottom so we have
|
|
|
|
// lots of nice whitespace for new messages coming in.
|
|
|
|
//
|
|
|
|
// FIXME: this doesn't work for End because rows.last_visible()
|
|
|
|
// always returns a message.
|
|
|
|
var current_msg_table = rows.get_table(current_msg_list.table_name);
|
2017-03-10 23:48:51 +01:00
|
|
|
message_viewport.scrollTop(current_msg_table.outerHeight(true) -
|
|
|
|
message_viewport.height() * 0.1);
|
2017-03-18 01:41:56 +01:00
|
|
|
unread_ops.mark_current_list_as_read();
|
2013-08-05 21:52:38 +02:00
|
|
|
}
|
2013-07-24 22:51:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
exports.to_home = function () {
|
2017-03-10 23:48:51 +01:00
|
|
|
message_viewport.last_movement_direction = -1;
|
2013-07-24 22:51:13 +02:00
|
|
|
var next_row = rows.first_visible(current_msg_list.selected_row());
|
|
|
|
if (next_row.length !== 0) {
|
2013-07-24 23:41:49 +02:00
|
|
|
go_to_row(next_row);
|
2013-07-24 22:51:13 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.to_end = function () {
|
|
|
|
var next_id = current_msg_list.last().id;
|
2017-03-10 23:48:51 +01:00
|
|
|
message_viewport.last_movement_direction = 1;
|
2013-07-24 22:51:13 +02:00
|
|
|
current_msg_list.select_id(next_id, {then_scroll: true,
|
|
|
|
from_scroll: true});
|
2017-03-18 01:41:56 +01:00
|
|
|
unread_ops.mark_current_list_as_read();
|
2013-07-24 22:51:13 +02:00
|
|
|
};
|
|
|
|
|
2017-03-18 23:23:39 +01:00
|
|
|
function amount_to_paginate() {
|
|
|
|
// Some day we might have separate versions of this function
|
|
|
|
// for Page Up vs. Page Down, but for now it's the same
|
|
|
|
// strategy in either direction.
|
|
|
|
var info = message_viewport.message_viewport_info();
|
|
|
|
var page_size = info.visible_height;
|
|
|
|
|
|
|
|
// We don't want to page up a full page, because Zulip users
|
|
|
|
// are especially worried about missing messages, so we want
|
|
|
|
// a little bit of the old page to stay on the screen. The
|
|
|
|
// value chosen here is roughly 2 or 3 lines of text, but there
|
|
|
|
// is nothing sacred about it, and somebody more anal than me
|
|
|
|
// might wish to tie this to the size of some particular DOM
|
|
|
|
// element.
|
|
|
|
var overlap_amount = 55;
|
|
|
|
|
|
|
|
var delta = page_size - overlap_amount;
|
|
|
|
|
|
|
|
// If the user has shrunk their browser a whole lot, pagination
|
|
|
|
// is not going to be very pleasant, but we can at least
|
|
|
|
// ensure they go in the right direction.
|
|
|
|
if (delta < 1) {
|
|
|
|
delta = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return delta;
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.page_up_the_right_amount = function () {
|
|
|
|
// This function's job is to scroll up the right amount,
|
|
|
|
// after the user hits Page Up. We do this ourselves
|
|
|
|
// because we can't rely on the browser to account for certain
|
|
|
|
// page elements, like the compose box, that sit in fixed
|
|
|
|
// positions above the message pane. For other scrolling
|
|
|
|
// related adjustements, try to make those happen in the
|
|
|
|
// scroll handlers, not here.
|
|
|
|
var delta = amount_to_paginate();
|
|
|
|
message_viewport.scrollTop(message_viewport.scrollTop() - delta);
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.page_down_the_right_amount = function () {
|
|
|
|
// see also: page_up_the_right_amount
|
|
|
|
var delta = amount_to_paginate();
|
|
|
|
message_viewport.scrollTop(message_viewport.scrollTop() + delta);
|
|
|
|
};
|
|
|
|
|
2013-07-24 22:51:13 +02:00
|
|
|
exports.page_up = function () {
|
2017-03-10 23:48:51 +01:00
|
|
|
if (message_viewport.at_top() && !current_msg_list.empty()) {
|
2013-07-24 22:51:13 +02:00
|
|
|
current_msg_list.select_id(current_msg_list.first().id, {then_scroll: false});
|
2016-06-09 23:02:49 +02:00
|
|
|
} else {
|
2017-03-18 23:23:39 +01:00
|
|
|
exports.page_up_the_right_amount();
|
2013-07-24 22:51:13 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.page_down = function () {
|
2017-03-10 23:48:51 +01:00
|
|
|
if (message_viewport.at_bottom() && !current_msg_list.empty()) {
|
2013-07-24 22:51:13 +02:00
|
|
|
current_msg_list.select_id(current_msg_list.last().id, {then_scroll: false});
|
2017-03-18 01:41:56 +01:00
|
|
|
unread_ops.mark_current_list_as_read();
|
2016-06-09 23:02:49 +02:00
|
|
|
} else {
|
2017-03-18 23:23:39 +01:00
|
|
|
exports.page_down_the_right_amount();
|
2013-07-24 22:51:13 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-02-14 19:32:40 +01:00
|
|
|
exports.cycle_stream = function (direction) {
|
2016-12-02 17:09:31 +01:00
|
|
|
var currentStream;
|
|
|
|
var nextStream;
|
2017-05-16 06:07:00 +02:00
|
|
|
var stream_name = narrow_state.stream();
|
2017-05-13 17:41:10 +02:00
|
|
|
if (stream_name !== undefined) {
|
|
|
|
var stream_id = stream_data.get_stream_id(stream_name);
|
|
|
|
currentStream = stream_list.get_stream_li(stream_id);
|
2014-02-14 19:32:40 +01:00
|
|
|
}
|
2017-06-03 14:16:45 +02:00
|
|
|
if (!currentStream) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-02-14 19:32:40 +01:00
|
|
|
switch (direction) {
|
|
|
|
case 'forward':
|
2017-04-25 15:25:31 +02:00
|
|
|
if (narrow_state.stream() === undefined) {
|
2014-02-28 22:48:45 +01:00
|
|
|
nextStream = $("#stream_filters").children('.narrow-filter').first();
|
2014-02-14 19:32:40 +01:00
|
|
|
} else {
|
2014-02-28 22:48:45 +01:00
|
|
|
nextStream = currentStream.next('.narrow-filter');
|
2014-02-14 19:32:40 +01:00
|
|
|
if (nextStream.length === 0) {
|
2014-02-28 22:48:45 +01:00
|
|
|
nextStream = $("#stream_filters").children('.narrow-filter').first();
|
2014-02-14 19:32:40 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'backward':
|
2017-04-25 15:25:31 +02:00
|
|
|
if (narrow_state.stream() === undefined) {
|
2014-02-28 22:48:45 +01:00
|
|
|
nextStream = $("#stream_filters").children('.narrow-filter').last();
|
2014-02-14 19:32:40 +01:00
|
|
|
} else {
|
2014-02-28 22:48:45 +01:00
|
|
|
nextStream = currentStream.prev('.narrow-filter');
|
2014-02-14 19:32:40 +01:00
|
|
|
if (nextStream.length === 0) {
|
2014-02-28 22:48:45 +01:00
|
|
|
nextStream = $("#stream_filters").children('.narrow-filter').last();
|
2014-02-14 19:32:40 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
blueslip.error("Invalid parameter to cycle_stream", {value: direction});
|
|
|
|
}
|
|
|
|
narrow.by('stream', nextStream.data('name'));
|
|
|
|
};
|
|
|
|
|
2016-05-25 13:26:57 +02:00
|
|
|
exports.scroll_to_selected = function () {
|
|
|
|
var selected_row = current_msg_list.selected_row();
|
|
|
|
if (selected_row && (selected_row.length !== 0)) {
|
2017-03-10 23:48:51 +01:00
|
|
|
message_viewport.recenter_view(selected_row);
|
2016-05-25 13:26:57 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2016-05-25 13:24:33 +02:00
|
|
|
|
|
|
|
exports.maybe_scroll_to_selected = function () {
|
|
|
|
// If we have been previously instructed to re-center to the
|
|
|
|
// selected message, then do so
|
|
|
|
if (pointer.recenter_pointer_on_display) {
|
2016-05-25 13:26:57 +02:00
|
|
|
exports.scroll_to_selected();
|
2016-05-25 13:24:33 +02:00
|
|
|
pointer.recenter_pointer_on_display = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-24 22:51:13 +02:00
|
|
|
return exports;
|
2013-08-02 19:33:20 +02:00
|
|
|
}());
|
2016-12-04 08:59:56 +01:00
|
|
|
|
|
|
|
if (typeof module !== 'undefined') {
|
|
|
|
module.exports = navigate;
|
|
|
|
}
|