From 7e20c659f88e26ccdfdc65f4894ed6ecf61ca8a9 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Tue, 10 Feb 2009 00:37:40 +0100 Subject: [PATCH] activity updates respect now the redirection settings --- src/client/abstractmessageprocessor.h | 5 ++- src/client/messagefilter.cpp | 39 ++++++++--------- src/client/networkmodel.cpp | 62 ++++++++++++++++++++++++--- src/client/networkmodel.h | 12 +++++- src/qtui/qtuimessageprocessor.cpp | 4 +- 5 files changed, 91 insertions(+), 31 deletions(-) diff --git a/src/client/abstractmessageprocessor.h b/src/client/abstractmessageprocessor.h index ff9daadf..b38138e2 100644 --- a/src/client/abstractmessageprocessor.h +++ b/src/client/abstractmessageprocessor.h @@ -37,7 +37,10 @@ public slots: virtual void process(QList &msgs) = 0; protected: - inline void postProcess(Message &msg) { Client::networkModel()->updateBufferActivity(msg); } + // updateBufferActivity also sets the Message::Redirected flag which is later used + // to determine where a message should be displayed. therefore it's crucial that it + // is called before inserting the message into the model + inline void preProcess(Message &msg) { Client::networkModel()->updateBufferActivity(msg); } }; #endif diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index c9c44d16..323405e1 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -140,29 +140,26 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar 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; + + 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; } - break; - case Message::Error: - redirect = true; - redirectionTarget = _errorMsgsTarget; - break; - default: - break; - } - - if(redirect) { if(redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId)) return true; diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 939fcb1d..8b087d58 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -798,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() { @@ -979,11 +985,50 @@ void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId 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; + 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) { @@ -1119,3 +1164,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(); +} diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index f763a21c..8be6b854 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -56,6 +56,7 @@ public: BufferItem *findBufferItem(BufferId bufferId); inline BufferItem *findBufferItem(const BufferInfo &bufferInfo) { return findBufferItem(bufferInfo.bufferId()); } BufferItem *bufferItem(const BufferInfo &bufferInfo); + inline StatusBufferItem *statusBufferItem() const { return _statusBufferItem; } public slots: void setNetworkName(const QString &networkName); @@ -70,7 +71,7 @@ signals: private slots: void onBeginRemoveChilds(int start, int end); - + private: NetworkId _networkId; StatusBufferItem *_statusBufferItem; @@ -327,7 +328,7 @@ public slots: void setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId); void setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel activity); void clearBufferActivity(const BufferId &bufferId); - void updateBufferActivity(const Message &msg); + void updateBufferActivity(Message &msg); void networkRemoved(const NetworkId &networkId); signals: @@ -336,6 +337,7 @@ signals: private slots: void checkForRemovedBuffers(const QModelIndex &parent, int start, int end); void checkForNewBuffers(const QModelIndex &parent, int start, int end); + void messageRedirectionSettingsChanged(); private: int networkRow(NetworkId networkId) const; @@ -345,9 +347,15 @@ private: BufferItem *findBufferItem(BufferId bufferId) const; BufferItem *bufferItem(const BufferInfo &bufferInfo); + void updateBufferActivity(BufferItem *bufferItem, const Message &msg); + static bool bufferItemLessThan(const BufferItem *left, const BufferItem *right); QHash _bufferItemCache; + + int _userNoticesTarget; + int _serverNoticesTarget; + int _errorMsgsTarget; }; Q_DECLARE_OPERATORS_FOR_FLAGS(NetworkModel::ItemTypes) diff --git a/src/qtui/qtuimessageprocessor.cpp b/src/qtui/qtuimessageprocessor.cpp index 3aa3acd2..2466e15d 100644 --- a/src/qtui/qtuimessageprocessor.cpp +++ b/src/qtui/qtuimessageprocessor.cpp @@ -56,8 +56,8 @@ void QtUiMessageProcessor::reset() { void QtUiMessageProcessor::process(Message &msg) { checkForHighlight(msg); + preProcess(msg); Client::messageModel()->insertMessage(msg); - postProcess(msg); } void QtUiMessageProcessor::process(QList &msgs) { @@ -65,7 +65,7 @@ void QtUiMessageProcessor::process(QList &msgs) { QList::iterator msgIterEnd = msgs.end(); while(msgIter != msgIterEnd) { checkForHighlight(*msgIter); - postProcess(*msgIter); + preProcess(*msgIter); msgIter++; } Client::messageModel()->insertMessages(msgs); -- 2.20.1