IrcChannel::ircUserDestroyed() now sends appropriate signals. Plus some other small...
[quassel.git] / src / client / nickmodel.cpp
index d7e4248..a1e8bcd 100644 (file)
@@ -50,6 +50,7 @@ void NickModel::setIrcChannel(IrcChannel *channel) {
   _ircChannel = channel;
   reset();
   if(_ircChannel) {
+    connect(channel, SIGNAL(destroyed()), this, SLOT(setIrcChannel()));
     connect(channel, SIGNAL(ircUserJoined(IrcUser *)), this, SLOT(addUser(IrcUser *)));
     connect(channel, SIGNAL(ircUserParted(IrcUser *)), this, SLOT(removeUser(IrcUser *)));
     connect(channel, SIGNAL(ircUserNickSet(IrcUser *, QString)), this, SLOT(renameUser(IrcUser *)));
@@ -60,7 +61,6 @@ void NickModel::setIrcChannel(IrcChannel *channel) {
       addUser(ircuser);
     }
   }
-
 }
 
 QVariant NickModel::headerData(int section, Qt::Orientation orientation, int role) const {
@@ -140,25 +140,32 @@ QVariant NickModel::data(const QModelIndex &index, int role) const {
   }
   int cat = index.internalId();
   if(!cat) { // top-level item (category)
-    if(role ==  Qt::DisplayRole) {
-      QString title;
-      switch(index.row()) {
-        case 0: title = tr("%n Owner(s)", "", users[index.row()].count()); break;
-        case 1: title = tr("%n Admin(s)", "", users[index.row()].count()); break;
-        case 2: title = tr("%n Operator(s)", "", users[index.row()].count()); break;
-        case 3: title = tr("%n Half-Op(s)", "", users[index.row()].count()); break;
-        case 4: title = tr("%n Voiced", "", users[index.row()].count()); break;
-        case 5: title = tr("%n User(s)", "", users[index.row()].count()); break;
-        default:
-          qDebug() << "invalid model index"; return QVariant();
+    switch(role) {
+      case Qt::DisplayRole: {
+        QString title;
+        switch(index.row()) {
+          case 0: title = tr("%n Owner(s)", "", users[index.row()].count()); break;
+          case 1: title = tr("%n Admin(s)", "", users[index.row()].count()); break;
+          case 2: title = tr("%n Operator(s)", "", users[index.row()].count()); break;
+          case 3: title = tr("%n Half-Op(s)", "", users[index.row()].count()); break;
+          case 4: title = tr("%n Voiced", "", users[index.row()].count()); break;
+          case 5: title = tr("%n User(s)", "", users[index.row()].count()); break;
+          default: qDebug() << "invalid model index"; return QVariant();
+        }
+        return title;
       }
-      return title;
-    } else return QVariant();
+      case SortKeyRole: return index.row();
+      default: return QVariant();
+    }
   } else {
     IrcUser *user = users[cat-1][index.row()];
     switch(role) {
       case Qt::DisplayRole:
         return user->nick();
+      case Qt::ToolTipRole:
+        return user->hostmask();
+      case SortKeyRole:
+        return user->nick();
       default:
         return QVariant();
     }
@@ -187,14 +194,14 @@ int NickModel::categoryFromIndex(const QModelIndex &index) const {
   return index.internalId();
 }
 
-void NickModel::addUser(IrcUser *user) {
+void NickModel::addUser(IrcUser *user) { //qDebug() << "adding" << user->nick();
   int cat = userCategory(user);
   beginInsertRows(createIndex(cat-1, 0, 0), 0, 0);
   users[cat-1].prepend(user);
   endInsertRows();
 }
 
-void NickModel::removeUser(IrcUser *user) {
+void NickModel::removeUser(IrcUser *user) { //qDebug() << "removing" << user->nick();
   // we don't know for sure which category this user was in, so we have to search
   QModelIndex index = indexOfUser(user);
   removeUser(index);
@@ -207,7 +214,7 @@ void NickModel::removeUser(const QModelIndex &index) {
   endRemoveRows();
 }
 
-void NickModel::renameUser(IrcUser *user) {
+void NickModel::renameUser(IrcUser *user) { //qDebug() << "renaming" << user->nick();
   QModelIndex index = indexOfUser(user);
   emit dataChanged(index, index);
 }
@@ -223,4 +230,23 @@ void NickModel::changeUserModes(IrcUser *user) {
   }
 }
 
+/******************************************************************************************
+ * FilteredNickModel
+ ******************************************************************************************/
+
+FilteredNickModel::FilteredNickModel(QObject *parent) : QSortFilterProxyModel(parent) {
+  setDynamicSortFilter(true);
+  setSortCaseSensitivity(Qt::CaseInsensitive);
+  setSortRole(NickModel::SortKeyRole);
+
+}
+
+// Hide empty categories
+bool FilteredNickModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
+  if(!source_parent.isValid()) {
+    QModelIndex index = sourceModel()->index(source_row, 0);
+    return sourceModel()->rowCount(index);
+  }
+  return true;
+}