new internal hot buffers list
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 21 May 2009 19:17:25 +0000 (21:17 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 21 May 2009 20:01:12 +0000 (22:01 +0200)
src/client/CMakeLists.txt
src/client/bufferhotlistfilter.cpp [new file with mode: 0644]
src/client/bufferhotlistfilter.h [new file with mode: 0644]
src/client/networkmodel.cpp
src/client/networkmodel.h

index f60f66c..f9a60f2 100644 (file)
@@ -10,6 +10,7 @@ set(SOURCES
     abstractmessageprocessor.cpp
     abstractui.cpp
     backlogrequester.cpp
     abstractmessageprocessor.cpp
     abstractui.cpp
     backlogrequester.cpp
+    bufferhotlistfilter.cpp
     buffermodel.cpp
     buffersettings.cpp
     bufferviewoverlay.cpp
     buffermodel.cpp
     buffersettings.cpp
     bufferviewoverlay.cpp
@@ -34,6 +35,7 @@ set(SOURCES
 set(MOC_HDRS
     abstractmessageprocessor.h
     abstractui.h
 set(MOC_HDRS
     abstractmessageprocessor.h
     abstractui.h
+    bufferhotlistfilter.h
     buffermodel.h
     bufferviewoverlay.h
     client.h
     buffermodel.h
     bufferviewoverlay.h
     client.h
diff --git a/src/client/bufferhotlistfilter.cpp b/src/client/bufferhotlistfilter.cpp
new file mode 100644 (file)
index 0000000..e3f31da
--- /dev/null
@@ -0,0 +1,73 @@
+/***************************************************************************
+ *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "bufferhotlistfilter.h"
+
+#include "networkmodel.h"
+
+BufferHotListFilter::BufferHotListFilter(QAbstractItemModel *source, QObject *parent)
+  : QSortFilterProxyModel(parent)
+{
+  setSourceModel(source);
+  setDynamicSortFilter(true);
+  sort(0, Qt::DescendingOrder); // enable sorting... this is "usually" triggered by a enabling setSortingEnabled(true) on a view;
+}
+
+bool BufferHotListFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
+  Q_ASSERT(sourceModel());
+  QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent);
+
+  MsgId firstUnreadMsgId = sourceModel()->data(source_index, NetworkModel::BufferFirstUnreadMsgIdRole).value<MsgId>();
+  if(!firstUnreadMsgId.isValid())
+    return false;
+
+  // filter out statusbuffers (it's accessable as networkitem)
+  BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt();
+  if(bufferType == BufferInfo::StatusBuffer) {
+    NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt();
+    return itemType == NetworkModel::NetworkItemType;
+  }
+}
+
+bool BufferHotListFilter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
+  qDebug() << Q_FUNC_INFO;
+  qDebug() << source_left << source_right;
+  int leftActivity = sourceModel()->data(source_left, NetworkModel::BufferActivityRole).toInt();
+  int rightActivity = sourceModel()->data(source_right, NetworkModel::BufferActivityRole).toInt();
+  qDebug() << leftActivity << rightActivity;
+  if(leftActivity != rightActivity)
+    return leftActivity < rightActivity;
+
+  MsgId leftUnreadMsgId = sourceModel()->data(source_left, NetworkModel::BufferFirstUnreadMsgIdRole).value<MsgId>();
+  MsgId rightUnreadMsgId = sourceModel()->data(source_right, NetworkModel::BufferFirstUnreadMsgIdRole).value<MsgId>();
+  qDebug() << leftUnreadMsgId << rightUnreadMsgId;
+  return leftUnreadMsgId > rightUnreadMsgId; // newer messages are treated to be "less"
+}
+
+QVariant BufferHotListFilter::data(const QModelIndex &index, int role) const {
+  QVariant d = QSortFilterProxyModel::data(index, role);
+
+  if(role == Qt::DisplayRole) {
+    int activity = QSortFilterProxyModel::data(index, NetworkModel::BufferActivityRole).toInt();    
+    MsgId unreadMsgId = QSortFilterProxyModel::data(index, NetworkModel::BufferFirstUnreadMsgIdRole).value<MsgId>();
+    return QString("%1 %2 %3").arg(d.toString()).arg(activity).arg(unreadMsgId.toInt());
+  }
+  return d;
+}
diff --git a/src/client/bufferhotlistfilter.h b/src/client/bufferhotlistfilter.h
new file mode 100644 (file)
index 0000000..a3577bd
--- /dev/null
@@ -0,0 +1,40 @@
+/***************************************************************************
+ *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef BUFFERHOTLISTFILTER_H
+#define BUFFERHOTLISTFILTER_H
+
+#include <QSortFilterProxyModel>
+
+class BufferHotListFilter : public QSortFilterProxyModel {
+  Q_OBJECT
+
+public:
+  BufferHotListFilter(QAbstractItemModel *source, QObject *parent = 0);
+
+  virtual inline int columnCount(const QModelIndex &) const { return 1; }
+  QVariant data(const QModelIndex &index, int role) const;
+
+protected:
+  virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
+  virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;
+};
+
+#endif //BUFFERHOTLISTFILTER_H
index ae44091..f5442be 100644 (file)
@@ -216,6 +216,7 @@ void BufferItem::setActivityLevel(BufferInfo::ActivityLevel level) {
 void BufferItem::clearActivityLevel() {
   _activity = BufferInfo::NoActivity;
   _lastSeenMarkerMsgId = _lastSeenMsgId;
 void BufferItem::clearActivityLevel() {
   _activity = BufferInfo::NoActivity;
   _lastSeenMarkerMsgId = _lastSeenMsgId;
+  _firstUnreadMsgId = MsgId();
   emit dataChanged();
 }
 
   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(msg.flags() & Message::Self)      // don't update activity for our own messages
     return;
 
-  if(lastSeenMsgId() >= msg.msgId())
+  if(msg.msgId() <= lastSeenMsgId())
     return;
 
     return;
 
+  bool stateChanged = false;
+  if(!firstUnreadMsgId().isValid() || msg.msgId() < firstUnreadMsgId()) {
+    stateChanged = true;
+    _firstUnreadMsgId = msg.msgId();
+  }
+     
   BufferInfo::ActivityLevel oldLevel = activityLevel();
 
   _activity |= BufferInfo::OtherActivity;
   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(msg.flags() & Message::Highlight)
     _activity |= BufferInfo::Highlight;
 
-  if(oldLevel != _activity)
+  stateChanged |= (oldLevel != _activity);
+
+  if(stateChanged)
     emit dataChanged();
 }
 
     emit dataChanged();
 }
 
@@ -259,6 +268,8 @@ QVariant BufferItem::data(int column, int role) const {
     return isActive();
   case NetworkModel::BufferActivityRole:
     return (int)activityLevel();
     return isActive();
   case NetworkModel::BufferActivityRole:
     return (int)activityLevel();
+  case NetworkModel::BufferFirstUnreadMsgIdRole:
+    return qVariantFromValue(firstUnreadMsgId());
   default:
     return PropertyMapItem::data(column, role);
   }
   default:
     return PropertyMapItem::data(column, role);
   }
index 8be6b85..09f9ece 100644 (file)
@@ -113,6 +113,8 @@ public:
   void clearActivityLevel();
   void updateActivityLevel(const Message &msg);
 
   void clearActivityLevel();
   void updateActivityLevel(const Message &msg);
 
+  inline const MsgId &firstUnreadMsgId() const { return _firstUnreadMsgId; }
+
   bool isCurrentBuffer() const;
   virtual QString toolTip(int column) const;
 
   bool isCurrentBuffer() const;
   virtual QString toolTip(int column) const;
 
@@ -124,6 +126,7 @@ private:
   BufferInfo::ActivityLevel _activity;
   MsgId _lastSeenMsgId;
   MsgId _lastSeenMarkerMsgId;
   BufferInfo::ActivityLevel _activity;
   MsgId _lastSeenMsgId;
   MsgId _lastSeenMarkerMsgId;
+  MsgId _firstUnreadMsgId;
 };
 
 /*****************************************
 };
 
 /*****************************************
@@ -270,7 +273,8 @@ public:
     ItemTypeRole,
     UserAwayRole,
     IrcUserRole,
     ItemTypeRole,
     UserAwayRole,
     IrcUserRole,
-    IrcChannelRole
+    IrcChannelRole,
+    BufferFirstUnreadMsgIdRole,
   };
 
   enum ItemType {
   };
 
   enum ItemType {