X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagefilter.cpp;h=edb7a319a68e7a319efe079aba79bce95e080b46;hp=238c7d57f1c5fdb5106b6f1d48b350e9ea595a5b;hb=2d63a234566618c61722639ab71a9684e1ce48e6;hpb=402f690fb8ca07adc2c063ba550d7e8fc0159ada diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 238c7d57..edb7a319 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -22,13 +22,13 @@ #include "buffersettings.h" #include "client.h" +#include "buffermodel.h" #include "messagemodel.h" #include "networkmodel.h" MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) : QSortFilterProxyModel(parent), - _messageTypeFilter(0), - _bufferType(BufferInfo::InvalidBuffer) + _messageTypeFilter(0) { init(); setSourceModel(source); @@ -37,15 +37,23 @@ MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) MessageFilter::MessageFilter(MessageModel *source, const QList &buffers, QObject *parent) : QSortFilterProxyModel(parent), _validBuffers(buffers.toSet()), - _messageTypeFilter(0), - _bufferType(BufferInfo::InvalidBuffer) + _messageTypeFilter(0) { init(); setSourceModel(source); } void MessageFilter::init() { + setDynamicSortFilter(true); + + _userNoticesTarget = _serverNoticesTarget = _errorMsgsTarget = -1; + BufferSettings defaultSettings; + defaultSettings.notify("UserNoticesTarget", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("ServerNoticesTarget", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("ErrorMsgsTarget", this, SLOT(messageRedirectionChanged())); + messageRedirectionChanged(); + _messageTypeFilter = defaultSettings.messageFilter(); defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); @@ -53,6 +61,7 @@ void MessageFilter::init() { if(mySettings.hasFilter()) _messageTypeFilter = mySettings.messageFilter(); mySettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + mySettings.notify("hasMessageTypeFilter", this, SLOT(messageTypeFilterChanged())); } void MessageFilter::messageTypeFilterChanged() { @@ -71,13 +80,36 @@ void MessageFilter::messageTypeFilterChanged() { } } +void MessageFilter::messageRedirectionChanged() { + BufferSettings bufferSettings; + bool changed = false; + + if(_userNoticesTarget != bufferSettings.userNoticesTarget()) { + _userNoticesTarget = bufferSettings.userNoticesTarget(); + changed = true; + } + + if(_serverNoticesTarget != bufferSettings.serverNoticesTarget()) { + _serverNoticesTarget = bufferSettings.serverNoticesTarget(); + changed = true; + } + + if(_errorMsgsTarget != bufferSettings.errorMsgsTarget()) { + _errorMsgsTarget = bufferSettings.errorMsgsTarget(); + changed = true; + } + + if(changed) + invalidateFilter(); +} + QString MessageFilter::idString() const { if(_validBuffers.isEmpty()) return "*"; - QList bufferIds = _validBuffers.toList();; + QList bufferIds = _validBuffers.toList(); qSort(bufferIds); - + QStringList bufferIdStrings; foreach(BufferId id, bufferIds) bufferIdStrings << QString::number(id.toInt()); @@ -97,12 +129,69 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar if(_validBuffers.isEmpty()) return true; - BufferId id = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value(); - if(!id.isValid()) { + BufferId bufferId = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value(); + if(!bufferId.isValid()) { return true; } - if(_validBuffers.contains(id)) { + MsgId msgId = sourceModel()->data(sourceIdx, MessageModel::MsgIdRole).value(); + Message::Flags flags = (Message::Flags)sourceModel()->data(sourceIdx, MessageModel::FlagsRole).toInt(); + + NetworkId myNetworkId = networkId(); + NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId); + if(myNetworkId != msgNetworkId) + return false; + + + if(flags & Message::Redirected) { + int redirectionTarget = 0; + switch(messageType) { + case Message::Notice: + if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) { + if(flags & Message::ServerMsg) { + // server notice + redirectionTarget = _serverNoticesTarget; + } else { + redirectionTarget = _userNoticesTarget; + } + } + break; + case Message::Error: + redirectionTarget = _errorMsgsTarget; + break; + default: + break; + } + + if(redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId)) + return true; + + if(redirectionTarget & BufferSettings::CurrentBuffer && !(flags & Message::Backlog)) { + BufferId redirectedTo = sourceModel()->data(sourceIdx, MessageModel::RedirectedToRole).value(); + if(!redirectedTo.isValid()) { + BufferId redirectedTo = Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value(); + if(redirectedTo.isValid()) + sourceModel()->setData(sourceIdx, QVariant::fromValue(redirectedTo), MessageModel::RedirectedToRole); + } + + if(_validBuffers.contains(redirectedTo)) + return true; + } + + if(redirectionTarget & BufferSettings::StatusBuffer) { + QSet::const_iterator idIter = _validBuffers.constBegin(); + while(idIter != _validBuffers.constEnd()) { + if(Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer) + return true; + idIter++; + } + } + + return false; + } + + + if(_validBuffers.contains(bufferId)) { return true; } else { // show Quit messages in Query buffers: @@ -111,18 +200,20 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar if(!(messageType & Message::Quit)) return false; + if(myNetworkId != msgNetworkId) + return false; + uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); - if(_filteredQuitMsgs.contains(messageTimestamp)) + QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty).toLower(); + if(quiter != bufferName().toLower()) return false; - QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty); - if(quiter.toLower() == bufferName().toLower()) { - MessageFilter *that = const_cast(this); - that->_filteredQuitMsgs << messageTimestamp; - return true; - } else { + if(_filteredQuitMsgs.contains(quiter, messageTimestamp)) return false; - } + + MessageFilter *that = const_cast(this); + that->_filteredQuitMsgs.insert(quiter, messageTimestamp); + return true; } } @@ -133,21 +224,3 @@ void MessageFilter::requestBacklog() { bufferIdIter++; } } - -const QString &MessageFilter::bufferName() const { - if(_bufferName.isEmpty()) { - MessageFilter *that = const_cast(this); - that->_bufferName = Client::networkModel()->bufferName(singleBufferId()); - return that->_bufferName; - } - return _bufferName; -} - -BufferInfo::Type MessageFilter::bufferType() const { - if(_bufferType == BufferInfo::InvalidBuffer) { - MessageFilter *that = const_cast(this); - that->_bufferType = Client::networkModel()->bufferType(singleBufferId()); - return that->_bufferType; - } - return _bufferType; -}