if it compiles it should fix the new missing query issue :)
[quassel.git] / src / uisupport / bufferviewfilter.cpp
index 7179f26..6bd6565 100644 (file)
 #include "buffermodel.h"
 #include "buffersettings.h"
 #include "client.h"
+#include "clientbufferviewconfig.h"
+#include "graphicalui.h"
 #include "iconloader.h"
 #include "networkmodel.h"
+#include "uistyle.h"
 
 class CheckRemovalEvent : public QEvent {
 public:
@@ -44,11 +47,9 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *
   : QSortFilterProxyModel(model),
     _config(0),
     _sortOrder(Qt::AscendingOrder),
-    _userOfflineIcon(SmallIcon("im-user-offline")),
-    _userAwayIcon(SmallIcon("im-user-away")),
-    _userOnlineIcon(SmallIcon("im-user")),
+    _showServerQueries(false),
     _editMode(false),
-    _enableEditMode(tr("Show / Hide buffers"), this)
+    _enableEditMode(tr("Show / Hide Chats"), this)
 {
   setConfig(config);
   setSourceModel(model);
@@ -62,14 +63,9 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *
   _enableEditMode.setChecked(_editMode);
   connect(&_enableEditMode, SIGNAL(toggled(bool)), this, SLOT(enableEditMode(bool)));
 
-  BufferSettings bufferSettings;
-  _showUserStateIcons = bufferSettings.showUserStateIcons();
-  bufferSettings.notify("ShowUserStateIcons", this, SLOT(showUserStateIconsChanged()));
-}
-
-void BufferViewFilter::showUserStateIconsChanged() {
-  BufferSettings bufferSettings;
-  _showUserStateIcons = bufferSettings.showUserStateIcons();
+  BufferSettings defaultSettings;
+  defaultSettings.notify("ServerNoticesTarget", this, SLOT(showServerQueriesChanged()));
+  showServerQueriesChanged();
 }
 
 void BufferViewFilter::setConfig(BufferViewConfig *config) {
@@ -91,7 +87,9 @@ void BufferViewFilter::setConfig(BufferViewConfig *config) {
   if(config->isInitialized()) {
     configInitialized();
   } else {
-    connect(config, SIGNAL(initDone()), this, SLOT(configInitialized()));
+    // we use a queued connection here since manipulating the connection list of a sending object
+    // doesn't seem to be such a good idea while executing a connected slots.
+    connect(config, SIGNAL(initDone()), this, SLOT(configInitialized()), Qt::QueuedConnection);
     invalidate();
   }
 }
@@ -100,18 +98,19 @@ void BufferViewFilter::configInitialized() {
   if(!config())
     return;
 
-  connect(config(), SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(allowedBufferTypesSet(int)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(minimumActivitySet(int)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(bufferListSet()), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(bufferMoved(const BufferId &, int)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(invalidate()));
-  connect(config(), SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(invalidate()));
+  connect(config(), SIGNAL(configChanged()), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(allowedBufferTypesSet(int)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(minimumActivitySet(int)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(bufferListSet()), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(bufferMoved(const BufferId &, int)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(invalidate()));
+//   connect(config(), SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(invalidate()));
 
   disconnect(config(), SIGNAL(initDone()), this, SLOT(configInitialized()));
 
@@ -121,6 +120,16 @@ void BufferViewFilter::configInitialized() {
   emit configChanged();
 }
 
+void BufferViewFilter::showServerQueriesChanged() {
+  BufferSettings bufferSettings;
+
+  bool showQueries = (bufferSettings.serverNoticesTarget() & BufferSettings::DefaultBuffer);
+  if(_showServerQueries != showQueries) {
+    _showServerQueries = showQueries;
+    invalidate();
+  }
+}
+
 QList<QAction *> BufferViewFilter::actions(const QModelIndex &index) {
   Q_UNUSED(index)
   QList<QAction *> actionList;
@@ -138,13 +147,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;
@@ -167,12 +171,23 @@ void BufferViewFilter::enableEditMode(bool enable) {
 Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const {
   QModelIndex source_index = mapToSource(index);
   Qt::ItemFlags flags = sourceModel()->flags(source_index);
-  if(_config) {
-    if(source_index == QModelIndex() || sourceModel()->data(source_index, NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType) {
+  if(config()) {
+    NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt();
+    BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt();
+    if(source_index == QModelIndex() || itemType == NetworkModel::NetworkItemType) {
       flags |= Qt::ItemIsDropEnabled;
     } else if(_editMode) {
       flags |= Qt::ItemIsUserCheckable | Qt::ItemIsTristate;
     }
+
+    // prohibit dragging of most items. and most drop places
+    // only query to query is allowed for merging
+    if(bufferType != BufferInfo::QueryBuffer) {
+      ClientBufferViewConfig *clientConf = qobject_cast<ClientBufferViewConfig *>(config());
+      if(clientConf && clientConf->isLocked()) {
+       flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled);
+      }
+    }
   }
   return flags;
 }
@@ -210,10 +225,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);
       }
@@ -250,6 +267,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())
@@ -278,8 +322,13 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex)
   int allowedBufferTypes = config()->allowedBufferTypes();
   if(!config()->networkId().isValid())
     allowedBufferTypes &= ~BufferInfo::StatusBuffer;
-  if(!(allowedBufferTypes & sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt()))
+  int bufferType = sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt();
+  if(!(allowedBufferTypes & bufferType))
+    return false;
+
+  if(bufferType & BufferInfo::QueryBuffer && !_showServerQueries && sourceModel()->data(source_bufferIndex, Qt::DisplayRole).toString().contains('.')) {
     return false;
+  }
 
   // the following dynamic filters may not trigger if the buffer is currently selected.
   QModelIndex currentIndex = Client::bufferModel()->standardSelectionModel()->currentIndex();
@@ -358,16 +407,18 @@ bool BufferViewFilter::networkLessThan(const QModelIndex &source_left, const QMo
   NetworkId leftNetworkId = sourceModel()->data(source_left, NetworkModel::NetworkIdRole).value<NetworkId>();
   NetworkId rightNetworkId = sourceModel()->data(source_right, NetworkModel::NetworkIdRole).value<NetworkId>();
 
-  if(config() && config()->sortAlphabetically())
-    return QSortFilterProxyModel::lessThan(source_left, source_right);
-  else
-    return leftNetworkId < rightNetworkId;
+  return QSortFilterProxyModel::lessThan(source_left, source_right);
 }
 
 QVariant BufferViewFilter::data(const QModelIndex &index, int role) const {
   switch(role) {
+  case Qt::FontRole:
+  case Qt::ForegroundRole:
+  case Qt::BackgroundRole:
   case Qt::DecorationRole:
-    return icon(index);
+    if((config() && config()->disableDecoration()))
+      return QVariant();
+    return GraphicalUi::uiStyle()->bufferViewItemData(mapToSource(index), role);
   case Qt::CheckStateRole:
     return checkedState(index);
   default:
@@ -375,31 +426,6 @@ QVariant BufferViewFilter::data(const QModelIndex &index, int role) const {
   }
 }
 
-QVariant BufferViewFilter::icon(const QModelIndex &index) const {
-  if(!_showUserStateIcons || (config() && config()->disableDecoration()))
-    return QVariant();
-
-  if(index.column() != 0)
-    return QVariant();
-
-  QModelIndex source_index = mapToSource(index);
-  if(sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt() != NetworkModel::BufferItemType)
-    return QVariant();
-
-  if(sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt() != BufferInfo::QueryBuffer)
-    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();
-}
-
 QVariant BufferViewFilter::checkedState(const QModelIndex &index) const {
   if(!_editMode || !config())
     return QVariant();
@@ -504,3 +530,4 @@ bool BufferViewFilter::bufferIdLessThan(const BufferId &left, const BufferId &ri
     return QString::compare(Client::networkModel()->data(leftIndex, Qt::DisplayRole).toString(), Client::networkModel()->data(rightIndex, Qt::DisplayRole).toString(), Qt::CaseInsensitive) < 0;
 }
 
+