X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=27bb3e2f4b879bca692e4cf4d1fd29bf88a60880;hp=000a5e02cb6a1f514a47c52a48168828dbc72a3a;hb=ef97dad874c30d7e0586b3dcb98eed15d8987382;hpb=9c4a633cfff4b7b14199b6488fc39ffc31d62dfd diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 000a5e02..27bb3e2f 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -55,8 +55,22 @@ QVariant NetworkItem::data(int column, int role) const { } } +BufferItem *NetworkItem::findBufferItem(BufferId bufferId) { + BufferItem *bufferItem = 0; + + for(int i = 0; i < childCount(); i++) { + bufferItem = qobject_cast(child(i)); + if(!bufferItem) + continue; + if(bufferItem->bufferId() == bufferId) + return bufferItem; + } + return 0; +} + + BufferItem *NetworkItem::bufferItem(const BufferInfo &bufferInfo) { - BufferItem *bufferItem = qobject_cast(childById(qHash(bufferInfo.bufferId()))); + BufferItem *bufferItem = findBufferItem(bufferInfo); if(bufferItem) return bufferItem; @@ -146,6 +160,10 @@ QString NetworkItem::toolTip(int column) const { toolTip.append(QString("Server: %1").arg(currentServer())); toolTip.append(QString("Users: %1").arg(nickCount())); + if(_network) { + toolTip.append(QString("Lag: %1 msecs").arg(_network->latency())); + } + return QString("

%1

").arg(toolTip.join("
")); } @@ -414,23 +432,22 @@ void ChannelBufferItem::ircChannelDestroyed() { removeAllChilds(); } -void ChannelBufferItem::ircUserDestroyed() { - // PRIVATE - IrcUser *ircUser = static_cast(sender()); - removeUserFromCategory(ircUser); - emit dataChanged(2); -} - void ChannelBufferItem::join(const QList &ircUsers) { addUsersToCategory(ircUsers); + emit dataChanged(2); +} - foreach(IrcUser *ircUser, ircUsers) { - if(!ircUser) +UserCategoryItem *ChannelBufferItem::findCategoryItem(int categoryId) { + UserCategoryItem *categoryItem = 0; + + for(int i = 0; i < childCount(); i++) { + categoryItem = qobject_cast(child(i)); + if(!categoryItem) continue; - connect(ircUser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed())); + if(categoryItem->categoryId() == categoryId) + return categoryItem; } - - emit dataChanged(2); + return 0; } void ChannelBufferItem::addUserToCategory(IrcUser *ircUser) { @@ -447,7 +464,7 @@ void ChannelBufferItem::addUsersToCategory(const QList &ircUsers) { foreach(IrcUser *ircUser, ircUsers) { categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser)); - categoryItem = qobject_cast(childById(qHash(categoryId))); + categoryItem = findCategoryItem(categoryId); if(!categoryItem) { categoryItem = new UserCategoryItem(categoryId, this); categories[categoryItem] = QList(); @@ -497,22 +514,25 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) { Q_ASSERT(_ircChannel); int categoryId = UserCategoryItem::categoryFromModes(_ircChannel->userModes(ircUser)); - UserCategoryItem *categoryItem = qobject_cast(childById(qHash(categoryId))); + UserCategoryItem *categoryItem = findCategoryItem(categoryId); if(categoryItem) { - if(categoryItem->childById(qHash(ircUser))) + if(categoryItem->findIrcUser(ircUser)) { return; // already in the right category; + } } else { categoryItem = new UserCategoryItem(categoryId, this); newChild(categoryItem); } // find the item that needs reparenting + UserCategoryItem *oldCategoryItem = 0; IrcUserItem *ircUserItem = 0; for(int i = 0; i < childCount(); i++) { - UserCategoryItem *categoryItem = qobject_cast(child(i)); - IrcUserItem *userItem = qobject_cast(categoryItem->childById(qHash(ircUser))); + UserCategoryItem *catItem = qobject_cast(child(i)); + IrcUserItem *userItem = catItem->findIrcUser(ircUser); if(userItem) { + oldCategoryItem = catItem; ircUserItem = userItem; break; } @@ -522,7 +542,11 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) { qWarning() << "ChannelBufferItem::userModeChanged(IrcUser *): unable to determine old category of" << ircUser; return; } - ircUserItem->reParent(categoryItem); + + Q_ASSERT(oldCategoryItem); + if(ircUserItem->reParent(categoryItem) && oldCategoryItem->childCount() == 0) { + removeChild(oldCategoryItem); + } } /***************************************** @@ -536,6 +560,7 @@ UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent) : PropertyMapItem(QStringList() << "categoryName", parent), _category(category) { + setObjectName(parent->data(0, Qt::DisplayRole).toString() + "/" + QString::number(category)); } // caching this makes no sense, since we display the user number dynamically @@ -551,8 +576,17 @@ QString UserCategoryItem::categoryName() const { } } -quint64 UserCategoryItem::id() const { - return qHash(_category); +IrcUserItem *UserCategoryItem::findIrcUser(IrcUser *ircUser) { + IrcUserItem *userItem = 0; + + for(int i = 0; i < childCount(); i++) { + userItem = qobject_cast(child(i)); + if(!userItem) + continue; + if(userItem->ircUser() == ircUser) + return userItem; + } + return 0; } void UserCategoryItem::addUsers(const QList &ircUsers) { @@ -564,9 +598,12 @@ void UserCategoryItem::addUsers(const QList &ircUsers) { } bool UserCategoryItem::removeUser(IrcUser *ircUser) { - bool success = removeChildById(qHash(ircUser)); - if(success) + IrcUserItem *userItem = findIrcUser(ircUser); + bool success = (bool)userItem; + if(success) { + removeChild(userItem); emit dataChanged(0); + } return success; } @@ -603,30 +640,14 @@ QVariant UserCategoryItem::data(int column, int role) const { *****************************************/ IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent) : PropertyMapItem(QStringList() << "nickName", parent), - _ircUser(ircUser), - _id(qHash(ircUser)) + _ircUser(ircUser) { - // we don't need to handle the ircUser's destroyed signal since it's automatically removed - // by the IrcChannel::ircUserParted(); - + setObjectName(ircUser->nick()); + connect(ircUser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed())); connect(ircUser, SIGNAL(nickSet(QString)), this, SIGNAL(dataChanged())); connect(ircUser, SIGNAL(awaySet(bool)), this, SIGNAL(dataChanged())); } -QString IrcUserItem::nickName() const { - if(_ircUser) - return _ircUser->nick(); - else - return QString(); -} - -bool IrcUserItem::isActive() const { - if(_ircUser) - return !_ircUser->isAway(); - else - return false; -} - QVariant IrcUserItem::data(int column, int role) const { switch(role) { case NetworkModel::ItemActiveRole: @@ -700,49 +721,78 @@ Buffer *NetworkModel::getBufferByIndex(const QModelIndex &index) const { } */ +int NetworkModel::networkRow(NetworkId networkId) { + NetworkItem *netItem = 0; + for(int i = 0; i < rootItem->childCount(); i++) { + netItem = qobject_cast(rootItem->child(i)); + if(!netItem) + continue; + if(netItem->networkId() == networkId) + return i; + } + return -1; +} -// experimental stuff :) QModelIndex NetworkModel::networkIndex(NetworkId networkId) { - return indexById(qHash(networkId)); + int netRow = networkRow(networkId); + if(netRow == -1) + return QModelIndex(); + else + return indexByItem(qobject_cast(rootItem->child(netRow))); } -NetworkItem *NetworkModel::existsNetworkItem(NetworkId networkId) { - return qobject_cast(rootItem->childById(networkId.toInt())); +NetworkItem *NetworkModel::findNetworkItem(NetworkId networkId) { + int netRow = networkRow(networkId); + if(netRow == -1) + return 0; + else + return qobject_cast(rootItem->child(netRow)); } NetworkItem *NetworkModel::networkItem(NetworkId networkId) { - NetworkItem *netItem = existsNetworkItem(networkId); + NetworkItem *netItem = findNetworkItem(networkId); if(netItem == 0) { netItem = new NetworkItem(networkId, rootItem); rootItem->newChild(netItem); } - - Q_ASSERT(netItem); return netItem; } void NetworkModel::networkRemoved(const NetworkId &networkId) { - rootItem->removeChildById(qHash(networkId)); + int netRow = networkRow(networkId); + if(netRow != -1) { + rootItem->removeChild(netRow); + } } QModelIndex NetworkModel::bufferIndex(BufferId bufferId) { - AbstractTreeItem *netItem, *bufferItem; - for(int i = 0; i < rootItem->childCount(); i++) { - netItem = rootItem->child(i); - if((bufferItem = netItem->childById(qHash(bufferId)))) { - return indexByItem(bufferItem); - } - } - return QModelIndex(); + BufferItem *bufferItem = findBufferItem(bufferId); + if(bufferItem) + return indexByItem(bufferItem); + else + return QModelIndex(); } -BufferItem *NetworkModel::existsBufferItem(const BufferInfo &bufferInfo) { - QModelIndex bufferIdx = bufferIndex(bufferInfo.bufferId()); - if(bufferIdx.isValid()) - return static_cast(bufferIdx.internalPointer()); - else +BufferItem *NetworkModel::findBufferItem(const BufferInfo &bufferInfo) { + NetworkItem *netItem = findNetworkItem(bufferInfo.networkId()); + if(!netItem) return 0; + + BufferItem *bufferItem = netItem->findBufferItem(bufferInfo); + return bufferItem; +} + +BufferItem *NetworkModel::findBufferItem(BufferId bufferId) { + NetworkItem *netItem; + BufferItem *bufferItem; + + for(int i = 0; i < rootItem->childCount(); i++) { + netItem = qobject_cast(rootItem->child(i)); + if((bufferItem = netItem->findBufferItem(bufferId))) + return bufferItem; + } + return 0; } BufferItem *NetworkModel::bufferItem(const BufferInfo &bufferInfo) { @@ -826,13 +876,15 @@ bool NetworkModel::dropMimeData(const QMimeData *data, Qt::DropAction action, in // no self merges (would kill us) if(bufferId == parent.data(BufferIdRole).value()) return false; - - Q_ASSERT(rootItem->childById(qHash(netId))); - Q_ASSERT(rootItem->childById(qHash(netId))->childById(qHash(bufferId))); + + NetworkItem *netItem = findNetworkItem(netId); + Q_ASSERT(netItem); + + BufferItem *bufferItem = netItem->findBufferItem(bufferId); + Q_ASSERT(bufferItem); // source must be a query too - BufferInfo::Type sourceType = (BufferInfo::Type)rootItem->childById(qHash(netId))->childById(qHash(bufferId))->data(0, BufferTypeRole).toInt(); - if(sourceType != BufferInfo::QueryBuffer) + if(bufferItem->bufferType() != BufferInfo::QueryBuffer) return false; // TODO: warn user about buffermerge! @@ -854,14 +906,9 @@ void NetworkModel::bufferUpdated(BufferInfo bufferInfo) { } void NetworkModel::removeBuffer(BufferId bufferId) { - const int numNetworks = rootItem->childCount(); - if(numNetworks == 0) - return; - - for(int i = 0; i < numNetworks; i++) { - if(rootItem->child(i)->removeChildById(qHash(bufferId))) - break; - } + BufferItem *bufferItem = findBufferItem(bufferId); + if(bufferItem) + bufferItem->parent()->removeChild(bufferItem); } /*