X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagefilter.cpp;h=526145f161d3786a52b490c1a1265957d64c3cae;hp=55f609c7f7f08bf2e07eb3a72de35734fca4e854;hb=694f9bfbf7f1af19108461c7e00d133e55082bce;hpb=61c8d84d1c849373e0f115dc748ed45cff95287d diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 55f609c7..526145f1 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -28,205 +28,219 @@ #include "clientignorelistmanager.h" MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) - : QSortFilterProxyModel(parent), + : QSortFilterProxyModel(parent), _messageTypeFilter(0) { - init(); - setSourceModel(source); + init(); + setSourceModel(source); } + MessageFilter::MessageFilter(MessageModel *source, const QList &buffers, QObject *parent) - : QSortFilterProxyModel(parent), + : QSortFilterProxyModel(parent), _validBuffers(buffers.toSet()), _messageTypeFilter(0) { - init(); - setSourceModel(source); + init(); + setSourceModel(source); } -void MessageFilter::init() { - setDynamicSortFilter(true); - _userNoticesTarget = _serverNoticesTarget = _errorMsgsTarget = -1; +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(); + 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())); + _messageTypeFilter = defaultSettings.messageFilter(); + defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); - BufferSettings mySettings(idString()); - if(mySettings.hasFilter()) - _messageTypeFilter = mySettings.messageFilter(); - mySettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); - mySettings.notify("hasMessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + BufferSettings mySettings(idString()); + if (mySettings.hasFilter()) + _messageTypeFilter = mySettings.messageFilter(); + mySettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + mySettings.notify("hasMessageTypeFilter", 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; - _filteredQuitMsgs.clear(); - invalidateFilter(); - } +void MessageFilter::messageTypeFilterChanged() +{ + int newFilter; + BufferSettings defaultSettings; + newFilter = BufferSettings().messageFilter(); + + BufferSettings mySettings(idString()); + if (mySettings.hasFilter()) + newFilter = mySettings.messageFilter(); + + if (_messageTypeFilter != newFilter) { + _messageTypeFilter = newFilter; + _filteredQuitMsgs.clear(); + invalidateFilter(); + } } -void MessageFilter::messageRedirectionChanged() { - BufferSettings bufferSettings; - bool changed = false; - if(_userNoticesTarget != bufferSettings.userNoticesTarget()) { - _userNoticesTarget = bufferSettings.userNoticesTarget(); - changed = true; - } +void MessageFilter::messageRedirectionChanged() +{ + BufferSettings bufferSettings; + bool changed = false; - if(_serverNoticesTarget != bufferSettings.serverNoticesTarget()) { - _serverNoticesTarget = bufferSettings.serverNoticesTarget(); - changed = true; - } + if (_userNoticesTarget != bufferSettings.userNoticesTarget()) { + _userNoticesTarget = bufferSettings.userNoticesTarget(); + changed = true; + } - if(_errorMsgsTarget != bufferSettings.errorMsgsTarget()) { - _errorMsgsTarget = bufferSettings.errorMsgsTarget(); - changed = true; - } + if (_serverNoticesTarget != bufferSettings.serverNoticesTarget()) { + _serverNoticesTarget = bufferSettings.serverNoticesTarget(); + changed = true; + } + + if (_errorMsgsTarget != bufferSettings.errorMsgsTarget()) { + _errorMsgsTarget = bufferSettings.errorMsgsTarget(); + changed = true; + } - if(changed) - invalidateFilter(); + if (changed) + invalidateFilter(); } -QString MessageFilter::idString() const { - if(_validBuffers.isEmpty()) - return "*"; - QList bufferIds = _validBuffers.toList(); - qSort(bufferIds); +QString MessageFilter::idString() const +{ + if (_validBuffers.isEmpty()) + return "*"; - QStringList bufferIdStrings; - foreach(BufferId id, bufferIds) + QList bufferIds = _validBuffers.toList(); + qSort(bufferIds); + + QStringList bufferIdStrings; + foreach(BufferId id, bufferIds) bufferIdStrings << QString::number(id.toInt()); - return bufferIdStrings.join("|"); + return bufferIdStrings.join("|"); } -bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - Q_UNUSED(sourceParent); - QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2); - Message::Type messageType = (Message::Type)sourceIdx.data(MessageModel::TypeRole).toInt(); - - // apply message type filter - if(_messageTypeFilter & messageType) - return false; - - if(_validBuffers.isEmpty()) - return true; - - BufferId bufferId = sourceIdx.data(MessageModel::BufferIdRole).value(); - if(!bufferId.isValid()) { - return true; - } - - // MsgId msgId = sourceIdx.data(MessageModel::MsgIdRole).value(); - Message::Flags flags = (Message::Flags)sourceIdx.data(MessageModel::FlagsRole).toInt(); - - NetworkId myNetworkId = networkId(); - NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId); - if(myNetworkId != msgNetworkId) - return false; - - // 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(), 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; - } - if(redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId)) - return true; +bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + Q_UNUSED(sourceParent); + QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2); + Message::Type messageType = (Message::Type)sourceIdx.data(MessageModel::TypeRole).toInt(); - 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); - } + // apply message type filter + if (_messageTypeFilter & messageType) + return false; - if(_validBuffers.contains(redirectedTo)) + if (_validBuffers.isEmpty()) 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++; - } + BufferId bufferId = sourceIdx.data(MessageModel::BufferIdRole).value(); + if (!bufferId.isValid()) { + return true; } - return false; - } + // MsgId msgId = sourceIdx.data(MessageModel::MsgIdRole).value(); + Message::Flags flags = (Message::Flags)sourceIdx.data(MessageModel::FlagsRole).toInt(); + + NetworkId myNetworkId = networkId(); + NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId); + if (myNetworkId != msgNetworkId) + return false; + + // 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(), 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; + } + if (redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId)) + return true; - if(_validBuffers.contains(bufferId)) { - return true; - } else { - // show Quit messages in Query buffers: - if(bufferType() != BufferInfo::QueryBuffer) - return false; - if(!(messageType & Message::Quit)) - return false; + 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(myNetworkId != msgNetworkId) - return false; + if (_validBuffers.contains(redirectedTo)) + return true; + } - uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); - QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty).toLower(); - if(quiter != bufferName().toLower()) - return false; + if (redirectionTarget & BufferSettings::StatusBuffer) { + QSet::const_iterator idIter = _validBuffers.constBegin(); + while (idIter != _validBuffers.constEnd()) { + if (Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer) + return true; + idIter++; + } + } - if(_filteredQuitMsgs.contains(quiter, messageTimestamp)) - return false; + return false; + } - MessageFilter *that = const_cast(this); - that->_filteredQuitMsgs.insert(quiter, messageTimestamp); - return true; - } + if (_validBuffers.contains(bufferId)) { + return true; + } + else { + // show Quit messages in Query buffers: + if (bufferType() != BufferInfo::QueryBuffer) + return false; + if (!(messageType & Message::Quit)) + return false; + + if (myNetworkId != msgNetworkId) + return false; + + uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); + QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty).toLower(); + if (quiter != bufferName().toLower()) + return false; + + if (_filteredQuitMsgs.contains(quiter, messageTimestamp)) + return false; + + MessageFilter *that = const_cast(this); + that->_filteredQuitMsgs.insert(quiter, messageTimestamp); + return true; + } } -void MessageFilter::requestBacklog() { - QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); - while(bufferIdIter != _validBuffers.constEnd()) { - Client::messageModel()->requestBacklog(*bufferIdIter); - bufferIdIter++; - } + +void MessageFilter::requestBacklog() +{ + QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); + while (bufferIdIter != _validBuffers.constEnd()) { + Client::messageModel()->requestBacklog(*bufferIdIter); + bufferIdIter++; + } }