Attach Filters to MessageLists

This should allow us to stop special-casing the narrowed message list
as much.

(imported from commit 1eb7216fbd8aa16b796c239a189d6ce0008344f9)
This commit is contained in:
Zev Benjamin 2013-04-25 15:13:06 -04:00
parent 4f4e982ed1
commit 8474675076
3 changed files with 19 additions and 4 deletions

View File

@ -1,9 +1,10 @@
/*jslint nomen: true */ /*jslint nomen: true */
function MessageList(table_name, opts) { function MessageList(table_name, filter, opts) {
$.extend(this, {collapse_messages: true}, opts); $.extend(this, {collapse_messages: true}, opts);
this._items = []; this._items = [];
this._hash = {}; this._hash = {};
this.table_name = table_name; this.table_name = table_name;
this.filter = filter;
this._selected_id = -1; this._selected_id = -1;
this._message_groups = []; this._message_groups = [];
// Half-open interval of the indices that define the current render window // Half-open interval of the indices that define the current render window
@ -13,6 +14,9 @@ function MessageList(table_name, opts) {
if (this.table_name) { if (this.table_name) {
this._clear_table(); this._clear_table();
} }
if (this.filter === undefined) {
this.filter = new narrow.Filter();
}
this.narrowed = false; this.narrowed = false;
if (this.table_name === "zfilt") { if (this.table_name === "zfilt") {
this.narrowed = true; this.narrowed = true;

View File

@ -3,8 +3,12 @@ var narrow = (function () {
var exports = {}; var exports = {};
function Filter(operators) { function Filter(operators) {
if (operators === undefined) {
this._operators = [];
} else {
this._operators = this._canonicalize_operators(operators); this._operators = this._canonicalize_operators(operators);
} }
}
Filter.prototype = { Filter.prototype = {
predicate: function Filter_predicate() { predicate: function Filter_predicate() {
@ -56,6 +60,10 @@ Filter.prototype = {
_build_predicate: function Filter__build_predicate() { _build_predicate: function Filter__build_predicate() {
var operators = this._operators; var operators = this._operators;
if (! this.can_apply_locally()) {
return function () { return true; };
}
// FIXME: This is probably pretty slow. // FIXME: This is probably pretty slow.
// We could turn it into something more like a compiler: // We could turn it into something more like a compiler:
// build JavaScript code in a string and then eval() it. // build JavaScript code in a string and then eval() it.
@ -117,6 +125,8 @@ Filter.prototype = {
} }
}; };
exports.Filter = Filter;
var current_filter; var current_filter;
exports.active = function () { exports.active = function () {
@ -353,7 +363,8 @@ exports.activate = function (operators, opts) {
} }
}); });
narrowed_msg_list = new MessageList('zfilt', {collapse_messages: collapse_messages}); narrowed_msg_list = new MessageList('zfilt', current_filter,
{collapse_messages: collapse_messages});
current_msg_list = narrowed_msg_list; current_msg_list = narrowed_msg_list;
function maybe_select_closest() { function maybe_select_closest() {

View File

@ -1,5 +1,5 @@
var all_msg_list = new MessageList(); var all_msg_list = new MessageList();
var home_msg_list = new MessageList('zhome'); var home_msg_list = new MessageList('zhome', new narrow.Filter([["in", "home"]]));
var narrowed_msg_list; var narrowed_msg_list;
var current_msg_list = home_msg_list; var current_msg_list = home_msg_list;
var subject_dict = {}; var subject_dict = {};