modernize: Use auto where the type is clear from context
[quassel.git] / src / uisupport / bufferviewfilter.cpp
index bbb0b74..b8b78e2 100644 (file)
@@ -39,7 +39,7 @@
 *****************************************/
 BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *config)
     : QSortFilterProxyModel(model),
-    _config(0),
+    _config(nullptr),
     _sortOrder(Qt::AscendingOrder),
     _showServerQueries(false),
     _editMode(false),
@@ -68,7 +68,7 @@ void BufferViewFilter::setConfig(BufferViewConfig *config)
         return;
 
     if (_config) {
-        disconnect(_config, 0, this, 0);
+        disconnect(_config, nullptr, this, nullptr);
     }
 
     _config = config;
@@ -192,7 +192,7 @@ Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const
         // 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());
+            auto *clientConf = qobject_cast<ClientBufferViewConfig *>(config());
             if (clientConf && !clientConf->isLocked()) {
                 flags |= Qt::ItemIsDropEnabled;
             }
@@ -245,7 +245,7 @@ bool BufferViewFilter::dropMimeData(const QMimeData *data, Qt::DropAction action
             if (config()->bufferList().contains(bufferId) && !config()->sortAlphabetically()) {
                 if (config()->bufferList().indexOf(bufferId) < pos)
                     pos--;
-                ClientBufferViewConfig *clientConf = qobject_cast<ClientBufferViewConfig *>(config());
+                auto *clientConf = qobject_cast<ClientBufferViewConfig *>(config());
                 if (!clientConf || !clientConf->isLocked())
                     config()->requestMoveBuffer(bufferId, pos);
             }
@@ -440,6 +440,30 @@ bool BufferViewFilter::bufferLessThan(const QModelIndex &source_left, const QMod
 {
     BufferId leftBufferId = sourceModel()->data(source_left, NetworkModel::BufferIdRole).value<BufferId>();
     BufferId rightBufferId = sourceModel()->data(source_right, NetworkModel::BufferIdRole).value<BufferId>();
+    // If filtering, prioritize relevant items first
+    if (!_filterString.isEmpty()) {
+        // Get names of the buffers
+        QString leftBufferName = sourceModel()->data(source_left, NetworkModel::BufferInfoRole)
+                .value<BufferInfo>().bufferName();
+        QString rightBufferName = sourceModel()->data(source_right, NetworkModel::BufferInfoRole)
+                .value<BufferInfo>().bufferName();
+        // Check if there's any differences across types, most important first
+        if ((QString::compare(leftBufferName, _filterString, Qt::CaseInsensitive) == 0)
+                != (QString::compare(rightBufferName, _filterString, Qt::CaseInsensitive) == 0)) {
+            // One of these buffers is an exact match with the filter string, while the other isn't
+            // Prioritize whichever one is the exact match
+            // (If left buffer is exact, return true to set it as less than right)
+            return (QString::compare(leftBufferName, _filterString, Qt::CaseInsensitive) == 0);
+        }
+        else if (leftBufferName.startsWith(_filterString, Qt::CaseInsensitive)
+                != rightBufferName.startsWith(_filterString, Qt::CaseInsensitive)) {
+            // One of these buffers starts with the filter string, while the other doesn't
+            // Prioritize whichever one starts with the filter string
+            // (If left buffer starts with, return true to set it as less than right)
+            return leftBufferName.startsWith(_filterString, Qt::CaseInsensitive);
+        }
+        // Otherwise, do the normal sorting (sorting happens within each priority bracket)
+    }
     if (config()) {
         int leftPos = config()->bufferList().indexOf(leftBufferId);
         int rightPos = config()->bufferList().indexOf(rightBufferId);