X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=777e809a6a8ec079ddd03b7fe3598975a9d43a95;hp=27bb3e2f4b879bca692e4cf4d1fd29bf88a60880;hb=3e85aa859e7533ec910f8b2efe4a8abd801d3a47;hpb=ef97dad874c30d7e0586b3dcb98eed15d8987382 diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 27bb3e2f..777e809a 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -123,7 +123,7 @@ void NetworkItem::attachIrcChannel(IrcChannel *ircChannel) { if(channelItem->bufferName().toLower() == ircChannel->name().toLower()) { channelItem->attachIrcChannel(ircChannel); - break; + return; } } } @@ -293,14 +293,15 @@ QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *pare IrcUser *ircUser = net->ircUser(bufferInfo.bufferName()); if(ircUser) attachIrcUser(ircUser); - } -bool QueryBufferItem::isActive() const { - if(_ircUser) - return !_ircUser->isAway(); - else - return false; +QVariant QueryBufferItem::data(int column, int role) const { + switch(role) { + case NetworkModel::UserAwayRole: + return (bool)_ircUser ? _ircUser->isAway() : false; + default: + return BufferItem::data(column, role); + } } QString QueryBufferItem::toolTip(int column) const { @@ -526,13 +527,12 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) { } // find the item that needs reparenting - UserCategoryItem *oldCategoryItem = 0; IrcUserItem *ircUserItem = 0; for(int i = 0; i < childCount(); i++) { - UserCategoryItem *catItem = qobject_cast(child(i)); - IrcUserItem *userItem = catItem->findIrcUser(ircUser); + UserCategoryItem *oldCategoryItem = qobject_cast(child(i)); + Q_ASSERT(oldCategoryItem); + IrcUserItem *userItem = oldCategoryItem->findIrcUser(ircUser); if(userItem) { - oldCategoryItem = catItem; ircUserItem = userItem; break; } @@ -542,11 +542,7 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) { qWarning() << "ChannelBufferItem::userModeChanged(IrcUser *): unable to determine old category of" << ircUser; return; } - - Q_ASSERT(oldCategoryItem); - if(ircUserItem->reParent(categoryItem) && oldCategoryItem->childCount() == 0) { - removeChild(oldCategoryItem); - } + ircUserItem->reParent(categoryItem); } /***************************************** @@ -560,6 +556,7 @@ UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent) : PropertyMapItem(QStringList() << "categoryName", parent), _category(category) { + setTreeItemFlags(AbstractTreeItem::DeleteOnLastChildRemoved); setObjectName(parent->data(0, Qt::DisplayRole).toString() + "/" + QString::number(category)); } @@ -696,12 +693,22 @@ QString IrcUserItem::toolTip(int column) const { return QString("

%1

").arg(toolTip.join("
")); } +// void IrcUserItem::ircUserDestroyed() { +// parent()->removeChild(this); +// if(parent()->childCount() == 0) +// parent()->parent()->removeChild(parent()); +// } + /***************************************** * NetworkModel *****************************************/ NetworkModel::NetworkModel(QObject *parent) : TreeModel(NetworkModel::defaultHeader(), parent) { + connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), + this, SLOT(checkForNewBuffers(const QModelIndex &, int, int))); + connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), + this, SLOT(checkForRemovedBuffers(const QModelIndex &, int, int))); } QListNetworkModel::defaultHeader() { @@ -767,11 +774,10 @@ void NetworkModel::networkRemoved(const NetworkId &networkId) { } QModelIndex NetworkModel::bufferIndex(BufferId bufferId) { - BufferItem *bufferItem = findBufferItem(bufferId); - if(bufferItem) - return indexByItem(bufferItem); - else + if(!_bufferItemCache.contains(bufferId)) return QModelIndex(); + + return indexByItem(_bufferItemCache[bufferId]); } BufferItem *NetworkModel::findBufferItem(const BufferInfo &bufferInfo) { @@ -948,3 +954,59 @@ const Network *NetworkModel::networkByIndex(const QModelIndex &index) const { return Client::network(networkId); } + + +void NetworkModel::checkForRemovedBuffers(const QModelIndex &parent, int start, int end) { + if(parent.data(ItemTypeRole) != NetworkItemType) + return; + + for(int row = start; row <= end; row++) { + _bufferItemCache.remove(parent.child(row, 0).data(BufferIdRole).value()); + } +} + +void NetworkModel::checkForNewBuffers(const QModelIndex &parent, int start, int end) { + if(parent.data(ItemTypeRole) != NetworkItemType) + return; + + for(int row = start; row <= end; row++) { + QModelIndex child = parent.child(row, 0); + _bufferItemCache[child.data(BufferIdRole).value()] = static_cast(child.internalPointer()); + } +} + +QString NetworkModel::bufferName(BufferId bufferId) { + if(!_bufferItemCache.contains(bufferId)) + return QString(); + + return _bufferItemCache[bufferId]->bufferName(); +} + +NetworkId NetworkModel::networkId(BufferId bufferId) { + if(!_bufferItemCache.contains(bufferId)) + return NetworkId(); + + NetworkItem *netItem = qobject_cast(_bufferItemCache[bufferId]->parent()); + if(netItem) + return netItem->networkId(); + else + return NetworkId(); +} + +QString NetworkModel::networkName(BufferId bufferId) { + if(!_bufferItemCache.contains(bufferId)) + return QString(); + + NetworkItem *netItem = qobject_cast(_bufferItemCache[bufferId]->parent()); + if(netItem) + return netItem->networkName(); + else + return QString(); +} + +BufferInfo::Type NetworkModel::bufferType(BufferId bufferId) { + if(!_bufferItemCache.contains(bufferId)) + return BufferInfo::InvalidBuffer; + + return _bufferItemCache[bufferId]->bufferType(); +}