vlc | branch: master | Pierre Lamot <[email protected]> | Thu Jul 18 18:42:55 2019 +0200| [453e2fe7a8184bb1c261348689c990efa486347c] | committer: Jean-Baptiste Kempf
qt: allow changing root element in MLNetworkModel without recreating the model > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=453e2fe7a8184bb1c261348689c990efa486347c --- .../qt/components/mediacenter/mlnetworkmodel.cpp | 35 +++++++++++++++++----- .../qt/components/mediacenter/mlnetworkmodel.hpp | 22 ++++++++++++-- .../gui/qt/qml/mediacenter/MCNetworkDisplay.qml | 11 +++---- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp b/modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp index 90ec18dcf7..f5c0bdc9db 100644 --- a/modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp +++ b/modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp @@ -118,21 +118,42 @@ bool MLNetworkModel::setData( const QModelIndex& idx, const QVariant& value, int return res == VLC_SUCCESS; } -void MLNetworkModel::setContext(QmlMainContext* ctx, NetworkTreeItem parentTree ) +void MLNetworkModel::setCtx(QmlMainContext* ctx) { - assert(!m_ctx); if (ctx) { m_ctx = ctx; m_ml = vlc_ml_instance_get( m_ctx->getIntf() ); - m_treeItem = parentTree; + } + if (m_ctx && m_hasTree) { initializeMediaSources(); } + emit ctxChanged(); +} + +void MLNetworkModel::setTree(QVariant parentTree) +{ + if (parentTree.canConvert<NetworkTreeItem>()) + m_treeItem = parentTree.value<NetworkTreeItem>(); + else + m_treeItem = NetworkTreeItem(); + m_hasTree = true; + if (m_ctx && m_hasTree) { + initializeMediaSources(); + } + emit treeChanged(); } bool MLNetworkModel::initializeMediaSources() { auto libvlc = vlc_object_instance(m_ctx->getIntf()); + m_listeners.clear(); + if (!m_items.empty()) { + beginResetModel(); + m_items.clear(); + endResetModel(); + } + // When listing all found devices, we have no specified media and no parent, // but we can't go up a level in this case. // Otherwise, we can have a parent (when listing a subdirectory of a device) @@ -194,7 +215,7 @@ bool MLNetworkModel::initializeMediaSources() std::unique_ptr<SourceListener> l{ new SourceListener( m_treeItem.source, this ) }; if ( l->listener == nullptr ) return false; - vlc_media_tree_Preparse( tree, libvlc, m_treeItem.media ); + vlc_media_tree_Preparse( tree, libvlc, m_treeItem.media.get() ); m_listeners.push_back( std::move( l ) ); return true; @@ -206,7 +227,7 @@ void MLNetworkModel::onItemCleared( MediaSourcePtr mediaSource, input_item_node_ { input_item_node_t *res; input_item_node_t *parent; - if ( vlc_media_tree_Find( m_treeItem.source->tree, m_treeItem.media, + if ( vlc_media_tree_Find( m_treeItem.source->tree, m_treeItem.media.get(), &res, &parent ) == false ) return; refreshMediaList( std::move( mediaSource ), res->pp_children, res->i_children, true ); @@ -221,7 +242,7 @@ void MLNetworkModel::onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* { if ( m_treeItem.media == nullptr ) refreshDeviceList( std::move( mediaSource ), children, count, false ); - else if ( parent->p_item == m_treeItem.media ) + else if ( parent->p_item == m_treeItem.media.get() ) refreshMediaList( std::move( mediaSource ), children, count, false ); } @@ -289,7 +310,7 @@ void MLNetworkModel::refreshMediaList( MediaSourcePtr mediaSource, &item.indexed ) != VLC_SUCCESS ) item.indexed = false; } - item.tree = NetworkTreeItem{ mediaSource, it, m_treeItem.media }; + item.tree = NetworkTreeItem( mediaSource, it, m_treeItem.media.get() ); items->push_back( std::move( item ) ); } callAsync([this, clear, items]() { diff --git a/modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp b/modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp index a708c1f3bb..0f3274ec9c 100644 --- a/modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp +++ b/modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp @@ -37,6 +37,10 @@ using MediaSourcePtr = vlc_shared_data_ptr_type(vlc_media_source_t, vlc_media_source_Hold, vlc_media_source_Release); +using InputItemPtr = vlc_shared_data_ptr_type(input_item_t, + input_item_Hold, + input_item_Release); + class NetworkTreeItem { Q_GADGET @@ -54,8 +58,8 @@ public: NetworkTreeItem& operator=( NetworkTreeItem&& ) = default; MediaSourcePtr source; - input_item_t *media; - input_item_t *parent; + InputItemPtr media; + InputItemPtr parent; }; class MLNetworkModel : public QAbstractListModel @@ -71,6 +75,9 @@ public: }; Q_ENUM( ItemType ); + Q_PROPERTY(QmlMainContext* ctx READ getCtx WRITE setCtx NOTIFY ctxChanged) + Q_PROPERTY(QVariant tree READ getTree WRITE setTree NOTIFY treeChanged) + explicit MLNetworkModel(QObject* parent = nullptr); MLNetworkModel( QmlMainContext* ctx, QString parentMrl, QObject* parent = nullptr ); @@ -81,7 +88,15 @@ public: Qt::ItemFlags flags( const QModelIndex& idx ) const override; bool setData( const QModelIndex& idx,const QVariant& value, int role ) override; - Q_INVOKABLE void setContext(QmlMainContext* ctx, NetworkTreeItem parentMrl); + void setCtx(QmlMainContext* ctx); + void setTree(QVariant tree); + + inline QmlMainContext* getCtx() { return m_ctx; } + inline QVariant getTree() { return QVariant::fromValue( m_treeItem); } + +signals: + void ctxChanged(); + void treeChanged(); private: struct Item @@ -152,6 +167,7 @@ private: std::vector<Item> m_items; QmlMainContext* m_ctx = nullptr; vlc_medialibrary_t* m_ml; + bool m_hasTree = false; NetworkTreeItem m_treeItem; std::vector<std::unique_ptr<SourceListener>> m_listeners; }; diff --git a/modules/gui/qt/qml/mediacenter/MCNetworkDisplay.qml b/modules/gui/qt/qml/mediacenter/MCNetworkDisplay.qml index 1f58c17ef8..8b0149ffa9 100644 --- a/modules/gui/qt/qml/mediacenter/MCNetworkDisplay.qml +++ b/modules/gui/qt/qml/mediacenter/MCNetworkDisplay.qml @@ -28,15 +28,15 @@ import "qrc:///style/" Utils.NavigableFocusScope { id: root - property var tree + property alias tree: mlModel.tree Utils.SelectableDelegateModel { id: delegateModel model: MLNetworkModel { - Component.onCompleted: { - setContext(mainctx, root.tree) - } + id: mlModel + ctx: mainctx + tree: undefined } delegate: Package { @@ -69,7 +69,8 @@ Utils.NavigableFocusScope { medialib.addAndPlay( list ) } else { if (delegateModel.items.get(index).model.type != MLNetworkModel.TYPE_FILE) { - history.push(["mc", "network", { tree: delegateModel.items.get(index).model.tree }], History.Go); + root.tree = delegateModel.items.get(index).model.tree + history.push(["mc", "network", { tree: delegateModel.items.get(index).model.tree }], History.Stay); } else { medialib.addAndPlay( delegateModel.items.get(index).model.mrl ); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
