[vlc-devel] [PATCH 13/17] qml: Create PlaylistMediaDisplay
Benjamin Arnaud
benjamin.arnaud at videolabs.io
Fri Feb 19 10:25:37 UTC 2021
---
modules/gui/qt/Makefile.am | 1 +
.../medialibrary/qml/PlaylistMediaDisplay.qml | 247 ++++++++++++++++++
modules/gui/qt/vlc.qrc | 1 +
po/POTFILES.in | 1 +
4 files changed, 250 insertions(+)
create mode 100644 modules/gui/qt/medialibrary/qml/PlaylistMediaDisplay.qml
diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index cebb02f019..1b9909bf18 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -668,6 +668,7 @@ libqt_plugin_la_QML = \
gui/qt/medialibrary/qml/VideoAllDisplay.qml \
gui/qt/medialibrary/qml/PlaylistMediaList.qml \
gui/qt/medialibrary/qml/PlaylistMedia.qml \
+ gui/qt/medialibrary/qml/PlaylistMediaDisplay.qml \
gui/qt/medialibrary/qml/VideoDisplayRecentVideos.qml \
gui/qt/medialibrary/qml/VideoGridItem.qml \
gui/qt/medialibrary/qml/VideoInfoExpandPanel.qml \
diff --git a/modules/gui/qt/medialibrary/qml/PlaylistMediaDisplay.qml b/modules/gui/qt/medialibrary/qml/PlaylistMediaDisplay.qml
new file mode 100644
index 0000000000..d982c633f6
--- /dev/null
+++ b/modules/gui/qt/medialibrary/qml/PlaylistMediaDisplay.qml
@@ -0,0 +1,247 @@
+/*****************************************************************************
+ * Copyright (C) 2021 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
+import QtQuick.Controls 2.4
+import QtQuick.Layouts 1.3
+import QtQml.Models 2.2
+
+import org.videolan.medialib 0.1
+
+import "qrc:///widgets/" as Widgets
+import "qrc:///main/" as MainInterface
+import "qrc:///util/" as Util
+import "qrc:///style/"
+
+Widgets.NavigableFocusScope {
+ id: root
+
+ //---------------------------------------------------------------------------------------------
+ // Properties
+ //---------------------------------------------------------------------------------------------
+
+ readonly property bool isViewMultiView: false
+
+ readonly property int currentIndex: currentItem.currentIndex
+
+ property int initialIndex: 0
+ property variant initialId
+ property string initialName
+
+ // NOTE: Specify an optionnal header for the view.
+ property Component header: undefined
+
+ property Item headerItem: (currentItem) ? currentItem.headerItem : undefined
+
+ //---------------------------------------------------------------------------------------------
+ // Aliases
+ //---------------------------------------------------------------------------------------------
+
+ // NOTE: This is used to determine which media(s) shall be displayed.
+ property alias parentId: model.parentId
+
+ // NOTE: The name of the playlist.
+ property alias name: label.text
+
+ property alias model: model
+
+ property alias currentItem: view
+
+ //---------------------------------------------------------------------------------------------
+
+ property alias dragItem: dragItem
+
+ //---------------------------------------------------------------------------------------------
+ // Settings
+ //---------------------------------------------------------------------------------------------
+
+ navigationCancel: function() {
+ if (currentItem.currentIndex <= 0) {
+ defaultNavigationCancel()
+ } else {
+ currentItem.currentIndex = 0;
+
+ currentItem.positionViewAtIndex(0, ItemView.Contain);
+ }
+ }
+
+ //---------------------------------------------------------------------------------------------
+ // Events
+ //---------------------------------------------------------------------------------------------
+
+ onModelChanged: resetFocus()
+
+ onInitialIndexChanged: resetFocus()
+
+ //---------------------------------------------------------------------------------------------
+ // Functions
+ //---------------------------------------------------------------------------------------------
+
+ function setCurrentItemFocus() { view.currentItem.forceActiveFocus() }
+
+ function resetFocus() {
+ if (model.count === 0) return
+
+ var initialIndex = root.initialIndex
+
+ if (initialIndex >= model.count)
+ initialIndex = 0
+
+ modelSelect.select(model.index(initialIndex, 0), ItemSelectionModel.ClearAndSelect);
+
+ if (currentItem)
+ currentItem.positionViewAtIndex(initialIndex, ItemView.Contain);
+ }
+
+ //---------------------------------------------------------------------------------------------
+ // Private
+
+ function _actionAtIndex(index) {
+ g_mainDisplay.showPlayer();
+
+ medialib.addAndPlay(model.getIdsForIndexes(modelSelect.selectedIndexes));
+ }
+
+ //---------------------------------------------------------------------------------------------
+ // Childs
+ //---------------------------------------------------------------------------------------------
+
+ MLPlaylistModel {
+ id: model
+
+ ml: medialib
+
+ parentId: initialId
+
+ onCountChanged: {
+ if (count === 0 || modelSelect.hasSelection) return;
+
+ resetFocus();
+ }
+ }
+
+ Widgets.SubtitleLabel {
+ id: label
+
+ anchors.top: parent.top
+
+ anchors.topMargin: VLCStyle.margin_normal
+
+ width: root.width
+
+ leftPadding : VLCStyle.margin_xlarge
+ bottomPadding: VLCStyle.margin_xsmall
+
+ text: initialName
+ }
+
+ Widgets.DragItem {
+ id: dragItem
+
+ function updateComponents(maxCovers) {
+ var items = modelSelect.selectedIndexes.slice(0, maxCovers).map(function (x){
+ return model.getDataAt(x.row);
+ })
+
+ var covers = items.map(function (item) {
+ return { artwork: item.thumbnail || VLCStyle.noArtCover }
+ });
+
+ var title = items.map(function (item) {
+ return item.title
+ }).join(", ");
+
+ return {
+ covers: covers,
+ title: title,
+ count: modelSelect.selectedIndexes.length
+ }
+ }
+
+ function insertIntoPlaylist(index) {
+ medialib.insertIntoPlaylist(index,
+ model.getIdsForIndexes(modelSelect.selectedIndexes));
+ }
+ }
+
+ Util.SelectableDelegateModel {
+ id: modelSelect
+
+ model: root.model
+ }
+
+ PlaylistMediaContextMenu {
+ id: contextMenu
+
+ model: root.model
+ }
+
+ PlaylistMedia
+ {
+ id: view
+
+ //-------------------------------------------------------------------------------------
+ // Settings
+
+ anchors.left : parent.left
+ anchors.right : parent.right
+ anchors.top : label.bottom
+ anchors.bottom: parent.bottom
+
+ clip: true
+
+ focus: (model.count !== 0)
+
+ model: root.model
+
+ selectionDelegateModel: modelSelect
+
+ dragItem: root.dragItem
+
+ header: root.header
+
+ headerTopPadding: VLCStyle.margin_normal
+
+ headerPositioning: ListView.InlineHeader
+
+ navigationParent: root
+ navigationUpItem: (headerItem) ? headerItem.focus : undefined
+
+ //-------------------------------------------------------------------------------------
+ // Events
+
+ onContextMenuButtonClicked: contextMenu.popup(modelSelect.selectedIndexes,
+ menuParent.mapToGlobal(0,0))
+
+ onRightClick: contextMenu.popup(modelSelect.selectedIndexes, globalMousePos)
+ }
+
+ EmptyLabel {
+ anchors.fill: parent
+
+ visible: (model.count === 0)
+
+ focus: visible
+
+ text: i18n.qtr("No media found")
+
+ cover: VLCStyle.noArtAlbumCover
+
+ navigationParent: root
+ }
+}
diff --git a/modules/gui/qt/vlc.qrc b/modules/gui/qt/vlc.qrc
index dbc9dec717..d0f705191e 100644
--- a/modules/gui/qt/vlc.qrc
+++ b/modules/gui/qt/vlc.qrc
@@ -274,6 +274,7 @@
<file alias="VideoAllDisplay.qml">medialibrary/qml/VideoAllDisplay.qml</file>
<file alias="PlaylistMediaList.qml">medialibrary/qml/PlaylistMediaList.qml</file>
<file alias="PlaylistMedia.qml">medialibrary/qml/PlaylistMedia.qml</file>
+ <file alias="PlaylistMediaDisplay.qml">medialibrary/qml/PlaylistMediaDisplay.qml</file>
<file alias="MusicAlbumsDisplay.qml">medialibrary/qml/MusicAlbumsDisplay.qml</file>
<file alias="MusicAlbumsGridExpandDelegate.qml">medialibrary/qml/MusicAlbumsGridExpandDelegate.qml</file>
<file alias="MusicArtist.qml">medialibrary/qml/MusicArtist.qml</file>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index cf159d1ae3..bf6a78a9f8 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -830,6 +830,7 @@ modules/gui/qt/medialibrary/qml/VideoAll.qml
modules/gui/qt/medialibrary/qml/VideoAllDisplay.qml
modules/gui/qt/medialibrary/qml/PlaylistMediaList.qml
modules/gui/qt/medialibrary/qml/PlaylistMedia.qml
+modules/gui/qt/medialibrary/qml/PlaylistMediaDisplay.qml
modules/gui/qt/menus/qml/Menubar.qml
modules/gui/qt/network/qml/DiscoverDisplay.qml
modules/gui/qt/network/qml/DiscoverUrlDisplay.qml
--
2.25.1
More information about the vlc-devel
mailing list