internal restructuring
[quassel.git] / src / client / networkmodel.cpp
index 940feb7..385e1bd 100644 (file)
 #include "signalproxy.h"
 #include "network.h"
 #include "ircchannel.h"
-#include "ircuser.h"
 
 #include "buffersettings.h"
 
 #include "util.h" // get rid of this (needed for isChannelName)
 
+/*****************************************
+*  Network Items
+*****************************************/
+NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent)
+  : PropertyMapItem(QList<QString>() << "networkName" << "currentServer" << "nickCount", parent),
+    _networkId(netid)
+{
+  setFlags(Qt::ItemIsEnabled);
+}
+
+QVariant NetworkItem::data(int column, int role) const {
+  switch(role) {
+  case NetworkModel::NetworkIdRole:
+    return qVariantFromValue(_networkId);
+  case NetworkModel::ItemTypeRole:
+    return NetworkModel::NetworkItemType;
+  case NetworkModel::ItemActiveRole:
+    return isActive();
+  default:
+    return PropertyMapItem::data(column, role);
+  }
+}
+
+quint64 NetworkItem::id() const {
+  return qHash(_networkId);
+}
+
+bool NetworkItem::isActive() const {
+  if(_network)
+    return _network->isConnected();
+  else
+    return false;
+}
+
+QString NetworkItem::networkName() const {
+  if(_network)
+    return _network->networkName();
+  else
+    return QString();
+}
+
+QString NetworkItem::currentServer() const {
+  if(_network)
+    return _network->currentServer();
+  else
+    return QString();
+}
+
+int NetworkItem::nickCount() const {
+  if(_network)
+    return _network->ircUsers().count();
+  else
+    return 0;
+}
+
+void NetworkItem::attachNetwork(Network *network) {
+  if(!network)
+    return;
+  
+  _network = network;
+
+  connect(network, SIGNAL(networkNameSet(QString)),
+         this, SLOT(setNetworkName(QString)));
+  connect(network, SIGNAL(currentServerSet(QString)),
+         this, SLOT(setCurrentServer(QString)));
+  connect(network, SIGNAL(ircChannelAdded(QString)),
+         this, SLOT(attachIrcChannel(QString)));
+  connect(network, SIGNAL(connectedSet(bool)),
+         this, SIGNAL(dataChanged()));
+  connect(network, SIGNAL(destroyed()),
+         this, SIGNAL(dataChanged()));
+  
+  emit dataChanged();
+}
+
+void NetworkItem::attachIrcChannel(const QString &channelName) {
+  IrcChannel *ircChannel = _network->ircChannel(channelName);
+  if(!ircChannel) {
+    qWarning() << "NetworkItem::attachIrcChannel(): unkown Channel" << channelName;
+    return;
+  }
+  
+  BufferItem *bufferItem;
+  for(int i = 0; i < childCount(); i++) {
+    bufferItem = qobject_cast<BufferItem *>(child(i));
+    if(bufferItem->bufferName().toLower() == ircChannel->name().toLower()) {
+      bufferItem->attachIrcChannel(ircChannel);
+      break;
+    }
+  }
+}
+
+void NetworkItem::setNetworkName(const QString &networkName) {
+  Q_UNUSED(networkName);
+  emit dataChanged(0);
+}
+
+void NetworkItem::setCurrentServer(const QString &serverName) {
+  Q_UNUSED(serverName);
+  emit dataChanged(1);
+}
+
+
+QString NetworkItem::toolTip(int column) const {
+  Q_UNUSED(column);
+
+  QStringList toolTip(QString("<b>%1</b>").arg(networkName()));
+  toolTip.append(QString("Server: %1").arg(currentServer()));
+  toolTip.append(QString("Users: %1").arg(nickCount()));
+
+  return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
+}
+
 /*****************************************
 *  Fancy Buffer Items
 *****************************************/
@@ -105,6 +217,7 @@ QVariant BufferItem::data(int column, int role) const {
 }
 
 bool BufferItem::setData(int column, const QVariant &value, int role) {
+  qDebug() << "BufferItem::setData(int column, const QVariant &value, int role):" << this << column << value << role;
   switch(role) {
   case NetworkModel::BufferActivityRole:
     setActivityLevel((Buffer::ActivityLevel)value.toInt());
@@ -214,10 +327,14 @@ void BufferItem::addUsersToCategory(const QList<IrcUser *> &ircUsers) {
   Q_ASSERT(_ircChannel);
 
   QHash<UserCategoryItem *, QList<IrcUser *> > categories;
+
+  int categoryId = -1;
+  UserCategoryItem *categoryItem = 0;
+  
   foreach(IrcUser *ircUser, ircUsers) {
-    UserCategoryItem *categoryItem;
-    int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
-    if(!(categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId))))) {
+    categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
+    categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)));
+    if(!categoryItem) {
       categoryItem = new UserCategoryItem(categoryId, this);
       categories[categoryItem] = QList<IrcUser *>();
       newChild(categoryItem);
@@ -251,39 +368,42 @@ void BufferItem::removeUserFromCategory(IrcUser *ircUser) {
     return;
   }
 
-  bool success = false;
   UserCategoryItem *categoryItem = 0;
   for(int i = 0; i < childCount(); i++) {
     categoryItem = qobject_cast<UserCategoryItem *>(child(i));
-    if(success = categoryItem->removeUser(ircUser)) {
+    if(categoryItem->removeUser(ircUser)) {
       if(categoryItem->childCount() == 0)
        removeChild(i);
       break;
     }
   }
-
-  if(!success) {
-    qDebug() << "didn't find User:" << ircUser << qHash(ircUser);
-    qDebug() << "==== Childlist for Item:" << this << id() << bufferName() << "====";
-    for(int i = 0; i < childCount(); i++) {
-      categoryItem = qobject_cast<UserCategoryItem *>(child(i));
-      categoryItem->dumpChildList();
-    }
-    qDebug() << "==== End Of Childlist for Item:" << this << id() << bufferName() << "====";
-  }
-  Q_ASSERT(success);
 }
 
 void BufferItem::userModeChanged(IrcUser *ircUser) {
   Q_ASSERT(_ircChannel);
 
-  UserCategoryItem *categoryItem;
   int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
-  if((categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)))) && categoryItem->childById(qHash(ircUser)))
+  UserCategoryItem *categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)));
+    
+  if(categoryItem && categoryItem->childById(qHash(ircUser)))
     return; // already in the right category;
-  
-  removeUserFromCategory(ircUser);
-  addUserToCategory(ircUser);
+
+  // find the item that needs reparenting
+  IrcUserItem *ircUserItem = 0;
+  for(int i = 0; i < childCount(); i++) {
+    UserCategoryItem *categoryItem = qobject_cast<UserCategoryItem *>(child(i));
+    IrcUserItem *userItem = qobject_cast<IrcUserItem *>(categoryItem->childById(qHash(ircUser)));
+    if(userItem) {
+      ircUserItem = userItem;
+      break;
+    }
+  }
+
+  if(!ircUserItem) {
+    qWarning() << "BufferItem::userModeChanged(IrcUser *): unable to determine old category of" << ircUser;
+    return;
+  }
+  ircUserItem->reParent(categoryItem);
 }
 
 QString BufferItem::toolTip(int column) const {
@@ -313,6 +433,11 @@ QString BufferItem::toolTip(int column) const {
             toolTip.append(tr("<b>Topic:</b> %1").arg(_topic));
           }
         }
+       if(_ircChannel) {
+         QString channelMode = _ircChannel->channelModeString(); // channelModeString is compiled on the fly -> thus cache the result
+         if(!channelMode.isEmpty())
+           toolTip.append(tr("<b>Mode:</b> %1").arg(channelMode));
+       }
       } else {
         toolTip.append(tr("Not active <br /> Double-click to join"));
       }
@@ -350,118 +475,6 @@ QDateTime BufferItem::lastSeen() {
   return _lastSeen;
 }
 */
-/*****************************************
-*  Network Items
-*****************************************/
-NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent)
-  : PropertyMapItem(QList<QString>() << "networkName" << "currentServer" << "nickCount", parent),
-    _networkId(netid)
-{
-  setFlags(Qt::ItemIsEnabled);
-}
-
-QVariant NetworkItem::data(int column, int role) const {
-  switch(role) {
-  case NetworkModel::NetworkIdRole:
-    return qVariantFromValue(_networkId);
-  case NetworkModel::ItemTypeRole:
-    return NetworkModel::NetworkItemType;
-  case NetworkModel::ItemActiveRole:
-    return isActive();
-  default:
-    return PropertyMapItem::data(column, role);
-  }
-}
-
-quint64 NetworkItem::id() const {
-  return qHash(_networkId);
-}
-
-bool NetworkItem::isActive() const {
-  if(_network)
-    return _network->isConnected();
-  else
-    return false;
-}
-
-QString NetworkItem::networkName() const {
-  if(_network)
-    return _network->networkName();
-  else
-    return QString();
-}
-
-QString NetworkItem::currentServer() const {
-  if(_network)
-    return _network->currentServer();
-  else
-    return QString();
-}
-
-int NetworkItem::nickCount() const {
-  if(_network)
-    return _network->ircUsers().count();
-  else
-    return 0;
-}
-
-void NetworkItem::attachNetwork(Network *network) {
-  if(!network)
-    return;
-  
-  _network = network;
-
-  connect(network, SIGNAL(networkNameSet(QString)),
-         this, SLOT(setNetworkName(QString)));
-  connect(network, SIGNAL(currentServerSet(QString)),
-         this, SLOT(setCurrentServer(QString)));
-  connect(network, SIGNAL(ircChannelAdded(QString)),
-         this, SLOT(attachIrcChannel(QString)));
-  connect(network, SIGNAL(connectedSet(bool)),
-         this, SIGNAL(dataChanged()));
-  connect(network, SIGNAL(destroyed()),
-         this, SIGNAL(dataChanged()));
-  
-  emit dataChanged();
-}
-
-void NetworkItem::attachIrcChannel(const QString &channelName) {
-  IrcChannel *ircChannel = _network->ircChannel(channelName);
-  if(!ircChannel) {
-    qWarning() << "NetworkItem::attachIrcChannel(): unkown Channel" << channelName;
-    return;
-  }
-  
-  BufferItem *bufferItem;
-  for(int i = 0; i < childCount(); i++) {
-    bufferItem = qobject_cast<BufferItem *>(child(i));
-    if(bufferItem->bufferName().toLower() == ircChannel->name().toLower()) {
-      bufferItem->attachIrcChannel(ircChannel);
-      break;
-    }
-  }
-}
-
-void NetworkItem::setNetworkName(const QString &networkName) {
-  Q_UNUSED(networkName);
-  emit dataChanged(0);
-}
-
-void NetworkItem::setCurrentServer(const QString &serverName) {
-  Q_UNUSED(serverName);
-  emit dataChanged(1);
-}
-
-
-QString NetworkItem::toolTip(int column) const {
-  Q_UNUSED(column);
-
-  QStringList toolTip(QString("<b>%1</b>").arg(networkName()));
-  toolTip.append(QString("Server: %1").arg(currentServer()));
-  toolTip.append(QString("Users: %1").arg(nickCount()));
-
-  return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
-}
 
 
 /*****************************************
@@ -475,7 +488,6 @@ UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent)
   : PropertyMapItem(QStringList() << "categoryName", parent),
     _category(category)
 {
-
 }
 
 // caching this makes no sense, since we display the user number dynamically
@@ -500,10 +512,14 @@ void UserCategoryItem::addUsers(const QList<IrcUser *> &ircUsers) {
   foreach(IrcUser *ircUser, ircUsers)
     userItems << new IrcUserItem(ircUser, this);
   newChilds(userItems);
+  emit dataChanged(0);
 }
 
 bool UserCategoryItem::removeUser(IrcUser *ircUser) {
-  return removeChildById(qHash(ircUser));
+  bool success = removeChildById(qHash(ircUser));
+  if(success)
+    emit dataChanged(0);
+  return success;
 }
 
 int UserCategoryItem::categoryFromModes(const QString &modes) {
@@ -565,14 +581,6 @@ bool IrcUserItem::isActive() const {
     return false;
 }
 
-IrcUser *IrcUserItem::ircUser() {
-  return _ircUser;
-}
-
-quint64 IrcUserItem::id() const {
-  return _id;
-}
-
 QVariant IrcUserItem::data(int column, int role) const {
   switch(role) {
   case NetworkModel::ItemActiveRole: