-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();
-
- // 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;
- }