[vlc-commits] qt/menus: Add playlist support
Benjamin Arnaud
git at videolan.org
Tue Feb 23 08:54:15 UTC 2021
vlc | branch: master | Benjamin Arnaud <benjamin.arnaud at videolabs.io> | Fri Feb 19 11:25:33 2021 +0100| [ad4e4271d7f48aad61c83f76b218c664050a58f6] | committer: Pierre Lamot
qt/menus: Add playlist support
Signed-off-by: Pierre Lamot <pierre at videolabs.io>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ad4e4271d7f48aad61c83f76b218c664050a58f6
---
modules/gui/qt/maininterface/mainui.cpp | 1 +
modules/gui/qt/menus/qml_menu_wrapper.cpp | 141 ++++++++++++++++++++++++++++++
modules/gui/qt/menus/qml_menu_wrapper.hpp | 30 +++++++
3 files changed, 172 insertions(+)
diff --git a/modules/gui/qt/maininterface/mainui.cpp b/modules/gui/qt/maininterface/mainui.cpp
index 6d31022a19..61bfc50e2e 100644
--- a/modules/gui/qt/maininterface/mainui.cpp
+++ b/modules/gui/qt/maininterface/mainui.cpp
@@ -196,6 +196,7 @@ void MainUI::registerQMLTypes()
qmlRegisterType<AlbumTrackContextMenu>( "org.videolan.medialib", 0, 1, "AlbumTrackContextMenu" );
qmlRegisterType<URLContextMenu>( "org.videolan.medialib", 0, 1, "URLContextMenu" );
qmlRegisterType<VideoContextMenu>( "org.videolan.medialib", 0, 1, "VideoContextMenu" );
+ qmlRegisterType<PlaylistListContextMenu>( "org.videolan.medialib", 0, 1, "PlaylistListContextMenu" );
qmlRegisterType<PlaylistMediaContextMenu>( "org.videolan.medialib", 0, 1, "PlaylistMediaContextMenu" );
}
diff --git a/modules/gui/qt/menus/qml_menu_wrapper.cpp b/modules/gui/qt/menus/qml_menu_wrapper.cpp
index 259b10c877..03eba1477d 100644
--- a/modules/gui/qt/menus/qml_menu_wrapper.cpp
+++ b/modules/gui/qt/menus/qml_menu_wrapper.cpp
@@ -20,6 +20,8 @@
#include "util/qml_main_context.hpp"
#include "medialibrary/medialib.hpp"
#include "medialibrary/mlvideomodel.hpp"
+#include "medialibrary/mlplaylistlistmodel.hpp"
+#include "medialibrary/mlplaylistmodel.hpp"
#include "medialibrary/mlalbummodel.hpp"
#include "medialibrary/mlartistmodel.hpp"
#include "medialibrary/mlgenremodel.hpp"
@@ -259,6 +261,11 @@ void BaseMedialibMenu::medialibAudioContextMenu(MediaLib* ml, const QVariantList
ml->addToPlaylist(mlId);
});
+ action = m_menu->addAction( qtr("Add to playlist") );
+ connect(action, &QAction::triggered, [mlId]( ) {
+ DialogsProvider::getInstance()->playlistsDialog(mlId);
+ });
+
if (options.contains("information") && options["information"].type() == QVariant::Int) {
action = m_menu->addAction( qtr("Information") );
@@ -359,6 +366,11 @@ void VideoContextMenu::popup(const QModelIndexList& selected, QPoint pos, QVaria
ml->addToPlaylist(itemIdList);
});
+ action = m_menu->addAction( qtr("Add to playlist") );
+ connect(action, &QAction::triggered, [itemIdList]( ) {
+ DialogsProvider::getInstance()->playlistsDialog(itemIdList);
+ });
+
action = m_menu->addAction( qtr("Play as audio") );
connect(action, &QAction::triggered, [ml, itemIdList]( ) {
QStringList options({":no-video"});
@@ -380,6 +392,135 @@ void VideoContextMenu::popup(const QModelIndexList& selected, QPoint pos, QVaria
m_menu->popup(pos);
}
+//=================================================================================================
+// PlaylistListContextMenu
+//=================================================================================================
+
+PlaylistListContextMenu::PlaylistListContextMenu(QObject * parent)
+ : QObject(parent)
+{}
+
+PlaylistListContextMenu::~PlaylistListContextMenu() /* override */
+{
+ if (m_menu)
+ delete m_menu;
+}
+
+void PlaylistListContextMenu::popup(const QModelIndexList & selected, QPoint pos, QVariantMap)
+{
+ if (!m_model)
+ return;
+
+ if (m_menu)
+ delete m_menu;
+
+ QVariantList ids;
+
+ for (const QModelIndex & modelIndex : selected)
+ ids.push_back(m_model->data(modelIndex, MLPlaylistListModel::PLAYLIST_ID));
+
+ m_menu = new QMenu();
+
+ MediaLib * ml = m_model->ml();
+
+ QAction * action = m_menu->addAction(qtr("Add and play"));
+
+ connect(action, &QAction::triggered, [ml, ids]() {
+ ml->addAndPlay(ids);
+ });
+
+ action = m_menu->addAction(qtr("Enqueue"));
+
+ connect(action, &QAction::triggered, [ml, ids]() {
+ ml->addToPlaylist(ids);
+ });
+
+ action = m_menu->addAction(qtr("Delete"));
+
+ connect(action, &QAction::triggered, [this, ids]() {
+ m_model->deletePlaylists(ids);
+ });
+
+ m_menu->popup(pos);
+}
+
+//=================================================================================================
+// PlaylistMediaContextMenu
+//=================================================================================================
+
+PlaylistMediaContextMenu::PlaylistMediaContextMenu(QObject * parent) : QObject(parent) {}
+
+PlaylistMediaContextMenu::~PlaylistMediaContextMenu() /* override */
+{
+ if (m_menu)
+ delete m_menu;
+}
+
+void PlaylistMediaContextMenu::popup(const QModelIndexList & selected, QPoint pos,
+ QVariantMap options)
+{
+ if (!m_model)
+ return;
+
+ if (m_menu)
+ delete m_menu;
+
+ QVariantList ids;
+
+ for (const QModelIndex& modelIndex : selected)
+ ids.push_back(m_model->data(modelIndex, MLPlaylistModel::MEDIA_ID));
+
+ m_menu = new QMenu();
+
+ MediaLib * ml = m_model->ml();
+
+ QAction * action = m_menu->addAction(qtr("Add and play"));
+
+ connect(action, &QAction::triggered, [ml, ids]() {
+ ml->addAndPlay(ids);
+ });
+
+ action = m_menu->addAction(qtr("Enqueue"));
+
+ connect(action, &QAction::triggered, [ml, ids]() {
+ ml->addToPlaylist(ids);
+ });
+
+ action = m_menu->addAction(qtr("Add to playlist"));
+
+ connect(action, &QAction::triggered, [ml, ids]() {
+ DialogsProvider::getInstance()->playlistsDialog(ids);
+ });
+
+ action = m_menu->addAction(qtr("Play as audio"));
+
+ connect(action, &QAction::triggered, [ml, ids]() {
+ QStringList options({":no-video"});
+ ml->addAndPlay(ids, &options);
+ });
+
+ if (options.contains("information") && options["information"].type() == QVariant::Int) {
+ action = m_menu->addAction(qtr("Information"));
+
+ QSignalMapper * mapper = new QSignalMapper(m_menu);
+
+ connect(action, &QAction::triggered, mapper, QOverload<>::of(&QSignalMapper::map));
+
+ mapper->setMapping(action, options["information"].toInt());
+#if QT_VERSION >= QT_VERSION_CHECK(5,15,0)
+ connect(mapper, &QSignalMapper::mappedInt, this,
+ &PlaylistMediaContextMenu::showMediaInformation);
+#else
+ connect(mapper, QOverload<int>::of(&QSignalMapper::mapped), this,
+ &PlaylistMediaContextMenu::showMediaInformation);
+#endif
+ }
+
+ m_menu->popup(pos);
+}
+
+//=================================================================================================
+
NetworkMediaContextMenu::NetworkMediaContextMenu(QObject* parent)
: QObject(parent)
{}
diff --git a/modules/gui/qt/menus/qml_menu_wrapper.hpp b/modules/gui/qt/menus/qml_menu_wrapper.hpp
index d9a87ddb7a..8481839189 100644
--- a/modules/gui/qt/menus/qml_menu_wrapper.hpp
+++ b/modules/gui/qt/menus/qml_menu_wrapper.hpp
@@ -32,6 +32,8 @@ class MLArtistModel;
class MLAlbumTrackModel;
class MLUrlModel;
class MLVideoModel;
+class MLPlaylistListModel;
+class MLPlaylistModel;
class NetworkDeviceModel;
class NetworkMediaModel;
class QmlMainContext;
@@ -214,6 +216,34 @@ private:
QMenu* m_menu = nullptr;
};
+class PlaylistListContextMenu : public QObject {
+ Q_OBJECT
+ SIMPLE_MENU_PROPERTY(MLPlaylistListModel *, model, nullptr)
+public:
+ PlaylistListContextMenu(QObject * parent = nullptr);
+ ~PlaylistListContextMenu() /* override */;
+
+public slots:
+ void popup(const QModelIndexList & selected, QPoint pos, QVariantMap options = {});
+private:
+ QMenu* m_menu = nullptr;
+};
+
+class PlaylistMediaContextMenu : public QObject {
+ Q_OBJECT
+ SIMPLE_MENU_PROPERTY(MLPlaylistModel *, model, nullptr)
+public:
+ PlaylistMediaContextMenu(QObject * parent = nullptr);
+ ~PlaylistMediaContextMenu() /* override */;
+
+public slots:
+ void popup(const QModelIndexList & selected, QPoint pos, QVariantMap options = {});
+signals:
+ void showMediaInformation(int index);
+private:
+ QMenu* m_menu = nullptr;
+};
+
class NetworkMediaContextMenu : public QObject {
Q_OBJECT
SIMPLE_MENU_PROPERTY(NetworkMediaModel*, model, nullptr)
More information about the vlc-commits
mailing list