From 88d1cbc29df359f1f7987d97b649923b7a762d57 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 1 Sep 2018 13:35:03 +0200 Subject: [PATCH] Pop-up completion with distinct values A QSortFilterProxyModel is used for filtering the values in the column so only distinct values are accepted for the completion. With this change the less intrusive pop-up completion can be used, displaying only unique values in the completion menu. --- src/ExtendedTableWidget.cpp | 30 +++++++++++++++++++++++++++--- src/ExtendedTableWidget.h | 13 +++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/ExtendedTableWidget.cpp b/src/ExtendedTableWidget.cpp index 7dde5a95..861fad26 100644 --- a/src/ExtendedTableWidget.cpp +++ b/src/ExtendedTableWidget.cpp @@ -100,6 +100,24 @@ QList parseClipboard(QString clipboard) } +UniqueFilterModel::UniqueFilterModel(QObject* parent) + : QSortFilterProxyModel(parent) +{ +} + +bool UniqueFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex index = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent); + const QString& value = index.data().toString(); + + if (!value.isEmpty() && !m_uniqueValues.contains(value)) { + const_cast(this)->m_uniqueValues.insert(value); + return true; + } + else + return false; + +} ExtendedTableWidgetEditorDelegate::ExtendedTableWidgetEditorDelegate(QObject* parent) : QStyledItemDelegate(parent) @@ -111,10 +129,16 @@ QWidget* ExtendedTableWidgetEditorDelegate::createEditor(QWidget* parent, const QLineEdit* editor = new QLineEdit(parent); // If the row count is not greater than the complete threshold setting, set a completer of values based on current values in the column. if (index.model()->rowCount() <= Settings::getValue("databrowser", "complete_threshold").toInt()) { - QCompleter *completer = new QCompleter(editor); - completer->setModel(const_cast(index.model())); + QCompleter* completer = new QCompleter(editor); + UniqueFilterModel* completerFilter = new UniqueFilterModel(completer); + // Provide a filter for the source model, so only unique and non-empty values are accepted. + completerFilter->setSourceModel(const_cast(index.model())); + completerFilter->setFilterKeyColumn(index.column()); + completer->setModel(completerFilter); + // Complete on this column, using a popup and case-insensitively. completer->setCompletionColumn(index.column()); - completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setCompletionMode(QCompleter::PopupCompletion); + completer->setCaseSensitivity(Qt::CaseInsensitive); editor->setCompleter(completer); } // Set the maximum length to the highest possible value instead of the default 32768. diff --git a/src/ExtendedTableWidget.h b/src/ExtendedTableWidget.h index ad4772b4..9e8e8a8e 100644 --- a/src/ExtendedTableWidget.h +++ b/src/ExtendedTableWidget.h @@ -6,12 +6,25 @@ #include #include #include +#include class QMenu; class QMimeData; class FilterTableHeader; namespace sqlb { class ObjectIdentifier; } +// Filter proxy model that only accepts distinct non-empty values. +class UniqueFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + explicit UniqueFilterModel(QObject* parent = nullptr); + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; + private: + QSet m_uniqueValues; +}; + // We use this class to provide editor widgets for the ExtendedTableWidget. It's used for every cell in the table view. class ExtendedTableWidgetEditorDelegate : public QStyledItemDelegate {