X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=a73b0917a21920049ff40aec6f87fc2a81237dd4;hp=9a42db9b187487b6cd44f30e0fd27acf2ddb1ad6;hb=1a45f16a9734820fba42fe1db3f38dd1eee49df6;hpb=6ee26fd6d0a163314002616d277e5444f11b7720 diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 9a42db9b..a73b0917 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 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 * @@ -49,6 +49,8 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig * setSourceModel(model); setDynamicSortFilter(true); + // Sort case-insensitively (primarily for network names; channels/nicks handled elsewhere) + setSortCaseSensitivity(Qt::CaseInsensitive); _enableEditMode.setCheckable(true); _enableEditMode.setChecked(_editMode); @@ -357,7 +359,7 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) if (!_filterString.isEmpty()) { const BufferInfo info = qvariant_cast(Client::bufferModel()->data(source_bufferIndex, NetworkModel::BufferInfoRole)); QString name = info.bufferName(); - if (name.contains(_filterString)) { + if (name.contains(_filterString, Qt::CaseInsensitive)) { return true; } else { return false; @@ -438,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);