From e1d4e2bf7c368d84d853f33e5f55a72945cc7f6a Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sun, 11 Jan 2009 16:47:13 +0100 Subject: [PATCH] when renaming a buffer to a matching known irc user, the on/offline state is now displayed correctly --- src/client/networkmodel.cpp | 31 ++++++++++++++++++++++++------- src/client/networkmodel.h | 9 ++++++--- src/core/ircserverhandler.cpp | 8 ++++++-- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index b52ab3a2..97deb997 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -143,7 +143,7 @@ void NetworkItem::attachIrcUser(IrcUser *ircUser) { continue; if(queryItem->bufferName().toLower() == ircUser->nick().toLower()) { - queryItem->attachIrcUser(ircUser); + queryItem->setIrcUser(ircUser); break; } } @@ -310,8 +310,7 @@ QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *pare return; IrcUser *ircUser = net->ircUser(bufferInfo.bufferName()); - if(ircUser) - attachIrcUser(ircUser); + setIrcUser(ircUser); } QVariant QueryBufferItem::data(int column, int role) const { @@ -346,6 +345,14 @@ bool QueryBufferItem::setData(int column, const QVariant &value, int role) { } } +void QueryBufferItem::setBufferName(const QString &name) { + BufferItem::setBufferName(name); + NetworkId netId = data(0, NetworkModel::NetworkIdRole).value(); + const Network *net = Client::network(netId); + if(net) + setIrcUser(net->ircUser(name)); +} + QString QueryBufferItem::toolTip(int column) const { // pretty much code duplication of IrcUserItem::toolTip() but inheritance won't solve this... Q_UNUSED(column); @@ -381,14 +388,24 @@ QString QueryBufferItem::toolTip(int column) const { return QString("

%1

").arg(toolTip.join("
")); } -void QueryBufferItem::attachIrcUser(IrcUser *ircUser) { +void QueryBufferItem::setIrcUser(IrcUser *ircUser) { + if(_ircUser == ircUser) + return; + + if(_ircUser) { + disconnect(_ircUser, 0, this, 0); + } + + if(ircUser) { + connect(ircUser, SIGNAL(quited()), this, SLOT(removeIrcUser())); + connect(ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); + } + _ircUser = ircUser; - connect(_ircUser, SIGNAL(quited()), this, SLOT(ircUserQuited())); - connect(_ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); emit dataChanged(); } -void QueryBufferItem::ircUserQuited() { +void QueryBufferItem::removeIrcUser() { _ircUser = 0; emit dataChanged(); } diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 4c78878f..c678bae3 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -89,7 +89,7 @@ public: inline BufferId bufferId() const { return _bufferInfo.bufferId(); } inline BufferInfo::Type bufferType() const { return _bufferInfo.type(); } - void setBufferName(const QString &name); + virtual void setBufferName(const QString &name); virtual inline QString bufferName() const { return _bufferInfo.bufferName(); } virtual inline QString topic() const { return QString(); } virtual inline int nickCount() const { return 0; } @@ -141,12 +141,15 @@ public: virtual QVariant data(int column, int role) const; virtual bool setData(int column, const QVariant &value, int role); + virtual inline bool isActive() const { return (bool)_ircUser; } virtual QString toolTip(int column) const; + virtual void setBufferName(const QString &name); + public slots: - void attachIrcUser(IrcUser *ircUser); - void ircUserQuited(); + void setIrcUser(IrcUser *ircUser); + void removeIrcUser(); private: IrcUser *_ircUser; diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 4d706d69..8a093f62 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -306,11 +306,15 @@ void IrcServerHandler::handleNick(const QString &prefix, const QList ? newnick : prefix; + + // the order is cruicial + // otherwise the client would rename the buffer, see that the assigned ircuser doesn't match anymore + // and remove the ircuser from the querybuffer leading to a wrong on/offline state + ircuser->setNick(newnick); coreSession()->renameBuffer(network()->networkId(), newnick, oldnick); + foreach(QString channel, ircuser->channels()) emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender); - - ircuser->setNick(newnick); } void IrcServerHandler::handleNotice(const QString &prefix, const QList ¶ms) { -- 2.20.1