From c0428c61815422598dd4b30bac702f4d73508f15 Mon Sep 17 00:00:00 2001 From: Mikko Ahlroth Date: Tue, 4 Nov 2014 22:59:08 +0200 Subject: [PATCH] More robust bufferlist, including read indicator and live refresh --- qml/js/buffers.js | 82 +++++++++++++++++++++++----------------- qml/pages/BufferList.qml | 59 +++++++++++++++++------------ 2 files changed, 82 insertions(+), 59 deletions(-) diff --git a/qml/js/buffers.js b/qml/js/buffers.js index 162f314..003be75 100644 --- a/qml/js/buffers.js +++ b/qml/js/buffers.js @@ -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); } } diff --git a/qml/pages/BufferList.qml b/qml/pages/BufferList.qml index ee177f8..4ddb1ce 100644 --- a/qml/pages/BufferList.qml +++ b/qml/pages/BufferList.qml @@ -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 } }