Semi-yearly copyright bump
[quassel.git] / src / uisupport / bufferviewfilter.cpp
index 4c5d4a9..41c2ee1 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2015 by the Quassel Project                        *
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -137,6 +137,14 @@ QList<QAction *> BufferViewFilter::actions(const QModelIndex &index)
     return actionList;
 }
 
+void BufferViewFilter::setFilterString(const QString string)
+{
+    beginResetModel();
+    _filterString = string;
+    endResetModel();
+    enableEditMode(!string.isEmpty());
+}
+
 
 void BufferViewFilter::enableEditMode(bool enable)
 {
@@ -175,23 +183,23 @@ Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const
     QModelIndex source_index = mapToSource(index);
     Qt::ItemFlags flags = sourceModel()->flags(source_index);
     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) {
+        // We need Status Buffers to be a drop target, to allow for rearranging buffers.
+        // The Status Buffer "owns" the space between Channel/Query buffers in the tree.
+        // This DOES mean that it looks like you can merge a buffer into the Status buffer, but that is restricted in BufferView::dropEvent().
+        if (bufferType == BufferInfo::StatusBuffer) {
+            // But only if the layout isn't locked!
             ClientBufferViewConfig *clientConf = qobject_cast<ClientBufferViewConfig *>(config());
-            if (clientConf && clientConf->isLocked()) {
-                flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled);
+            if (clientConf && !clientConf->isLocked()) {
+                flags |= Qt::ItemIsDropEnabled;
             }
         }
+
+        // If we're in Edit Mode, everything except Status Buffers should be hideable.
+        if (_editMode && bufferType != BufferInfo::StatusBuffer) {
+            flags |= Qt::ItemIsUserCheckable | Qt::ItemIsTristate;
+        }
     }
     return flags;
 }
@@ -346,6 +354,16 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex)
         return false;
     }
 
+    if (!_filterString.isEmpty()) {
+        const BufferInfo info = qvariant_cast<BufferInfo>(Client::bufferModel()->data(source_bufferIndex, NetworkModel::BufferInfoRole));
+        QString name = info.bufferName();
+        if (name.contains(_filterString, Qt::CaseInsensitive)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     // the following dynamic filters may not trigger if the buffer is currently selected.
     QModelIndex currentIndex = Client::bufferModel()->standardSelectionModel()->currentIndex();
     if (bufferId == Client::bufferModel()->data(currentIndex, NetworkModel::BufferIdRole).value<BufferId>())