From f37791b92e3bf6e78b93036c0669926eeba3347b Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Thu, 17 Jan 2008 13:38:37 +0000 Subject: [PATCH 1/1] Made the Nicklist Pretty again --- src/client/networkmodel.cpp | 98 ++++++++++++++++++++++++++++++++++++- src/client/networkmodel.h | 38 ++++++++++++++ 2 files changed, 134 insertions(+), 2 deletions(-) diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index ff449424..61ee7b98 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -120,6 +120,12 @@ void BufferItem::attachIrcChannel(IrcChannel *ircChannel) { this, SLOT(part(IrcUser *))); connect(ircChannel, SIGNAL(destroyed()), this, SLOT(ircChannelDestroyed())); + connect(ircChannel, SIGNAL(ircUserModesSet(IrcUser *, QString)), + this, SLOT(userModeChanged(IrcUser *))); + connect(ircChannel, SIGNAL(ircUserModeAdded(IrcUser *, QString)), + this, SLOT(userModeChanged(IrcUser *))); + connect(ircChannel, SIGNAL(ircUserModeRemoved(IrcUser *, QString)), + this, SLOT(userModeChanged(IrcUser *))); emit dataChanged(); } @@ -159,15 +165,48 @@ void BufferItem::setTopic(const QString &topic) { } void BufferItem::join(IrcUser *ircUser) { - emit newChild(new IrcUserItem(ircUser, this)); + if(!ircUser) + return; + + addUserToCategory(ircUser); emit dataChanged(2); } +void BufferItem::addUserToCategory(IrcUser *ircUser) { + Q_ASSERT(_ircChannel); + + UserCategoryItem *categoryItem; + int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser)); + if(!(categoryItem = qobject_cast(childById(qHash(categoryId))))) { + categoryItem = new UserCategoryItem(categoryId, this); + emit newChild(categoryItem); + } + + categoryItem->addUser(ircUser); +} + void BufferItem::part(IrcUser *ircUser) { Q_UNUSED(ircUser); emit dataChanged(2); } +void BufferItem::removeUserFromCategory(IrcUser *ircUser) { + UserCategoryItem *categoryItem = 0; + IrcUserItem *userItem; + for(int i = 0; i < childCount(); i++) { + categoryItem = qobject_cast(child(i)); + if(userItem = qobject_cast(categoryItem->childById((quint64)ircUser))) { + userItem->deleteLater(); + return; + } + } +} + +void BufferItem::userModeChanged(IrcUser *ircUser) { + removeUserFromCategory(ircUser); + addUserToCategory(ircUser); +} + /***************************************** * Network Items *****************************************/ @@ -265,6 +304,54 @@ void NetworkItem::setCurrentServer(const QString &serverName) { emit dataChanged(1); } +/***************************************** +* 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 UserCategoryItem::categories = QList() << UserCategoryItem::Category('q', "Owners") + << UserCategoryItem::Category('a', "Admins") + << UserCategoryItem::Category('a', "Admins") + << UserCategoryItem::Category('o', "Operators") + << UserCategoryItem::Category('h', "Half-Ops") + << UserCategoryItem::Category('v', "Voiced"); + +UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent) + : PropertyMapItem(QStringList() << "categoryId", parent), + _category(category) +{ + connect(this, SIGNAL(childDestroyed(int)), + this, SLOT(checkNoChilds())); +} + +QString UserCategoryItem::categoryId() { + if(_category < categories.count()) + return categories[_category].displayString; + else + return QString("Users"); +} + +void UserCategoryItem::checkNoChilds() { + if(childCount() == 0) + deleteLater(); +} + +quint64 UserCategoryItem::id() const { + return qHash(_category); +} + +void UserCategoryItem::addUser(IrcUser *ircUser) { + emit newChild(new IrcUserItem(ircUser, this)); +} + +int UserCategoryItem::categoryFromModes(const QString &modes) { + for(int i = 0; i < categories.count(); i++) { + if(modes.contains(categories[i].mode)) + return i; + } + return categories.count(); +} + /***************************************** * Irc User Items *****************************************/ @@ -283,6 +370,14 @@ QString IrcUserItem::nickName() { return _ircUser->nick(); } +IrcUser *IrcUserItem::ircUser() { + return _ircUser; +} + +quint64 IrcUserItem::id() const { + return (quint64)_ircUser; +} + void IrcUserItem::setNick(QString newNick) { Q_UNUSED(newNick); emit dataChanged(0); @@ -291,7 +386,6 @@ void IrcUserItem::ircUserDestroyed() { deleteLater(); } - /***************************************** * NetworkModel *****************************************/ diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 09e1bd29..a9a108d2 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -88,6 +88,10 @@ public slots: void join(IrcUser *ircUser); void part(IrcUser *ircUser); + void addUserToCategory(IrcUser *ircUser); + void removeUserFromCategory(IrcUser *ircUser); + void userModeChanged(IrcUser *ircUser); + private slots: void ircChannelDestroyed(); @@ -135,6 +139,38 @@ private: QPointer _network; }; +/***************************************** +* User Category Items (like @vh etc.) +*****************************************/ +class UserCategoryItem : public PropertyMapItem { + Q_OBJECT + Q_PROPERTY(QString categoryId READ categoryId) + +public: + UserCategoryItem(int category, AbstractTreeItem *parent); + + QString categoryId(); + virtual quint64 id() const; + + void addUser(IrcUser *ircUser); + + static int categoryFromModes(const QString &modes); + +private slots: + void checkNoChilds(); + +private: + int _category; + + struct Category { + QChar mode; + QString displayString; + inline Category(QChar mode_, QString displayString_) : mode(mode_), displayString(displayString_) {}; + }; + + static const QList categories; +}; + /***************************************** * Irc User Items *****************************************/ @@ -146,6 +182,8 @@ public: IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent); QString nickName(); + IrcUser *ircUser(); + virtual quint64 id() const; private slots: void setNick(QString newNick); -- 2.20.1