[vlc-devel] [PATCH 1/2] qt: expose medialibrary discovery progress as state rather than events
Pierre Lamot
pierre at videolabs.io
Tue Aug 6 18:42:19 CEST 2019
this avoids handling the logic in QML
---
.../qt/components/mediacenter/mcmedialib.cpp | 57 +++++++++++++++++--
.../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 1889537cbe..3edef7b946 100644
--- a/modules/gui/qt/components/mediacenter/mcmedialib.cpp
+++ b/modules/gui/qt/components/mediacenter/mcmedialib.cpp
@@ -224,23 +224,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_discoveryProgress = percent;
+ self->emit discoveryProgressChanged(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_discoveryIdle = 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 61d100c47d..b97fffc2b1 100644
--- a/modules/gui/qt/components/mediacenter/mcmedialib.hpp
+++ b/modules/gui/qt/components/mediacenter/mcmedialib.hpp
@@ -40,6 +40,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 discoveryProgress READ discoveryProgress NOTIFY discoveryProgressChanged)
+ Q_PROPERTY(QString discoveryEntryPoint READ discoveryEntryPoint NOTIFY discoveryEntryPointChanged)
+ Q_PROPERTY(bool discoveryIdle READ discoveryIdle NOTIFY idleChanged)
public:
MCMediaLib(intf_thread_t* _intf, QObject* _parent = nullptr );
@@ -54,17 +58,23 @@ public:
Q_INVOKABLE void addAndPlay(const QUrl& mrl);
Q_INVOKABLE void addAndPlay(const QVariantList&itemIdList);
+ inline bool discoveryIdle() const { return m_discoveryIdle; }
+ inline int discoveryPending() const { return m_discoveryPending; }
+ inline QString discoveryEntryPoint() const { return m_discoveryEntryPoint; }
+ inline int discoveryProgress() const { return m_discoveryProgress; }
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 discoveryProgressChanged( quint32 percent );
+ void discoveryEntryPointChanged( QString entryPoint );
+ void discoveryPendingChanged( bool state );
+ void idleChanged();
private:
bool isGridView() const;
@@ -81,6 +91,10 @@ private:
intf_thread_t* m_intf;
bool m_gridView;
+ bool m_discoveryIdle = false;
+ bool m_discoveryPending = false;
+ int m_discoveryProgress = 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..e954c0b7a5 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.discoveryIdle
- 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.discoveryProgress
+ indeterminate: medialib.discoveryPending
Text {
id: progressText_id
color: VLCStyle.colors.text
+ text: medialib.discoveryPending ? medialib.discoveryEntryPoint : (medialib.discoveryProgress + "%")
z: progressBar_id.z + 1
anchors.horizontalCenter: parent.horizontalCenter
visible: true
--
2.17.1
More information about the vlc-devel
mailing list