fixes #413 - Icons in Nicklist
authorMarcus Eggenberger <egs@quassel-irc.org>
Sat, 14 Feb 2009 00:27:52 +0000 (01:27 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sat, 14 Feb 2009 00:27:52 +0000 (01:27 +0100)
src/uisupport/nickviewfilter.cpp
src/uisupport/nickviewfilter.h

index 5fa8e1f..959ae9c 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "nickviewfilter.h"
 
 
 #include "nickviewfilter.h"
 
+#include "buffersettings.h"
+#include "iconloader.h"
 #include "networkmodel.h"
 
 /******************************************************************************************
 #include "networkmodel.h"
 
 /******************************************************************************************
  ******************************************************************************************/
 NickViewFilter::NickViewFilter(const BufferId &bufferId, NetworkModel *parent)
   : QSortFilterProxyModel(parent),
  ******************************************************************************************/
 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);
 {
   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 {
 }
 
 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>() == _bufferId);
 }
   QModelIndex source_child = source_parent.child(source_row, 0);
   return (sourceModel()->data(source_child, NetworkModel::BufferIdRole).value<BufferId>() == _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();
+}
index 70809d3..7bf9b6b 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <QSortFilterProxyModel>
 
 
 #include <QSortFilterProxyModel>
 
+#include <QPixmap>
+
 #include "types.h"
 
 class NetworkModel;
 #include "types.h"
 
 class NetworkModel;
@@ -34,12 +36,27 @@ class NickViewFilter : public QSortFilterProxyModel {
 public:
   NickViewFilter(const BufferId &bufferId, NetworkModel *parent = 0);
 
 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;
 
 protected:
   virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
 
+private slots:
+  void showUserStateIconsChanged();
+
 private:
   BufferId _bufferId;
 
 private:
   BufferId _bufferId;
 
+  QHash<int, QPixmap> _categoryIconHash;
+  QPixmap _userOnlineIcon;
+  QPixmap _userAwayIcon;
+  QPixmap _categoryOpIcon;
+  QPixmap _categoryVoiceIcon;
+  int _opIconLimit;
+  int _voiceIconLimit;
+  bool _showUserStateIcons;
+
   void loadColors();
 };
 
   void loadColors();
 };