/***************************************************************************
- * 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 *
#include "buffermodel.h"
#include "messagemodel.h"
#include "networkmodel.h"
+#include "clientignorelistmanager.h"
MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent)
: QSortFilterProxyModel(parent),
void MessageFilter::init() {
setDynamicSortFilter(true);
- BufferSettings defaultSettings;
- defaultSettings.notify("UserNoticesInDefaultBuffer", this, SLOT(messageRedirectionChanged()));
- defaultSettings.notify("UserNoticesInStatusBuffer", this, SLOT(messageRedirectionChanged()));
- defaultSettings.notify("UserNoticesInCurrentBuffer", this, SLOT(messageRedirectionChanged()));
-
- defaultSettings.notify("serverNoticesInDefaultBuffer", this, SLOT(messageRedirectionChanged()));
- defaultSettings.notify("serverNoticesInStatusBuffer", this, SLOT(messageRedirectionChanged()));
- defaultSettings.notify("serverNoticesInCurrentBuffer", this, SLOT(messageRedirectionChanged()));
+ _userNoticesTarget = _serverNoticesTarget = _errorMsgsTarget = -1;
- defaultSettings.notify("ErrorMsgsInDefaultBuffer", this, SLOT(messageRedirectionChanged()));
- defaultSettings.notify("ErrorMsgsInStatusBuffer", this, SLOT(messageRedirectionChanged()));
- defaultSettings.notify("ErrorMsgsInCurrentBuffer", this, SLOT(messageRedirectionChanged()));
+ BufferSettings defaultSettings;
+ defaultSettings.notify("UserNoticesTarget", this, SLOT(messageRedirectionChanged()));
+ defaultSettings.notify("ServerNoticesTarget", this, SLOT(messageRedirectionChanged()));
+ defaultSettings.notify("ErrorMsgsTarget", this, SLOT(messageRedirectionChanged()));
messageRedirectionChanged();
_messageTypeFilter = defaultSettings.messageFilter();
void MessageFilter::messageRedirectionChanged() {
BufferSettings bufferSettings;
- _userNoticesInDefaultBuffer = bufferSettings.value("UserNoticesInDefaultBuffer", QVariant(true)).toBool();
- _userNoticesInStatusBuffer = bufferSettings.value("UserNoticesInStatusBuffer", QVariant(false)).toBool();
- _userNoticesInCurrentBuffer = bufferSettings.value("UserNoticesInCurrentBuffer", QVariant(false)).toBool();
+ bool changed = false;
+
+ if(_userNoticesTarget != bufferSettings.userNoticesTarget()) {
+ _userNoticesTarget = bufferSettings.userNoticesTarget();
+ changed = true;
+ }
- _serverNoticesInDefaultBuffer = bufferSettings.value("ServerNoticesInDefaultBuffer", QVariant(false)).toBool();
- _serverNoticesInStatusBuffer = bufferSettings.value("ServerNoticesInStatusBuffer", QVariant(true)).toBool();
- _serverNoticesInCurrentBuffer = bufferSettings.value("ServerNoticesInCurrentBuffer", QVariant(false)).toBool();
+ if(_serverNoticesTarget != bufferSettings.serverNoticesTarget()) {
+ _serverNoticesTarget = bufferSettings.serverNoticesTarget();
+ changed = true;
+ }
- _errorMsgsInDefaultBuffer = bufferSettings.value("ErrorMsgsInDefaultBuffer", QVariant(true)).toBool();
- _errorMsgsInStatusBuffer = bufferSettings.value("ErrorMsgsInStatusBuffer", QVariant(false)).toBool();
- _errorMsgsInCurrentBuffer = bufferSettings.value("ErrorMsgsInCurrentBuffer", QVariant(false)).toBool();
+ if(_errorMsgsTarget != bufferSettings.errorMsgsTarget()) {
+ _errorMsgsTarget = bufferSettings.errorMsgsTarget();
+ changed = true;
+ }
- invalidateFilter();
+ if(changed)
+ invalidateFilter();
}
QString MessageFilter::idString() const {
bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const {
Q_UNUSED(sourceParent);
QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2);
- Message::Type messageType = (Message::Type)sourceModel()->data(sourceIdx, MessageModel::TypeRole).toInt();
+ Message::Type messageType = (Message::Type)sourceIdx.data(MessageModel::TypeRole).toInt();
// apply message type filter
if(_messageTypeFilter & messageType)
if(_validBuffers.isEmpty())
return true;
- BufferId bufferId = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value<BufferId>();
+ BufferId bufferId = sourceIdx.data(MessageModel::BufferIdRole).value<BufferId>();
if(!bufferId.isValid()) {
return true;
}
- MsgId msgId = sourceModel()->data(sourceIdx, MessageModel::MsgIdRole).value<MsgId>();
- Message::Flags flags = (Message::Flags)sourceModel()->data(sourceIdx, MessageModel::FlagsRole).toInt();
+ MsgId msgId = sourceIdx.data(MessageModel::MsgIdRole).value<MsgId>();
+ Message::Flags flags = (Message::Flags)sourceIdx.data(MessageModel::FlagsRole).toInt();
NetworkId myNetworkId = networkId();
NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId);
if(myNetworkId != msgNetworkId)
return false;
- bool redirect = false;
- bool inDefaultBuffer;
- bool inStatusBuffer;
- bool inCurrentBuffer;
-
- switch(messageType) {
- case Message::Notice:
- if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
- redirect = true;
- if(flags & Message::ServerMsg) {
- // server notice
- inDefaultBuffer = _serverNoticesInDefaultBuffer;
- inStatusBuffer = _serverNoticesInStatusBuffer;
- inCurrentBuffer = _serverNoticesInCurrentBuffer;
- } else {
- inDefaultBuffer = _userNoticesInDefaultBuffer;
- inStatusBuffer = _userNoticesInStatusBuffer;
- inCurrentBuffer = _userNoticesInCurrentBuffer;
+ // ignorelist handling
+ // only match if message is not flagged as server msg
+ if(!(flags & Message::ServerMsg) && Client::ignoreListManager()
+ && Client::ignoreListManager()->match(sourceIdx.data(MessageModel::MessageRole).value<Message>(), Client::networkModel()->networkName(bufferId)))
+ 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;
}
- break;
- case Message::Error:
- redirect = true;
- inDefaultBuffer = _errorMsgsInDefaultBuffer;
- inStatusBuffer = _errorMsgsInStatusBuffer;
- inCurrentBuffer = _errorMsgsInCurrentBuffer;
- break;
- default:
- break;
- }
-
- if(redirect) {
- if(_redirectedMsgs.contains(msgId))
- return true;
- if(inDefaultBuffer && _validBuffers.contains(bufferId))
+ if(redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId))
return true;
- if(inCurrentBuffer && !(flags & Message::Backlog) && _validBuffers.contains(Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>())) {
+ if(redirectionTarget & BufferSettings::CurrentBuffer && !(flags & Message::Backlog)) {
BufferId redirectedTo = sourceModel()->data(sourceIdx, MessageModel::RedirectedToRole).value<BufferId>();
if(!redirectedTo.isValid()) {
- sourceModel()->setData(sourceIdx, QVariant::fromValue<BufferId>(singleBufferId()), MessageModel::RedirectedToRole);
- _redirectedMsgs << msgId;
- return true;
- } else if(_validBuffers.contains(redirectedTo)) {
- return true;
+ BufferId redirectedTo = Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>();
+ if(redirectedTo.isValid())
+ sourceModel()->setData(sourceIdx, QVariant::fromValue<BufferId>(redirectedTo), MessageModel::RedirectedToRole);
}
- }
- QSet<BufferId>::const_iterator idIter = _validBuffers.constBegin();
- while(idIter != _validBuffers.constEnd()) {
- if(inStatusBuffer && Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer)
+ if(_validBuffers.contains(redirectedTo))
return true;
- idIter++;
+ }
+
+ if(redirectionTarget & BufferSettings::StatusBuffer) {
+ QSet<BufferId>::const_iterator idIter = _validBuffers.constBegin();
+ while(idIter != _validBuffers.constEnd()) {
+ if(Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer)
+ return true;
+ idIter++;
+ }
}
return false;