Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (13)
Showing
with 283 additions and 449 deletions
......@@ -882,6 +882,9 @@ libqt_plugin_la_QML = \
gui/qt/util/qml/ViewDragAutoScrollHandler.qml \
gui/qt/util/qml/BindingRev8.qml \
gui/qt/util/qml/BindingRev14.qml \
gui/qt/util/qml/VanillaObject.qml \
gui/qt/util/qml/NativeMenu.qml \
gui/qt/util/qml/MLContextMenu.qml \
gui/qt/widgets/qml/ActionButtonOverlay.qml \
gui/qt/widgets/qml/ActionButtonPrimary.qml \
gui/qt/widgets/qml/BannerTabButton.qml \
......
......@@ -347,14 +347,6 @@ void MainUI::registerQMLTypes()
registerAnonymousType<MLArtist>(uri, versionMajor);
registerAnonymousType<MLAlbumTrack>(uri, versionMajor);
qmlRegisterType<AlbumContextMenu>( uri, versionMajor, versionMinor, "AlbumContextMenu" );
qmlRegisterType<ArtistContextMenu>( uri, versionMajor, versionMinor, "ArtistContextMenu" );
qmlRegisterType<GenreContextMenu>( uri, versionMajor, versionMinor, "GenreContextMenu" );
qmlRegisterType<AlbumTrackContextMenu>( uri, versionMajor, versionMinor, "AlbumTrackContextMenu" );
qmlRegisterType<URLContextMenu>( uri, versionMajor, versionMinor, "URLContextMenu" );
qmlRegisterType<VideoContextMenu>( uri, versionMajor, versionMinor, "VideoContextMenu" );
qmlRegisterType<VideoGroupsContextMenu>( uri, versionMajor, versionMinor, "VideoGroupsContextMenu" );
qmlRegisterType<VideoFoldersContextMenu>( uri, versionMajor, versionMinor, "VideoFoldersContextMenu" );
qmlRegisterType<PlaylistListContextMenu>( uri, versionMajor, versionMinor, "PlaylistListContextMenu" );
qmlRegisterType<PlaylistMediaContextMenu>( uri, versionMajor, versionMinor, "PlaylistMediaContextMenu" );
......
......@@ -23,6 +23,7 @@ import QtQuick 2.11
import org.videolan.medialib 0.1
import "qrc:///widgets/" as Widgets
import "qrc:///util/" as Util
import "qrc:///style/"
VideoAll {
......@@ -53,7 +54,7 @@ VideoAll {
parentId: initialId
}
contextMenu: VideoContextMenu { model: modelVideo }
contextMenu: Util.MLContextMenu { model: modelVideo; showPlayAsAudioAction: true }
header: Column {
width: root.width
......
......@@ -112,8 +112,9 @@ FocusScope {
defaultCover: VLCStyle.noArtAlbumCover
}
AlbumContextMenu {
Util.MLContextMenu {
id: contextMenu
model: albumModelId
}
......
......@@ -85,8 +85,9 @@ FocusScope {
model: artistModel
}
ArtistContextMenu {
Util.MLContextMenu {
id: contextMenu
model: artistModel
}
......
......@@ -281,13 +281,15 @@ FocusScope {
parentId: albumModel.parentId
}
AlbumContextMenu {
Util.MLContextMenu {
id: contextMenu
model: albumModel
}
AlbumTrackContextMenu {
Util.MLContextMenu {
id: trackContextMenu
model: trackModel
}
......
......@@ -124,8 +124,9 @@ FocusScope {
}
}
GenreContextMenu {
Util.MLContextMenu {
id: contextMenu
model: genreModel
}
......
......@@ -104,8 +104,9 @@ Widgets.KeyNavigableTableView {
model: rootmodel
}
AlbumTrackContextMenu {
Util.MLContextMenu {
id: contextMenu
model: rootmodel
}
}
......@@ -78,8 +78,9 @@ Widgets.KeyNavigableTableView {
model: urlModel
}
URLContextMenu {
Util.MLContextMenu {
id: contextMenu
model: urlModel
}
......
......@@ -27,6 +27,7 @@ import org.videolan.vlc 0.1
import "qrc:///widgets/" as Widgets
import "qrc:///main/" as MainInterface
import "qrc:///util/" as Util
import "qrc:///util/Helpers.js" as Helpers
import "qrc:///style/"
FocusScope {
......@@ -282,8 +283,11 @@ FocusScope {
onContextMenuButtonClicked: {
gridView.rightClickOnItem(index);
root.contextMenu.popup(modelSelect.selectedIndexes, globalMousePos,
{ "information" : index });
var options = {}
if (Helpers.get(model, "isVideo", true))
options["information"] = index
root.contextMenu.popup(modelSelect.selectedIndexes, globalMousePos, options);
}
// Animations
......
......@@ -24,6 +24,7 @@ import org.videolan.vlc 0.1
import org.videolan.medialib 0.1
import "qrc:///widgets/" as Widgets
import "qrc:///util/" as Util
import "qrc:///style/"
VideoAll {
......@@ -52,7 +53,7 @@ VideoAll {
model: !!_meta ? _meta.model : null
contextMenu: !!_meta ? _meta.contextMenu : null
contextMenu: Util.MLContextMenu { model: _meta ? _meta.model : null; showPlayAsAudioAction: true }
// Functions
......@@ -119,8 +120,6 @@ VideoAll {
property var model: MLVideoModel { ml: MediaLib }
property var contextMenu: VideoContextMenu { model: metaVideo.model }
function onAction(indexes) {
g_mainDisplay.showPlayer()
......@@ -142,8 +141,6 @@ VideoAll {
property var model: MLVideoGroupsModel { ml: MediaLib }
property var contextMenu: VideoGroupsContextMenu { model: metaGroup.model }
function onAction(indexes) {
var index = indexes[0]
......@@ -188,8 +185,6 @@ VideoAll {
property var model: MLVideoFoldersModel { ml: MediaLib }
property var contextMenu: VideoFoldersContextMenu { model: metaFolder.model }
function onAction(indexes) {
var index = indexes[0]
......
......@@ -50,10 +50,12 @@ FocusScope {
// Childs
VideoContextMenu {
Util.MLContextMenu {
id: contextMenu
model: listView.model
showPlayAsAudioAction: true
}
Column {
......
......@@ -18,16 +18,8 @@
#include "qml_menu_wrapper.hpp"
#include "menus.hpp"
#include "medialibrary/medialib.hpp"
#include "medialibrary/mlvideomodel.hpp"
#include "medialibrary/mlvideogroupsmodel.hpp"
#include "medialibrary/mlvideofoldersmodel.hpp"
#include "medialibrary/mlplaylistlistmodel.hpp"
#include "medialibrary/mlplaylistmodel.hpp"
#include "medialibrary/mlalbummodel.hpp"
#include "medialibrary/mlartistmodel.hpp"
#include "medialibrary/mlgenremodel.hpp"
#include "medialibrary/mlalbumtrackmodel.hpp"
#include "medialibrary/mlurlmodel.hpp"
#include "medialibrary/mlbookmarkmodel.hpp"
#include "network/networkdevicemodel.hpp"
#include "network/networkmediamodel.hpp"
......@@ -36,6 +28,7 @@
#include "dialogs/dialogs_provider.hpp"
// Qt includes
#include <QPainter>
#include <QSignalMapper>
#include <QScreen>
......@@ -589,275 +582,6 @@ void QmlAudioMenu::beforePopup(QMenu * menu) /* override */
});
}
BaseMedialibMenu::BaseMedialibMenu(QObject* parent)
: QObject(parent)
{}
void BaseMedialibMenu::medialibAudioContextMenu(MediaLib* ml, const QVariantList& mlId, const QPoint& pos, const QVariantMap& options)
{
m_menu = std::make_unique<QMenu>();
QAction* action;
action = m_menu->addAction( qtr("Add and play") );
connect(action, &QAction::triggered, [ml, mlId]( ) {
ml->addAndPlay(mlId);
});
action = m_menu->addAction( qtr("Enqueue") );
connect(action, &QAction::triggered, [ml, mlId]( ) {
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") );
QSignalMapper* sigmapper = new QSignalMapper(m_menu.get());
connect(action, &QAction::triggered, sigmapper, QOverload<>::of(&QSignalMapper::map));
sigmapper->setMapping(action, options["information"].toInt());
connect(sigmapper, QSIGNALMAPPER_MAPPEDINT_SIGNAL,
this, &BaseMedialibMenu::showMediaInformation);
}
m_menu->popup(pos);
}
AlbumContextMenu::AlbumContextMenu(QObject* parent)
: BaseMedialibMenu(parent)
{}
void AlbumContextMenu::popup(const QModelIndexList& selected, QPoint pos, QVariantMap options)
{
BaseMedialibMenu::popup(m_model, MLAlbumModel::ALBUM_ID, selected, pos, options);
}
ArtistContextMenu::ArtistContextMenu(QObject* parent)
: BaseMedialibMenu(parent)
{}
void ArtistContextMenu::popup(const QModelIndexList &selected, QPoint pos, QVariantMap options)
{
BaseMedialibMenu::popup(m_model, MLArtistModel::ARTIST_ID, selected, pos, options);
}
GenreContextMenu::GenreContextMenu(QObject* parent)
: BaseMedialibMenu(parent)
{}
void GenreContextMenu::popup(const QModelIndexList& selected, QPoint pos, QVariantMap options)
{
BaseMedialibMenu::popup(m_model, MLGenreModel::GENRE_ID, selected, pos, options);
}
AlbumTrackContextMenu::AlbumTrackContextMenu(QObject* parent)
: BaseMedialibMenu(parent)
{}
void AlbumTrackContextMenu::popup(const QModelIndexList &selected, QPoint pos, QVariantMap options)
{
BaseMedialibMenu::popup(m_model, MLAlbumTrackModel::TRACK_ID, selected, pos, options);
}
URLContextMenu::URLContextMenu(QObject* parent)
: BaseMedialibMenu(parent)
{}
void URLContextMenu::popup(const QModelIndexList &selected, QPoint pos, QVariantMap options)
{
BaseMedialibMenu::popup(m_model, MLUrlModel::URL_ID, selected, pos, options);
}
VideoContextMenu::VideoContextMenu(QObject* parent)
: QObject(parent)
{}
void VideoContextMenu::popup(const QModelIndexList& selected, QPoint pos, QVariantMap options)
{
if (!m_model)
return;
m_menu = std::make_unique<QMenu>();
QAction* action;
MediaLib* ml= m_model->ml();
QVariantList itemIdList;
for (const QModelIndex& modelIndex : selected)
itemIdList.push_back(m_model->data(modelIndex, MLVideoModel::VIDEO_ID));
action = m_menu->addAction( qtr("Add and play") );
connect(action, &QAction::triggered, [ml, itemIdList, options]( ) {
ml->addAndPlay(itemIdList, options["player-options"].toStringList());
});
action = m_menu->addAction( qtr("Enqueue") );
connect(action, &QAction::triggered, [ml, itemIdList]( ) {
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, options]( ) {
QStringList list = options["player-options"].toStringList();
list.prepend(":no-video");
ml->addAndPlay(itemIdList, list);
});
if (options.contains("information") && options["information"].type() == QVariant::Int) {
action = m_menu->addAction( qtr("Information") );
QSignalMapper* sigmapper = new QSignalMapper(m_menu.get());
connect(action, &QAction::triggered, sigmapper, QOverload<>::of(&QSignalMapper::map));
sigmapper->setMapping(action, options["information"].toInt());
connect(sigmapper, QSIGNALMAPPER_MAPPEDINT_SIGNAL,
this, &VideoContextMenu::showMediaInformation);
}
m_menu->popup(pos);
}
//=================================================================================================
// VideoGroupsContextMenu
//=================================================================================================
VideoGroupsContextMenu::VideoGroupsContextMenu(QObject * parent) : QObject(parent) {}
void VideoGroupsContextMenu::popup(const QModelIndexList & selected, QPoint pos,
QVariantMap options)
{
if (m_model == nullptr)
return;
QVariantList ids;
for (const QModelIndex & index : selected)
ids.push_back(m_model->data(index, MLVideoModel::VIDEO_ID));
m_menu = std::make_unique<QMenu>();
MediaLib * ml = m_model->ml();
QAction * action = m_menu->addAction(qtr("Add and play"));
connect(action, &QAction::triggered, [ml, ids, options]()
{
ml->addAndPlay(ids, options["player-options"].toStringList());
});
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, [ids]()
{
DialogsProvider::getInstance()->playlistsDialog(ids);
});
action = m_menu->addAction(qtr("Play as audio"));
connect(action, &QAction::triggered, [ml, ids, options]()
{
QStringList list = options["player-options"].toStringList();
list.prepend(":no-video");
ml->addAndPlay(ids, list);
});
// NOTE: At the moment informations are only available for single video(s).
if (selected.count() == 1
&&
m_model->data(selected.first(), MLVideoGroupsModel::GROUP_IS_VIDEO) == true
&&
options.contains("information") && options["information"].type() == QVariant::Int)
{
action = m_menu->addAction(qtr("Information"));
QSignalMapper * mapper = new QSignalMapper(m_menu.get());
mapper->setMapping(action, options["information"].toInt());
connect(action, &QAction::triggered, mapper, QOverload<>::of(&QSignalMapper::map));
connect(mapper, QSIGNALMAPPER_MAPPEDINT_SIGNAL,
this, &VideoGroupsContextMenu::showMediaInformation);
}
m_menu->popup(pos);
}
// VideoFoldersContextMenu
VideoFoldersContextMenu::VideoFoldersContextMenu(QObject * parent)
: QObject(parent)
{}
void VideoFoldersContextMenu::popup(const QModelIndexList & selected, QPoint pos,
QVariantMap options)
{
if (m_model == nullptr)
return;
QVariantList ids;
for (const QModelIndex & index : selected)
ids.push_back(m_model->data(index, MLVideoFoldersModel::FOLDER_ID));
m_menu = std::make_unique<QMenu>();
MediaLib * ml = m_model->ml();
QAction * action = m_menu->addAction(qtr("Add and play"));
connect(action, &QAction::triggered, [ml, ids, options]()
{
ml->addAndPlay(ids, options["player-options"].toStringList());
});
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, [ids]()
{
DialogsProvider::getInstance()->playlistsDialog(ids);
});
action = m_menu->addAction(qtr("Play as audio"));
connect(action, &QAction::triggered, [ml, ids, options]()
{
QStringList list = options["player-options"].toStringList();
list.prepend(":no-video");
ml->addAndPlay(ids, list);
});
m_menu->popup(pos);
}
//=================================================================================================
// PlaylistListContextMenu
//=================================================================================================
......
......@@ -27,14 +27,6 @@
#include "maininterface/mainctx.hpp"
class MediaLib;
class MLAlbumModel;
class MLGenreModel;
class MLArtistModel;
class MLAlbumTrackModel;
class MLUrlModel;
class MLVideoModel;
class MLVideoGroupsModel;
class MLVideoFoldersModel;
class MLPlaylistListModel;
class MLPlaylistModel;
class NetworkDeviceModel;
......@@ -293,143 +285,6 @@ protected: // QmlTrackMenu implementation
void beforePopup(QMenu * menu) override;
};
class BaseMedialibMenu : public QObject
{
Q_OBJECT
public:
BaseMedialibMenu(QObject* parent = nullptr);
signals:
void showMediaInformation(int index);
protected:
void medialibAudioContextMenu(MediaLib* ml, const QVariantList& mlId, const QPoint& pos, const QVariantMap& options);
template<typename ModelType>
void popup(ModelType* model, typename ModelType::Roles role, const QModelIndexList &selected, const QPoint& pos, const QVariantMap& options) {
if (!model)
return;
MediaLib* ml= model->ml();
if (!ml)
return;
QVariantList itemIdList;
for (const QModelIndex& modelIndex : selected)
itemIdList.push_back(model->data(modelIndex, role));
medialibAudioContextMenu(ml, itemIdList, pos, options);
}
private:
std::unique_ptr<QMenu> m_menu;
};
class AlbumContextMenu : public BaseMedialibMenu {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLAlbumModel*, model, nullptr)
public:
AlbumContextMenu(QObject* parent = nullptr);
public slots:
void popup(const QModelIndexList& selected, QPoint pos, QVariantMap options = {});
};
class ArtistContextMenu : public BaseMedialibMenu {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLArtistModel*, model, nullptr)
public:
ArtistContextMenu(QObject* parent = nullptr);
public slots:
void popup(const QModelIndexList& selected, QPoint pos, QVariantMap options = {});
};
class GenreContextMenu : public BaseMedialibMenu {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLGenreModel*, model, nullptr)
public:
GenreContextMenu(QObject* parent = nullptr);
public slots:
void popup(const QModelIndexList& selected, QPoint pos, QVariantMap options = {});
};
class AlbumTrackContextMenu : public BaseMedialibMenu {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLAlbumTrackModel*, model, nullptr)
public:
AlbumTrackContextMenu(QObject* parent = nullptr);
public slots:
void popup(const QModelIndexList& selected, QPoint pos, QVariantMap options = {});
};
class URLContextMenu : public BaseMedialibMenu {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLUrlModel*, model, nullptr)
public:
URLContextMenu(QObject* parent = nullptr);
public slots:
void popup(const QModelIndexList& selected, QPoint pos, QVariantMap options = {});
};
class VideoContextMenu : public QObject {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLVideoModel*, model, nullptr)
public:
VideoContextMenu(QObject* parent = nullptr);
public slots:
void popup(const QModelIndexList& selected, QPoint pos, QVariantMap options = {} );
signals:
void showMediaInformation(int index);
private:
std::unique_ptr<QMenu> m_menu;
};
//-------------------------------------------------------------------------------------------------
// Groups
//-------------------------------------------------------------------------------------------------
class VideoGroupsContextMenu : public QObject {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLVideoGroupsModel *, model, nullptr)
public:
VideoGroupsContextMenu(QObject * parent = nullptr);
public slots:
void popup(const QModelIndexList & selected, QPoint pos, QVariantMap options = {});
signals:
void showMediaInformation(int index);
private:
std::unique_ptr<QMenu> m_menu;
};
// Folders
class VideoFoldersContextMenu : public QObject {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLVideoFoldersModel *, model, nullptr)
public:
VideoFoldersContextMenu(QObject * parent = nullptr);
public slots:
void popup(const QModelIndexList & selected, QPoint pos, QVariantMap options = {});
signals:
// FIXME: This signal is required for VideoAll Connections.
void showMediaInformation(int index);
private:
std::unique_ptr<QMenu> m_menu;
};
//-------------------------------------------------------------------------------------------------
class PlaylistListContextMenu : public QObject {
Q_OBJECT
SIMPLE_MENU_PROPERTY(MLPlaylistListModel *, model, nullptr)
......
......@@ -50,7 +50,7 @@ function isValidInstanceOf(object, type) {
// or the value is invalid, returns defaultValue
function get(dict, key, defaultValue) {
var v = typeof dict !== "undefined" ? dict[key] : undefined
return !v ? defaultValue : v
return typeof v === "undefined" ? defaultValue : v
}
// NOTE: This allows us to force another 'reason' even when the item has activeFocus.
......@@ -72,3 +72,7 @@ function contains(rect, pos) {
return (clamp(pos.x, rect.x, rect.x + rect.width) === pos.x)
&& (clamp(pos.y, rect.y, rect.y + rect.height) === pos.y)
}
function isInteger(data) {
return (typeof data === 'number' && (data % 1) === 0)
}
/*****************************************************************************
* Copyright (C) 2022 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.
*****************************************************************************/
import QtQml 2.11
import org.videolan.vlc 0.1
import "qrc:///util/Helpers.js" as Helpers
// @brief - a generic ML context menu
NativeMenu {
id: root
/* required */ property var model: null
property string idDataRole: "id"
property bool showPlayAsAudioAction: false
signal showMediaInformation(int index)
actions: [{
"text": I18n.qtr("Play"),
"action": addAndPlay
}, {
"text": I18n.qtr("Play as audio"),
"action": playAsAudio,
"visible": root.showPlayAsAudioAction
}, {
"text": I18n.qtr("Enqueue"),
"action": enqueue
}, {
"text": I18n.qtr("Add to a playlist"),
"action": addToAPlaylist
}, {
"text": I18n.qtr("Information"),
"action": _signalShowInformation,
"visible": showInformationAvailable
}]
onRequestData: {
model.getData(indexes, function (data) {
setData(requestID, data)
})
}
function showInformationAvailable(options, indexes) {
return indexes.length === 1
&& Helpers.isInteger(Helpers.get(options, "information", null))
}
function addAndPlay(dataList, options, indexes) {
model.ml.addAndPlay(_mlIDList(dataList), _playerOptions(options))
}
function playAsAudio(dataList, options, indexes) {
model.ml.addAndPlay(_mlIDList(dataList), _playerOptions(options, ":no-video"))
}
function enqueue(dataList, options, indexes) {
model.ml.addToPlaylist(_mlIDList(dataList), _playerOptions(options))
}
function addToAPlaylist(dataList, options, indexes) {
DialogsProvider.playlistsDialog(_mlIDList(dataList))
}
function _signalShowInformation(dataList, options) {
var index = Helpers.get(options, "information", null)
console.assert(Helpers.isInteger(index))
showMediaInformation(index)
}
function _playerOptions(options, extraOptions) {
var playerOpts = Helpers.get(options, "player-options", [])
return playerOpts.concat(extraOptions)
}
function _mlIDList(dataList) {
var idList = []
for (var i in dataList) {
idList.push(dataList[i][idDataRole])
}
return idList
}
}
/*****************************************************************************
* Copyright (C) 2022 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.
*****************************************************************************/
import QtQml 2.11
import org.videolan.vlc 0.1
// @brief - a class that can be used to create native menus with support
// to asyncronously retreive data from MLBaseModel like model
VanillaObject {
id: root
/**
actions - list of action to show
each action is an Object and contains following keys
"text" - (string) display text of the action
"action" - (function(dataList, options, indexes)) a function that will be called when action is selected
"visible" - (Boolean or function(options, indexes) -> Boolean) (optional) a boolean value or function which
controls whether the action is shown in the menu following 'popup' call
e.g see MLContextMenu.qml
**/
property var actions: []
signal requestData(var requestID, var indexes)
property var _options: null
property var _indexes: []
property bool _pendingData: false
property var _dataList: null
property int _currentRequest: 0
property int _actionOnDataReceived: -1
property var _effectiveActions: null
function popup(_indexes, point, _options) {
root._options = _options
root._indexes = _indexes
_actionOnDataReceived = -1
_pendingData = true
_dataList = null
var requestID = ++_currentRequest
requestData(requestID, _indexes)
var textStrings = []
_effectiveActions = []
for (var i in actions) {
if (!actions[i].hasOwnProperty("visible")
|| (typeof actions[i].visible === "boolean" && actions[i].visible)
|| (typeof actions[i].visible === "function" && actions[i].visible(_options, _indexes))) {
_effectiveActions.push(actions[i])
textStrings.push(actions[i].text)
}
}
menu.popup(point, textStrings)
}
function setData(id, data) {
if (_currentRequest !== id)
return;
_dataList = data
_pendingData = false
if (_actionOnDataReceived !== -1)
_executeAction(_actionOnDataReceived)
}
function _executeAction(index) {
var action = root._effectiveActions[index]
action.action(_dataList, _options, _indexes)
}
StringListMenu {
id: menu
onSelected: {
if (root._pendingData)
root._actionOnDataReceived = index
else
root._executeAction(index)
}
}
}
/*****************************************************************************
* Copyright (C) 2022 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.
*****************************************************************************/
import QtQuick 2.11
QtObject {
id: object
default property alias children: object.__children
property list<QtObject> __children: [QtObject {}]
}
......@@ -32,6 +32,9 @@
<file alias="ViewDragAutoScrollHandler.qml">util/qml/ViewDragAutoScrollHandler.qml</file>
<file alias="BindingRev8.qml">util/qml/BindingRev8.qml</file>
<file alias="BindingRev14.qml">util/qml/BindingRev14.qml</file>
<file alias="VanillaObject.qml">util/qml/VanillaObject.qml</file>
<file alias="NativeMenu.qml">util/qml/NativeMenu.qml</file>
<file alias="MLContextMenu.qml">util/qml/MLContextMenu.qml</file>
</qresource>
<qresource prefix="/toolbar">
<file alias="faster.svg">pixmaps/faster.svg</file>
......