+void ChannelBufferItem::userModeChanged(IrcUser *ircUser) {
+ Q_ASSERT(_ircChannel);
+
+ int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser));
+ UserCategoryItem *categoryItem = qobject_cast<UserCategoryItem *>(childById(qHash(categoryId)));
+
+ if(categoryItem) {
+ if(categoryItem->childById(qHash(ircUser)))
+ return; // already in the right category;
+ } else {
+ categoryItem = new UserCategoryItem(categoryId, this);
+ newChild(categoryItem);
+ }
+
+ // 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() << "ChannelBufferItem::userModeChanged(IrcUser *): unable to determine old category of" << ircUser;
+ return;
+ }
+ ircUserItem->reParent(categoryItem);
+}
+
+/*****************************************
+* User Category Items (like @vh etc.)
+*****************************************/
+// we hardcode this even though we have PREFIX in network... but that wouldn't help with mapping modes to
+// category strings anyway.
+const QList<QChar> UserCategoryItem::categories = QList<QChar>() << 'q' << 'a' << 'o' << 'h' << 'v';
+
+UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent)
+ : PropertyMapItem(QStringList() << "categoryName", parent),
+ _category(category)
+{
+}
+
+// caching this makes no sense, since we display the user number dynamically
+QString UserCategoryItem::categoryName() const {
+ int n = childCount();
+ switch(_category) {
+ case 0: return tr("%n Owner(s)", 0, n);
+ case 1: return tr("%n Admin(s)", 0, n);
+ case 2: return tr("%n Operator(s)", 0, n);
+ case 3: return tr("%n Half-Op(s)", 0, n);
+ case 4: return tr("%n Voiced", 0, n);
+ default: return tr("%n User(s)", 0, n);
+ }
+}
+
+quint64 UserCategoryItem::id() const {
+ return qHash(_category);
+}
+
+void UserCategoryItem::addUsers(const QList<IrcUser *> &ircUsers) {
+ QList<AbstractTreeItem *> userItems;
+ foreach(IrcUser *ircUser, ircUsers)
+ userItems << new IrcUserItem(ircUser, this);
+ newChilds(userItems);