fixes #413 - Icons in Nicklist
[quassel.git] / src / uisupport / nickviewfilter.cpp
index 5332769..959ae9c 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  ***************************************************************************/
 
 #include "nickviewfilter.h"
+
+#include "buffersettings.h"
+#include "iconloader.h"
 #include "networkmodel.h"
-#include "uisettings.h"
 
 /******************************************************************************************
  * NickViewFilter
  ******************************************************************************************/
 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);
-  loadColors();
+
+  BufferSettings bufferSettings;
+  _showUserStateIcons = bufferSettings.showUserStateIcons();
+  bufferSettings.notify("ShowUserStateIcons", this, SLOT(showUserStateIconsChanged()));
 }
 
-void NickViewFilter::loadColors() {
-  UiSettings s("QtUi/Colors");
-  _FgOnlineStatus = s.value("onlineStatusFG", QVariant(QColor(Qt::black))).value<QColor>();
-  _FgAwayStatus = s.value("awayStatusFG", QVariant(QColor(Qt::gray))).value<QColor>();
-  // FIXME: use the style interface instead of qsettings
+bool NickViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
+  // root node, networkindexes, the bufferindex of the buffer this filter is active for and it's childs are accepted
+  if(!source_parent.isValid())
+    return true;
+
+  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 {
-  if(role == Qt::ForegroundRole)
-    return foreground(index);
-  else
+  switch(role) {
+  case Qt::DecorationRole:
+    return icon(index);
+  default:
     return QSortFilterProxyModel::data(index, role);
+  }
 }
 
-QVariant NickViewFilter::foreground(const QModelIndex &index) const {
-  if(!index.data(NetworkModel::ItemActiveRole).toBool())
-    return _FgAwayStatus;
-  return _FgOnlineStatus;
-}
+QVariant NickViewFilter::icon(const QModelIndex &index) const {
+  if(!_showUserStateIcons)
+    return QVariant();
 
+  if(index.column() != 0)
+    return QVariant();
 
-bool NickViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
-  // root node, networkindexes, the bufferindex of the buffer this filter is active for and it's childs are accepted
-  if(!source_parent.isValid())
-    return true;
+  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();
+  };
+}
 
-  QModelIndex source_child = source_parent.child(source_row, 0);
-  return (sourceModel()->data(source_child, NetworkModel::BufferIdRole).value<BufferId>() == _bufferId);
+void NickViewFilter::showUserStateIconsChanged() {
+  BufferSettings bufferSettings;
+  _showUserStateIcons = bufferSettings.showUserStateIcons();
 }