From e9189ebd5af607385629d3aa74dc9fc15bb642f4 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Tue, 26 Feb 2008 15:57:40 +0000 Subject: [PATCH] Redirection of certain messages to different targets is now possible. You can chose wheter the message should be displayed in the current buffer, the status buffer or the original target. The settings apply currently to notices and error messages like "no such nick or channel" --- src/client/client.cpp | 86 ++++++++++++++++--- src/client/client.h | 3 + .../settingspages/generalsettingspage.cpp | 6 +- src/qtui/settingspages/generalsettingspage.ui | 2 +- version.inc | 2 +- 5 files changed, 81 insertions(+), 18 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index a2988ed8..24f1726c 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -33,6 +33,7 @@ #include "quasselui.h" #include "signalproxy.h" #include "util.h" +#include "buffersettings.h" QPointer Client::instanceptr = 0; AccountId Client::_currentCoreAccount = 0; @@ -142,7 +143,13 @@ QList Client::buffers() { } -// FIXME remove +Buffer *Client::statusBuffer(const NetworkId &networkId) const { + if(_statusBuffers.contains(networkId)) + return _statusBuffers[networkId]; + else + return 0; +} + Buffer *Client::buffer(BufferId bufferId) { if(instance()->_buffers.contains(bufferId)) return instance()->_buffers[bufferId]; @@ -150,16 +157,17 @@ Buffer *Client::buffer(BufferId bufferId) { return 0; } -// FIXME remove Buffer *Client::buffer(BufferInfo bufferInfo) { Buffer *buff = buffer(bufferInfo.bufferId()); if(!buff) { Client *client = Client::instance(); buff = new Buffer(bufferInfo, client); - connect(buff, SIGNAL(destroyed()), - client, SLOT(bufferDestroyed())); + connect(buff, SIGNAL(destroyed()), client, SLOT(bufferDestroyed())); client->_buffers[bufferInfo.bufferId()] = buff; + if(bufferInfo.type() == BufferInfo::StatusBuffer) + client->_statusBuffers[bufferInfo.networkId()] = buff; + emit client->bufferUpdated(bufferInfo); // I don't like this: but currently there isn't really a prettier way: @@ -327,6 +335,8 @@ void Client::disconnectFromCore() { } Q_ASSERT(_buffers.isEmpty()); + _statusBuffers.clear(); + QHash::iterator netIter = _networks.begin(); while(netIter != _networks.end()) { Network *net = netIter.value(); @@ -370,6 +380,15 @@ void Client::bufferDestroyed() { } iter++; } + + QHash::iterator statusIter = _statusBuffers.begin(); + while(statusIter != _statusBuffers.end()) { + if(statusIter.value() == buffer) { + statusIter = _statusBuffers.erase(statusIter); + break; + } + statusIter++; + } } void Client::networkDestroyed() { @@ -388,19 +407,55 @@ void Client::networkDestroyed() { void Client::recvMessage(const Message &message) { Message msg = message; Buffer *b; - - if(msg.type() == Message::Error) { - b = buffer(msg.bufferInfo().bufferId()); - if(!b) { - // FIXME: if buffer doesn't exist, forward the message to the status or current buffer - b = buffer(msg.bufferInfo()); + + checkForHighlight(msg); + + if(msg.flags() & Message::Redirected) { + BufferSettings bufferSettings; + bool inStatus = bufferSettings.value("UserMessagesInStatusBuffer", QVariant(true)).toBool(); + bool inQuery = bufferSettings.value("UserMessagesInQueryBuffer", QVariant(false)).toBool(); + bool inCurrent = bufferSettings.value("UserMessagesInCurrentBuffer", QVariant(false)).toBool(); + + if(inStatus) { + b = statusBuffer(msg.bufferInfo().networkId()); + if(b) { + b->appendMsg(msg); + } else if(!inQuery && !inCurrent) { // make sure the message get's shown somewhere + b = buffer(msg.bufferInfo()); + b->appendMsg(msg); + } + } + + if(inQuery) { + b = buffer(msg.bufferInfo().bufferId()); + if(b) { + b->appendMsg(msg); + } else if(!inStatus && !inCurrent) { // make sure the message get's shown somewhere + b = statusBuffer(msg.bufferInfo().networkId()); + if(!b) + b = buffer(msg.bufferInfo()); // seems like we have to create the buffer anyways... + b->appendMsg(msg); + } + } + + if(inCurrent) { + BufferId currentId = bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value(); + b = buffer(currentId); + if(b && currentId != msg.bufferInfo().bufferId() && !inQuery) { + b->appendMsg(msg); + } else if(!inStatus && !inQuery) { // make sure the message get's shown somewhere + b = statusBuffer(msg.bufferInfo().networkId()); + if(!b) + b = buffer(msg.bufferInfo()); // seems like we have to create the buffer anyways... + b->appendMsg(msg); + } } } else { + // the regular case: we can deliver where it was supposed to go b = buffer(msg.bufferInfo()); + b->appendMsg(msg); } - - checkForHighlight(msg); - b->appendMsg(msg); + //bufferModel()->updateBufferActivity(msg); if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) { @@ -420,6 +475,11 @@ void Client::recvStatusMsg(QString /*net*/, QString /*msg*/) { void Client::recvBacklogData(BufferInfo id, QVariantList msgs, bool /*done*/) { Buffer *b = buffer(id); + if(!b) { + qWarning() << "Client::recvBacklogData(): received Backlog for unknown Buffer:" << id; + return; + } + foreach(QVariant v, msgs) { Message msg = v.value(); checkForHighlight(msg); diff --git a/src/client/client.h b/src/client/client.h index 21e6102a..4d1bad6c 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -193,6 +193,8 @@ private: static void setCurrentCoreAccount(AccountId); static inline BufferSyncer *bufferSyncer() { return instance()->_bufferSyncer; } + Buffer *statusBuffer(const NetworkId &networkid) const; + static QPointer instanceptr; QPointer socket; @@ -208,6 +210,7 @@ private: bool _connectedToCore, _syncedToCore; QHash _buffers; + QHash _statusBuffers; // fast lookup QHash _networks; QHash _identities; diff --git a/src/qtui/settingspages/generalsettingspage.cpp b/src/qtui/settingspages/generalsettingspage.cpp index e8e6bfbb..53ed0514 100644 --- a/src/qtui/settingspages/generalsettingspage.cpp +++ b/src/qtui/settingspages/generalsettingspage.cpp @@ -50,9 +50,9 @@ GeneralSettingsPage::GeneralSettingsPage(QWidget *parent) connect(ui.displayTopicInTooltip, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); connect(ui.mouseWheelChangesBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - ui.userMessagesInStatusBuffer->setEnabled(false); - ui.userMessagesInQueryBuffer->setEnabled(false); - ui.userMessagesInCurrentBuffer->setEnabled(false); +// ui.userMessagesInStatusBuffer->setEnabled(false); +// ui.userMessagesInQueryBuffer->setEnabled(false); +// ui.userMessagesInCurrentBuffer->setEnabled(false); } bool GeneralSettingsPage::hasDefaults() const { diff --git a/src/qtui/settingspages/generalsettingspage.ui b/src/qtui/settingspages/generalsettingspage.ui index 4a4784e1..4620bb42 100644 --- a/src/qtui/settingspages/generalsettingspage.ui +++ b/src/qtui/settingspages/generalsettingspage.ui @@ -61,7 +61,7 @@ - Display user related messages: + Display user related messages and private Notices: diff --git a/version.inc b/version.inc index 96e2b8ad..959caa98 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-alpha1"; quasselDate = "2008-02-24"; - quasselBuild = 585; + quasselBuild = 586; //! Minimum client build number the core needs clientBuildNeeded = 563; -- 2.20.1