[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