From d37bdc91c5474603e1417c2cd9c40c02e1ad5ee6 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sat, 14 Feb 2009 01:27:52 +0100 Subject: [PATCH 1/1] fixes #413 - Icons in Nicklist --- src/uisupport/nickviewfilter.cpp | 58 +++++++++++++++++++++++++++++++- src/uisupport/nickviewfilter.h | 17 ++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/uisupport/nickviewfilter.cpp b/src/uisupport/nickviewfilter.cpp index 5fa8e1fa..959ae9c6 100644 --- a/src/uisupport/nickviewfilter.cpp +++ b/src/uisupport/nickviewfilter.cpp @@ -20,6 +20,8 @@ #include "nickviewfilter.h" +#include "buffersettings.h" +#include "iconloader.h" #include "networkmodel.h" /****************************************************************************************** @@ -27,12 +29,22 @@ ******************************************************************************************/ NickViewFilter::NickViewFilter(const BufferId &bufferId, NetworkModel *parent) : QSortFilterProxyModel(parent), - _bufferId(bufferId) + _bufferId(bufferId), + _userOnlineIcon(SmallIcon("im-user")), + _userAwayIcon(SmallIcon("im-user-away")), + _categoryOpIcon(SmallIcon("irc-operator")), + _categoryVoiceIcon(SmallIcon("irc-voice")), + _opIconLimit(UserCategoryItem::categoryFromModes("o")), + _voiceIconLimit(UserCategoryItem::categoryFromModes("v")) { setSourceModel(parent); setDynamicSortFilter(true); setSortCaseSensitivity(Qt::CaseInsensitive); setSortRole(TreeModel::SortRole); + + BufferSettings bufferSettings; + _showUserStateIcons = bufferSettings.showUserStateIcons(); + bufferSettings.notify("ShowUserStateIcons", this, SLOT(showUserStateIconsChanged())); } bool NickViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { @@ -43,3 +55,47 @@ bool NickViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_ QModelIndex source_child = source_parent.child(source_row, 0); return (sourceModel()->data(source_child, NetworkModel::BufferIdRole).value() == _bufferId); } + +QVariant NickViewFilter::data(const QModelIndex &index, int role) const { + switch(role) { + case Qt::DecorationRole: + return icon(index); + default: + return QSortFilterProxyModel::data(index, role); + } +} + +QVariant NickViewFilter::icon(const QModelIndex &index) const { + if(!_showUserStateIcons) + return QVariant(); + + if(index.column() != 0) + return QVariant(); + + QModelIndex source_index = mapToSource(index); + NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt(); + switch(itemType) { + case NetworkModel::UserCategoryItemType: + { + int categoryId = sourceModel()->data(source_index, TreeModel::SortRole).toInt(); + if(categoryId <= _opIconLimit) + return _categoryOpIcon; + if(categoryId <= _voiceIconLimit) + return _categoryVoiceIcon; + return _userOnlineIcon; + } + case NetworkModel::IrcUserItemType: + if(sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool()) + return _userOnlineIcon; + else + return _userAwayIcon; + break; + default: + return QVariant(); + }; +} + +void NickViewFilter::showUserStateIconsChanged() { + BufferSettings bufferSettings; + _showUserStateIcons = bufferSettings.showUserStateIcons(); +} diff --git a/src/uisupport/nickviewfilter.h b/src/uisupport/nickviewfilter.h index 70809d3b..7bf9b6bc 100644 --- a/src/uisupport/nickviewfilter.h +++ b/src/uisupport/nickviewfilter.h @@ -23,6 +23,8 @@ #include +#include + #include "types.h" class NetworkModel; @@ -34,12 +36,27 @@ class NickViewFilter : public QSortFilterProxyModel { public: NickViewFilter(const BufferId &bufferId, NetworkModel *parent = 0); + virtual QVariant data(const QModelIndex &index, int role) const; + QVariant icon(const QModelIndex &index) const; + protected: virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; +private slots: + void showUserStateIconsChanged(); + private: BufferId _bufferId; + QHash _categoryIconHash; + QPixmap _userOnlineIcon; + QPixmap _userAwayIcon; + QPixmap _categoryOpIcon; + QPixmap _categoryVoiceIcon; + int _opIconLimit; + int _voiceIconLimit; + bool _showUserStateIcons; + void loadColors(); }; -- 2.20.1