[vlc-commits] qt: expose medialibrary discovery progress as state rather than events

Pierre Lamot git at videolan.org
Thu Aug 29 10:45:01 CEST 2019


vlc | branch: master | Pierre Lamot <pierre at videolabs.io> | Wed Aug  7 10:33:29 2019 +0200| [d3f1aa5c06f212cd228a12433598c85a5b93764b] | committer: Jean-Baptiste Kempf

qt: expose medialibrary discovery progress as state rather than events

this avoids handling the logic in QML

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d3f1aa5c06f212cd228a12433598c85a5b93764b
---

 .../gui/qt/components/mediacenter/mcmedialib.cpp   | 57 +++++++++++++++++++---
 .../gui/qt/components/mediacenter/mcmedialib.hpp   | 22 +++++++--
 modules/gui/qt/qml/utils/ScanProgressBar.qml       | 25 ++--------
 3 files changed, 73 insertions(+), 31 deletions(-)

diff --git a/modules/gui/qt/components/mediacenter/mcmedialib.cpp b/modules/gui/qt/components/mediacenter/mcmedialib.cpp
index d451a741d2..7c44fd9720 100644
--- a/modules/gui/qt/components/mediacenter/mcmedialib.cpp
+++ b/modules/gui/qt/components/mediacenter/mcmedialib.cpp
@@ -222,23 +222,68 @@ void MCMediaLib::onMediaLibraryEvent( void* data, const vlc_ml_event_t* event )
     switch ( event->i_type )
     {
         case VLC_ML_EVENT_PARSING_PROGRESS_UPDATED:
-            self->emit progressUpdated( event->parsing_progress.i_percent );
+        {
+            int percent =  event->parsing_progress.i_percent;
+            QMetaObject::invokeMethod(self, [self, percent]() {
+                self->m_parsingProgress = percent;
+                self->emit parsingProgressChanged(percent);
+            });
             break;
+        }
         case VLC_ML_EVENT_DISCOVERY_STARTED:
-            self->emit discoveryStarted();
+        {
+            QMetaObject::invokeMethod(self, [self]() {
+                self->m_discoveryPending = true;
+                self->emit discoveryPendingChanged(self->m_discoveryPending);
+                self->emit discoveryStarted();
+            });
             break;
+        }
         case VLC_ML_EVENT_DISCOVERY_PROGRESS:
-            self->emit discoveryProgress( event->discovery_progress.psz_entry_point );
+        {
+            QString entryPoint{ event->discovery_progress.psz_entry_point };
+            QMetaObject::invokeMethod(self, [self, entryPoint]() {
+                self->m_discoveryEntryPoint = entryPoint;
+                self->emit discoveryEntryPointChanged(entryPoint);
+            });
             break;
+        }
         case VLC_ML_EVENT_DISCOVERY_COMPLETED:
-            self->emit discoveryCompleted();
+        {
+            QMetaObject::invokeMethod(self, [self]() {
+                self->m_discoveryPending = false;
+                self->emit discoveryPendingChanged(self->m_discoveryPending);
+                self->emit discoveryCompleted();
+            });
             break;
+        }
         case VLC_ML_EVENT_RELOAD_STARTED:
-            self->emit reloadStarted();
+        {
+            QMetaObject::invokeMethod(self, [self]() {
+                self->m_discoveryPending = true;
+                self->emit discoveryPendingChanged(self->m_discoveryPending);
+                self->emit reloadStarted();
+            });
             break;
+        }
         case VLC_ML_EVENT_RELOAD_COMPLETED:
-            self->emit reloadCompleted();
+        {
+            QMetaObject::invokeMethod(self, [self]() {
+                self->m_discoveryPending = false;
+                self->emit discoveryPendingChanged(self->m_discoveryPending);
+                self->emit reloadCompleted();
+            });
             break;
+        }
+        case VLC_ML_EVENT_BACKGROUND_IDLE_CHANGED:
+        {
+            bool idle = event->background_idle_changed.b_idle;
+            QMetaObject::invokeMethod(self, [self, idle]() {
+                self->m_idle = idle;
+                self->emit idleChanged();
+            });
+            break;
+        }
         default:
             break;
     }
diff --git a/modules/gui/qt/components/mediacenter/mcmedialib.hpp b/modules/gui/qt/components/mediacenter/mcmedialib.hpp
index 43df1183b1..db52978bf4 100644
--- a/modules/gui/qt/components/mediacenter/mcmedialib.hpp
+++ b/modules/gui/qt/components/mediacenter/mcmedialib.hpp
@@ -39,6 +39,10 @@ class MCMediaLib : public QObject
     Q_OBJECT
 
     Q_PROPERTY(bool gridView READ isGridView WRITE setGridView NOTIFY gridViewChanged)
+    Q_PROPERTY(bool discoveryPending READ discoveryPending NOTIFY discoveryPendingChanged)
+    Q_PROPERTY(int  parsingProgress READ parsingProgress NOTIFY parsingProgressChanged)
+    Q_PROPERTY(QString discoveryEntryPoint READ discoveryEntryPoint NOTIFY discoveryEntryPointChanged)
+    Q_PROPERTY(bool idle READ idle NOTIFY idleChanged)
 
 public:
     MCMediaLib(intf_thread_t* _intf, QObject* _parent = nullptr );
@@ -53,17 +57,23 @@ public:
     Q_INVOKABLE void addAndPlay(const QUrl& mrl);
     Q_INVOKABLE void addAndPlay(const QVariantList&itemIdList);
 
+    inline bool idle() const { return m_idle; }
+    inline int discoveryPending() const { return m_discoveryPending; }
+    inline QString discoveryEntryPoint() const { return m_discoveryEntryPoint; }
+    inline int parsingProgress() const { return m_parsingProgress; }
 
     vlc_medialibrary_t* vlcMl();
 
 signals:
     void gridViewChanged();
-    void discoveryStarted();
     void reloadStarted();
-    void discoveryProgress( QString entryPoint );
-    void discoveryCompleted();
     void reloadCompleted();
-    void progressUpdated( quint32 percent );
+    void discoveryStarted();
+    void discoveryCompleted();
+    void parsingProgressChanged( quint32 percent );
+    void discoveryEntryPointChanged( QString entryPoint );
+    void discoveryPendingChanged( bool state );
+    void idleChanged();
 
 private:
     bool isGridView() const;
@@ -76,6 +86,10 @@ private:
     intf_thread_t* m_intf;
 
     bool m_gridView;
+    bool m_idle = false;
+    bool m_discoveryPending = false;
+    int m_parsingProgress = 0;
+    QString m_discoveryEntryPoint;
 
     /* Medialibrary */
     vlc_medialibrary_t* m_ml;
diff --git a/modules/gui/qt/qml/utils/ScanProgressBar.qml b/modules/gui/qt/qml/utils/ScanProgressBar.qml
index 7b298110c4..2e4d2ede37 100644
--- a/modules/gui/qt/qml/utils/ScanProgressBar.qml
+++ b/modules/gui/qt/qml/utils/ScanProgressBar.qml
@@ -21,37 +21,20 @@ import QtQuick.Controls 2.4
 import "qrc:///style/"
 
 ProgressBar {
-    property int progressPercent: 0
-    property bool discoveryDone: true
+    visible: !medialib.idle
 
-    Connections {
-        target: medialib
-        onProgressUpdated: {
-            progressPercent = percent;
-            if (discoveryDone)
-                progressText_id.text = percent + "%";
-        }
-        onDiscoveryProgress: {
-            progressText_id.text = entryPoint;
-        }
-        onDiscoveryStarted: discoveryDone = false
-        onReloadStarted: discoveryDone = false
-        onDiscoveryCompleted: discoveryDone = true
-        onReloadCompleted: discoveryDone = true
-    }
-
-    visible: ((progressPercent < 100) && (progressPercent != 0)) || !discoveryDone
     id: progressBar_id
     from: 0
     to: 100
     height: progressText_id.height
     anchors.topMargin: 10
     anchors.bottomMargin: 10
-    value: progressPercent
-    indeterminate: !discoveryDone
+    value: medialib.parsingProgress
+    indeterminate: medialib.discoveryPending
     Text {
         id: progressText_id
         color: VLCStyle.colors.text
+        text:  medialib.discoveryPending ? medialib.discoveryEntryPoint : (medialib.parsingProgress + "%")
         z: progressBar_id.z + 1
         anchors.horizontalCenter: parent.horizontalCenter
         visible: true



More information about the vlc-commits mailing list