some minor improvements to the NetworkModel and added a sanity check to TreeModel
[quassel.git] / src / client / networkmodel.cpp
index 4ccb5b5..7890099 100644 (file)
@@ -143,6 +143,13 @@ void BufferItem::attachIrcChannel(IrcChannel *ircChannel) {
          this, SLOT(userModeChanged(IrcUser *)));
   connect(ircChannel, SIGNAL(ircUserModeRemoved(IrcUser *, QString)),
          this, SLOT(userModeChanged(IrcUser *)));
+
+  if(!ircChannel->ircUsers().isEmpty()) {
+    qWarning() << "Channel" << ircChannel->name() << "has already users which is quite surprising :)";
+    foreach(IrcUser *ircUser, ircChannel->ircUsers()) {
+      join(ircUser);
+    }
+  }
   
   emit dataChanged();
 }
@@ -220,12 +227,22 @@ void BufferItem::removeUserFromCategory(IrcUser *ircUser) {
   UserCategoryItem *categoryItem = 0;
   for(int i = 0; i < childCount(); i++) {
     categoryItem = qobject_cast<UserCategoryItem *>(child(i));
-    if(success = categoryItem->removeChildById((quint64)ircUser)) {
+    if(success = categoryItem->removeUser(ircUser)) {
       if(categoryItem->childCount() == 0)
        removeChild(i);
       break;
     }
   }
+
+  if(!success) {
+    qDebug() << "didn't find User:" << ircUser << (quint64)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);
 
   int totalusers = 0;
@@ -273,8 +290,16 @@ quint64 NetworkItem::id() const {
   return _networkId.toInt();
 }
 
+void NetworkItem::setActive(bool connected) {
+  Q_UNUSED(connected);
+  emit dataChanged();
+}
+
 bool NetworkItem::isActive() const {
-  return _network;
+  if(_network)
+    return _network->isConnected();
+  else
+    return false;
 }
 
 QString NetworkItem::networkName() const {
@@ -310,6 +335,9 @@ void NetworkItem::attachNetwork(Network *network) {
          this, SLOT(setCurrentServer(QString)));
   connect(network, SIGNAL(ircChannelAdded(QString)),
          this, SLOT(attachIrcChannel(QString)));
+  connect(network, SIGNAL(connectedSet(bool)),
+         this, SLOT(setActive(bool)));
+  
   // FIXME: connect this and that...
 
   emit dataChanged();
@@ -376,6 +404,10 @@ void UserCategoryItem::addUser(IrcUser *ircUser) {
   newChild(new IrcUserItem(ircUser, this));
 }
 
+bool UserCategoryItem::removeUser(IrcUser *ircUser) {
+  return removeChildById((quint64)ircUser);
+}
+
 int UserCategoryItem::categoryFromModes(const QString &modes) {
   for(int i = 0; i < categories.count(); i++) {
     if(modes.contains(categories[i].mode))
@@ -386,6 +418,8 @@ int UserCategoryItem::categoryFromModes(const QString &modes) {
 
 QVariant UserCategoryItem::data(int column, int role) const {
   switch(role) {
+  case NetworkModel::ItemActiveRole:
+    return true;
   case NetworkModel::ItemTypeRole:
     return NetworkModel::UserCategoryItemType;
   case NetworkModel::BufferIdRole:
@@ -428,6 +462,8 @@ quint64 IrcUserItem::id() const {
 
 QVariant IrcUserItem::data(int column, int role) const {
   switch(role) {
+  case NetworkModel::ItemActiveRole:
+    return !_ircUser->isAway();
   case NetworkModel::ItemTypeRole:
     return NetworkModel::IrcUserItemType;
   case NetworkModel::BufferIdRole:
@@ -443,7 +479,14 @@ QVariant IrcUserItem::data(int column, int role) const {
 
 QString IrcUserItem::toolTip(int column) const {
   Q_UNUSED(column);
-  return "<p><b>" + nickName() + "</b><br />" + _ircUser->hostmask() + "</p>";
+  QString toolTip = "<b>" + nickName() + "</b><br />" + _ircUser->hostmask();
+  if(_ircUser->isAway()) {
+    toolTip += "<br /> away";
+    if(!_ircUser->awayMessage().isEmpty()) { 
+      toolTip += " (" + _ircUser->awayMessage() + ")"; 
+    }
+  }
+  return "<p>" + toolTip + "</p>";
 }
 
 void IrcUserItem::setNick(QString newNick) {