From af456476e906a564d9faf3381b8bc3111fdb2bbd Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Fri, 14 Nov 2008 00:56:20 +0100 Subject: [PATCH] Impelementing proper message redirection. you can now individualy specify if user notices, server notices or errors should be displayed in their original target, the status buffer or the currently selected buffer. --- src/client/messagefilter.cpp | 109 +++++++++++++++++- src/client/messagefilter.h | 14 +++ src/client/messagemodel.cpp | 15 +++ src/client/messagemodel.h | 4 +- src/common/message.h | 1 + src/qtui/chatlinemodelitem.h | 1 - .../settingspages/generalsettingspage.cpp | 6 +- 7 files changed, 140 insertions(+), 10 deletions(-) diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 79d6e9dd..e39b796f 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -22,6 +22,7 @@ #include "buffersettings.h" #include "client.h" +#include "buffermodel.h" #include "messagemodel.h" #include "networkmodel.h" @@ -46,6 +47,18 @@ void MessageFilter::init() { BufferSettings defaultSettings; _messageTypeFilter = defaultSettings.messageFilter(); defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + defaultSettings.notify("UserNoticesInDefaultBuffer", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("UserNoticesInStatusBuffer", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("UserNoticesInCurrentBuffer", this, SLOT(messageRedirectionChanged())); + + defaultSettings.notify("serverNoticesInDefaultBuffer", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("serverNoticesInStatusBuffer", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("serverNoticesInCurrentBuffer", this, SLOT(messageRedirectionChanged())); + + defaultSettings.notify("ErrorMsgsInDefaultBuffer", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("ErrorMsgsInStatusBuffer", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("ErrorMsgsInCurrentBuffer", this, SLOT(messageRedirectionChanged())); + messageRedirectionChanged(); BufferSettings mySettings(idString()); if(mySettings.hasFilter()) @@ -69,13 +82,30 @@ void MessageFilter::messageTypeFilterChanged() { } } +void MessageFilter::messageRedirectionChanged() { + BufferSettings bufferSettings; + _userNoticesInDefaultBuffer = bufferSettings.value("UserNoticesInDefaultBuffer", QVariant(true)).toBool(); + _userNoticesInStatusBuffer = bufferSettings.value("UserNoticesInStatusBuffer", QVariant(false)).toBool(); + _userNoticesInCurrentBuffer = bufferSettings.value("UserNoticesInCurrentBuffer", QVariant(false)).toBool(); + + _serverNoticesInDefaultBuffer = bufferSettings.value("ServerNoticesInDefaultBuffer", QVariant(false)).toBool(); + _serverNoticesInStatusBuffer = bufferSettings.value("ServerNoticesInStatusBuffer", QVariant(true)).toBool(); + _serverNoticesInCurrentBuffer = bufferSettings.value("ServerNoticesInCurrentBuffer", QVariant(false)).toBool(); + + _errorMsgsInDefaultBuffer = bufferSettings.value("ErrorMsgsInDefaultBuffer", QVariant(true)).toBool(); + _errorMsgsInStatusBuffer = bufferSettings.value("ErrorMsgsInStatusBuffer", QVariant(false)).toBool(); + _errorMsgsInCurrentBuffer = bufferSettings.value("ErrorMsgsInCurrentBuffer", QVariant(false)).toBool(); + + invalidateFilter(); +} + QString MessageFilter::idString() const { if(_validBuffers.isEmpty()) return "*"; QList bufferIds = _validBuffers.toList();; qSort(bufferIds); - + QStringList bufferIdStrings; foreach(BufferId id, bufferIds) bufferIdStrings << QString::number(id.toInt()); @@ -95,12 +125,80 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar if(_validBuffers.isEmpty()) return true; - BufferId id = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value(); - if(!id.isValid()) { + BufferId bufferId = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value(); + if(!bufferId.isValid()) { return true; } - if(_validBuffers.contains(id)) { + MsgId msgId = sourceModel()->data(sourceIdx, MessageModel::MsgIdRole).value(); + 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 redirectedTo = sourceModel()->data(sourceIdx, MessageModel::RedirectedToRole).value(); + if(!redirectedTo.isValid()) { + sourceModel()->setData(sourceIdx, QVariant::fromValue(singleBufferId()), MessageModel::RedirectedToRole); + _redirectedMsgs << msgId; + return true; + } else if(_validBuffers.contains(redirectedTo)) { + return true; + } + } + + QSet::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: @@ -108,7 +206,8 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar return false; if(!(messageType & Message::Quit)) return false; - if(networkId() != Client::networkModel()->networkId(id)) + + if(myNetworkId != msgNetworkId) return false; uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); diff --git a/src/client/messagefilter.h b/src/client/messagefilter.h index 342fb86d..c173a8c6 100644 --- a/src/client/messagefilter.h +++ b/src/client/messagefilter.h @@ -46,6 +46,7 @@ public: public slots: void messageTypeFilterChanged(); + void messageRedirectionChanged(); void requestBacklog(); protected: @@ -57,8 +58,21 @@ private: void init(); QSet _validBuffers; + mutable QSet _redirectedMsgs; QMultiHash _filteredQuitMsgs; int _messageTypeFilter; + + bool _userNoticesInDefaultBuffer; + bool _userNoticesInStatusBuffer; + bool _userNoticesInCurrentBuffer; + + bool _serverNoticesInDefaultBuffer; + bool _serverNoticesInStatusBuffer; + bool _serverNoticesInCurrentBuffer; + + bool _errorMsgsInDefaultBuffer; + bool _errorMsgsInStatusBuffer; + bool _errorMsgsInCurrentBuffer; }; #endif diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 13e69007..8dfaf015 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -395,6 +395,8 @@ MessageModelItem::MessageModelItem(const Message &msg) : _type(msg.type()), _flags(msg.flags()) { + if(!msg.sender().contains('!')) + _flags |= Message::ServerMsg; } QVariant MessageModelItem::data(int column, int role) const { @@ -407,10 +409,23 @@ QVariant MessageModelItem::data(int column, int role) const { case MessageModel::TypeRole: return _type; case MessageModel::FlagsRole: return (int)_flags; case MessageModel::TimestampRole: return _timestamp; + case MessageModel::RedirectedToRole: return qVariantFromValue(_redirectedTo); default: return QVariant(); } } +bool MessageModelItem::setData(int column, const QVariant &value, int role) { + Q_UNUSED(column); + + switch(role) { + case MessageModel::RedirectedToRole: + _redirectedTo = value.value(); + return true; + default: + return false; + } +} + // Stuff for later bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelItem *m2){ diff --git a/src/client/messagemodel.h b/src/client/messagemodel.h index 0f25fa8c..c7c975d8 100644 --- a/src/client/messagemodel.h +++ b/src/client/messagemodel.h @@ -44,6 +44,7 @@ public: TimestampRole, FormatRole, ColumnTypeRole, + RedirectedToRole, UserRole }; @@ -105,7 +106,7 @@ public: inline virtual ~MessageModelItem() {} virtual QVariant data(int column, int role) const; - virtual bool setData(int column, const QVariant &value, int role) = 0; + virtual bool setData(int column, const QVariant &value, int role); inline const QDateTime &timeStamp() const { return _timestamp; } inline MsgId msgId() const { return _msgId; } @@ -123,6 +124,7 @@ private: QDateTime _timestamp; MsgId _msgId; BufferId _bufferId; + BufferId _redirectedTo; Message::Type _type; Message::Flags _flags; }; diff --git a/src/common/message.h b/src/common/message.h index 4d283ad6..1d366a2e 100644 --- a/src/common/message.h +++ b/src/common/message.h @@ -55,6 +55,7 @@ public: Self = 0x01, Highlight = 0x02, Redirected = 0x04, + ServerMsg = 0x08, Backlog = 0x80 }; Q_DECLARE_FLAGS(Flags, Flag) diff --git a/src/qtui/chatlinemodelitem.h b/src/qtui/chatlinemodelitem.h index 922e1834..864c1d5f 100644 --- a/src/qtui/chatlinemodelitem.h +++ b/src/qtui/chatlinemodelitem.h @@ -33,7 +33,6 @@ public: ChatLineModelItem(const Message &); ~ChatLineModelItem(); virtual QVariant data(int column, int role) const; - virtual inline bool setData(int column, const QVariant &value, int role) { Q_UNUSED(column); Q_UNUSED(value); Q_UNUSED(role); return false; } private: ChatLineModelItemPrivate *_data; diff --git a/src/qtui/settingspages/generalsettingspage.cpp b/src/qtui/settingspages/generalsettingspage.cpp index f7c55e3a..9b232bdd 100644 --- a/src/qtui/settingspages/generalsettingspage.cpp +++ b/src/qtui/settingspages/generalsettingspage.cpp @@ -116,9 +116,9 @@ void GeneralSettingsPage::load() { SettingsPage::load(ui.userNoticesInStatusBuffer, bufferSettings.value("UserNoticesInStatusBuffer", QVariant(false)).toBool()); SettingsPage::load(ui.userNoticesInCurrentBuffer, bufferSettings.value("UserNoticesInCurrentBuffer", QVariant(false)).toBool()); - SettingsPage::load(ui.serverNoticesInDefaultBuffer, bufferSettings.value("serverNoticesInDefaultBuffer", QVariant(false)).toBool()); - SettingsPage::load(ui.serverNoticesInStatusBuffer, bufferSettings.value("serverNoticesInStatusBuffer", QVariant(true)).toBool()); - SettingsPage::load(ui.serverNoticesInCurrentBuffer, bufferSettings.value("serverNoticesInCurrentBuffer", QVariant(false)).toBool()); + SettingsPage::load(ui.serverNoticesInDefaultBuffer, bufferSettings.value("ServerNoticesInDefaultBuffer", QVariant(false)).toBool()); + SettingsPage::load(ui.serverNoticesInStatusBuffer, bufferSettings.value("ServerNoticesInStatusBuffer", QVariant(true)).toBool()); + SettingsPage::load(ui.serverNoticesInCurrentBuffer, bufferSettings.value("ServerNoticesInCurrentBuffer", QVariant(false)).toBool()); SettingsPage::load(ui.errorMsgsInDefaultBuffer, bufferSettings.value("ErrorMsgsInDefaultBuffer", QVariant(true)).toBool()); SettingsPage::load(ui.errorMsgsInStatusBuffer, bufferSettings.value("ErrorMsgsInStatusBuffer", QVariant(false)).toBool()); -- 2.20.1