+ QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2);
+ Message::Type messageType = (Message::Type)sourceModel()->data(sourceIdx, MessageModel::TypeRole).toInt();
+
+ // apply message type filter
+ if(_messageTypeFilter & messageType)
+ return false;
+
+ if(_validBuffers.isEmpty())
+ return true;
+
+ 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;
+ 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;
+ }
+ }
+ 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))
+ return true;
+
+ if(inCurrentBuffer && !(flags & Message::Backlog) && _validBuffers.contains(Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>())) {
+ 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;
+ }
+ }
+
+ QSet<BufferId>::const_iterator idIter = _validBuffers.constBegin();
+ while(idIter != _validBuffers.constEnd()) {
+ if(inStatusBuffer && 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);
+ return true;
+ }
+}
+
+void MessageFilter::requestBacklog() {
+ QSet<BufferId>::const_iterator bufferIdIter = _validBuffers.constBegin();
+ while(bufferIdIter != _validBuffers.constEnd()) {
+ Client::messageModel()->requestBacklog(*bufferIdIter);
+ bufferIdIter++;
+ }