From fb1c465a71b110984d59722bbf0ed873674daf94 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 27 Nov 2007 01:09:34 +0000 Subject: [PATCH] Now we have a sorted nicklist and hide unused categories \o/ --- src/client/nickmodel.cpp | 52 ++++++++++++++++++++++++++++---------- src/client/nickmodel.h | 17 ++++++++++++- src/qtui/mainwin.cpp | 3 ++- src/uisupport/nickview.cpp | 14 +++++++++- src/uisupport/nickview.h | 5 +++- 5 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/client/nickmodel.cpp b/src/client/nickmodel.cpp index d7e4248c..a3e7692f 100644 --- a/src/client/nickmodel.cpp +++ b/src/client/nickmodel.cpp @@ -140,25 +140,32 @@ QVariant NickModel::data(const QModelIndex &index, int role) const { } int cat = index.internalId(); if(!cat) { // top-level item (category) - if(role == Qt::DisplayRole) { - QString title; - switch(index.row()) { - case 0: title = tr("%n Owner(s)", "", users[index.row()].count()); break; - case 1: title = tr("%n Admin(s)", "", users[index.row()].count()); break; - case 2: title = tr("%n Operator(s)", "", users[index.row()].count()); break; - case 3: title = tr("%n Half-Op(s)", "", users[index.row()].count()); break; - case 4: title = tr("%n Voiced", "", users[index.row()].count()); break; - case 5: title = tr("%n User(s)", "", users[index.row()].count()); break; - default: - qDebug() << "invalid model index"; return QVariant(); + switch(role) { + case Qt::DisplayRole: { + QString title; + switch(index.row()) { + case 0: title = tr("%n Owner(s)", "", users[index.row()].count()); break; + case 1: title = tr("%n Admin(s)", "", users[index.row()].count()); break; + case 2: title = tr("%n Operator(s)", "", users[index.row()].count()); break; + case 3: title = tr("%n Half-Op(s)", "", users[index.row()].count()); break; + case 4: title = tr("%n Voiced", "", users[index.row()].count()); break; + case 5: title = tr("%n User(s)", "", users[index.row()].count()); break; + default: qDebug() << "invalid model index"; return QVariant(); + } + return title; } - return title; - } else return QVariant(); + case SortKeyRole: return index.row(); + default: return QVariant(); + } } else { IrcUser *user = users[cat-1][index.row()]; switch(role) { case Qt::DisplayRole: return user->nick(); + case Qt::ToolTipRole: + return user->hostmask(); + case SortKeyRole: + return user->nick(); default: return QVariant(); } @@ -223,4 +230,23 @@ void NickModel::changeUserModes(IrcUser *user) { } } +/****************************************************************************************** + * FilteredNickModel + ******************************************************************************************/ + +FilteredNickModel::FilteredNickModel(QObject *parent) : QSortFilterProxyModel(parent) { + setDynamicSortFilter(true); + setSortCaseSensitivity(Qt::CaseInsensitive); + setSortRole(NickModel::SortKeyRole); + +} + +// Hide empty categories +bool FilteredNickModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { + if(!source_parent.isValid()) { + QModelIndex index = sourceModel()->index(source_row, 0); + return sourceModel()->rowCount(index); + } + return true; +} diff --git a/src/client/nickmodel.h b/src/client/nickmodel.h index b49ebf1d..828f21d4 100644 --- a/src/client/nickmodel.h +++ b/src/client/nickmodel.h @@ -22,6 +22,7 @@ #define _NICKMODEL_H_ #include +#include #include class IrcChannel; @@ -32,12 +33,14 @@ class IrcUser; * levels, where the top-level items are the categories (such as Ops, Voiced etc), and the second-level items * the actual nicks/users. Several roles are provided to access information about a nick. * - * Note that the nicks are not sorted in any way. Use a QSortFilterProxyModel to do that instead. + * Note that the nicks are not sorted in any way. Use a FilteredNickModel instead. */ class NickModel : public QAbstractItemModel { Q_OBJECT public: + enum NickModelRole { SortKeyRole = Qt::UserRole }; + NickModel(IrcChannel *channel = 0, QObject *parent = 0); virtual ~NickModel(); @@ -70,4 +73,16 @@ class NickModel : public QAbstractItemModel { }; +//! This ProxyModel can be used on top of a NickModel in order to provide a sorted nicklist and to hide unused categories. +class FilteredNickModel : public QSortFilterProxyModel { + Q_OBJECT + + public: + FilteredNickModel(QObject *parent = 0); + + protected: + virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + +}; + #endif diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index e8f515fd..a815df9b 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -197,6 +197,7 @@ void MainWin::connectedToCore() { ui.actionDisconnectCore->setEnabled(true); ui.actionNetworkList->setEnabled(true); ui.bufferWidget->show(); + statusBar()->showMessage(tr("Connected to core.")); } void MainWin::disconnectedFromCore() { @@ -206,7 +207,7 @@ void MainWin::disconnectedFromCore() { ui.actionNetworkList->setEnabled(false); ui.bufferWidget->hide(); ui.actionConnectCore->setEnabled(true); - //qDebug() << "mainwin disconnected"; + statusBar()->showMessage(tr("Not connected to core.")); } AbstractUiMsg *MainWin::layoutMsg(const Message &msg) { diff --git a/src/uisupport/nickview.cpp b/src/uisupport/nickview.cpp index 26a345df..d4eb827d 100644 --- a/src/uisupport/nickview.cpp +++ b/src/uisupport/nickview.cpp @@ -21,12 +21,22 @@ #include "nickview.h" #include "nickmodel.h" +#include +#include NickView::NickView(QWidget *parent) : QTreeView(parent) { setGeometry(0, 0, 30, 30); //setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + setIndentation(10); + header()->hide(); + header()->hideSection(1); + setAnimated(true); + setSortingEnabled(true); + sortByColumn(0, Qt::AscendingOrder); + filteredModel = new FilteredNickModel(this); + QTreeView::setModel(filteredModel); } NickView::~NickView() { @@ -35,5 +45,7 @@ NickView::~NickView() { } void NickView::setModel(NickModel *model) { - QTreeView::setModel(model); + filteredModel->setSourceModel(model); + expandAll(); + } diff --git a/src/uisupport/nickview.h b/src/uisupport/nickview.h index 25a6b3e3..2dcf1801 100644 --- a/src/uisupport/nickview.h +++ b/src/uisupport/nickview.h @@ -24,6 +24,8 @@ #include class NickModel; +class FilteredNickModel; +class QSortFilterProxyModel; class NickView : public QTreeView { Q_OBJECT @@ -35,7 +37,8 @@ class NickView : public QTreeView { public slots: void setModel(NickModel *model); - + private: + QSortFilterProxyModel *filteredModel; }; -- 2.20.1