diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am index f85c9a337ada106e47a442a3a6f403b69864c1ea..0207cbaddc9eebdbaa1a6e59354794595c44bdb6 100644 --- a/modules/gui/qt/Makefile.am +++ b/modules/gui/qt/Makefile.am @@ -155,8 +155,12 @@ libqt_plugin_la_SOURCES = \ gui/qt/components/mediacenter/mlgenre.hpp \ gui/qt/components/mediacenter/mlgenremodel.cpp \ gui/qt/components/mediacenter/mlgenremodel.hpp \ - gui/qt/components/mediacenter/mlnetworkmodel.cpp \ - gui/qt/components/mediacenter/mlnetworkmodel.hpp \ + gui/qt/components/mediacenter/mlnetworkdevicemodel.cpp \ + gui/qt/components/mediacenter/mlnetworkdevicemodel.hpp \ + gui/qt/components/mediacenter/mlnetworkmediamodel.cpp \ + gui/qt/components/mediacenter/mlnetworkmediamodel.hpp \ + gui/qt/components/mediacenter/mlnetworksourcelistener.cpp \ + gui/qt/components/mediacenter/mlnetworksourcelistener.hpp \ gui/qt/components/mediacenter/mlvideo.hpp \ gui/qt/components/mediacenter/mlvideo.cpp \ gui/qt/components/mediacenter/mlvideomodel.cpp \ @@ -295,7 +299,8 @@ nodist_libqt_plugin_la_SOURCES = \ gui/qt/components/mediacenter/mlartistmodel.moc.cpp \ gui/qt/components/mediacenter/mlgenre.moc.cpp \ gui/qt/components/mediacenter/mlgenremodel.moc.cpp \ - gui/qt/components/mediacenter/mlnetworkmodel.moc.cpp \ + gui/qt/components/mediacenter/mlnetworkdevicemodel.moc.cpp \ + gui/qt/components/mediacenter/mlnetworkmediamodel.moc.cpp \ gui/qt/components/mediacenter/mlvideo.moc.cpp \ gui/qt/components/mediacenter/mlvideomodel.moc.cpp \ gui/qt/components/mediacenter/mlrecentsvideomodel.moc.cpp \ diff --git a/modules/gui/qt/components/mediacenter/mlnetworkdevicemodel.cpp b/modules/gui/qt/components/mediacenter/mlnetworkdevicemodel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e2eb5f9ba2d79c57c3daa33a42dcf513f518feaa --- /dev/null +++ b/modules/gui/qt/components/mediacenter/mlnetworkdevicemodel.cpp @@ -0,0 +1,238 @@ +/***************************************************************************** + * 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 "mlnetworkdevicemodel.hpp" +#include "mlnetworkmediamodel.hpp" + +#include "components/playlist/media.hpp" +#include "components/playlist/playlist_controller.hpp" + +namespace { + +enum Role { + NETWORK_NAME = Qt::UserRole + 1, + NETWORK_MRL, + NETWORK_TYPE, + NETWORK_PROTOCOL, + NETWORK_SOURCE, + NETWORK_TREE, +}; + +} + +MLNetworkDeviceModel::MLNetworkDeviceModel( QObject* parent ) + : QAbstractListModel( parent ) + , m_ml( nullptr ) +{ +} + +QVariant MLNetworkDeviceModel::data( const QModelIndex& index, int role ) const +{ + if (!m_ctx) + return {}; + auto idx = index.row(); + if ( idx < 0 || (size_t)idx >= m_items.size() ) + return {}; + const auto& item = m_items[idx]; + switch ( role ) + { + case NETWORK_NAME: + return item.name; + case NETWORK_MRL: + return item.mainMrl; + case NETWORK_TYPE: + return item.type; + case NETWORK_PROTOCOL: + return item.protocol; + case NETWORK_SOURCE: + return item.mediaSource->description; + case NETWORK_TREE: + return QVariant::fromValue( NetworkTreeItem(item.mediaSource, item.inputItem.get()) ); + default: + return {}; + } +} + +QHash<int, QByteArray> MLNetworkDeviceModel::roleNames() const +{ + return { + { NETWORK_NAME, "name" }, + { NETWORK_MRL, "mrl" }, + { NETWORK_TYPE, "type" }, + { NETWORK_PROTOCOL, "protocol" }, + { NETWORK_SOURCE, "source" }, + { NETWORK_TREE, "tree" }, + }; +} + + +int MLNetworkDeviceModel::rowCount(const QModelIndex& parent) const +{ + if ( parent.isValid() ) + return 0; + assert( m_items.size() < INT32_MAX ); + return static_cast<int>( m_items.size() ); +} + + +void MLNetworkDeviceModel::setCtx(QmlMainContext* ctx) +{ + if (ctx) { + m_ctx = ctx; + m_ml = vlc_ml_instance_get( m_ctx->getIntf() ); + } + if (m_ctx && m_sdSource != CAT_UNDEFINED) { + initializeMediaSources(); + } + emit ctxChanged(); +} + +void MLNetworkDeviceModel::setSdSource(SDCatType s) +{ + m_sdSource = s; + if (m_ctx && m_sdSource != CAT_UNDEFINED) { + initializeMediaSources(); + } + emit sdSourceChanged(); +} + +bool MLNetworkDeviceModel::initializeMediaSources() +{ + auto libvlc = vlc_object_instance(m_ctx->getIntf()); + + m_listeners.clear(); + if (!m_items.empty()) { + beginResetModel(); + m_items.clear(); + endResetModel(); + } + + auto provider = vlc_media_source_provider_Get( libvlc ); + + using SourceMetaPtr = std::unique_ptr<vlc_media_source_meta_list_t, + decltype( &vlc_media_source_meta_list_Delete )>; + + SourceMetaPtr providerList( vlc_media_source_provider_List( provider, static_cast<services_discovery_category_e>(m_sdSource) ), + &vlc_media_source_meta_list_Delete ); + if ( providerList == nullptr ) + return false; + + auto nbProviders = vlc_media_source_meta_list_Count( providerList.get() ); + + for ( auto i = 0u; i < nbProviders; ++i ) + { + auto meta = vlc_media_source_meta_list_Get( providerList.get(), i ); + auto mediaSource = vlc_media_source_provider_GetMediaSource( provider, + meta->name ); + if ( mediaSource == nullptr ) + continue; + std::unique_ptr<MLNetworkSourceListener> l{ new MLNetworkSourceListener( + MediaSourcePtr{ mediaSource, false }, this ) }; + if ( l->listener == nullptr ) + return false; + m_listeners.push_back( std::move( l ) ); + } + return m_listeners.empty() == false; +} + + +void MLNetworkDeviceModel::onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ) +{ + refreshDeviceList( std::move( mediaSource), node->pp_children, node->i_children, true ); +} + +void MLNetworkDeviceModel::onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, + input_item_node_t *const children[], + size_t count ) +{ + refreshDeviceList( std::move( mediaSource ), children, count, false ); +} + +void MLNetworkDeviceModel::onItemRemoved( MediaSourcePtr, + input_item_node_t *const children[], + size_t count ) +{ + for ( auto i = 0u; i < count; ++i ) + { + input_item_t* p_item = children[i]->p_item; + input_item_Hold( p_item ); + QMetaObject::invokeMethod(this, [this, p_item]() { + QUrl itemUri = QUrl::fromEncoded(p_item->psz_uri); + auto it = std::find_if( begin( m_items ), end( m_items ), [p_item, itemUri](const Item& i) { + return QString::compare( qfu(p_item->psz_name), i.name, Qt::CaseInsensitive ) == 0 && + itemUri.scheme() == i.mainMrl.scheme(); + }); + if ( it == end( m_items ) ) + { + input_item_Release( p_item ); + return; + } + auto mrlIt = std::find_if( begin( (*it).mrls ), end( (*it).mrls), + [itemUri]( const QUrl& mrl ) { + return mrl == itemUri; + }); + input_item_Release( p_item ); + if ( mrlIt == end( (*it).mrls ) ) + return; + (*it).mrls.erase( mrlIt ); + if ( (*it).mrls.empty() == false ) + return; + auto idx = std::distance( begin( m_items ), it ); + beginRemoveRows({}, idx, idx ); + m_items.erase( it ); + endRemoveRows(); + }); + } +} + +void MLNetworkDeviceModel::refreshDeviceList( MediaSourcePtr mediaSource, input_item_node_t* const children[], size_t count, bool clear ) +{ + if ( clear == true ) + { + QMetaObject::invokeMethod(this, [this, mediaSource]() { + beginResetModel(); + m_items.erase(std::remove_if(m_items.begin(), m_items.end(), [mediaSource](const Item& value) { + return value.mediaSource == mediaSource; + }), m_items.end()); + endResetModel(); + }); + } + for ( auto i = 0u; i < count; ++i ) + { + Item item; + item.mainMrl = QUrl::fromEncoded( QByteArray{ children[i]->p_item->psz_uri }.append( '/' ) ); + item.name = qfu(children[i]->p_item->psz_name); + item.mrls.push_back( item.mainMrl ); + item.type = static_cast<ItemType>( children[i]->p_item->i_type ); + item.protocol = item.mainMrl.scheme(); + item.mediaSource = mediaSource; + item.inputItem = InputItemPtr(children[i]->p_item); + + QMetaObject::invokeMethod(this, [this, item]() mutable { + auto it = std::find_if( begin( m_items ), end( m_items ), [&item](const Item& i) { + return QString::compare(item.name , i.name, Qt::CaseInsensitive ) == 0 && + item.mainMrl.scheme() == i.mainMrl.scheme(); + }); + if ( it != end( m_items ) ) + return; + beginInsertRows( {}, m_items.size(), m_items.size() ); + m_items.push_back( std::move( item ) ); + endInsertRows(); + }); + } +} diff --git a/modules/gui/qt/components/mediacenter/mlnetworkdevicemodel.hpp b/modules/gui/qt/components/mediacenter/mlnetworkdevicemodel.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a1d354c3a3ffb5d036b4f9cbca51aa6df2d51688 --- /dev/null +++ b/modules/gui/qt/components/mediacenter/mlnetworkdevicemodel.hpp @@ -0,0 +1,122 @@ +/***************************************************************************** + * 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 MLNETWORKDEVICEMODEL_HPP +#define MLNETWORKDEVICEMODEL_HPP + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <QAbstractListModel> + +#include <vlc_media_library.h> +#include <vlc_media_source.h> +#include <vlc_threads.h> +#include <vlc_cxx_helpers.hpp> + +#include <components/qml_main_context.hpp> +#include "mlnetworksourcelistener.hpp" + +#include <memory> + +class MLNetworkDeviceModel : public QAbstractListModel, public MLNetworkSourceListener::SourceListenerCb +{ + Q_OBJECT +public: + enum ItemType{ + // qt version of input_item_type_e + TYPE_UNKNOWN = ITEM_TYPE_UNKNOWN, + TYPE_FILE, + TYPE_DIRECTORY, + TYPE_DISC, + TYPE_CARD, + TYPE_STREAM, + TYPE_PLAYLIST, + TYPE_NODE, + }; + Q_ENUM( ItemType ) + + enum SDCatType{ + // qt version of input_item_type_e + CAT_UNDEFINED = 0, + CAT_DEVICES = SD_CAT_DEVICES, + CAT_LAN, + CAT_INTERNET, + CAT_MYCOMPUTER, + }; + Q_ENUM( SDCatType ) + + + Q_PROPERTY(QmlMainContext* ctx READ getCtx WRITE setCtx NOTIFY ctxChanged) + Q_PROPERTY(SDCatType sd_source READ getSdSource WRITE setSdSource NOTIFY sdSourceChanged) + + +public: + MLNetworkDeviceModel( QObject* parent = nullptr ); + + QVariant data(const QModelIndex& index, int role) const override; + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex& parent) const override; + + void setCtx(QmlMainContext* ctx); + void setSdSource(SDCatType s); + + inline QmlMainContext* getCtx() { return m_ctx; } + inline SDCatType getSdSource() { return m_sdSource; } + +signals: + void ctxChanged(); + void sdSourceChanged(); + +private: + 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); + + struct Item + { + QString name; + QUrl mainMrl; + std::vector<QUrl> mrls; + QString protocol; + ItemType type; + MediaSourcePtr mediaSource; + InputItemPtr inputItem; + }; + + bool initializeMediaSources(); + void onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ) override; + void onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, input_item_node_t *const children[], size_t count ) override; + void onItemRemoved( MediaSourcePtr mediaSource, input_item_node_t *const children[], size_t count ) override; + + void refreshDeviceList(MediaSourcePtr mediaSource, input_item_node_t* const children[], size_t count , bool clear); + +private: + std::vector<Item> m_items; + QmlMainContext* m_ctx = nullptr; + vlc_medialibrary_t* m_ml = nullptr; + SDCatType m_sdSource = CAT_UNDEFINED; + + std::vector<std::unique_ptr<MLNetworkSourceListener>> m_listeners; +}; + +#endif // MLNETWORKDEVICEMODEL_HPP diff --git a/modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp b/modules/gui/qt/components/mediacenter/mlnetworkmediamodel.cpp similarity index 50% rename from modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp rename to modules/gui/qt/components/mediacenter/mlnetworkmediamodel.cpp index a12fb9098335ec321e3332919b9ac00f3a34ef4a..53b9cab2d8808846dc8c72613201e9a21ca6fa49 100644 --- a/modules/gui/qt/components/mediacenter/mlnetworkmodel.cpp +++ b/modules/gui/qt/components/mediacenter/mlnetworkmediamodel.cpp @@ -4,11 +4,11 @@ * 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. + * (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 + * 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 @@ -16,10 +16,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include "mlnetworkmodel.hpp" +#include "mlnetworkmediamodel.hpp" #include "mlhelper.hpp" +#include "components/playlist/media.hpp" +#include "components/playlist/playlist_controller.hpp" + namespace { enum Role { @@ -35,13 +38,13 @@ enum Role { } -MLNetworkModel::MLNetworkModel( QObject* parent ) +MLNetworkMediaModel::MLNetworkMediaModel( QObject* parent ) : QAbstractListModel( parent ) , m_ml( nullptr ) { } -QVariant MLNetworkModel::data( const QModelIndex& index, int role ) const +QVariant MLNetworkMediaModel::data( const QModelIndex& index, int role ) const { if (!m_ctx) return {}; @@ -72,7 +75,7 @@ QVariant MLNetworkModel::data( const QModelIndex& index, int role ) const } } -QHash<int, QByteArray> MLNetworkModel::roleNames() const +QHash<int, QByteArray> MLNetworkMediaModel::roleNames() const { return { { NETWORK_NAME, "name" }, @@ -86,7 +89,7 @@ QHash<int, QByteArray> MLNetworkModel::roleNames() const }; } -int MLNetworkModel::rowCount(const QModelIndex& parent) const +int MLNetworkMediaModel::rowCount(const QModelIndex& parent) const { if ( parent.isValid() ) return 0; @@ -94,13 +97,14 @@ int MLNetworkModel::rowCount(const QModelIndex& parent) const return static_cast<int>( m_items.size() ); } -Qt::ItemFlags MLNetworkModel::flags( const QModelIndex& idx ) const +Qt::ItemFlags MLNetworkMediaModel::flags( const QModelIndex& idx ) const { return QAbstractListModel::flags( idx ) | Qt::ItemIsEditable; } -bool MLNetworkModel::setData( const QModelIndex& idx, const QVariant& value, int role ) +bool MLNetworkMediaModel::setData( const QModelIndex& idx, const QVariant& value, int role ) { + printf("MLNetworkMediaModel::setData `\n"); if (!m_ml) return false; @@ -109,6 +113,7 @@ bool MLNetworkModel::setData( const QModelIndex& idx, const QVariant& value, int auto enabled = value.toBool(); if ( m_items[idx.row()].indexed == enabled ) return false; + printf("MLNetworkMediaModel::setData change indexed`\n"); int res; if ( enabled ) res = vlc_ml_add_folder( m_ml, qtu( m_items[idx.row()].mainMrl.toString( QUrl::None ) ) ); @@ -119,7 +124,8 @@ bool MLNetworkModel::setData( const QModelIndex& idx, const QVariant& value, int return res == VLC_SUCCESS; } -void MLNetworkModel::setIndexed(bool indexed) + +void MLNetworkMediaModel::setIndexed(bool indexed) { if (indexed == m_indexed || !m_canBeIndexed) return; @@ -135,7 +141,7 @@ void MLNetworkModel::setIndexed(bool indexed) } } -void MLNetworkModel::setCtx(QmlMainContext* ctx) +void MLNetworkMediaModel::setCtx(QmlMainContext* ctx) { if (ctx) { m_ctx = ctx; @@ -147,7 +153,7 @@ void MLNetworkModel::setCtx(QmlMainContext* ctx) emit ctxChanged(); } -void MLNetworkModel::setTree(QVariant parentTree) +void MLNetworkMediaModel::setTree(QVariant parentTree) { if (parentTree.canConvert<NetworkTreeItem>()) m_treeItem = parentTree.value<NetworkTreeItem>(); @@ -159,74 +165,23 @@ void MLNetworkModel::setTree(QVariant parentTree) } emit treeChanged(); } -void MLNetworkModel::setIsOnProviderList(bool b) -{ - m_isOnProviderList = b; - - emit isOnProviderListChanged(); -} -void MLNetworkModel::setSdSource(QString s) -{ - beginResetModel(); - m_sdSource = s; - emit sdSourceChanged(); - endResetModel(); -} -bool MLNetworkModel::initializeMediaSources() +bool MLNetworkMediaModel::initializeMediaSources() { auto libvlc = vlc_object_instance(m_ctx->getIntf()); - m_listeners.clear(); + m_listener.reset(); if (!m_items.empty()) { beginResetModel(); m_items.clear(); endResetModel(); } - if ( m_treeItem.media == nullptr ) - { - // If there's no target media, we're handling device discovery - setIsOnProviderList( true ); - auto provider = vlc_media_source_provider_Get( libvlc ); - - using SourceMetaPtr = std::unique_ptr<vlc_media_source_meta_list_t, - decltype( &vlc_media_source_meta_list_Delete )>; - - services_discovery_category_e cat = SD_CAT_LAN; - if ( m_sdSource == "SD_CAT_DEVICES" ) - cat = SD_CAT_DEVICES; - else if ( m_sdSource == "SD_CAT_MYCOMPUTER" ) - cat = SD_CAT_MYCOMPUTER; - else if ( m_sdSource == "SD_CAT_INTERNET" ) - cat = SD_CAT_INTERNET; - - SourceMetaPtr providerList( vlc_media_source_provider_List( provider, cat ), - &vlc_media_source_meta_list_Delete ); - if ( providerList == nullptr ) - return false; - - auto nbProviders = vlc_media_source_meta_list_Count( providerList.get() ); + if (!m_treeItem) + return false; - for ( auto i = 0u; i < nbProviders; ++i ) - { - auto meta = vlc_media_source_meta_list_Get( providerList.get(), i ); - auto mediaSource = vlc_media_source_provider_GetMediaSource( provider, - meta->name ); - if ( mediaSource == nullptr ) - continue; - std::unique_ptr<SourceListener> l{ new SourceListener( - MediaSourcePtr{ mediaSource, false }, this ) }; - if ( l->listener == nullptr ) - return false; - m_listeners.push_back( std::move( l ) ); - } - return m_listeners.empty() == false; - } - // Otherwise, we're listing content from a device or folder - setIsOnProviderList( false ); auto tree = m_treeItem.source->tree; - std::unique_ptr<SourceListener> l{ new SourceListener( m_treeItem.source, this ) }; + std::unique_ptr<MLNetworkSourceListener> l{ new MLNetworkSourceListener( m_treeItem.source, this ) }; if ( l->listener == nullptr ) return false; @@ -246,38 +201,32 @@ bool MLNetworkModel::initializeMediaSources() emit isIndexedChanged(); } + vlc_media_tree_Preparse( tree, libvlc, m_treeItem.media.get() ); - m_listeners.push_back( std::move( l ) ); + m_listener = std::move( l ); return true; } -void MLNetworkModel::onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ) +void MLNetworkMediaModel::onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ) { - if ( m_treeItem.media != nullptr ) - { - input_item_node_t *res; - input_item_node_t *parent; - 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 ); - } - else - refreshDeviceList( std::move( mediaSource), node->pp_children, node->i_children, true ); + input_item_node_t *res; + input_item_node_t *parent; + 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 ); } -void MLNetworkModel::onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, +void MLNetworkMediaModel::onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, input_item_node_t *const children[], size_t count ) { - if ( m_treeItem.media == nullptr ) - refreshDeviceList( std::move( mediaSource ), children, count, false ); - else if ( parent->p_item == m_treeItem.media.get() ) + if ( parent->p_item == m_treeItem.media.get() ) refreshMediaList( std::move( mediaSource ), children, count, false ); } -void MLNetworkModel::onItemRemoved( MediaSourcePtr, +void MLNetworkMediaModel::onItemRemoved( MediaSourcePtr, input_item_node_t *const children[], size_t count ) { @@ -285,7 +234,7 @@ void MLNetworkModel::onItemRemoved( MediaSourcePtr, { input_item_t* p_item = children[i]->p_item; input_item_Hold( p_item ); - callAsync([this, p_item]() { + QMetaObject::invokeMethod(this, [this, p_item]() { QUrl itemUri = QUrl::fromEncoded(p_item->psz_uri); auto it = std::find_if( begin( m_items ), end( m_items ), [p_item, itemUri](const Item& i) { return QString::compare( qfu(p_item->psz_name), i.name, Qt::CaseInsensitive ) == 0 && @@ -314,7 +263,7 @@ void MLNetworkModel::onItemRemoved( MediaSourcePtr, } } -void MLNetworkModel::refreshMediaList( MediaSourcePtr mediaSource, +void MLNetworkMediaModel::refreshMediaList( MediaSourcePtr mediaSource, input_item_node_t* const children[], size_t count, bool clear ) { @@ -340,10 +289,10 @@ void MLNetworkModel::refreshMediaList( MediaSourcePtr mediaSource, &item.indexed ) != VLC_SUCCESS ) item.indexed = false; } - item.tree = NetworkTreeItem( mediaSource, it, m_treeItem.media.get() ); + item.tree = NetworkTreeItem( mediaSource, it ); items->push_back( std::move( item ) ); } - callAsync([this, clear, items]() { + QMetaObject::invokeMethod(this, [this, clear, items]() { std::unique_ptr<std::vector<Item>> itemsPtr{ items }; if ( clear == true ) { @@ -360,97 +309,8 @@ void MLNetworkModel::refreshMediaList( MediaSourcePtr mediaSource, }); } -void MLNetworkModel::refreshDeviceList( MediaSourcePtr mediaSource, input_item_node_t* const children[], size_t count, bool clear ) -{ - if ( clear == true ) - { - callAsync([this, mediaSource]() { - beginResetModel(); - m_items.erase(std::remove_if(m_items.begin(), m_items.end(), [mediaSource](const Item& value) { - return value.mediaSource == mediaSource; - }), m_items.end()); - endResetModel(); - }); - } - for ( auto i = 0u; i < count; ++i ) - { - Item item; - item.mainMrl = QUrl::fromEncoded( QByteArray{ children[i]->p_item->psz_uri }.append( '/' ) ); - item.name = qfu(children[i]->p_item->psz_name); - item.mrls.push_back( item.mainMrl ); - item.indexed = false; - item.type = static_cast<ItemType>( children[i]->p_item->i_type ); - item.canBeIndexed = canBeIndexed( item.mainMrl , item.type ); - item.protocol = item.mainMrl.scheme(); - item.tree = NetworkTreeItem{ mediaSource, - children[i]->p_item, - nullptr }; - item.mediaSource = mediaSource; - - callAsync([this, item]() mutable { - auto it = std::find_if( begin( m_items ), end( m_items ), [&item](const Item& i) { - return QString::compare(item.name , i.name, Qt::CaseInsensitive ) == 0 && - item.mainMrl.scheme() == i.mainMrl.scheme(); - }); - if ( it != end( m_items ) ) - return; - if ( item.canBeIndexed == true ) - { - if ( vlc_ml_is_indexed( m_ml, qtu( item.mainMrl.toString( QUrl::None ) ), - &item.indexed ) != VLC_SUCCESS ) - item.indexed = false; - } - beginInsertRows( {}, m_items.size(), m_items.size() ); - m_items.push_back( std::move( item ) ); - endInsertRows(); - }); - } -} - -MLNetworkModel::SourceListener::SourceListener(MediaSourcePtr s, MLNetworkModel* m) - : source( s ) - , listener( nullptr, [s]( vlc_media_tree_listener_id* l ) { - vlc_media_tree_RemoveListener( s->tree, l ); - } ) - , model( m ) -{ - static const vlc_media_tree_callbacks cbs { - &SourceListener::onItemCleared, - &SourceListener::onItemAdded, - &SourceListener::onItemRemoved - }; - auto l = vlc_media_tree_AddListener( s->tree, &cbs, this, true ); - if ( l == nullptr ) - return; - listener.reset( l ); -} - -void MLNetworkModel::SourceListener::onItemCleared( vlc_media_tree_t*, input_item_node_t* node, - void* userdata) -{ - auto* self = static_cast<SourceListener*>( userdata ); - self->model->onItemCleared( self->source, node ); -} - -void MLNetworkModel::SourceListener::onItemAdded( vlc_media_tree_t *, input_item_node_t * parent, - input_item_node_t *const children[], size_t count, - void *userdata ) +bool MLNetworkMediaModel::canBeIndexed(const QUrl& url , ItemType itemType ) { - auto* self = static_cast<SourceListener*>( userdata ); - auto source = self->source; - auto model = self->model; - model->onItemAdded( source, parent, children, count ); + return static_cast<input_item_type_e>(itemType) != ITEM_TYPE_FILE && (url.scheme() == "smb" || url.scheme() == "ftp"); } -void MLNetworkModel::SourceListener::onItemRemoved( vlc_media_tree_t *, input_item_node_t *, - input_item_node_t *const children[], size_t count, - void *userdata ) -{ - auto* self = static_cast<SourceListener*>( userdata ); - self->model->onItemRemoved( self->source, children, count ); -} - -bool MLNetworkModel::canBeIndexed(const QUrl& url , ItemType itemType ) -{ - return itemType != ITEM_TYPE_FILE && (url.scheme() == "smb" || url.scheme() == "ftp"); -} diff --git a/modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp b/modules/gui/qt/components/mediacenter/mlnetworkmediamodel.hpp similarity index 62% rename from modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp rename to modules/gui/qt/components/mediacenter/mlnetworkmediamodel.hpp index 6e26605ddefa7b74480cc04f92efd8cef0ab5ddc..e7d84ba326ab43d8afe9b350fff3f1a6773f94a5 100644 --- a/modules/gui/qt/components/mediacenter/mlnetworkmodel.hpp +++ b/modules/gui/qt/components/mediacenter/mlnetworkmediamodel.hpp @@ -4,11 +4,11 @@ * 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. + * (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 + * 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 @@ -16,8 +16,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#ifndef MLNETWORKMODEL_HPP -#define MLNETWORKMODEL_HPP +#ifndef MLNETWORKMEDIAMODEL_HPP +#define MLNETWORKMEDIAMODEL_HPP #ifdef HAVE_CONFIG_H #include "config.h" @@ -31,6 +31,7 @@ #include <vlc_cxx_helpers.hpp> #include <components/qml_main_context.hpp> +#include "mlnetworksourcelistener.hpp" #include <memory> @@ -45,24 +46,28 @@ class NetworkTreeItem { Q_GADGET public: - NetworkTreeItem() : source(nullptr), media(nullptr), parent(nullptr) {} - NetworkTreeItem( MediaSourcePtr s, input_item_t* m, input_item_t* p ) + NetworkTreeItem() : source(nullptr), media(nullptr) {} + NetworkTreeItem( MediaSourcePtr s, input_item_t* m ) : source( std::move( s ) ) , media( m ) - , parent( p ) { } + NetworkTreeItem( const NetworkTreeItem& ) = default; NetworkTreeItem& operator=( const NetworkTreeItem& ) = default; NetworkTreeItem( NetworkTreeItem&& ) = default; NetworkTreeItem& operator=( NetworkTreeItem&& ) = default; + operator bool() const + { + return source.get() != nullptr; + } + MediaSourcePtr source; InputItemPtr media; - InputItemPtr parent; }; -class MLNetworkModel : public QAbstractListModel +class MLNetworkMediaModel : public QAbstractListModel, public MLNetworkSourceListener::SourceListenerCb { Q_OBJECT @@ -78,12 +83,10 @@ public: TYPE_PLAYLIST, TYPE_NODE, }; - Q_ENUM( ItemType ); + Q_ENUM( ItemType ) Q_PROPERTY(QmlMainContext* ctx READ getCtx WRITE setCtx NOTIFY ctxChanged) Q_PROPERTY(QVariant tree READ getTree WRITE setTree NOTIFY treeChanged) - Q_PROPERTY(bool is_on_provider_list READ getIsOnProviderList WRITE setIsOnProviderList NOTIFY isOnProviderListChanged) - Q_PROPERTY(QString sd_source READ getSdSource WRITE setSdSource NOTIFY sdSourceChanged) Q_PROPERTY(QString name READ getName NOTIFY nameChanged) Q_PROPERTY(QUrl url READ getUrl NOTIFY urlChanged) @@ -91,8 +94,9 @@ public: Q_PROPERTY(bool indexed READ isIndexed WRITE setIndexed NOTIFY isIndexedChanged) Q_PROPERTY(bool canBeIndexed READ canBeIndexed NOTIFY canBeIndexedChanged) - explicit MLNetworkModel(QObject* parent = nullptr); - MLNetworkModel( QmlMainContext* ctx, QString parentMrl, QObject* parent = nullptr ); + + explicit MLNetworkMediaModel(QObject* parent = nullptr); + MLNetworkMediaModel( QmlMainContext* ctx, QString parentMrl, QObject* parent = nullptr ); QVariant data(const QModelIndex& index, int role) const override; QHash<int, QByteArray> roleNames() const override; @@ -101,12 +105,12 @@ public: Qt::ItemFlags flags( const QModelIndex& idx ) const override; bool setData( const QModelIndex& idx,const QVariant& value, int role ) override; - void setIndexed(bool indexed); void setCtx(QmlMainContext* ctx); void setTree(QVariant tree); - void setIsOnProviderList(bool b); - void setSdSource(QString s); + + inline QmlMainContext* getCtx() const { return m_ctx; } + inline QVariant getTree() const { return QVariant::fromValue( m_treeItem); } inline QString getName() const { return m_name; } inline QUrl getUrl() const { return m_url; } @@ -114,11 +118,6 @@ public: inline bool isIndexed() const { return m_indexed; } inline bool canBeIndexed() const { return m_canBeIndexed; } - inline QmlMainContext* getCtx() const { return m_ctx; } - inline QVariant getTree() const { return QVariant::fromValue( m_treeItem); } - inline bool getIsOnProviderList() const { return m_isOnProviderList; } - inline QString getSdSource() const { return m_sdSource; } - signals: void nameChanged(); void urlChanged(); @@ -145,57 +144,17 @@ private: MediaSourcePtr mediaSource; }; - ///call function @a fun on object thread - template <typename Fun> - void callAsync(Fun&& fun) - { -#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - QMetaObject::invokeMethod(this, std::forward<Fun>(fun), Qt::QueuedConnection, nullptr); -#else - QObject src; - QObject::connect(&src, &QObject::destroyed, q, std::forward<Fun>(fun), Qt::QueuedConnection); -#endif - } bool initializeMediaSources(); - void onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ); - void onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, input_item_node_t *const children[], size_t count ); - void onItemRemoved( MediaSourcePtr mediaSource, input_item_node_t *const children[], size_t count ); + void onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ) override; + void onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, input_item_node_t *const children[], size_t count ) override; + void onItemRemoved( MediaSourcePtr mediaSource, input_item_node_t *const children[], size_t count ) override; void refreshMediaList(MediaSourcePtr s, input_item_node_t* const children[], size_t count , bool clear); - void refreshDeviceList(MediaSourcePtr mediaSource, input_item_node_t* const children[], size_t count , bool clear); static bool canBeIndexed(const QUrl& url , ItemType itemType ); private: - struct SourceListener - { - using ListenerPtr = std::unique_ptr<vlc_media_tree_listener_id, - std::function<void(vlc_media_tree_listener_id*)>>; - - SourceListener( MediaSourcePtr s, MLNetworkModel* m ); - SourceListener() : source( nullptr ), listener( nullptr ), model( nullptr ){} - - SourceListener( SourceListener&& ) = default; - SourceListener& operator=( SourceListener&& ) = default; - - SourceListener( const SourceListener& ) = delete; - SourceListener& operator=( const SourceListener& ) = delete; - - static void onItemCleared( vlc_media_tree_t* tree, input_item_node_t* node, - void* userdata ); - static void onItemAdded( vlc_media_tree_t *tree, input_item_node_t *node, - input_item_node_t *const children[], size_t count, - void *userdata ); - static void onItemRemoved( vlc_media_tree_t *tree, input_item_node_t *node, - input_item_node_t *const children[], size_t count, - void *userdata ); - - MediaSourcePtr source; - ListenerPtr listener; - MLNetworkModel *model; - }; - //properties of the current node QString m_name; QUrl m_url; @@ -203,14 +162,13 @@ private: bool m_indexed = false; bool m_canBeIndexed = false; + std::vector<Item> m_items; QmlMainContext* m_ctx = nullptr; vlc_medialibrary_t* m_ml; bool m_hasTree = false; NetworkTreeItem m_treeItem; - bool m_isOnProviderList; - QString m_sdSource; - std::vector<std::unique_ptr<SourceListener>> m_listeners; + std::unique_ptr<MLNetworkSourceListener> m_listener; }; -#endif // MLNETWORKMODEL_HPP +#endif // MLNETWORKMEDIAMODEL_HPP diff --git a/modules/gui/qt/components/mediacenter/mlnetworksourcelistener.cpp b/modules/gui/qt/components/mediacenter/mlnetworksourcelistener.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c7fcbb618d1271075f806a257b63dfad9317236d --- /dev/null +++ b/modules/gui/qt/components/mediacenter/mlnetworksourcelistener.cpp @@ -0,0 +1,51 @@ +#include "mlnetworksourcelistener.hpp" + +MLNetworkSourceListener::SourceListenerCb::~SourceListenerCb() +{ +} + +MLNetworkSourceListener::MLNetworkSourceListener(MediaSourcePtr s, SourceListenerCb* m) + : source( s ) + , listener( nullptr, [s]( vlc_media_tree_listener_id* l ) { + vlc_media_tree_RemoveListener( s->tree, l ); + } ) + , cb( m ) +{ + static const vlc_media_tree_callbacks cbs { + &MLNetworkSourceListener::onItemCleared, + &MLNetworkSourceListener::onItemAdded, + &MLNetworkSourceListener::onItemRemoved + }; + auto l = vlc_media_tree_AddListener( s->tree, &cbs, this, true ); + if ( l == nullptr ) + return; + listener.reset( l ); +} + +MLNetworkSourceListener::MLNetworkSourceListener() +{ +} + +void MLNetworkSourceListener::onItemCleared( vlc_media_tree_t*, input_item_node_t* node, + void* userdata) +{ + auto* self = static_cast<MLNetworkSourceListener*>( userdata ); + self->cb->onItemCleared( self->source, node ); +} + +void MLNetworkSourceListener::onItemAdded( vlc_media_tree_t *, input_item_node_t * parent, + input_item_node_t *const children[], size_t count, + void *userdata ) +{ + auto* self = static_cast<MLNetworkSourceListener*>( userdata ); + auto source = self->source; + self->cb->onItemAdded( self->source, parent, children, count ); +} + +void MLNetworkSourceListener::onItemRemoved( vlc_media_tree_t *, input_item_node_t *, + input_item_node_t *const children[], size_t count, + void *userdata ) +{ + auto* self = static_cast<MLNetworkSourceListener*>( userdata ); + self->cb->onItemRemoved( self->source, children, count ); +} diff --git a/modules/gui/qt/components/mediacenter/mlnetworksourcelistener.hpp b/modules/gui/qt/components/mediacenter/mlnetworksourcelistener.hpp new file mode 100644 index 0000000000000000000000000000000000000000..210b91d76ac1e55361ddb6c6dcafb2c47843b4a7 --- /dev/null +++ b/modules/gui/qt/components/mediacenter/mlnetworksourcelistener.hpp @@ -0,0 +1,78 @@ +/***************************************************************************** + * 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 MLNETWORKSOURCELISTENER_HPP +#define MLNETWORKSOURCELISTENER_HPP + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <vlc_media_library.h> +#include <vlc_media_source.h> +#include <vlc_threads.h> +#include <vlc_cxx_helpers.hpp> + +#include <components/qml_main_context.hpp> + +#include <memory> +#include <functional> + +class MLNetworkSourceListener +{ +public: + using MediaSourcePtr = vlc_shared_data_ptr_type(vlc_media_source_t, + vlc_media_source_Hold, vlc_media_source_Release); + + using ListenerPtr = std::unique_ptr<vlc_media_tree_listener_id, + std::function<void(vlc_media_tree_listener_id*)>>; + + class SourceListenerCb + { + public: + virtual ~SourceListenerCb(); + + virtual void onItemCleared( MediaSourcePtr mediaSource, input_item_node_t* node ) = 0; + virtual void onItemAdded( MediaSourcePtr mediaSource, input_item_node_t* parent, input_item_node_t *const children[], size_t count ) = 0; + virtual void onItemRemoved( MediaSourcePtr mediaSource, input_item_node_t *const children[], size_t count ) = 0; + }; + +public: + MLNetworkSourceListener( MediaSourcePtr s, SourceListenerCb* m ); + MLNetworkSourceListener(); + + MLNetworkSourceListener( MLNetworkSourceListener&& ) = default; + MLNetworkSourceListener& operator=( MLNetworkSourceListener&& ) = default; + + MLNetworkSourceListener( const MLNetworkSourceListener& ) = delete; + MLNetworkSourceListener& operator=( const MLNetworkSourceListener& ) = delete; + + static void onItemCleared( vlc_media_tree_t* tree, input_item_node_t* node, + void* userdata ); + static void onItemAdded( vlc_media_tree_t *tree, input_item_node_t *node, + input_item_node_t *const children[], size_t count, + void *userdata ); + static void onItemRemoved( vlc_media_tree_t *tree, input_item_node_t *node, + input_item_node_t *const children[], size_t count, + void *userdata ); + + MediaSourcePtr source; + ListenerPtr listener = nullptr; + SourceListenerCb *cb = nullptr; +}; +#endif // MLNETWORKSOURCELISTENER_HPP diff --git a/modules/gui/qt/main_interface.cpp b/modules/gui/qt/main_interface.cpp index 8f87d26c85ce9d710dbea966676703436009634b..0c16f7a18d14191ae30080f229037c50a0dfb636 100644 --- a/modules/gui/qt/main_interface.cpp +++ b/modules/gui/qt/main_interface.cpp @@ -51,7 +51,8 @@ #include "components/mediacenter/mlgenremodel.hpp" #include "components/mediacenter/mlvideomodel.hpp" #include "components/mediacenter/mlrecentsvideomodel.hpp" -#include "components/mediacenter/mlnetworkmodel.hpp" +#include "components/mediacenter/mlnetworkmediamodel.hpp" +#include "components/mediacenter/mlnetworkdevicemodel.hpp" #include "components/recent_media_model.hpp" #include "components/settings.hpp" @@ -346,7 +347,8 @@ void MainInterface::createMainWidget( QSettings * ) qmlRegisterType<MLVideoModel>( "org.videolan.medialib", 0, 1, "MLVideoModel" ); qmlRegisterType<MLRecentsVideoModel>( "org.videolan.medialib", 0, 1, "MLRecentsVideoModel" ); qRegisterMetaType<NetworkTreeItem>(); - qmlRegisterType<MLNetworkModel>( "org.videolan.medialib", 0, 1, "MLNetworkModel"); + qmlRegisterType<MLNetworkMediaModel>( "org.videolan.medialib", 0, 1, "MLNetworkMediaModel"); + qmlRegisterType<MLNetworkDeviceModel>( "org.videolan.medialib", 0, 1, "MLNetworkDeviceModel"); //expose base object, they aren't instanciable from QML side qmlRegisterType<MLAlbum>(); diff --git a/modules/gui/qt/qml/mediacenter/MCNetworkBrowseDisplay.qml b/modules/gui/qt/qml/mediacenter/MCNetworkBrowseDisplay.qml index 7ae6ac40254f85e9ac47a925fac09b837a71a49a..c8881c86e7eed51881c0ec22f3e7271858ddc60f 100644 --- a/modules/gui/qt/qml/mediacenter/MCNetworkBrowseDisplay.qml +++ b/modules/gui/qt/qml/mediacenter/MCNetworkBrowseDisplay.qml @@ -39,7 +39,7 @@ Utils.NavigableFocusScope { } } - MLNetworkModel { + MLNetworkMediaModel { id: providerModel ctx: mainctx tree: undefined @@ -148,15 +148,15 @@ Utils.NavigableFocusScope { image: { switch (model.type){ - case MLNetworkModel.TYPE_DISC: + case MLNetworkMediaModel.TYPE_DISC: return "qrc:///type/disc.svg" - case MLNetworkModel.TYPE_CARD: + case MLNetworkMediaModel.TYPE_CARD: return "qrc:///type/capture-card.svg" - case MLNetworkModel.TYPE_STREAM: + case MLNetworkMediaModel.TYPE_STREAM: return "qrc:///type/stream.svg" - case MLNetworkModel.TYPE_PLAYLIST: + case MLNetworkMediaModel.TYPE_PLAYLIST: return "qrc:///type/playlist.svg" - case MLNetworkModel.TYPE_FILE: + case MLNetworkMediaModel.TYPE_FILE: return "qrc:///type/file_black.svg" default: return "qrc:///type/directory_black.svg" @@ -173,7 +173,7 @@ Utils.NavigableFocusScope { } onItemDoubleClicked: { - if (model.type === MLNetworkModel.TYPE_NODE || model.type === MLNetworkModel.TYPE_DIRECTORY) + if (model.type === MLNetworkMediaModel.TYPE_NODE || model.type === MLNetworkMediaModel.TYPE_DIRECTORY) history.push( ["mc", "network", { tree: model.tree } ], History.Go) else medialib.addAndPlay( model.mrl ) diff --git a/modules/gui/qt/qml/mediacenter/MCNetworkHomeDisplay.qml b/modules/gui/qt/qml/mediacenter/MCNetworkHomeDisplay.qml index 4aa07c770346ece977dcc3bca774d0ea99ed7283..8ce438b23f8a7b838b9fbf259cdde531b83d9cdf 100644 --- a/modules/gui/qt/qml/mediacenter/MCNetworkHomeDisplay.qml +++ b/modules/gui/qt/qml/mediacenter/MCNetworkHomeDisplay.qml @@ -39,21 +39,19 @@ Utils.NavigableFocusScope { MCNetworksSectionSelectableDM{ id: machineDM - model: MLNetworkModel { + model: MLNetworkDeviceModel { id: machineModel ctx: mainctx - tree: undefined - sd_source: "SD_CAT_DEVICES" + sd_source: MLNetworkDeviceModel.CAT_DEVICES } } MCNetworksSectionSelectableDM{ id: lanDM - model: MLNetworkModel { + model: MLNetworkDeviceModel { id: lanModel ctx: mainctx - tree: undefined - sd_source: "SD_CAT_LAN" + sd_source: MLNetworkDeviceModel.CAT_LAN } } diff --git a/modules/gui/qt/qml/mediacenter/MCNetworksSectionSelectableDM.qml b/modules/gui/qt/qml/mediacenter/MCNetworksSectionSelectableDM.qml index ece2cb227b7f76e08daa1f84504859267c78c908..72eca9739176dddc7a13d9a2866fa0b50cff53a4 100644 --- a/modules/gui/qt/qml/mediacenter/MCNetworksSectionSelectableDM.qml +++ b/modules/gui/qt/qml/mediacenter/MCNetworksSectionSelectableDM.qml @@ -45,7 +45,7 @@ Utils.SelectableDelegateModel { } onItemDoubleClicked: { - if (model.type === MLNetworkModel.TYPE_NODE || model.type === MLNetworkModel.TYPE_DIRECTORY) + if (model.type === MLNetworkMediaModel.TYPE_NODE || model.type === MLNetworkMediaModel.TYPE_DIRECTORY) history.push( ["mc", "network", { tree: model.tree } ], History.Go) else medialib.addAndPlay( model.mrl ) @@ -70,7 +70,7 @@ Utils.SelectableDelegateModel { } onItemDoubleClicked: { - if (model.type === MLNetworkModel.TYPE_NODE || model.type === MLNetworkModel.TYPE_DIRECTORY) + if (model.type === MLNetworkMediaModel.TYPE_NODE || model.type === MLNetworkMediaModel.TYPE_DIRECTORY) history.push( ["mc", "network", { tree: model.tree } ], History.Go) else medialib.addAndPlay( model.mrl ) @@ -120,8 +120,9 @@ Utils.SelectableDelegateModel { if ( delegateModel.selectedGroup.count > 1 ) { playSelection() } else { - if (delegateModel.items.get(index).model.type === MLNetworkModel.TYPE_DIRECTORY - || delegateModel.items.get(index).model.type === MLNetworkModel.TYPE_NODE) { + if (delegateModel.items.get(index).model.type === MLNetworkMediaModel.TYPE_DIRECTORY + || delegateModel.items.get(index).model.type === MLNetworkMediaModel.TYPE_NODE) { + console.log("push network tree", delegateModel.items.get(index).model.tree) history.push(["mc", "network", { tree: delegateModel.items.get(index).model.tree }], History.Go); } else { playSelection() diff --git a/modules/gui/qt/qml/mediacenter/NetworkGridItem.qml b/modules/gui/qt/qml/mediacenter/NetworkGridItem.qml index a185406d5ace3b6037d1167f14fb433900b90126..55b1164ded6eafaff659b9589a83b090ebd16bdc 100644 --- a/modules/gui/qt/qml/mediacenter/NetworkGridItem.qml +++ b/modules/gui/qt/qml/mediacenter/NetworkGridItem.qml @@ -32,15 +32,15 @@ Utils.GridItem { pictureHeight: VLCStyle.network_normal image: { switch (model.type){ - case MLNetworkModel.TYPE_DISC: + case MLNetworkMediaModel.TYPE_DISC: return "qrc:///type/disc.svg" - case MLNetworkModel.TYPE_CARD: + case MLNetworkMediaModel.TYPE_CARD: return "qrc:///type/capture-card.svg" - case MLNetworkModel.TYPE_STREAM: + case MLNetworkMediaModel.TYPE_STREAM: return "qrc:///type/stream.svg" - case MLNetworkModel.TYPE_PLAYLIST: + case MLNetworkMediaModel.TYPE_PLAYLIST: return "qrc:///type/playlist.svg" - case MLNetworkModel.TYPE_FILE: + case MLNetworkMediaModel.TYPE_FILE: return "qrc:///type/file_black.svg" default: return "qrc:///type/directory_black.svg" diff --git a/modules/gui/qt/qml/mediacenter/NetworkListItem.qml b/modules/gui/qt/qml/mediacenter/NetworkListItem.qml index f0ecc2c418eb12778f437b850dc2648608823fb3..bba033249119355c9fee73f9727fb37ea240c4b7 100644 --- a/modules/gui/qt/qml/mediacenter/NetworkListItem.qml +++ b/modules/gui/qt/qml/mediacenter/NetworkListItem.qml @@ -40,15 +40,15 @@ Utils.ListItem { fillMode: Image.PreserveAspectFit source: { switch (model.type) { - case MLNetworkModel.TYPE_DISC: + case MLNetworkMediaModel.TYPE_DISC: return "qrc:///type/disc.svg" - case MLNetworkModel.TYPE_CARD: + case MLNetworkMediaModel.TYPE_CARD: return "qrc:///type/capture-card.svg" - case MLNetworkModel.TYPE_STREAM: + case MLNetworkMediaModel.TYPE_STREAM: return "qrc:///type/stream.svg" - case MLNetworkModel.TYPE_PLAYLIST: + case MLNetworkMediaModel.TYPE_PLAYLIST: return "qrc:///type/playlist.svg" - case MLNetworkModel.TYPE_FILE: + case MLNetworkMediaModel.TYPE_FILE: return "qrc:///type/file_black.svg" default: return "qrc:///type/directory_black.svg" @@ -57,7 +57,7 @@ Utils.ListItem { } line1: model.name || qsTr("Unknown share") line2: model.mrl - imageText: (model.type !== MLNetworkModel.TYPE_DIRECTORY && model.type !== MLNetworkModel.TYPE_NODE) ? model.protocol : "" + imageText: (model.type !== MLNetworkMediaModel.TYPE_DIRECTORY && model.type !== MLNetworkMediaModel.TYPE_NODE) ? model.protocol : "" showContextButton: true