More robust bufferlist, including read indicator and live refresh

This commit is contained in:
Mikko Ahlroth 2014-11-04 22:59:08 +02:00
parent c227efa2e6
commit c0428c6181
2 changed files with 82 additions and 59 deletions

View file

@ -43,26 +43,19 @@ var _buffers = {};
// according to buffer number whenever requested
var _buffersList = [];
// ListModel for BufferList
// ListModel for BufferList.qml, will be kept in sync with _buffersList
var _buffersListModel = null;
// Call this function whenever the buffer list needs to be refreshed
// completely
var _bufferListRefreshCallback = null;
// Call this function whenever a single buffer has been changed
// (no need to refresh)
var _bufferChangedCallback = null;
// Page that will own all of our textlistmodels
var _parentPage = null;
// A class for storing the information of a single buffer
function Buffer(pointer, number, name, title) {
function Buffer(pointer, number, full_name, name, title) {
this.pointer = pointer;
this.number = number;
this.full_name = full_name;
this.name = name;
this.title = title;
this.visible = false;
@ -84,7 +77,7 @@ function Buffer(pointer, number, name, title) {
if (!this.active) {
++this.unreadCount;
_callChangeCallback(this);
_updateBufferInList(this);
}
};
@ -100,7 +93,7 @@ function Buffer(pointer, number, name, title) {
if (!this.inited && this.pointer !== '0') {
var self = this;
var lines = this.textList.count;
EQ.command('hdata buffer:0x' + this.pointer + '/own_lines/last_line(-' + (lines + 100) + ')/data', function(result) {
EQ.command('hdata buffer:' + this.full_name + '/own_lines/last_line(-' + (lines + 100) + ')/data', function(result) {
var lines = result[0].objectSets;
lines.reverse();
handleLines(lines);
@ -110,6 +103,7 @@ function Buffer(pointer, number, name, title) {
this.active = true;
this.inited = true;
this.unreadCount = 0;
_updateBufferInList(this);
}
// This buffer will be hidden from the user
@ -119,7 +113,7 @@ function Buffer(pointer, number, name, title) {
// Send input into this buffer
this.input = function(str) {
EQ.command('input 0x' + this.pointer + ' ' + str);
EQ.command('input ' + this.full_name + ' ' + str);
};
}
@ -138,18 +132,12 @@ function setDebugPage(page) {
_parentPage = page;
var pointer = '0';
var buffer = new Buffer(pointer, 1, 'weechat', 'Debug/core');
var buffer = new Buffer(pointer, 1, 'core.weechat', 'weechat', 'Debug/core');
_buffers[pointer] = buffer;
_buffersList.push(buffer);
_buffersListModel.append({
pointer: pointer,
number: 1,
name: 'weechat',
unreadCount: 0
});
_buffersListModel.append(_bufferToModel(buffer));
_callRefreshCallback();
D.setDebugBuffer(buffer);
page.changeBuffer(buffer);
}
@ -198,6 +186,7 @@ function bufferListData(data) {
var pointer = buffers[i]['__path'][0];
var number = buffers[i].number;
var name = buffers[i].short_name;
var full_name = buffers[i].full_name;
var title = buffers[i].title;
var buffer = null;
@ -211,25 +200,20 @@ function bufferListData(data) {
_buffers[pointer] = _buffers['0'];
buffer = _buffers['0'];
buffer.pointer = pointer;
buffer.full_name = full_name;
buffer.name = name;
buffer.title = title;
buffer.number = number;
}
else {
buffer = new Buffer(pointer, number, name, title);
buffer = new Buffer(pointer, number, full_name, name, title);
_buffers[pointer] = buffer;
_buffersList.push(buffer);
_buffersListModel.append({
pointer: pointer,
number: number,
name: name,
unreadCount: 0
});
}
}
_sortBuffersList();
_callRefreshCallback();
_regenerateBufferList();
}
// Handle a single line
@ -252,20 +236,48 @@ function lineAdded(data) {
handleLines(data[0].objectSets);
}
// Keep the buffer list sorted
function _sortBuffersList() {
_buffersList.sort(function (a, b) {
return a.number - b.number;
});
}
function _callChangeCallback(o) {
if (!!_bufferChangedCallback) {
_bufferChangedCallback(o);
// Convert a buffer object into an object insertable into a ListModel
function _bufferToModel(buffer) {
return {
pointer: buffer.pointer,
number: buffer.number,
name: buffer.name,
unreadCount: buffer.unreadCount
};
}
// Update the given buffer in the list
// If the given buffer is not in the list, nothing is done
function _updateBufferInList(buffer) {
var modelObject = _bufferToModel(buffer);
var bufferCount = _buffersListModel.count;
for (var i = 0; i < bufferCount; ++i) {
var bufferAt = _buffersListModel.get(i);
if (bufferAt.number === modelObject.number) {
_buffersListModel.set(i, modelObject);
}
}
}
function _callRefreshCallback() {
if (!!_bufferListRefreshCallback) {
_bufferListRefreshCallback();
// Regenerate _buffersListModel based on _buffersList
function _regenerateBufferList() {
_buffersListModel.clear();
for (var i = 0; i < _buffersList.length; ++i) {
var modelObject = _bufferToModel(_buffersList[i]);
_buffersListModel.append(modelObject);
}
}

View file

@ -44,34 +44,45 @@ Page {
});
}
Row {
GlassItem {
id: readIndicator
opacity: unreadCount > 0 ? 1.0 : 0.0;
anchors.left: parent.left
anchors.leftMargin: -Theme.paddingLarge
//anchors.top: parent.top
//anchors.topMargin: -Theme.paddingLarge
//anchors.bottom: parent.bottom
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.paddingLarge
}
Label {
id: bufferNumber
text: number
color: listItem.highlighted ? Theme.secondaryHighlightColor
: Theme.secondaryColor;
anchors {
left: parent.left
left: readIndicator.right
leftMargin: -2 * Theme.paddingLarge
verticalCenter: parent.verticalCenter
}
width: Theme.itemSizeSmall
horizontalAlignment: Qt.AlignRight
}
Label {
id: bufferName
text: name
color: listItem.highlighted ? Theme.highlightColor
: Theme.primaryColor;
anchors {
left: bufferNumber.right
leftMargin: Theme.paddingLarge
right: parent.right
}
Label {
text: number
color: listItem.highlighted ? Theme.secondaryHighlightColor
: Theme.secondaryColor;
width: parent.width / 7
horizontalAlignment: Qt.AlignRight
}
Label {
text: name
color: listItem.highlighted ? Theme.highlightColor
: Theme.primaryColor;
}
Label {
text: unreadCount
color: listItem.highlighted ? Theme.highlightColor
: Theme.primaryColor;
verticalCenter: parent.verticalCenter
}
}