X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=51d98646d547a6f0527292dcbc90047834d26876;hp=4c5d4a9c6e3673472bceee45bec89d4a50f764f6;hb=39328183a6a87c6eb10a9dbbffcd5d65bf154a1f;hpb=d3dcda30c8cbee75c0c8f500f4ab552bde513036 diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 4c5d4a9c..51d98646 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -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 * @@ -39,7 +39,7 @@ *****************************************/ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *config) : QSortFilterProxyModel(model), - _config(0), + _config(nullptr), _sortOrder(Qt::AscendingOrder), _showServerQueries(false), _editMode(false), @@ -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); @@ -66,7 +68,7 @@ void BufferViewFilter::setConfig(BufferViewConfig *config) return; if (_config) { - disconnect(_config, 0, this, 0); + disconnect(_config, nullptr, this, nullptr); } _config = config; @@ -137,6 +139,14 @@ QList 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 +185,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(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 +356,16 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) return false; } + if (!_filterString.isEmpty()) { + const BufferInfo info = qvariant_cast(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()) @@ -420,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);