X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=cc746f2c4c2206df0f69397ea7c779fe9a898494;hp=bbb0b74542512d521b852aece54d02ae05d5fbe7;hb=fcacaaf16551524c7ebb6114254d005274cc3d63;hpb=e61d189229dc09fb5978a8a1bc10aed413cd4cbd diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index bbb0b745..cc746f2c 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -39,7 +39,7 @@ *****************************************/ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *config) : QSortFilterProxyModel(model), - _config(0), + _config(nullptr), _sortOrder(Qt::AscendingOrder), _showServerQueries(false), _editMode(false), @@ -54,7 +54,7 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig * _enableEditMode.setCheckable(true); _enableEditMode.setChecked(_editMode); - connect(&_enableEditMode, SIGNAL(toggled(bool)), this, SLOT(enableEditMode(bool))); + connect(&_enableEditMode, &QAction::toggled, this, &BufferViewFilter::enableEditMode); BufferSettings defaultSettings; defaultSettings.notify("ServerNoticesTarget", this, SLOT(showServerQueriesChanged())); @@ -68,7 +68,7 @@ void BufferViewFilter::setConfig(BufferViewConfig *config) return; if (_config) { - disconnect(_config, 0, this, 0); + disconnect(_config, nullptr, this, nullptr); } _config = config; @@ -85,7 +85,7 @@ void BufferViewFilter::setConfig(BufferViewConfig *config) else { // 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); + connect(config, &SyncableObject::initDone, this, &BufferViewFilter::configInitialized, Qt::QueuedConnection); invalidate(); } } @@ -97,7 +97,7 @@ void BufferViewFilter::configInitialized() return; // connect(config(), SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(invalidate())); - connect(config(), SIGNAL(configChanged()), this, SLOT(invalidate())); + connect(config(), &BufferViewConfig::configChanged, this, &QSortFilterProxyModel::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())); @@ -110,7 +110,7 @@ void BufferViewFilter::configInitialized() // 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())); + disconnect(config(), &SyncableObject::initDone, this, &BufferViewFilter::configInitialized); setObjectName(config()->bufferViewName()); @@ -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(config()); + auto *clientConf = qobject_cast(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(config()); + auto *clientConf = qobject_cast(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 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);