when renaming a buffer to a matching known irc user, the on/offline state is now...
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 11 Jan 2009 15:47:13 +0000 (16:47 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 11 Jan 2009 15:47:13 +0000 (16:47 +0100)
src/client/networkmodel.cpp
src/client/networkmodel.h
src/core/ircserverhandler.cpp

index b52ab3a..97deb99 100644 (file)
@@ -143,7 +143,7 @@ void NetworkItem::attachIrcUser(IrcUser *ircUser) {
       continue;
 
     if(queryItem->bufferName().toLower() == ircUser->nick().toLower()) {
       continue;
 
     if(queryItem->bufferName().toLower() == ircUser->nick().toLower()) {
-      queryItem->attachIrcUser(ircUser);
+      queryItem->setIrcUser(ircUser);
       break;
     }
   }
       break;
     }
   }
@@ -310,8 +310,7 @@ QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *pare
     return;
 
   IrcUser *ircUser = net->ircUser(bufferInfo.bufferName());
     return;
 
   IrcUser *ircUser = net->ircUser(bufferInfo.bufferName());
-  if(ircUser)
-    attachIrcUser(ircUser);
+  setIrcUser(ircUser);
 }
 
 QVariant QueryBufferItem::data(int column, int role) const {
 }
 
 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<NetworkId>();
+  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);
 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("<p> %1 </p>").arg(toolTip.join("<br />"));
 }
 
   return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
 }
 
-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;
   _ircUser = ircUser;
-  connect(_ircUser, SIGNAL(quited()), this, SLOT(ircUserQuited()));
-  connect(_ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged()));
   emit dataChanged();
 }
 
   emit dataChanged();
 }
 
-void QueryBufferItem::ircUserQuited() {
+void QueryBufferItem::removeIrcUser() {
   _ircUser = 0;
   emit dataChanged();
 }
   _ircUser = 0;
   emit dataChanged();
 }
index 4c78878..c678bae 100644 (file)
@@ -89,7 +89,7 @@ public:
   inline BufferId bufferId() const { return _bufferInfo.bufferId(); }
   inline BufferInfo::Type bufferType() const { return _bufferInfo.type(); }
 
   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; }
   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 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 inline bool isActive() const { return (bool)_ircUser; }
   virtual QString toolTip(int column) const;
 
+  virtual void setBufferName(const QString &name);
+
 public slots:
 public slots:
-  void attachIrcUser(IrcUser *ircUser);
-  void ircUserQuited();
+  void setIrcUser(IrcUser *ircUser);
+  void removeIrcUser();
 
 private:
   IrcUser *_ircUser;
 
 private:
   IrcUser *_ircUser;
index 4d706d6..8a093f6 100644 (file)
@@ -306,11 +306,15 @@ void IrcServerHandler::handleNick(const QString &prefix, const QList<QByteArray>
     ? newnick
     : prefix;
 
     ? 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);
   coreSession()->renameBuffer(network()->networkId(), newnick, oldnick);
+
   foreach(QString channel, ircuser->channels())
     emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender);
   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<QByteArray> &params) {
 }
 
 void IrcServerHandler::handleNotice(const QString &prefix, const QList<QByteArray> &params) {