X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=ae4409193935cb3420018fe8ec887b1395966558;hb=27b9b5de238731138578ddef6c1d7de968b7ace7;hp=ee333cee45826f471262551e60bd834fd9f0cb27;hpb=453ccab6ade4a21c7aa3c331af893c91468250a4;p=quassel.git diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index ee333cee..ae440919 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -45,6 +45,7 @@ NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent) // as we "sync" the dataChanged() signals of NetworkItem and StatusBufferItem setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); connect(this, SIGNAL(networkDataChanged(int)), this, SIGNAL(dataChanged(int))); + connect(this, SIGNAL(beginRemoveChilds(int, int)), this, SLOT(onBeginRemoveChilds(int, int))); } QVariant NetworkItem::data(int column, int role) const { @@ -797,6 +798,12 @@ NetworkModel::NetworkModel(QObject *parent) this, SLOT(checkForNewBuffers(const QModelIndex &, int, int))); connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), this, SLOT(checkForRemovedBuffers(const QModelIndex &, int, int))); + + BufferSettings defaultSettings; + defaultSettings.notify("UserNoticesTarget", this, SLOT(messageRedirectionSettingsChanged())); + defaultSettings.notify("ServerNoticesTarget", this, SLOT(messageRedirectionSettingsChanged())); + defaultSettings.notify("ErrorMsgsTarget", this, SLOT(messageRedirectionSettingsChanged())); + messageRedirectionSettingsChanged(); } QListNetworkModel::defaultHeader() { @@ -964,6 +971,7 @@ MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) { BufferItem *bufferItem = findBufferItem(bufferId); if(!bufferItem) { qDebug() << "NetworkModel::lastSeenMsgId(): buffer is unknown:" << bufferId; + Client::purgeKnownBufferIds(); return MsgId(); } return bufferItem->lastSeenMsgId(); @@ -973,16 +981,66 @@ void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId BufferItem *bufferItem = findBufferItem(bufferId); if(!bufferItem) { qDebug() << "NetworkModel::setLastSeenMsgId(): buffer is unknown:" << bufferId; + Client::purgeKnownBufferIds(); return; } bufferItem->setLastSeenMsgId(msgId); } -void NetworkModel::updateBufferActivity(const Message &msg) { - BufferItem *item = bufferItem(msg.bufferInfo()); - item->updateActivityLevel(msg); - if(item->isCurrentBuffer()) - emit setLastSeenMsg(item->bufferId(), msg.msgId()); +void NetworkModel::updateBufferActivity(Message &msg) { + int redirectionTarget = 0; + switch(msg.type()) { + case Message::Notice: + if(bufferType(msg.bufferId()) != BufferInfo::ChannelBuffer) { + msg.setFlags(msg.flags() | Message::Redirected); + if(msg.flags() & Message::ServerMsg) { + // server notice + redirectionTarget = _serverNoticesTarget; + } else { + redirectionTarget = _userNoticesTarget; + } + } + break; + case Message::Error: + msg.setFlags(msg.flags() | Message::Redirected); + redirectionTarget = _errorMsgsTarget; + break; + // Update IrcUser's last activity + case Message::Plain: + case Message::Action: + if(bufferType(msg.bufferId()) == BufferInfo::ChannelBuffer) { + const Network *net = Client::network(msg.bufferInfo().networkId()); + IrcUser *user = net ? net->ircUser(nickFromMask(msg.sender())) : 0; + if(user) + user->setLastChannelActivity(msg.bufferId(), msg.timestamp()); + } + break; + default: + break; + } + + if(msg.flags() & Message::Redirected) { + if(redirectionTarget & BufferSettings::DefaultBuffer) + updateBufferActivity(bufferItem(msg.bufferInfo()), msg); + + if(redirectionTarget & BufferSettings::StatusBuffer) { + const NetworkItem *netItem = findNetworkItem(msg.bufferInfo().networkId()); + if(netItem) { + updateBufferActivity(netItem->statusBufferItem(), msg); + } + } + } else { + updateBufferActivity(bufferItem(msg.bufferInfo()), msg); + } +} + +void NetworkModel::updateBufferActivity(BufferItem *bufferItem, const Message &msg) { + if(!bufferItem) + return; + + bufferItem->updateActivityLevel(msg); + if(bufferItem->isCurrentBuffer()) + emit setLastSeenMsg(bufferItem->bufferId(), msg.msgId()); } void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel level) { @@ -1118,3 +1176,10 @@ bool NetworkModel::bufferItemLessThan(const BufferItem *left, const BufferItem * return QString::compare(left->bufferName(), right->bufferName(), Qt::CaseInsensitive) < 0; } +void NetworkModel::messageRedirectionSettingsChanged() { + BufferSettings bufferSettings; + + _userNoticesTarget = bufferSettings.userNoticesTarget(); + _serverNoticesTarget = bufferSettings.serverNoticesTarget(); + _errorMsgsTarget = bufferSettings.errorMsgsTarget(); +}