From 6b31f4c8abb36ebe658c2e5ce2a8e9ba2a50f443 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Thu, 21 May 2009 21:17:25 +0200 Subject: [PATCH] new internal hot buffers list --- src/client/CMakeLists.txt | 2 + src/client/bufferhotlistfilter.cpp | 73 ++++++++++++++++++++++++++++++ src/client/bufferhotlistfilter.h | 40 ++++++++++++++++ src/client/networkmodel.cpp | 15 +++++- src/client/networkmodel.h | 6 ++- 5 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/client/bufferhotlistfilter.cpp create mode 100644 src/client/bufferhotlistfilter.h diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index f60f66c5..f9a60f25 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -10,6 +10,7 @@ set(SOURCES abstractmessageprocessor.cpp abstractui.cpp backlogrequester.cpp + bufferhotlistfilter.cpp buffermodel.cpp buffersettings.cpp bufferviewoverlay.cpp @@ -34,6 +35,7 @@ set(SOURCES set(MOC_HDRS abstractmessageprocessor.h abstractui.h + bufferhotlistfilter.h buffermodel.h bufferviewoverlay.h client.h diff --git a/src/client/bufferhotlistfilter.cpp b/src/client/bufferhotlistfilter.cpp new file mode 100644 index 00000000..e3f31da8 --- /dev/null +++ b/src/client/bufferhotlistfilter.cpp @@ -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(); + 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 rightUnreadMsgId = sourceModel()->data(source_right, NetworkModel::BufferFirstUnreadMsgIdRole).value(); + 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(); + 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 index 00000000..a3577bdd --- /dev/null +++ b/src/client/bufferhotlistfilter.h @@ -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 + +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 diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index ae440919..f5442be1 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -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); } diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 8be6b854..09f9ece3 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -113,6 +113,8 @@ public: void clearActivityLevel(); void updateActivityLevel(const Message &msg); + inline const MsgId &firstUnreadMsgId() const { return _firstUnreadMsgId; } + bool isCurrentBuffer() const; virtual QString toolTip(int column) const; @@ -124,6 +126,7 @@ private: BufferInfo::ActivityLevel _activity; MsgId _lastSeenMsgId; MsgId _lastSeenMarkerMsgId; + MsgId _firstUnreadMsgId; }; /***************************************** @@ -270,7 +273,8 @@ public: ItemTypeRole, UserAwayRole, IrcUserRole, - IrcChannelRole + IrcChannelRole, + BufferFirstUnreadMsgIdRole, }; enum ItemType { -- 2.20.1