From 8a8d7e0d49f4938f672ea3a5d0c11a76ad641f52 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Sat, 6 Oct 2018 13:53:59 -0500 Subject: [PATCH] client: For filter, prioritize exact, startsWith When filtering buffer view results, prioritize exact string matches, then prioritize startsWith matches, both case-insensitive. Within these results, sort normally (e.g. alphabetical). This gives weight to exact matches and the start of the string. When no filter string is specified, sorting goes back to normal. Search string: "car" Before: > acar > bcar > careful > caring > racecar > car [hidden] After: > car [hidden] > careful > caring > acar > bcar > racecar Where [hidden] represents a buffer that's temporarily or permanently hidden. --- src/uisupport/bufferviewfilter.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index bbb0b745..a73b0917 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -440,6 +440,30 @@ bool BufferViewFilter::bufferLessThan(const QModelIndex &source_left, const QMod { BufferId leftBufferId = sourceModel()->data(source_left, NetworkModel::BufferIdRole).value(); BufferId rightBufferId = sourceModel()->data(source_right, NetworkModel::BufferIdRole).value(); + // If filtering, prioritize relevant items first + if (!_filterString.isEmpty()) { + // Get names of the buffers + QString leftBufferName = sourceModel()->data(source_left, NetworkModel::BufferInfoRole) + .value().bufferName(); + QString rightBufferName = sourceModel()->data(source_right, NetworkModel::BufferInfoRole) + .value().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); -- 2.20.1