vlc | branch: master | Abel Tesfaye <[email protected]> | Tue Jul 30 15:49:53 2019 +0300| [1f31213fe343e66eb6035c7211eabfb790676918] | committer: Jean-Baptiste Kempf
qt: create MLRecentsVideoModel > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1f31213fe343e66eb6035c7211eabfb790676918 --- modules/gui/qt/Makefile.am | 3 + .../gui/qt/components/mediacenter/mlbasemodel.hpp | 2 +- .../components/mediacenter/mlrecentsvideomodel.cpp | 147 +++++++++++++++++++++ .../components/mediacenter/mlrecentsvideomodel.hpp | 62 +++++++++ modules/gui/qt/main_interface.cpp | 2 + 5 files changed, 215 insertions(+), 1 deletion(-) diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am index 36ccbb6ae2..c57914da16 100644 --- a/modules/gui/qt/Makefile.am +++ b/modules/gui/qt/Makefile.am @@ -158,6 +158,8 @@ libqt_plugin_la_SOURCES = \ gui/qt/components/mediacenter/mlvideo.cpp \ gui/qt/components/mediacenter/mlvideomodel.cpp \ gui/qt/components/mediacenter/mlvideomodel.hpp \ + gui/qt/components/mediacenter/mlrecentsvideomodel.cpp \ + gui/qt/components/mediacenter/mlrecentsvideomodel.hpp \ gui/qt/components/playlist/media.hpp \ gui/qt/components/playlist/playlist_common.cpp \ gui/qt/components/playlist/playlist_common.hpp \ @@ -289,6 +291,7 @@ nodist_libqt_plugin_la_SOURCES = \ gui/qt/components/mediacenter/mlnetworkmodel.moc.cpp \ gui/qt/components/mediacenter/mlvideo.moc.cpp \ gui/qt/components/mediacenter/mlvideomodel.moc.cpp \ + gui/qt/components/mediacenter/mlrecentsvideomodel.moc.cpp \ gui/qt/components/playlist/playlist_common.moc.cpp \ gui/qt/components/playlist/playlist_item.moc.cpp \ gui/qt/components/playlist/playlist_model.moc.cpp \ diff --git a/modules/gui/qt/components/mediacenter/mlbasemodel.hpp b/modules/gui/qt/components/mediacenter/mlbasemodel.hpp index cb8af2ca90..8bb273075a 100644 --- a/modules/gui/qt/components/mediacenter/mlbasemodel.hpp +++ b/modules/gui/qt/components/mediacenter/mlbasemodel.hpp @@ -140,9 +140,9 @@ public: vlc_mutex_locker lock( &m_item_lock ); if ( m_initialized == false ) { + m_item_list = const_cast<MLSlidingWindowModel<T>*>(this)->fetch(); m_total_count = countTotalElements(); m_initialized = true; - m_item_list = const_cast<MLSlidingWindowModel<T>*>(this)->fetch(); } return m_total_count; } diff --git a/modules/gui/qt/components/mediacenter/mlrecentsvideomodel.cpp b/modules/gui/qt/components/mediacenter/mlrecentsvideomodel.cpp new file mode 100644 index 0000000000..a1dc8ede7d --- /dev/null +++ b/modules/gui/qt/components/mediacenter/mlrecentsvideomodel.cpp @@ -0,0 +1,147 @@ +/***************************************************************************** + * 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 "mlrecentsvideomodel.hpp" + +namespace { + +enum Role { + VIDEO_ID = Qt::UserRole + 1, + VIDEO_TITLE, + VIDEO_THUMBNAIL, + VIDEO_DURATION, + VIDEO_PROGRESS, + VIDEO_PLAYCOUNT, + VIDEO_RESOLUTION, + VIDEO_CHANNEL, + VIDEO_POSITION, + VIDEO_MRL, + VIDEO_VIDEO_TRACK, + VIDEO_AUDIO_TRACK, +}; + +} + +MLRecentsVideoModel::MLRecentsVideoModel( QObject* parent ) + : MLSlidingWindowModel<MLVideo>( parent ) +{ +} + +QVariant MLRecentsVideoModel::data( const QModelIndex& index , int role ) const +{ + const auto video = item( static_cast<unsigned int>( index.row() ) ); + if ( video == nullptr ) + return {}; + switch ( role ) + { + case VIDEO_ID: + return QVariant::fromValue( video->getId() ); + case VIDEO_TITLE: + return QVariant::fromValue( video->getTitle() ); + case VIDEO_THUMBNAIL: + return QVariant::fromValue( video->getThumbnail() ); + case VIDEO_DURATION: + return QVariant::fromValue( video->getDuration() ); + case VIDEO_PROGRESS: + return QVariant::fromValue( video->getProgress() ); + case VIDEO_PLAYCOUNT: + return QVariant::fromValue( video->getPlayCount() ); + case VIDEO_RESOLUTION: + return QVariant::fromValue( video->getResolutionName() ); + case VIDEO_CHANNEL: + return QVariant::fromValue( video->getChannel() ); + case VIDEO_POSITION: + return QVariant::fromValue( video->getSavedPosition() ); + case VIDEO_MRL: + return QVariant::fromValue( video->getMRL() ); + case VIDEO_VIDEO_TRACK: + return QVariant::fromValue( video->getVideoDesc() ); + case VIDEO_AUDIO_TRACK: + return QVariant::fromValue( video->getAudioDesc() ); + default: + return {}; + } +} + +QHash<int, QByteArray> MLRecentsVideoModel::roleNames() const +{ + return { + { VIDEO_ID, "id" }, + { VIDEO_TITLE, "title" }, + { VIDEO_THUMBNAIL, "thumbnail" }, + { VIDEO_DURATION, "duration" }, + { VIDEO_PROGRESS, "progress" }, + { VIDEO_PLAYCOUNT, "playcount" }, + { VIDEO_RESOLUTION, "resolution_name" }, + { VIDEO_CHANNEL, "channel" }, + { VIDEO_POSITION, "saved_position" }, + { VIDEO_MRL, "mrl" }, + { VIDEO_AUDIO_TRACK, "audioDesc" }, + { VIDEO_VIDEO_TRACK, "videoDesc" }, + }; +} + +std::vector<std::unique_ptr<MLVideo> > MLRecentsVideoModel::fetch() +{ + ml_unique_ptr<vlc_ml_media_list_t> media_list{ vlc_ml_list_history( + m_ml, &m_query_param ) }; + if ( media_list == nullptr ) + return {}; + std::vector<std::unique_ptr<MLVideo>> res; + m_video_count = 0; + for( vlc_ml_media_t &media: ml_range_iterate<vlc_ml_media_t>( media_list ) ) + if( media.i_type == VLC_ML_MEDIA_TYPE_VIDEO ) + { + m_video_count++; + res.emplace_back( std::unique_ptr<MLVideo>{ new MLVideo( m_ml, &media ) } ); + } + return res; +} + +size_t MLRecentsVideoModel::countTotalElements() const +{ + + if(numberOfItemsToShow == -1){ + return m_video_count; + } + return std::min(m_video_count,numberOfItemsToShow); +} + +void MLRecentsVideoModel::onVlcMlEvent( const vlc_ml_event_t* event ) +{ + switch ( event->i_type ) + { + case VLC_ML_EVENT_MEDIA_ADDED: + case VLC_ML_EVENT_MEDIA_UPDATED: + if ( event->modification.p_media->i_type == VLC_ML_MEDIA_TYPE_VIDEO ) + m_need_reset = true; + break; + case VLC_ML_EVENT_MEDIA_DELETED: + m_need_reset = true; + break; + default: + break; + } + MLBaseModel::onVlcMlEvent( event ); +} +void MLRecentsVideoModel::setNumberOfItemsToShow( int n ){ + numberOfItemsToShow = n; +} +int MLRecentsVideoModel::getNumberOfItemsToShow(){ + return numberOfItemsToShow; +} diff --git a/modules/gui/qt/components/mediacenter/mlrecentsvideomodel.hpp b/modules/gui/qt/components/mediacenter/mlrecentsvideomodel.hpp new file mode 100644 index 0000000000..055eecf174 --- /dev/null +++ b/modules/gui/qt/components/mediacenter/mlrecentsvideomodel.hpp @@ -0,0 +1,62 @@ +/***************************************************************************** + * 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 MCRECENTSMODEL_H +#define MCRECENTSMODEL_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <vlc_common.h> +#include <vlc_media_library.h> + +#include "mlbasemodel.hpp" +#include "mlvideo.hpp" + +#include <QObject> + +class MLRecentsVideoModel : public MLSlidingWindowModel<MLVideo> +{ + Q_OBJECT + Q_PROPERTY(int numberOfItemsToShow READ getNumberOfItemsToShow WRITE setNumberOfItemsToShow) + +public: + explicit MLRecentsVideoModel( QObject* parent = nullptr ); + virtual ~MLRecentsVideoModel() = default; + + QVariant data( const QModelIndex& index , int role ) const override; + QHash<int, QByteArray> roleNames() const override; + int numberOfItemsToShow = 10; + +private: + std::vector<std::unique_ptr<MLVideo>> fetch() override; + size_t countTotalElements() const override; + vlc_ml_sorting_criteria_t roleToCriteria( int /* role */ ) const override{ + return VLC_ML_SORTING_DEFAULT; + } + vlc_ml_sorting_criteria_t nameToCriteria( QByteArray /* name */ ) const override{ + return VLC_ML_SORTING_DEFAULT; + } + virtual void onVlcMlEvent( const vlc_ml_event_t* event ) override; + void setNumberOfItemsToShow(int); + int getNumberOfItemsToShow(); + int m_video_count; +}; + +#endif // MCRECENTSMODEL_H diff --git a/modules/gui/qt/main_interface.cpp b/modules/gui/qt/main_interface.cpp index 4d83b3fda1..eb28983885 100644 --- a/modules/gui/qt/main_interface.cpp +++ b/modules/gui/qt/main_interface.cpp @@ -50,6 +50,7 @@ #include "components/mediacenter/mlalbumtrackmodel.hpp" #include "components/mediacenter/mlgenremodel.hpp" #include "components/mediacenter/mlvideomodel.hpp" +#include "components/mediacenter/mlrecentsvideomodel.hpp" #include "components/mediacenter/mlnetworkmodel.hpp" #include "components/recent_media_model.hpp" #include "components/settings.hpp" @@ -341,6 +342,7 @@ void MainInterface::createMainWidget( QSettings * ) qmlRegisterType<MLAlbumTrackModel>( "org.videolan.medialib", 0, 1, "MLAlbumTrackModel" ); qmlRegisterType<MLGenreModel>( "org.videolan.medialib", 0, 1, "MLGenreModel" ); 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"); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
