Properly updating the new message marker on buffer switches
[quassel.git] / src / client / networkmodel.cpp
index 3e1bb10..d1d5fb5 100644 (file)
@@ -39,11 +39,16 @@ NetworkItem::NetworkItem(const NetworkId &netid, AbstractTreeItem *parent)
   : PropertyMapItem(QList<QString>() << "networkName" << "currentServer" << "nickCount", parent),
     _networkId(netid)
 {
-  setFlags(Qt::ItemIsEnabled);
+  setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
 }
 
 QVariant NetworkItem::data(int column, int role) const {
   switch(role) {
+  case NetworkModel::BufferIdRole:
+    if(childCount())
+      return child(0)->data(column, role);
+    else
+      return QVariant();
   case NetworkModel::NetworkIdRole:
     return qVariantFromValue(_networkId);
   case NetworkModel::ItemTypeRole:
@@ -185,10 +190,16 @@ void BufferItem::setActivityLevel(BufferInfo::ActivityLevel level) {
   }
 }
 
-//void BufferItem::updateActivityLevel(BufferInfo::ActivityLevel level) {
+void BufferItem::clearActivityLevel() {
+  _activity = BufferInfo::NoActivity;
+  _lastSeenMarkerMsgId = _lastSeenMsgId;
+  emit dataChanged();
+}
+
 void BufferItem::updateActivityLevel(const Message &msg) {
-  if(isCurrentBuffer())
+  if(isCurrentBuffer()) {
     return;
+  }
 
   if(msg.flags() & Message::Self)      // don't update activity for our own messages
     return;
@@ -247,6 +258,14 @@ void BufferItem::setBufferName(const QString &name) {
   emit dataChanged(0);
 }
 
+void BufferItem::setLastSeenMsgId(const MsgId &msgId) {
+  _lastSeenMsgId = msgId;
+  if(!isCurrentBuffer()) {
+    _lastSeenMarkerMsgId = msgId;
+  }
+  setActivityLevel(BufferInfo::NoActivity); 
+}
+
 bool BufferItem::isCurrentBuffer() const {
   return _bufferInfo.bufferId() == Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>();
 }
@@ -907,6 +926,13 @@ MsgId NetworkModel::lastSeenMsgId(BufferId bufferId) {
   return _bufferItemCache[bufferId]->lastSeenMsgId();
 }
 
+MsgId NetworkModel::lastSeenMarkerMsgId(BufferId bufferId) {
+  if(!_bufferItemCache.contains(bufferId))
+    return MsgId();
+
+  return _bufferItemCache[bufferId]->lastSeenMarkerMsgId();
+}
+
 void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) {
   BufferItem *bufferItem = findBufferItem(bufferId);
   if(!bufferItem) {
@@ -917,7 +943,10 @@ void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId
 }
 
 void NetworkModel::updateBufferActivity(const Message &msg) {
-  bufferItem(msg.bufferInfo())->updateActivityLevel(msg);
+  BufferItem *item = bufferItem(msg.bufferInfo());
+  item->updateActivityLevel(msg);
+  if(item->isCurrentBuffer())
+    emit setLastSeenMsg(item->bufferId(), msg.msgId());
 }
 
 void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel level) {
@@ -929,6 +958,15 @@ void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::Activ
   bufferItem->setActivityLevel(level);
 }
 
+void NetworkModel::clearBufferActivity(const BufferId &bufferId) {
+  BufferItem *bufferItem = findBufferItem(bufferId);
+  if(!bufferItem) {
+    qDebug() << "NetworkModel::clearBufferActivity(): buffer is unknown:" << bufferId;
+    return;
+  }
+  bufferItem->clearActivityLevel();
+}
+
 const Network *NetworkModel::networkByIndex(const QModelIndex &index) const {
   QVariant netVariant = index.data(NetworkIdRole);
   if(!netVariant.isValid())