+ BufferId bufferId = sourceModel()->data(sourceIdx, 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();
+
+ NetworkId myNetworkId = networkId();
+ NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId);
+ if(myNetworkId != msgNetworkId)
+ return false;
+
+ bool redirect = false;
+ int redirectionTarget = 0;
+ switch(messageType) {
+ case Message::Notice:
+ if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
+ redirect = true;
+ if(flags & Message::ServerMsg) {
+ // server notice
+ redirectionTarget = _serverNoticesTarget;
+ } else {
+ redirectionTarget = _userNoticesTarget;
+ }
+ }
+ break;
+ case Message::Error:
+ redirect = true;
+ redirectionTarget = _errorMsgsTarget;
+ break;
+ default:
+ break;
+ }
+
+ if(redirect) {
+
+ 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:
+ 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<QDateTime>().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<MessageFilter *>(this);
+ that->_filteredQuitMsgs.insert(quiter, messageTimestamp);