forked from qt-creator/qt-creator
Add filtering to About Plugins.
Change-Id: If5733b37b123f261acfffb24cf9b81683c2d9118 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com> Reviewed-by: Daniel Teske <daniel.teske@theqtcompany.com>
This commit is contained in:
@@ -79,6 +79,8 @@ using namespace Utils;
|
|||||||
|
|
||||||
namespace ExtensionSystem {
|
namespace ExtensionSystem {
|
||||||
|
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
enum Columns { NameColumn, LoadedColumn, VersionColumn, VendorColumn, };
|
enum Columns { NameColumn, LoadedColumn, VersionColumn, VendorColumn, };
|
||||||
|
|
||||||
enum IconIndex { OkIcon, ErrorIcon, NotLoadedIcon };
|
enum IconIndex { OkIcon, ErrorIcon, NotLoadedIcon };
|
||||||
@@ -275,6 +277,40 @@ public:
|
|||||||
PluginView *m_view; // Not owned.
|
PluginView *m_view; // Not owned.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SortFilterModel : public QSortFilterProxyModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SortFilterModel(QObject *parent) : QSortFilterProxyModel(parent) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
|
||||||
|
{
|
||||||
|
if (!source_parent.isValid()) {
|
||||||
|
// category items should be visible if any of its children match
|
||||||
|
const QRegExp ®exp = filterRegExp();
|
||||||
|
const QModelIndex &categoryIndex = sourceModel()->index(source_row, 0, source_parent);
|
||||||
|
if (regexp.indexIn(sourceModel()->data(categoryIndex, filterRole()).toString()) != -1)
|
||||||
|
return true;
|
||||||
|
const int rowCount = sourceModel()->rowCount(categoryIndex);
|
||||||
|
const int columnCount = sourceModel()->columnCount(categoryIndex);
|
||||||
|
for (int row = 0; row < rowCount; ++row) {
|
||||||
|
for (int column = 0; column < columnCount; ++column) {
|
||||||
|
if (regexp.indexIn(sourceModel()->data(
|
||||||
|
sourceModel()->index(row, column, categoryIndex),
|
||||||
|
filterRole()).toString()) != -1)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // Internal
|
||||||
|
|
||||||
|
using namespace ExtensionSystem::Internal;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a PluginView that gets the list of plugins from the
|
Constructs a PluginView that gets the list of plugins from the
|
||||||
given plugin \a manager with a given \a parent widget.
|
given plugin \a manager with a given \a parent widget.
|
||||||
@@ -298,9 +334,11 @@ PluginView::PluginView(QWidget *parent)
|
|||||||
m_model = new TreeModel(this);
|
m_model = new TreeModel(this);
|
||||||
m_model->setHeader(QStringList() << tr("Name") << tr("Load") << tr("Version") << tr("Vendor"));
|
m_model->setHeader(QStringList() << tr("Name") << tr("Load") << tr("Version") << tr("Vendor"));
|
||||||
|
|
||||||
m_sortModel = new QSortFilterProxyModel(this);
|
m_sortModel = new SortFilterModel(this);
|
||||||
m_sortModel->setSourceModel(m_model);
|
m_sortModel->setSourceModel(m_model);
|
||||||
m_sortModel->setSortRole(SortRole);
|
m_sortModel->setSortRole(SortRole);
|
||||||
|
m_sortModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
|
||||||
|
m_sortModel->setFilterKeyColumn(-1/*all*/);
|
||||||
m_categoryView->setModel(m_sortModel);
|
m_categoryView->setModel(m_sortModel);
|
||||||
|
|
||||||
QGridLayout *gridLayout = new QGridLayout(this);
|
QGridLayout *gridLayout = new QGridLayout(this);
|
||||||
@@ -338,6 +376,12 @@ PluginSpec *PluginView::currentPlugin() const
|
|||||||
return pluginForIndex(m_categoryView->currentIndex());
|
return pluginForIndex(m_categoryView->currentIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PluginView::setFilter(const QString &filter)
|
||||||
|
{
|
||||||
|
m_sortModel->setFilterFixedString(filter);
|
||||||
|
m_categoryView->expandAll();
|
||||||
|
}
|
||||||
|
|
||||||
PluginSpec *PluginView::pluginForIndex(const QModelIndex &index) const
|
PluginSpec *PluginView::pluginForIndex(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
const QModelIndex &sourceIndex = m_sortModel->mapToSource(index);
|
const QModelIndex &sourceIndex = m_sortModel->mapToSource(index);
|
||||||
|
@@ -51,8 +51,11 @@ namespace ExtensionSystem {
|
|||||||
|
|
||||||
class PluginManager;
|
class PluginManager;
|
||||||
class PluginSpec;
|
class PluginSpec;
|
||||||
|
|
||||||
|
namespace Internal {
|
||||||
class PluginItem;
|
class PluginItem;
|
||||||
class CollectionItem;
|
class CollectionItem;
|
||||||
|
} // Internal
|
||||||
|
|
||||||
class EXTENSIONSYSTEM_EXPORT PluginView : public QWidget
|
class EXTENSIONSYSTEM_EXPORT PluginView : public QWidget
|
||||||
{
|
{
|
||||||
@@ -63,6 +66,7 @@ public:
|
|||||||
~PluginView();
|
~PluginView();
|
||||||
|
|
||||||
PluginSpec *currentPlugin() const;
|
PluginSpec *currentPlugin() const;
|
||||||
|
void setFilter(const QString &filter);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void currentPluginChanged(ExtensionSystem::PluginSpec *spec);
|
void currentPluginChanged(ExtensionSystem::PluginSpec *spec);
|
||||||
@@ -78,8 +82,8 @@ private:
|
|||||||
Utils::TreeModel *m_model;
|
Utils::TreeModel *m_model;
|
||||||
QSortFilterProxyModel *m_sortModel;
|
QSortFilterProxyModel *m_sortModel;
|
||||||
|
|
||||||
friend class CollectionItem;
|
friend class Internal::CollectionItem;
|
||||||
friend class PluginItem;
|
friend class Internal::PluginItem;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespae ExtensionSystem
|
} // namespae ExtensionSystem
|
||||||
|
@@ -36,6 +36,8 @@
|
|||||||
#include <extensionsystem/pluginerrorview.h>
|
#include <extensionsystem/pluginerrorview.h>
|
||||||
#include <extensionsystem/pluginspec.h>
|
#include <extensionsystem/pluginspec.h>
|
||||||
|
|
||||||
|
#include <utils/fancylineedit.h>
|
||||||
|
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
@@ -54,6 +56,13 @@ PluginDialog::PluginDialog(QWidget *parent)
|
|||||||
m_view(new ExtensionSystem::PluginView(this))
|
m_view(new ExtensionSystem::PluginView(this))
|
||||||
{
|
{
|
||||||
QVBoxLayout *vl = new QVBoxLayout(this);
|
QVBoxLayout *vl = new QVBoxLayout(this);
|
||||||
|
|
||||||
|
auto filterEdit = new Utils::FancyLineEdit(this);
|
||||||
|
filterEdit->setFiltering(true);
|
||||||
|
connect(filterEdit, &Utils::FancyLineEdit::filterChanged,
|
||||||
|
m_view, &ExtensionSystem::PluginView::setFilter);
|
||||||
|
vl->addWidget(filterEdit);
|
||||||
|
|
||||||
vl->addWidget(m_view);
|
vl->addWidget(m_view);
|
||||||
|
|
||||||
m_detailsButton = new QPushButton(tr("Details"), this);
|
m_detailsButton = new QPushButton(tr("Details"), this);
|
||||||
|
Reference in New Issue
Block a user