[vlc-devel] [PATCH 5/6] qt: don't update the model when the callback comes from another node in NetworkMediaModel

Pierre Lamot pierre at videolabs.io
Mon Jan 20 14:23:26 CET 2020


  this fixes issues when we get the callback from a node after we changes view
  and end up displaying the content of a folder within the device view
---
 modules/gui/qt/network/networkmediamodel.cpp | 25 ++++++++++++++------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/modules/gui/qt/network/networkmediamodel.cpp b/modules/gui/qt/network/networkmediamodel.cpp
index 2a229ff652..a7e96a2ac7 100644
--- a/modules/gui/qt/network/networkmediamodel.cpp
+++ b/modules/gui/qt/network/networkmediamodel.cpp
@@ -265,9 +265,12 @@ bool NetworkMediaModel::initializeMediaSources()
     return true;
 }
 
-void NetworkMediaModel::onItemCleared( MediaSourcePtr mediaSource, input_item_node_t*)
+void NetworkMediaModel::onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node)
 {
-    QMetaObject::invokeMethod(this, [this, mediaSource = std::move(mediaSource)]() {
+    InputItemPtr p_node { node->p_item };
+    QMetaObject::invokeMethod(this, [this, p_node = std::move(p_node), mediaSource = std::move(mediaSource)]() {
+        if (p_node != m_treeItem.media)
+            return;
         input_item_node_t *res;
         input_item_node_t *parent;
         vlc_media_tree_Lock( m_treeItem.source->tree );
@@ -287,12 +290,12 @@ void NetworkMediaModel::onItemAdded( MediaSourcePtr mediaSource, input_item_node
 {
     InputItemPtr p_parent { parent->p_item };
     QMetaObject::invokeMethod(this, [this, p_parent = std::move(p_parent), mediaSource = std::move(mediaSource), children, count]() {
-        if ( p_parent.get() == m_treeItem.media.get() )
+        if ( p_parent == m_treeItem.media )
             refreshMediaList( std::move( mediaSource ), children, count, false );
     }, Qt::QueuedConnection);
 }
 
-void NetworkMediaModel::onItemRemoved(MediaSourcePtr, input_item_node_t *,
+void NetworkMediaModel::onItemRemoved(MediaSourcePtr, input_item_node_t * node,
                                     input_item_node_t *const children[],
                                     size_t count )
 {
@@ -301,7 +304,11 @@ void NetworkMediaModel::onItemRemoved(MediaSourcePtr, input_item_node_t *,
     for ( auto i = 0u; i < count; ++i )
         itemList.emplace_back( children[i]->p_item );
 
-    QMetaObject::invokeMethod(this, [this, itemList=std::move(itemList)]() {
+    InputItemPtr p_node { node->p_item };
+    QMetaObject::invokeMethod(this, [this, p_node=std::move(p_node), itemList=std::move(itemList)]() {
+        if (p_node != m_treeItem.media)
+            return;
+
         for (auto p_item : itemList)
         {
             QUrl itemUri = QUrl::fromEncoded(p_item->psz_uri);
@@ -329,9 +336,13 @@ void NetworkMediaModel::onItemRemoved(MediaSourcePtr, input_item_node_t *,
     }, Qt::QueuedConnection);
 }
 
-void NetworkMediaModel::onItemPreparseEnded(MediaSourcePtr, input_item_node_t*, enum input_item_preparse_status)
+void NetworkMediaModel::onItemPreparseEnded(MediaSourcePtr, input_item_node_t* node, enum input_item_preparse_status)
 {
-    QMetaObject::invokeMethod(this, [this]() {
+    InputItemPtr p_node { node->p_item };
+    QMetaObject::invokeMethod(this, [this, p_node=std::move(p_node)]() {
+        if (p_node != m_treeItem.media)
+            return;
+
         m_parsingPending = false;
         emit parsingPendingChanged(false);
     });
-- 
2.17.1



More information about the vlc-devel mailing list