X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fmessagefilter.cpp;h=a764a32f23c0f4f78fea3b9e93db125e90bb2f02;hb=7cc7b31044d82d24639956a8f004f0f6363d5e10;hp=0c35ee9ffff93ffd913276fecdc937eb0ec9699d;hpb=fadb23192f41a04c6a8e16e69576c675a8c40c0a;p=quassel.git diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 0c35ee9f..a764a32f 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -20,17 +20,87 @@ #include "messagefilter.h" +#include "buffersettings.h" +#include "client.h" +#include "messagemodel.h" + +MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) + : QSortFilterProxyModel(parent), + _messageTypeFilter(0) +{ + init(); + setSourceModel(source); +} + MessageFilter::MessageFilter(MessageModel *source, const QList &buffers, QObject *parent) : QSortFilterProxyModel(parent), - _bufferList(buffers) + _validBuffers(buffers.toSet()), + _messageTypeFilter(0) { + init(); setSourceModel(source); +} + +void MessageFilter::init() { + BufferSettings defaultSettings; + _messageTypeFilter = defaultSettings.messageFilter(); + defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + + BufferSettings mySettings(idString()); + if(mySettings.hasFilter()) + _messageTypeFilter = mySettings.messageFilter(); + mySettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); +} +void MessageFilter::messageTypeFilterChanged() { + int newFilter; + BufferSettings defaultSettings(); + newFilter = BufferSettings().messageFilter(); + + BufferSettings mySettings(idString()); + if(mySettings.hasFilter()) + newFilter = mySettings.messageFilter(); + + if(_messageTypeFilter != newFilter) { + _messageTypeFilter = newFilter; + invalidateFilter(); + } +} + +QString MessageFilter::idString() const { + if(_validBuffers.isEmpty()) + return "*"; + + QList bufferIds = _validBuffers.toList();; + qSort(bufferIds); + + QStringList bufferIdStrings; + foreach(BufferId id, bufferIds) + bufferIdStrings << QString::number(id.toInt()); + + return bufferIdStrings.join("|"); } bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { Q_UNUSED(sourceParent); - if(_bufferList.isEmpty()) return true; - BufferId id = sourceModel()->data(sourceModel()->index(sourceRow, 0), MessageModel::BufferIdRole).value(); - return _bufferList.contains(id); + QModelIndex sourceIdx = sourceModel()->index(sourceRow, 0); + if(_messageTypeFilter & sourceModel()->data(sourceIdx, MessageModel::TypeRole).toInt()) + return false; + + if(_validBuffers.isEmpty()) + return true; + + BufferId id = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value(); + if(!id.isValid()) { + return true; + } + return _validBuffers.contains(id); +} + +void MessageFilter::requestBacklog() { + QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); + while(bufferIdIter != _validBuffers.constEnd()) { + Client::messageModel()->requestBacklog(*bufferIdIter); + bufferIdIter++; + } }