X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fnetworkmodel.cpp;h=793f5ae5218dddba6d0c121c6384938cb1046a44;hb=533eaaeda64759c01daa624365b8fc63eeba5ccf;hp=d6c18d7c9bdfcd70e9568a1cd399edf05c840742;hpb=4a174a228d64ab906a0944f3de3dfe4324d058ff;p=quassel.git diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index d6c18d7c..793f5ae5 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -23,6 +23,7 @@ #include #include "bufferinfo.h" +#include "buffermodel.h" #include "client.h" #include "signalproxy.h" #include "network.h" @@ -185,10 +186,27 @@ void BufferItem::setActivityLevel(Buffer::ActivityLevel level) { } } -void BufferItem::updateActivityLevel(Buffer::ActivityLevel level) { - Buffer::ActivityLevel oldActivity = _activity; - _activity |= level; - if(oldActivity != _activity) +//void BufferItem::updateActivityLevel(Buffer::ActivityLevel level) { +void BufferItem::updateActivityLevel(const Message &msg) { + if(isCurrentBuffer()) + return; + + if(msg.flags() & Message::Self) // don't update activity for our own messages + return; + + if(lastSeenMsgId() >= msg.msgId()) + return; + + Buffer::ActivityLevel oldLevel = activityLevel(); + + _activity |= Buffer::OtherActivity; + if(msg.type() & (Message::Plain | Message::Notice | Message::Action)) + _activity |= Buffer::NewMessage; + + if(msg.flags() & Message::Highlight) + _activity |= Buffer::Highlight; + + if(oldLevel != _activity) emit dataChanged(); } @@ -230,33 +248,15 @@ void BufferItem::setBufferName(const QString &name) { emit dataChanged(0); } +bool BufferItem::isCurrentBuffer() const { + return _bufferInfo.bufferId() == Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value(); +} + QString BufferItem::toolTip(int column) const { Q_UNUSED(column); return tr("

%1 - %2

").arg(bufferInfo().bufferId().toInt()).arg(bufferName()); } -/* -void BufferItem::setLastMsgInsert(QDateTime msgDate) { - if(msgDate.isValid() && msgDate > _lastMsgInsert) - _lastMsgInsert = msgDate; -} -*/ -/* -// FIXME emit dataChanged() -bool BufferItem::setLastSeen() { - if(_lastSeen > _lastMsgInsert) - return false; - - _lastSeen = _lastMsgInsert; - BufferSettings(bufferInfo().bufferId()).setLastSeen(_lastSeen); - return true; -} - -QDateTime BufferItem::lastSeen() { - return _lastSeen; -} -*/ - /***************************************** * StatusBufferItem *****************************************/ @@ -705,6 +705,10 @@ QString IrcUserItem::toolTip(int column) const { 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() { @@ -717,13 +721,6 @@ bool NetworkModel::isBufferIndex(const QModelIndex &index) const { return index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType; } -/* -Buffer *NetworkModel::getBufferByIndex(const QModelIndex &index) const { - BufferItem *item = static_cast(index.internalPointer()); - return Client::instance()->buffer(item->id()); -} -*/ - int NetworkModel::networkRow(NetworkId networkId) { NetworkItem *netItem = 0; for(int i = 0; i < rootItem->childCount(); i++) { @@ -770,35 +767,23 @@ 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(); -} -BufferItem *NetworkModel::findBufferItem(const BufferInfo &bufferInfo) { - NetworkItem *netItem = findNetworkItem(bufferInfo.networkId()); - if(!netItem) - return 0; - - BufferItem *bufferItem = netItem->findBufferItem(bufferInfo); - return bufferItem; + return indexByItem(_bufferItemCache[bufferId]); } 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; + if(_bufferItemCache.contains(bufferId)) + return _bufferItemCache[bufferId]; + else + return 0; } BufferItem *NetworkModel::bufferItem(const BufferInfo &bufferInfo) { + if(_bufferItemCache.contains(bufferInfo.bufferId())) + return _bufferItemCache[bufferInfo.bufferId()]; + NetworkItem *netItem = networkItem(bufferInfo.networkId()); return netItem->bufferItem(bufferInfo); } @@ -909,37 +894,38 @@ void NetworkModel::bufferUpdated(BufferInfo bufferInfo) { } void NetworkModel::removeBuffer(BufferId bufferId) { + BufferItem *buffItem = findBufferItem(bufferId); + if(!buffItem) + return; + + buffItem->parent()->removeChild(buffItem); +} + +void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) { BufferItem *bufferItem = findBufferItem(bufferId); - if(bufferItem) - bufferItem->parent()->removeChild(bufferItem); + if(!bufferItem) { + qDebug() << "NetworkModel::setLastSeenMsgId(): buffer is unknown:" << bufferId; + return; + } + bufferItem->setLastSeenMsgId(msgId); } -/* void NetworkModel::updateBufferActivity(const Message &msg) { - BufferItem *buff = bufferItem(msg.bufferInfo()); - Q_ASSERT(buff); - - buff->setLastMsgInsert(msg.timestamp()); - - if(buff->lastSeen() >= msg.timestamp()) + BufferItem *bufferItem = findBufferItem(msg.bufferInfo()); + if(!bufferItem) { + qDebug() << "NetworkModel::updateBufferActivity(): buffer is unknown:" << msg.bufferInfo(); return; - - BufferItem::ActivityLevel level = BufferItem::OtherActivity; - if(msg.type() == Message::Plain || msg.type() == Message::Notice) - level |= BufferItem::NewMessage; - - if(msg.flags() & Message::Highlight) - level |= BufferItem::Highlight; - - bufferItem(msg.bufferInfo())->updateActivity(level); + } + bufferItem->updateActivityLevel(msg); } -*/ - -void NetworkModel::setBufferActivity(const BufferInfo &info, Buffer::ActivityLevel level) { - BufferItem *buff = bufferItem(info); - Q_ASSERT(buff); - buff->setActivityLevel(level); +void NetworkModel::setBufferActivity(const BufferId &bufferId, Buffer::ActivityLevel level) { + BufferItem *bufferItem = findBufferItem(bufferId); + if(!bufferItem) { + qDebug() << "NetworkModel::setBufferActivity(): buffer is unknown:" << bufferId; + return; + } + bufferItem->setActivityLevel(level); } const Network *NetworkModel::networkByIndex(const QModelIndex &index) const { @@ -951,3 +937,57 @@ 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(); +}