/***************************************************************************
- * 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 "buffersettings.h"
#include "client.h"
+#include "buffermodel.h"
#include "messagemodel.h"
#include "networkmodel.h"
}
void MessageFilter::init() {
+ setDynamicSortFilter(true);
+
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()));
if(mySettings.hasFilter())
_messageTypeFilter = mySettings.messageFilter();
mySettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged()));
+ mySettings.notify("hasMessageTypeFilter", this, SLOT(messageTypeFilterChanged()));
}
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<BufferId> bufferIds = _validBuffers.toList();;
+ QList<BufferId> bufferIds = _validBuffers.toList();
qSort(bufferIds);
-
+
QStringList bufferIdStrings;
foreach(BufferId id, bufferIds)
bufferIdStrings << QString::number(id.toInt());
if(_validBuffers.isEmpty())
return true;
- BufferId id = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value<BufferId>();
- if(!id.isValid()) {
+ BufferId bufferId = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value<BufferId>();
+ if(!bufferId.isValid()) {
return true;
}
- if(_validBuffers.contains(id)) {
+ MsgId msgId = sourceModel()->data(sourceIdx, MessageModel::MsgIdRole).value<MsgId>();
+ 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<BufferId>();
+ if(!redirectedTo.isValid()) {
+ BufferId redirectedTo = Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>();
+ if(redirectedTo.isValid())
+ sourceModel()->setData(sourceIdx, QVariant::fromValue<BufferId>(redirectedTo), MessageModel::RedirectedToRole);
+ }
+
+ if(_validBuffers.contains(redirectedTo))
+ return true;
+ }
+
+ 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;
+ }
+
+
+ if(_validBuffers.contains(bufferId)) {
return true;
} else {
// show Quit messages in Query buffers:
return false;
if(!(messageType & Message::Quit))
return false;
- if(networkId() != Client::networkModel()->networkId(id))
+
+ if(myNetworkId != msgNetworkId)
return false;
uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value<QDateTime>().toTime_t();