fixes #609 - bufferview not correctly sorted
[quassel.git] / src / uisupport / bufferviewfilter.cpp
index 3e0a59f..5b58ee5 100644 (file)
@@ -45,6 +45,8 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *
   : QSortFilterProxyModel(model),
     _config(0),
     _sortOrder(Qt::AscendingOrder),
+    _channelJoinedIcon(SmallIcon("irc-channel-active")),
+    _channelPartedIcon(SmallIcon("irc-channel-inactive")),
     _userOfflineIcon(SmallIcon("im-user-offline")),
     _userAwayIcon(SmallIcon("im-user-away")),
     _userOnlineIcon(SmallIcon("im-user")),
@@ -139,13 +141,8 @@ void BufferViewFilter::enableEditMode(bool enable) {
     return;
 
   if(enable == false) {
-    int numBuffers = config()->bufferList().count();
+    addBuffers(QList<BufferId>::fromSet(_toAdd));
     QSet<BufferId>::const_iterator iter;
-    for(iter = _toAdd.constBegin(); iter != _toAdd.constEnd(); iter++) {
-      if(config()->bufferList().contains(*iter))
-       continue;
-      config()->requestAddBuffer(*iter, numBuffers);
-    }
     for(iter = _toTempRemove.constBegin(); iter != _toTempRemove.constEnd(); iter++) {
       if(config()->temporarilyRemovedBuffers().contains(*iter))
         continue;
@@ -222,10 +219,12 @@ bool BufferViewFilter::dropMimeData(const QMimeData *data, Qt::DropAction action
          pos = 0;
       }
 
-      if(config()->bufferList().contains(bufferId)) {
+      if(config()->bufferList().contains(bufferId) && !config()->sortAlphabetically()) {
        if(config()->bufferList().indexOf(bufferId) < pos)
          pos--;
-       config()->requestMoveBuffer(bufferId, pos);
+       ClientBufferViewConfig *clientConf = qobject_cast<ClientBufferViewConfig *>(config());
+       if(!clientConf || !clientConf->isLocked())
+         config()->requestMoveBuffer(bufferId, pos);
       } else {
        config()->requestAddBuffer(bufferId, pos);
       }
@@ -262,6 +261,33 @@ void BufferViewFilter::addBuffer(const BufferId &bufferId) const {
   config()->requestAddBuffer(bufferId, pos);
 }
 
+void BufferViewFilter::addBuffers(const QList<BufferId> &bufferIds) const {
+  if(!config())
+    return;
+
+  QList<BufferId> bufferList = config()->bufferList();
+  foreach(BufferId bufferId, bufferIds) {
+    if(bufferList.contains(bufferId))
+      continue;
+
+    int pos = bufferList.count();
+    bool lt;
+    for(int i = 0; i < bufferList.count(); i++) {
+      if(config() && config()->sortAlphabetically())
+       lt = bufferIdLessThan(bufferId, bufferList[i]);
+      else
+       lt = bufferId < config()->bufferList()[i];
+
+      if(lt) {
+       pos = i;
+       bufferList.insert(pos, bufferId);
+       break;
+      }
+    }
+    config()->requestAddBuffer(bufferId, pos);
+  }
+}
+
 bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) const {
   // no config -> "all buffers" -> accept everything
   if(!config())
@@ -392,21 +418,29 @@ QVariant BufferViewFilter::icon(const QModelIndex &index) const {
     return QVariant();
 
   QModelIndex source_index = mapToSource(index);
-  if(sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt() != NetworkModel::BufferItemType)
-    return QVariant();
+  NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt();
+  BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt();
+  bool isActive = sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool();
 
-  if(sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt() != BufferInfo::QueryBuffer)
+  if(itemType != NetworkModel::BufferItemType)
     return QVariant();
 
-  if(!sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool())
-    return _userOfflineIcon;
-
-  if(sourceModel()->data(source_index, NetworkModel::UserAwayRole).toBool())
-    return _userAwayIcon;
-  else
-    return _userOnlineIcon;
-
-  return QVariant();
+  switch(bufferType) {
+  case BufferInfo::ChannelBuffer:
+    if(isActive)
+      return _channelJoinedIcon;
+    else
+      return _channelPartedIcon;
+  case BufferInfo::QueryBuffer:
+    if(!isActive)
+      return _userOfflineIcon;
+    if(sourceModel()->data(source_index, NetworkModel::UserAwayRole).toBool())
+      return _userAwayIcon;
+    else
+      return _userOnlineIcon;
+  default:
+    return QVariant();
+  }
 }
 
 QVariant BufferViewFilter::checkedState(const QModelIndex &index) const {