new internal hot buffers list
[quassel.git] / src / client / networkmodel.cpp
index cd5f46d..f5442be 100644 (file)
@@ -216,6 +216,7 @@ void BufferItem::setActivityLevel(BufferInfo::ActivityLevel level) {
 void BufferItem::clearActivityLevel() {
   _activity = BufferInfo::NoActivity;
   _lastSeenMarkerMsgId = _lastSeenMsgId;
+  _firstUnreadMsgId = MsgId();
   emit dataChanged();
 }
 
@@ -227,9 +228,15 @@ void BufferItem::updateActivityLevel(const Message &msg) {
   if(msg.flags() & Message::Self)      // don't update activity for our own messages
     return;
 
-  if(lastSeenMsgId() >= msg.msgId())
+  if(msg.msgId() <= lastSeenMsgId())
     return;
 
+  bool stateChanged = false;
+  if(!firstUnreadMsgId().isValid() || msg.msgId() < firstUnreadMsgId()) {
+    stateChanged = true;
+    _firstUnreadMsgId = msg.msgId();
+  }
+     
   BufferInfo::ActivityLevel oldLevel = activityLevel();
 
   _activity |= BufferInfo::OtherActivity;
@@ -239,7 +246,9 @@ void BufferItem::updateActivityLevel(const Message &msg) {
   if(msg.flags() & Message::Highlight)
     _activity |= BufferInfo::Highlight;
 
-  if(oldLevel != _activity)
+  stateChanged |= (oldLevel != _activity);
+
+  if(stateChanged)
     emit dataChanged();
 }
 
@@ -259,6 +268,8 @@ QVariant BufferItem::data(int column, int role) const {
     return isActive();
   case NetworkModel::BufferActivityRole:
     return (int)activityLevel();
+  case NetworkModel::BufferFirstUnreadMsgIdRole:
+    return qVariantFromValue(firstUnreadMsgId());
   default:
     return PropertyMapItem::data(column, role);
   }
@@ -970,6 +981,7 @@ MsgId NetworkModel::lastSeenMarkerMsgId(BufferId bufferId) const {
 MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) {
   BufferItem *bufferItem = findBufferItem(bufferId);
   if(!bufferItem) {
+    qDebug() << "NetworkModel::lastSeenMsgId(): buffer is unknown:" << bufferId;
     Client::purgeKnownBufferIds();
     return MsgId();
   }
@@ -979,6 +991,7 @@ MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) {
 void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) {
   BufferItem *bufferItem = findBufferItem(bufferId);
   if(!bufferItem) {
+    qDebug() << "NetworkModel::setLastSeenMsgId(): buffer is unknown:" << bufferId;
     Client::purgeKnownBufferIds();
     return;
   }
@@ -1003,6 +1016,16 @@ void NetworkModel::updateBufferActivity(Message &msg) {
     msg.setFlags(msg.flags() | Message::Redirected);
     redirectionTarget = _errorMsgsTarget;
     break;
+  // Update IrcUser's last activity
+  case Message::Plain:
+  case Message::Action:
+    if(bufferType(msg.bufferId()) == BufferInfo::ChannelBuffer) {
+      const Network *net = Client::network(msg.bufferInfo().networkId());
+      IrcUser *user = net ? net->ircUser(nickFromMask(msg.sender())) : 0;
+      if(user)
+        user->setLastChannelActivity(msg.bufferId(), msg.timestamp());
+    }
+    break;
   default:
     break;
   }