[vlc-devel] [PATCH 1/2] qt: add extension manager model
Sagar Kohli
kohli.sagar2 at gmail.com
Sat Aug 31 14:54:39 CEST 2019
---
modules/gui/qt/Makefile.am | 3 +
modules/gui/qt/components/extension_model.cpp | 141 ++++++++++++++++++
modules/gui/qt/components/extension_model.hpp | 91 +++++++++++
modules/gui/qt/main_interface.cpp | 3 +
4 files changed, 238 insertions(+)
create mode 100644 modules/gui/qt/components/extension_model.cpp
create mode 100644 modules/gui/qt/components/extension_model.hpp
diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index bdf5dcd5cf..1107905966 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -176,6 +176,8 @@ libqt_plugin_la_SOURCES = \
gui/qt/components/sout/sout_widgets.cpp \
gui/qt/components/sout/sout_widgets.hpp \
gui/qt/components/sout/profiles.hpp \
+ gui/qt/components/extension_model.cpp \
+ gui/qt/components/extension_model.hpp \
gui/qt/util/animators.cpp gui/qt/util/animators.hpp \
gui/qt/util/input_slider.cpp gui/qt/util/input_slider.hpp \
gui/qt/util/input_models.cpp gui/qt/util/input_models.hpp \
@@ -298,6 +300,7 @@ nodist_libqt_plugin_la_SOURCES = \
gui/qt/components/playlist/playlist_controller.moc.cpp \
gui/qt/components/sout/profile_selector.moc.cpp \
gui/qt/components/sout/sout_widgets.moc.cpp \
+ gui/qt/components/extension_model.moc.cpp \
gui/qt/util/animators.moc.cpp \
gui/qt/util/input_slider.moc.cpp \
gui/qt/util/input_models.moc.cpp \
diff --git a/modules/gui/qt/components/extension_model.cpp b/modules/gui/qt/components/extension_model.cpp
new file mode 100644
index 0000000000..e28d878e88
--- /dev/null
+++ b/modules/gui/qt/components/extension_model.cpp
@@ -0,0 +1,141 @@
+/*****************************************************************************
+ * Copyright (C) 2019 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 "extension_model.hpp"
+
+ExtensionModel::ExtensionModel(extension_t *p_ext, QObject *parent)
+ : QObject(parent), m_ext(p_ext)
+{
+}
+
+QString ExtensionModel::name() const
+{
+ return qfu( m_ext->psz_name );
+}
+
+QString ExtensionModel::title() const
+{
+ return qfu( m_ext->psz_title );
+}
+
+QString ExtensionModel::description() const
+{
+ return qfu( m_ext->psz_description );
+}
+
+QString ExtensionModel::shortdes() const
+{
+ return qfu( m_ext->psz_shortdescription );
+}
+
+QString ExtensionModel::author() const
+{
+ return qfu( m_ext->psz_author );
+}
+
+QString ExtensionModel::version() const
+{
+ return qfu( m_ext->psz_version );
+}
+
+QUrl ExtensionModel::url() const
+{
+ return qfu( m_ext->psz_url );
+}
+
+ExtensionManager::ExtensionManager(QObject *)
+{
+}
+
+ExtensionManager::~ExtensionManager()
+{
+ // Clear extensions list
+ m_extensionsList.clear();
+}
+
+void ExtensionManager::updateList()
+{
+ // Clear extensions list
+ m_extensionsList.clear();
+
+ // Find new extensions
+ extensions_manager_t *p_mgr = EM->getManager();
+ if( !p_mgr )
+ return;
+
+ vlc_mutex_locker lock( &p_mgr->lock );
+ extension_t *p_ext;
+ ARRAY_FOREACH( p_ext, p_mgr->extensions )
+ {
+ m_extensionsList.emplace_back( std::make_unique<ExtensionModel> ( p_ext, this ) );
+ }
+}
+
+void ExtensionManager::activate(int row)
+{
+ uint16_t i_ext = (uint16_t)row;
+
+ extensions_manager_t *p_mgr = EM->getManager();
+
+ vlc_mutex_locker lock( &p_mgr->lock );
+
+ extension_t *p_ext = ARRAY_VAL( p_mgr->extensions, i_ext );
+ assert( p_ext != NULL);
+
+ if( extension_TriggerOnly( p_mgr, p_ext ) )
+ {
+ extension_Trigger( p_mgr, p_ext );
+ }
+ else
+ {
+ if( !extension_IsActivated( p_mgr, p_ext ) )
+ extension_Activate( p_mgr, p_ext );
+ else
+ extension_Deactivate( p_mgr, p_ext );
+ }
+}
+
+int ExtensionManager::itemSize(QQmlListProperty<ExtensionModel> *property)
+{
+ ExtensionManager *extManager = static_cast< ExtensionManager *>(property->data);
+ return extManager->m_extensionsList.size();
+}
+
+ExtensionModel *ExtensionManager::itemAt(QQmlListProperty<ExtensionModel> *property, int index)
+{
+ ExtensionManager *extManager = static_cast< ExtensionManager *>(property->data);
+ return extManager->m_extensionsList[index].get();
+}
+
+QQmlListProperty<ExtensionModel> ExtensionManager::getExtensions()
+{
+ return QQmlListProperty<ExtensionModel>(this, static_cast<void *>(this), &itemSize, &itemAt);
+}
+
+QmlMainContext* ExtensionManager::getMainCtx()
+{
+ return m_mainCtx;
+}
+
+void ExtensionManager::setMainCtx(QmlMainContext *ctx)
+{
+ m_mainCtx = ctx;
+ EM = ExtensionsManager::getInstance(m_mainCtx->getIntf());
+ CONNECT( EM, extensionsUpdated(), this, updateList() );
+ EM->loadExtensions();
+}
diff --git a/modules/gui/qt/components/extension_model.hpp b/modules/gui/qt/components/extension_model.hpp
new file mode 100644
index 0000000000..896ec59081
--- /dev/null
+++ b/modules/gui/qt/components/extension_model.hpp
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ * Copyright (C) 2019 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 EXTENSION_MODEL_HPP
+#define EXTENSION_MODEL_HPP
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <QAbstractListModel>
+#include "extensions_manager.hpp"
+#include <QQmlListProperty>
+#include <QStringList>
+#include <vlc_extensions.h>
+#include "qml_main_context.hpp"
+#include <QUrl>
+#include <QObject>
+#include <QList>
+
+class ExtensionModel : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QString name READ name CONSTANT)
+ Q_PROPERTY(QString title READ title CONSTANT)
+ Q_PROPERTY(QString description READ description CONSTANT)
+ Q_PROPERTY(QString shortdes READ shortdes CONSTANT)
+ Q_PROPERTY(QString author READ author CONSTANT)
+ Q_PROPERTY(QString version READ version CONSTANT)
+ Q_PROPERTY(QUrl url READ url CONSTANT)
+
+private:
+ extension_t *m_ext;
+
+public:
+ ExtensionModel(extension_t *p_ext, QObject *parent=0);
+
+ QString name() const;
+ QString title() const;
+ QString description() const;
+ QString shortdes() const;
+ QString author() const;
+ QString version() const;
+ QUrl url() const;
+
+};
+
+class ExtensionManager: public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QQmlListProperty<ExtensionModel> extensions READ getExtensions CONSTANT);
+ Q_PROPERTY(QmlMainContext* mainCtx READ getMainCtx WRITE setMainCtx);
+
+public:
+ ExtensionManager(QObject *parent = nullptr);
+ virtual ~ExtensionManager();
+
+ static int itemSize(QQmlListProperty<ExtensionModel> *property);
+ static ExtensionModel *itemAt(QQmlListProperty<ExtensionModel> *property, int index);
+ QQmlListProperty<ExtensionModel> getExtensions();
+ QmlMainContext* getMainCtx();
+ void setMainCtx(QmlMainContext*);
+
+protected slots:
+ void updateList();
+ Q_INVOKABLE void activate(int row);
+
+private:
+ ExtensionsManager *EM;
+ std::vector<std::unique_ptr<ExtensionModel>> m_extensionsList;
+ QmlMainContext* m_mainCtx;
+
+};
+
+#endif // EXTENSION_MODEL_HPP
diff --git a/modules/gui/qt/main_interface.cpp b/modules/gui/qt/main_interface.cpp
index eb28983885..707d4ea520 100644
--- a/modules/gui/qt/main_interface.cpp
+++ b/modules/gui/qt/main_interface.cpp
@@ -54,6 +54,7 @@
#include "components/mediacenter/mlnetworkmodel.hpp"
#include "components/recent_media_model.hpp"
#include "components/settings.hpp"
+#include "components/extension_model.hpp"
#include "components/navigation_history.hpp"
#include "components/aboutmodel.hpp"
@@ -374,6 +375,8 @@ void MainInterface::createMainWidget( QSettings * )
qmlRegisterType<DialogModel>("org.videolan.vlc", 0, 1, "DialogModel");
qmlRegisterType<QmlEventFilter>( "org.videolan.vlc", 0, 1, "EventFilter" );
+ qmlRegisterType<ExtensionManager>( "org.videolan.vlc", 0, 1, "ExtensionManager");
+ qmlRegisterUncreatableType<ExtensionModel>( "org.videolan.vlc", 0, 1, "ExtensionModel", "");
qmlRegisterType<PlayerControlBarModel>( "org.videolan.vlc", 0, 1, "PlayerControlBarModel");
--
2.17.1
More information about the vlc-devel
mailing list