Quassl shows now activity from the backlog aswell.
[quassel.git] / src / client / networkmodel.cpp
index 076e704..61b269f 100644 (file)
@@ -40,9 +40,9 @@ BufferItem::BufferItem(BufferInfo bufferInfo, AbstractTreeItem *parent)
     _activity(NoActivity)
 {
   // determine BufferType
-  if(bufferInfo.buffer().isEmpty())
+  if(bufferInfo.bufferName().isEmpty())
     _type = StatusType;
-  else if(isChannelName(bufferInfo.buffer()))
+  else if(isChannelName(bufferInfo.bufferName()))
     _type = ChannelType;
   else
     _type = QueryType;
@@ -51,15 +51,16 @@ BufferItem::BufferItem(BufferInfo bufferInfo, AbstractTreeItem *parent)
   if(bufferType() == QueryType)
     flags |= Qt::ItemIsDropEnabled;
   setFlags(flags);
-}
 
+  _lastSeen = BufferSettings(bufferInfo.bufferId()).lastSeen();
+}
 
 const BufferInfo &BufferItem::bufferInfo() const {
   return _bufferInfo;
 }
 
 quint64 BufferItem::id() const {
-  return bufferInfo().uid().toInt();
+  return bufferInfo().bufferId().toInt();
 }
 
 bool BufferItem::isStatusBuffer() const {
@@ -81,14 +82,17 @@ BufferItem::ActivityLevel BufferItem::activity() const {
   return _activity;
 }
 
-void BufferItem::setActivity(const ActivityLevel &level) {
+bool BufferItem::setActivity(const ActivityLevel &level) {
   _activity = level;
   emit dataChanged();
+  return true;
 }
 
 void BufferItem::updateActivity(const ActivityLevel &level) {
+  ActivityLevel oldActivity = _activity;
   _activity |= level;
-  emit dataChanged();
+  if(oldActivity != _activity)
+    emit dataChanged();
 }
 
 QVariant BufferItem::data(int column, int role) const {
@@ -96,7 +100,7 @@ QVariant BufferItem::data(int column, int role) const {
   case NetworkModel::ItemTypeRole:
     return NetworkModel::BufferItemType;
   case NetworkModel::BufferIdRole:
-    return qVariantFromValue(bufferInfo().uid());
+    return qVariantFromValue(bufferInfo().bufferId());
   case NetworkModel::NetworkIdRole:
     return qVariantFromValue(bufferInfo().networkId());
   case NetworkModel::BufferInfoRole:
@@ -115,7 +119,9 @@ QVariant BufferItem::data(int column, int role) const {
 bool BufferItem::setData(int column, const QVariant &value, int role) {
   switch(role) {
   case NetworkModel::BufferActivityRole:
-    setActivity((ActivityLevel)value.toInt());
+    return setActivity((ActivityLevel)value.toInt());
+  case NetworkModel::LastSeenRole:
+    return setLastSeen();
   default:
     return PropertyMapItem::setData(column, value, role);
   }
@@ -163,7 +169,7 @@ QString BufferItem::bufferName() const {
   if(bufferType() == StatusType)
     return tr("Status Buffer");
   else
-    return bufferInfo().buffer();
+    return bufferInfo().bufferName();
 }
 
 QString BufferItem::topic() const {
@@ -263,6 +269,21 @@ void BufferItem::userModeChanged(IrcUser *ircUser) {
   addUserToCategory(ircUser);
 }
 
+void BufferItem::setLastMsgInsert(QDateTime msgDate) {
+  if(msgDate.isValid() && msgDate > _lastMsgInsert)
+    _lastMsgInsert = msgDate;
+}
+
+bool BufferItem::setLastSeen() {
+  _lastSeen = _lastMsgInsert;
+  BufferSettings(bufferInfo().bufferId()).setLastSeen(_lastSeen);
+  return true;
+}
+
+QDateTime BufferItem::lastSeen() {
+  return _lastSeen;
+}
+
 /*****************************************
 *  Network Items
 *****************************************/
@@ -578,7 +599,7 @@ QModelIndex NetworkModel::bufferIndex(BufferId bufferId) {
 }
 
 BufferItem *NetworkModel::existsBufferItem(const BufferInfo &bufferInfo) {
-  QModelIndex bufferIdx = bufferIndex(bufferInfo.uid());
+  QModelIndex bufferIdx = bufferIndex(bufferInfo.bufferId());
   if(bufferIdx.isValid())
     return static_cast<BufferItem *>(bufferIdx.internalPointer());
   else
@@ -701,13 +722,30 @@ void NetworkModel::bufferUpdated(BufferInfo bufferInfo) {
 }
 
 void NetworkModel::updateBufferActivity(const Message &msg) {
+  BufferItem *buff = bufferItem(msg.bufferInfo());
+  Q_ASSERT(buff);
+
+  buff->setLastMsgInsert(msg.timestamp());
+
+  if(buff->lastSeen() >= msg.timestamp())
+    return;
+
   BufferItem::ActivityLevel level = BufferItem::OtherActivity;
   if(msg.type() == Message::Plain || msg.type() == Message::Notice)
     level |= BufferItem::NewMessage;
 
-  if(msg.flags() & Message::Highlight)
+  const Network *net = Client::network(msg.bufferInfo().networkId());
+  if(net && msg.text().contains(net->myNick()))
     level |= BufferItem::Highlight;
-  
-  bufferItem(msg.buffer())->updateActivity(level);
+
+  bufferItem(msg.bufferInfo())->updateActivity(level);
 }
 
+const Network *NetworkModel::networkByIndex(const QModelIndex &index) const {
+  QVariant netVariant = index.data(NetworkIdRole);
+  if(!netVariant.isValid())
+    return 0;
+
+  NetworkId networkId = netVariant.value<NetworkId>();
+  return Client::network(networkId);
+}