VariableChooser: add filter

Change-Id: I604b39f96ff303502949d581d094067025093ca0
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Serhii Moroz
2017-02-13 21:46:27 +02:00
parent d6a84fe22c
commit 3c91c83f41

View File

@@ -80,6 +80,24 @@ private:
VariableChooserPrivate *m_target;
};
class VariableSortFilterProxyModel : public QSortFilterProxyModel
{
public:
explicit VariableSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent) {}
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
{
const QModelIndex index = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent);
if (!index.isValid())
return false;
const QRegExp regexp = filterRegExp();
if (regexp.isEmpty() || sourceModel()->rowCount(index) > 0)
return true;
const QString displayText = index.data(Qt::DisplayRole).toString();
return displayText.contains(regexp);
}
};
class VariableChooserPrivate : public QObject
{
@@ -101,6 +119,7 @@ public:
void handleItemActivated(const QModelIndex &index);
void insertText(const QString &variable);
void updatePositionAndShow(bool);
void updateFilter(const QString &filterText);
QWidget *currentWidget();
@@ -116,6 +135,7 @@ public:
QPointer<QPlainTextEdit> m_plainTextEdit;
QPointer<IconButton> m_iconButton;
QLineEdit *m_variableFilter;
VariableTreeView *m_variableTree;
QLabel *m_variableDescription;
QSortFilterProxyModel *m_sortModel;
@@ -251,18 +271,25 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent)
m_textEdit(0),
m_plainTextEdit(0),
m_iconButton(0),
m_variableFilter(0),
m_variableTree(0),
m_variableDescription(0)
{
m_defaultDescription = VariableChooser::tr("Select a variable to insert.");
m_variableFilter = new QLineEdit(q);
m_variableTree = new VariableTreeView(q, this);
m_variableDescription = new QLabel(q);
m_sortModel = new QSortFilterProxyModel(this);
m_variableFilter->setPlaceholderText(VariableChooser::tr("Filter"));
m_sortModel = new VariableSortFilterProxyModel(this);
m_sortModel->setSourceModel(&m_model);
m_sortModel->sort(0);
m_sortModel->setFilterKeyColumn(0);
m_sortModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
m_variableTree->setModel(m_sortModel);
m_variableDescription->setText(m_defaultDescription);
m_variableDescription->setMinimumSize(QSize(0, 60));
m_variableDescription->setAlignment(Qt::AlignLeft|Qt::AlignTop);
@@ -272,9 +299,12 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent)
QVBoxLayout *verticalLayout = new QVBoxLayout(q);
verticalLayout->setContentsMargins(3, 3, 3, 12);
verticalLayout->addWidget(m_variableFilter);
verticalLayout->addWidget(m_variableTree);
verticalLayout->addWidget(m_variableDescription);
connect(m_variableFilter, &QLineEdit::textChanged,
this, &VariableChooserPrivate::updateFilter);
connect(m_variableTree, &QTreeView::activated,
this, &VariableChooserPrivate::handleItemActivated);
connect(qobject_cast<QApplication *>(qApp), &QApplication::focusChanged,
@@ -368,6 +398,7 @@ VariableChooser::VariableChooser(QWidget *parent) :
setWindowFlags(Qt::Tool);
setFocusPolicy(Qt::StrongFocus);
setFocusProxy(d->m_variableTree);
setGeometry(QRect(0, 0, 400, 500));
addMacroExpanderProvider([]() { return globalMacroExpander(); });
}
@@ -519,6 +550,12 @@ void VariableChooserPrivate::updatePositionAndShow(bool)
m_variableTree->expandAll();
}
void VariableChooserPrivate::updateFilter(const QString &filterText)
{
m_sortModel->setFilterWildcard(filterText);
m_variableTree->expandAll();
}
/*!
* \internal
*/