[vlc-devel] [PATCH 1/3] qt, qml: add SortFilterProxyModel to filter models in QML
Prince Gupta
guptaprince8832 at gmail.com
Tue Sep 29 11:11:12 CEST 2020
---
modules/gui/qt/Makefile.am | 3 +
modules/gui/qt/maininterface/mainui.cpp | 2 +
modules/gui/qt/util/sortfilterproxymodel.cpp | 93 ++++++++++++++++++++
modules/gui/qt/util/sortfilterproxymodel.hpp | 65 ++++++++++++++
4 files changed, 163 insertions(+)
create mode 100644 modules/gui/qt/util/sortfilterproxymodel.cpp
create mode 100644 modules/gui/qt/util/sortfilterproxymodel.hpp
diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index f775bbb5d1..6ff173323e 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -212,6 +212,8 @@ libqt_plugin_la_SOURCES = \
gui/qt/util/selectable_list_model.cpp \
gui/qt/util/selectable_list_model.hpp \
gui/qt/util/singleton.hpp \
+ gui/qt/util/sortfilterproxymodel.cpp \
+ gui/qt/util/sortfilterproxymodel.hpp \
gui/qt/util/soutchain.cpp gui/qt/util/soutchain.hpp \
gui/qt/util/systempalette.cpp gui/qt/util/systempalette.hpp \
gui/qt/util/validators.cpp gui/qt/util/validators.hpp \
@@ -345,6 +347,7 @@ nodist_libqt_plugin_la_SOURCES = \
gui/qt/util/recents.moc.cpp \
gui/qt/util/renderer_manager.moc.cpp \
gui/qt/util/selectable_list_model.moc.cpp \
+ gui/qt/util/sortfilterproxymodel.moc.cpp \
gui/qt/util/systempalette.moc.cpp \
gui/qt/util/validators.moc.cpp \
gui/qt/util/varchoicemodel.moc.cpp \
diff --git a/modules/gui/qt/maininterface/mainui.cpp b/modules/gui/qt/maininterface/mainui.cpp
index c2d5460126..c4b8c6dfd4 100644
--- a/modules/gui/qt/maininterface/mainui.cpp
+++ b/modules/gui/qt/maininterface/mainui.cpp
@@ -24,6 +24,7 @@
#include "util/i18n.hpp"
#include "util/systempalette.hpp"
#include "util/recent_media_model.hpp"
+#include "util/sortfilterproxymodel.hpp"
#include "util/navigation_history.hpp"
#include "dialogs/help/aboutmodel.hpp"
@@ -214,6 +215,7 @@ void MainUI::registerQMLTypes()
qmlRegisterType<QmlGlobalMenu>( "org.videolan.vlc", 0, 1, "QmlGlobalMenu" );
qmlRegisterType<NetworkMediaContextMenu>( "org.videolan.vlc", 0, 1, "NetworkMediaContextMenu" );
qmlRegisterType<PlaylistContextMenu>( "org.videolan.vlc", 0, 1, "PlaylistContextMenu" );
+ qmlRegisterType<SortFilterProxyModel>( "org.videolan.vlc", 0, 1, "SortFilterProxyModel" );
}
void MainUI::onQmlWarning(const QList<QQmlError>& qmlErrors)
diff --git a/modules/gui/qt/util/sortfilterproxymodel.cpp b/modules/gui/qt/util/sortfilterproxymodel.cpp
new file mode 100644
index 0000000000..8106f9d089
--- /dev/null
+++ b/modules/gui/qt/util/sortfilterproxymodel.cpp
@@ -0,0 +1,93 @@
+/*****************************************************************************
+ * Copyright (C) 2020 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * ( at your option ) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include "sortfilterproxymodel.hpp"
+
+#include <QItemSelection>
+
+#include <cassert>
+
+SortFilterProxyModel::SortFilterProxyModel( QObject *parent )
+ : QSortFilterProxyModel( parent )
+{
+ setFilterCaseSensitivity(Qt::CaseInsensitive);
+
+ connect( this, &QAbstractListModel::rowsInserted, this, &SortFilterProxyModel::countChanged );
+ connect( this, &QAbstractListModel::rowsRemoved, this, &SortFilterProxyModel::countChanged );
+ connect( this, &QAbstractItemModel::modelReset, this, &SortFilterProxyModel::countChanged );
+ connect( this, &QAbstractItemModel::layoutChanged, this, &SortFilterProxyModel::countChanged );
+
+ connect( this, &QAbstractProxyModel::sourceModelChanged, this, &SortFilterProxyModel::updateFilterRole );
+}
+
+QString SortFilterProxyModel::searchPattern() const
+{
+ return filterRegExp().pattern();
+}
+
+void SortFilterProxyModel::setSearchPattern( const QString &searchPattern )
+{
+ setFilterRegExp(searchPattern);
+}
+
+QByteArray SortFilterProxyModel::searchRole() const
+{
+ return m_searchRole;
+}
+
+void SortFilterProxyModel::setSearchRole( const QByteArray &searchRole )
+{
+ m_searchRole = searchRole;
+ emit searchRoleChanged();
+ updateFilterRole();
+}
+
+int SortFilterProxyModel::count() const
+{
+ return rowCount();
+}
+
+QMap<QString, QVariant> SortFilterProxyModel::getDataAt( int idx )
+{
+ QMap<QString, QVariant> dataDict;
+ QHash<int,QByteArray> roles = roleNames();
+ for( const auto role: roles.keys() ) {
+ dataDict[roles[role]] = data( index( idx, 0 ), role );
+ }
+ return dataDict;
+}
+
+QModelIndexList SortFilterProxyModel::mapIndexesToSource( const QModelIndexList &indexes )
+{
+ QModelIndexList sourceIndexes;
+ sourceIndexes.reserve( indexes.size() );
+ for( const auto &proxyIndex : indexes ) {
+ sourceIndexes.push_back( mapToSource(proxyIndex) );
+ }
+ return sourceIndexes;
+}
+
+int SortFilterProxyModel::mapIndexToSource(int idx)
+{
+ return mapToSource( index( idx, 0 ) ).row();
+}
+
+void SortFilterProxyModel::updateFilterRole()
+{
+ setFilterRole( roleNames().key( m_searchRole ) );
+}
diff --git a/modules/gui/qt/util/sortfilterproxymodel.hpp b/modules/gui/qt/util/sortfilterproxymodel.hpp
new file mode 100644
index 0000000000..d2fba63f41
--- /dev/null
+++ b/modules/gui/qt/util/sortfilterproxymodel.hpp
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * Copyright (C) 2020 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * ( at your option ) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef SORT_FILTER_PROXY_MODEL
+#define SORT_FILTER_PROXY_MODEL
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "qt.hpp"
+#include <QObject>
+#include <QSortFilterProxyModel>
+
+class SortFilterProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+
+ Q_PROPERTY( QByteArray searchRole READ searchRole WRITE setSearchRole NOTIFY searchRoleChanged )
+ Q_PROPERTY( QString searchPattern READ searchPattern WRITE setSearchPattern NOTIFY searchPatternChanged )
+ Q_PROPERTY( int count READ count NOTIFY countChanged )
+
+public:
+ SortFilterProxyModel( QObject * parent = nullptr );
+
+ QString searchPattern() const;
+ void setSearchPattern( const QString &searchPattern );
+
+ QByteArray searchRole() const;
+ void setSearchRole( const QByteArray &searchRole );
+
+ int count() const;
+
+ Q_INVOKABLE QMap<QString, QVariant> getDataAt( int idx );
+ Q_INVOKABLE QModelIndexList mapIndexesToSource( const QModelIndexList &indexes );
+ Q_INVOKABLE int mapIndexToSource( int idx );
+
+signals:
+ void searchPatternChanged();
+ void searchRoleChanged();
+ void countChanged();
+
+private slots:
+ void updateFilterRole();
+
+private:
+ QByteArray m_searchRole;
+};
+
+#endif // SORT_FILTER_PROXY_MODEL
--
2.25.1
More information about the vlc-devel
mailing list