qt/menus: Add playlist support

Signed-off-by: Pierre Lamot <pierre@videolabs.io>
This commit is contained in:
Benjamin Arnaud 2021-02-19 11:25:33 +01:00 committed by Pierre Lamot
parent 459c58b6ab
commit ad4e4271d7
3 changed files with 172 additions and 0 deletions

View File

@ -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" );
}

View File

@ -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)
{}

View File

@ -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)