Merge pull request #1020 from lorenzhs/server-buffer-registry
Keep track of unread counts for servers' buffers for 'show only unread' view
This commit is contained in:
commit
41bea6ec7e
@ -134,6 +134,8 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout',
|
|||||||
var buffer = models.getActiveBuffer();
|
var buffer = models.getActiveBuffer();
|
||||||
// This can also be triggered before connecting to the relay, check for null (not undefined!)
|
// This can also be triggered before connecting to the relay, check for null (not undefined!)
|
||||||
if (buffer !== null) {
|
if (buffer !== null) {
|
||||||
|
var server = models.getServerForBuffer(buffer);
|
||||||
|
server.unread -= (buffer.unread + buffer.notification);
|
||||||
buffer.unread = 0;
|
buffer.unread = 0;
|
||||||
buffer.notification = 0;
|
buffer.notification = 0;
|
||||||
|
|
||||||
@ -716,11 +718,15 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout',
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Always show core buffer in the list (issue #438)
|
// Always show core buffer in the list (issue #438)
|
||||||
// Also show server buffers in hierarchical view
|
if (buffer.fullName === "core.weechat") {
|
||||||
if (buffer.fullName === "core.weechat" || (settings.orderbyserver && buffer.type === 'server')) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In hierarchical view, show server iff it has a buffer with unread messages
|
||||||
|
if (settings.orderbyserver && buffer.type === 'server') {
|
||||||
|
return models.getServerForBuffer(buffer).unread > 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Always show pinned buffers
|
// Always show pinned buffers
|
||||||
if (buffer.pinned) {
|
if (buffer.pinned) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -161,13 +161,16 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!manually && (!buffer.active || !$rootScope.isWindowFocused())) {
|
if (!manually && (!buffer.active || !$rootScope.isWindowFocused())) {
|
||||||
|
var server = models.getServerForBuffer(buffer);
|
||||||
if (buffer.notify > 1 && _.contains(message.tags, 'notify_message') && !_.contains(message.tags, 'notify_none')) {
|
if (buffer.notify > 1 && _.contains(message.tags, 'notify_message') && !_.contains(message.tags, 'notify_none')) {
|
||||||
buffer.unread++;
|
buffer.unread++;
|
||||||
|
server.unread++;
|
||||||
$rootScope.$emit('notificationChanged');
|
$rootScope.$emit('notificationChanged');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((buffer.notify !== 0 && message.highlight) || _.contains(message.tags, 'notify_private')) {
|
if ((buffer.notify !== 0 && message.highlight) || _.contains(message.tags, 'notify_private')) {
|
||||||
buffer.notification++;
|
buffer.notification++;
|
||||||
|
server.unread++;
|
||||||
notifications.createHighlight(buffer, message);
|
notifications.createHighlight(buffer, message);
|
||||||
$rootScope.$emit('notificationChanged');
|
$rootScope.$emit('notificationChanged');
|
||||||
}
|
}
|
||||||
@ -186,6 +189,12 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
|
|||||||
handleBufferUpdate(buffer, bufferInfos[i]);
|
handleBufferUpdate(buffer, bufferInfos[i]);
|
||||||
} else {
|
} else {
|
||||||
buffer = new models.Buffer(bufferInfos[i]);
|
buffer = new models.Buffer(bufferInfos[i]);
|
||||||
|
if (buffer.type === 'server') {
|
||||||
|
models.registerServer(buffer);
|
||||||
|
} else {
|
||||||
|
var server = models.getServerForBuffer(buffer);
|
||||||
|
server.unread += buffer.unread + buffer.notification;
|
||||||
|
}
|
||||||
models.addBuffer(buffer);
|
models.addBuffer(buffer);
|
||||||
// Switch to first buffer on startup
|
// Switch to first buffer on startup
|
||||||
var shouldResume = bufferResume.shouldResume(buffer);
|
var shouldResume = bufferResume.shouldResume(buffer);
|
||||||
@ -214,7 +223,9 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
|
|||||||
buffer.number = message.number;
|
buffer.number = message.number;
|
||||||
buffer.hidden = message.hidden;
|
buffer.hidden = message.hidden;
|
||||||
|
|
||||||
// reset these, hotlist info will arrive shortly
|
// reset unread counts, hotlist info will arrive shortly
|
||||||
|
var server = models.getServerForBuffer(buffer);
|
||||||
|
server.unread -= (buffer.unread + buffer.notification);
|
||||||
buffer.notification = 0;
|
buffer.notification = 0;
|
||||||
buffer.unread = 0;
|
buffer.unread = 0;
|
||||||
buffer.lastSeen = -1;
|
buffer.lastSeen = -1;
|
||||||
@ -238,6 +249,12 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
|
|||||||
var handleBufferOpened = function(message) {
|
var handleBufferOpened = function(message) {
|
||||||
var bufferMessage = message.objects[0].content[0];
|
var bufferMessage = message.objects[0].content[0];
|
||||||
var buffer = new models.Buffer(bufferMessage);
|
var buffer = new models.Buffer(bufferMessage);
|
||||||
|
if (buffer.type === 'server') {
|
||||||
|
models.registerServer(buffer);
|
||||||
|
} else {
|
||||||
|
var server = models.getServerForBuffer(buffer);
|
||||||
|
server.unread += buffer.unread + buffer.notification;
|
||||||
|
}
|
||||||
models.addBuffer(buffer);
|
models.addBuffer(buffer);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -374,6 +391,9 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
|
|||||||
buffer.unread = 0;
|
buffer.unread = 0;
|
||||||
buffer.notification = 0;
|
buffer.notification = 0;
|
||||||
});
|
});
|
||||||
|
_.each(models.getServers(), function(server) {
|
||||||
|
server.unread = 0;
|
||||||
|
});
|
||||||
if (message.objects.length > 0) {
|
if (message.objects.length > 0) {
|
||||||
var hotlist = message.objects[0].content;
|
var hotlist = message.objects[0].content;
|
||||||
hotlist.forEach(function(l) {
|
hotlist.forEach(function(l) {
|
||||||
@ -397,6 +417,9 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
|
|||||||
*/
|
*/
|
||||||
var unreadSum = _.reduce(l.count, function(memo, num) { return memo + num; }, 0);
|
var unreadSum = _.reduce(l.count, function(memo, num) { return memo + num; }, 0);
|
||||||
buffer.lastSeen = buffer.lines.length - 1 - unreadSum;
|
buffer.lastSeen = buffer.lines.length - 1 - unreadSum;
|
||||||
|
|
||||||
|
// update server buffer. Don't incude index 0 -> not unreadSum
|
||||||
|
models.getServerForBuffer(buffer).unread += l.count[1] + l.count[2] + l.count[3];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// the unread badges in the bufferlist doesn't update if we don't do this
|
// the unread badges in the bufferlist doesn't update if we don't do this
|
||||||
|
@ -438,6 +438,10 @@ weechat.directive('inputBar', function() {
|
|||||||
buffer.unread = 0;
|
buffer.unread = 0;
|
||||||
buffer.notification = 0;
|
buffer.notification = 0;
|
||||||
});
|
});
|
||||||
|
var servers = models.getServers();
|
||||||
|
_.each(servers, function(server) {
|
||||||
|
server.unread = 0;
|
||||||
|
});
|
||||||
connection.sendHotlistClearAll();
|
connection.sendHotlistClearAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
49
js/models.js
49
js/models.js
@ -473,11 +473,26 @@ models.service('models', ['$rootScope', '$filter', 'bufferResume', function($roo
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.Server = function() {
|
||||||
|
var id = 0; // will be set later on
|
||||||
|
var unread = 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: id,
|
||||||
|
unread: unread
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
var activeBuffer = null;
|
var activeBuffer = null;
|
||||||
var previousBuffer = null;
|
var previousBuffer = null;
|
||||||
|
|
||||||
this.model = { 'buffers': {} };
|
this.model = { 'buffers': {}, 'servers': {} };
|
||||||
|
|
||||||
|
this.registerServer = function(buffer) {
|
||||||
|
var key = buffer.plugin + '.' + buffer.server;
|
||||||
|
this.getServer(key).id = buffer.id;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Adds a buffer to the list
|
* Adds a buffer to the list
|
||||||
@ -563,6 +578,8 @@ models.service('models', ['$rootScope', '$filter', 'bufferResume', function($roo
|
|||||||
|
|
||||||
var unreadSum = activeBuffer.unread + activeBuffer.notification;
|
var unreadSum = activeBuffer.unread + activeBuffer.notification;
|
||||||
|
|
||||||
|
this.getServerForBuffer(activeBuffer).unread -= unreadSum;
|
||||||
|
|
||||||
activeBuffer.active = true;
|
activeBuffer.active = true;
|
||||||
activeBuffer.unread = 0;
|
activeBuffer.unread = 0;
|
||||||
activeBuffer.notification = 0;
|
activeBuffer.notification = 0;
|
||||||
@ -585,6 +602,7 @@ models.service('models', ['$rootScope', '$filter', 'bufferResume', function($roo
|
|||||||
*/
|
*/
|
||||||
this.reinitialize = function() {
|
this.reinitialize = function() {
|
||||||
this.model.buffers = {};
|
this.model.buffers = {};
|
||||||
|
this.model.servers = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -597,6 +615,35 @@ models.service('models', ['$rootScope', '$filter', 'bufferResume', function($roo
|
|||||||
return this.model.buffers[bufferId];
|
return this.model.buffers[bufferId];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the server list
|
||||||
|
*/
|
||||||
|
this.getServers = function() {
|
||||||
|
return this.model.servers;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the server object for a specific key, creating it if it does not exist
|
||||||
|
* @param key the server key
|
||||||
|
* @return the server object
|
||||||
|
*/
|
||||||
|
this.getServer = function(key) {
|
||||||
|
if (this.model.servers[key] === undefined) {
|
||||||
|
this.model.servers[key] = this.Server();
|
||||||
|
}
|
||||||
|
return this.model.servers[key];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns info on the server buffer for a specific buffer
|
||||||
|
* @param buffer the buffer
|
||||||
|
* @return the server object
|
||||||
|
*/
|
||||||
|
this.getServerForBuffer = function(buffer) {
|
||||||
|
var key = buffer.plugin + '.' + buffer.server;
|
||||||
|
return this.getServer(key);
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Closes a weechat buffer. Sets the first buffer
|
* Closes a weechat buffer. Sets the first buffer
|
||||||
* as active, if the closing buffer was active before
|
* as active, if the closing buffer was active before
|
||||||
|
Loading…
Reference in New Issue
Block a user