+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<BufferId>();
+ if (!bufferId.isValid()) {
+ return true;
+ }
+
+ // MsgId msgId = sourceIdx.data(MessageModel::MsgIdRole).value<MsgId>();
+ 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<Message>(), 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 (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);
+ }