From 11319db68d4add6b39add69ef766136480770dd8 Mon Sep 17 00:00:00 2001 From: Fatih Uzunoglu <fuzun54@outlook.com> Date: Fri, 8 Jan 2021 00:36:15 +0300 Subject: [PATCH] qml: use exported OverlayMenu in Playlist Signed-off-by: Pierre Lamot <pierre@videolabs.io> --- modules/gui/qt/Makefile.am | 2 +- .../gui/qt/playlist/qml/PlaylistListView.qml | 161 +-------- modules/gui/qt/playlist/qml/PlaylistMenu.qml | 275 ---------------- .../qt/playlist/qml/PlaylistOverlayMenu.qml | 306 ++++++++++++++++++ modules/gui/qt/vlc.qrc | 2 +- po/POTFILES.in | 1 + 6 files changed, 322 insertions(+), 425 deletions(-) delete mode 100644 modules/gui/qt/playlist/qml/PlaylistMenu.qml create mode 100644 modules/gui/qt/playlist/qml/PlaylistOverlayMenu.qml diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am index af4758f88c18..3f5d7cd41922 100644 --- a/modules/gui/qt/Makefile.am +++ b/modules/gui/qt/Makefile.am @@ -681,7 +681,7 @@ libqt_plugin_la_QML = \ gui/qt/playlist/qml/PLItem.qml \ gui/qt/playlist/qml/PlaylistDroppable.qml \ gui/qt/playlist/qml/PlaylistListView.qml \ - gui/qt/playlist/qml/PlaylistMenu.qml \ + gui/qt/playlist/qml/PlaylistOverlayMenu.qml \ gui/qt/playlist/qml/PlaylistToolbar.qml \ gui/qt/playlist/qml/PlaylistDetachedWindow.qml \ gui/qt/style/VLCColors.qml \ diff --git a/modules/gui/qt/playlist/qml/PlaylistListView.qml b/modules/gui/qt/playlist/qml/PlaylistListView.qml index 91474986ede6..5e902d4876e6 100644 --- a/modules/gui/qt/playlist/qml/PlaylistListView.qml +++ b/modules/gui/qt/playlist/qml/PlaylistListView.qml @@ -76,11 +76,24 @@ Widgets.NavigableFocusScope { mainPlaylistController.sort() } + PlaylistOverlayMenu { + id: overlayMenu + anchors.fill: parent + z: 1 + + backgroundItem: parentRect + } + Rectangle { id: parentRect anchors.fill: parent color: _colors.banner + onActiveFocusChanged: { + if (activeFocus) + view.forceActiveFocus() + } + //label for DnD Widgets.DNDLabel { id: dragItem @@ -151,154 +164,6 @@ Widgets.NavigableFocusScope { controler: mainPlaylistController } - PlaylistMenu { - id: overlayMenu - anchors.fill: parent - z: 2 - - navigationParent: root - navigationLeftItem: view - - leftPadding: root.leftPadding - rightPadding: root.rightPadding - - isPLEmpty: (root.plmodel.count === 0) - isItemNotSelected: (root.plmodel.selectedCount === 0) - - //rootmenu - Action { id:playAction; text: i18n.qtr("Play"); onTriggered: mainPlaylistController.goTo(root.plmodel.getSelection()[0], true); icon.source: "qrc:///toolbar/play_b.svg" } - Action { id:streamAction; text: i18n.qtr("Stream"); onTriggered: dialogProvider.streamingDialog(root.plmodel.getSelection().map(function(i) { return root.plmodel.itemAt(i).url; }), false); icon.source: "qrc:/menu/stream.svg" } - Action { id:saveAction; text: i18n.qtr("Save"); onTriggered: dialogProvider.streamingDialog(root.plmodel.getSelection().map(function(i) { return root.plmodel.itemAt(i).url; })); } - Action { id:infoAction; text: i18n.qtr("Information"); onTriggered: dialogProvider.mediaInfoDialog(root.plmodel.itemAt(root.plmodel.getSelection()[0])); icon.source: "qrc:/menu/info.svg" } - Action { id:exploreAction; text: i18n.qtr("Show Containing Directory"); onTriggered: mainPlaylistController.explore(root.plmodel.itemAt(root.plmodel.getSelection()[0])); icon.source: "qrc:/type/folder-grey.svg" } - Action { id:addFileAction; text: i18n.qtr("Add File..."); onTriggered: dialogProvider.simpleOpenDialog(false); icon.source: "qrc:/buttons/playlist/playlist_add.svg" } - Action { id:addDirAction; text: i18n.qtr("Add Directory..."); onTriggered: dialogProvider.PLAppendDir(); icon.source: "qrc:/buttons/playlist/playlist_add.svg" } - Action { id:addAdvancedAction; text: i18n.qtr("Advanced Open..."); onTriggered: dialogProvider.PLAppendDialog(); icon.source: "qrc:/buttons/playlist/playlist_add.svg" } - Action { id:savePlAction; text: i18n.qtr("Save Playlist to File..."); onTriggered: dialogProvider.savePlayingToPlaylist(); } - Action { id:clearAllAction; text: i18n.qtr("Clear Playlist"); onTriggered: mainPlaylistController.clear(); icon.source: "qrc:/toolbar/clear.svg" } - Action { id:selectAllAction; text: i18n.qtr("Select All"); onTriggered: root.plmodel.selectAll(); } - Action { id:shuffleAction; text: i18n.qtr("Shuffle Playlist"); onTriggered: mainPlaylistController.shuffle(); icon.source: "qrc:///buttons/playlist/shuffle_on.svg" } - Action { id:sortAction; text: i18n.qtr("Sort"); property string subMenu: "sortmenu"; } - Action { id:selectTracksAction; text: i18n.qtr("Select Tracks"); onTriggered: view.mode = "select"; } - Action { id:moveTracksAction; text: i18n.qtr("Move Selection"); onTriggered: view.mode = "move"; } - Action { id:deleteAction; text: i18n.qtr("Remove Selected"); onTriggered: view.onDelete(); } - - readonly property var sortList: [sortTitleAction, - sortDurationAction, - sortArtistAction, - sortAlbumAction, - sortGenreAction, - sortDateAction, - sortTrackAction, - sortURLAction, - sortRatingAction] - - Connections { - id: plControllerConnections - target: mainPlaylistController - - property alias sortList: overlayMenu.sortList - - function setMark() { - for (var i = 0; i < sortList.length; i++) { - if(sortList[i].key === mainPlaylistController.sortKey) { - sortList[i].sortActiveMark = "✓" - sortList[i].sortOrderMark = (mainPlaylistController.sortOrder === PlaylistControllerModel.SORT_ORDER_ASC ? "↓" : "↑") - continue - } - - sortList[i].sortActiveMark = "" - sortList[i].sortOrderMark = "" - } - } - - onSortOrderChanged: { - plControllerConnections.setMark() - } - - onSortKeyChanged: { - plControllerConnections.setMark() - } - } - - // sortmenu - Action { id: sortTitleAction; text: i18n.qtr("Title"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_TITLE; - property string sortActiveMark; property string sortOrderMark } - Action { id: sortDurationAction; text: i18n.qtr("Duration"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_DURATION - property string sortActiveMark; property string sortOrderMark } - Action { id: sortArtistAction; text: i18n.qtr("Artist"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_ARTIST - property string sortActiveMark; property string sortOrderMark } - Action { id: sortAlbumAction; text: i18n.qtr("Album"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_ALBUM - property string sortActiveMark; property string sortOrderMark } - Action { id: sortGenreAction; text: i18n.qtr("Genre"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_GENRE - property string sortActiveMark; property string sortOrderMark } - Action { id: sortDateAction; text: i18n.qtr("Date"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_DATE - property string sortActiveMark; property string sortOrderMark } - Action { id: sortTrackAction; text: i18n.qtr("Track Number"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_TRACK_NUMBER - property string sortActiveMark; property string sortOrderMark } - Action { id: sortURLAction; text: i18n.qtr("URL"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_URL - property string sortActiveMark; property string sortOrderMark } - Action { id: sortRatingAction; text: i18n.qtr("Rating"); onTriggered: root.sortPL(key); - readonly property int key: PlaylistControllerModel.SORT_KEY_RATING - property string sortActiveMark; property string sortOrderMark } - - models: { - "rootmenu" : { - title: i18n.qtr("Playlist"), - entries: [ - playAction, - streamAction, - saveAction, - infoAction, - exploreAction, - addFileAction, - addDirAction, - addAdvancedAction, - savePlAction, - clearAllAction, - selectAllAction, - shuffleAction, - sortAction, - selectTracksAction, - moveTracksAction, - deleteAction - ] - }, - "rootmenu_plempty" : { - title: i18n.qtr("Playlist"), - entries: [ - addFileAction, - addDirAction, - addAdvancedAction - ] - }, - "rootmenu_noselection" : { - title: i18n.qtr("Playlist"), - entries: [ - addFileAction, - addDirAction, - addAdvancedAction, - savePlAction, - clearAllAction, - sortAction, - selectTracksAction - ] - }, - "sortmenu" :{ - title: i18n.qtr("Sort Playlist"), - entries: sortList - } - } - } - ColumnLayout { anchors.fill: parent anchors.bottomMargin: VLCStyle.margin_normal diff --git a/modules/gui/qt/playlist/qml/PlaylistMenu.qml b/modules/gui/qt/playlist/qml/PlaylistMenu.qml deleted file mode 100644 index a19de35b654e..000000000000 --- a/modules/gui/qt/playlist/qml/PlaylistMenu.qml +++ /dev/null @@ -1,275 +0,0 @@ -/***************************************************************************** - * 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. - *****************************************************************************/ -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Controls.impl 2.4 -import QtQuick.Layouts 1.3 - -import "qrc:///widgets/" as Widgets -import "qrc:///util/KeyHelper.js" as KeyHelper -import "qrc:///style/" - -Widgets.NavigableFocusScope { - id: overlayMenu - visible: false - - property alias models: playlistMenu.models - property alias currentModel: playlistMenu.currentModel - - property int leftPadding: 0 - property int rightPadding: 0 - - property bool isPLEmpty: false - property bool isItemNotSelected: false - - onActiveFocusChanged: { - if (!activeFocus) { - overlayMenu.close() - } - } - - function close() { - overlayMenu.visible = false - view.forceActiveFocus() - } - - function open() { - playlistMenu.currentModel = isPLEmpty ? "rootmenu_plempty" : (isItemNotSelected ? "rootmenu_noselection" : "rootmenu") - playlistMenu.menuHierachy = [] - overlayMenu.visible = true - overlayMenu.forceActiveFocus() - } - - function pushMenu(menu) { - playlistMenu.menuHierachy.push(playlistMenu.currentModel) - playlistMenu.currentModel = menu - } - - property real drawerRatio: 0 - Behavior on drawerRatio { - NumberAnimation { - duration: 150 - } - } - onVisibleChanged: { - drawerRatio = visible ? 0.9 : 0 - } - - Rectangle { - color: "black" - anchors { - left: parent.left - top: parent.top - bottom: parent.bottom - } - width: parent.width * (1 - drawerRatio) - opacity: 0.4 - } - - Item { - id: parentItem - - anchors { - right: parent.right - top: parent.top - bottom: parent.bottom - } - width: parent.width * drawerRatio - - Widgets.FrostedGlassEffect { - id: glassEffect - source: view - - anchors.fill: parent - - readonly property point overlayLocalPos: view.mapFromItem(overlayMenu, parentItem.x, parentItem.y) - sourceRect: Qt.rect(overlayLocalPos.x, overlayLocalPos.y, glassEffect.width, glassEffect.height) - - tint: VLCStyle.colors.blendColors(VLCStyle.colors.black, VLCStyle.colors.banner, 0.85) - tintStrength: 0.6 - } - - //avoid mouse event to be propagated to the widget below - MouseArea { - anchors.fill: parent - hoverEnabled: true - } - - Widgets.KeyNavigableListView { - id: playlistMenu - anchors.fill: parent - focus: true - keyNavigationWraps: true - - property var models: { - "rootmenu" : { - "title" : "", - "entries" : [] - } - } - property string currentModel: "rootmenu" - property var menuHierachy: [] - - model: models[currentModel]["entries"] - modelCount: models[currentModel]["entries"].length - - header: Label { - text: models[currentModel]["title"] - color: "white" - font.pixelSize: VLCStyle.fontSize_xlarge - font.bold: true - - leftPadding: VLCStyle.margin_small - rightPadding: VLCStyle.margin_small - topPadding: VLCStyle.margin_xsmall - bottomPadding: VLCStyle.margin_xsmall - height: VLCStyle.fontHeight_xlarge + topPadding + bottomPadding - } - - delegate: Button { - id: control - text: modelData.text - width: playlistMenu.width - - leftPadding: VLCStyle.margin_small + root.leftPadding - rightPadding: VLCStyle.margin_small + root.rightPadding - - icon.width: VLCStyle.fontHeight_normal - icon.height: VLCStyle.fontHeight_normal - - contentItem: RowLayout { - width: control.width - - Label { - Layout.fillWidth: true - - text: control.text - color: "white" - font.pixelSize: VLCStyle.fontSize_normal - leftPadding: VLCStyle.icon_small - } - - Loader { - active: currentModel === "sortmenu" - - sourceComponent: Label { - text: modelData.sortOrderMark - color: "white" - font.pixelSize: VLCStyle.fontSize_normal - } - } - } - - background: Rectangle { - implicitWidth: 100 - implicitHeight: VLCStyle.fontHeight_normal - color: control.activeFocus ? VLCStyle.colors.accent : "transparent" - opacity: 0.8 - - Item { - id: leftSide - width: control.icon.width - height: control.icon.height - - x: control.mirrored ? control.width - width - control.rightPadding : control.leftPadding - y: control.topPadding + (control.availableHeight - height) / 2 - - Loader { - id: leftTextLoader - active: currentModel === "sortmenu" - - anchors.fill: parent - - sourceComponent: Label { - text: modelData.sortActiveMark - color: "white" - font.pixelSize: VLCStyle.fontSize_normal - } - } - - Loader { - active: !leftTextLoader.active - anchors.fill: parent - - sourceComponent: ColorImage { - width: leftSide.width - height: leftSide.height - - source: control.checked ? "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/check.png" - : modelData.icon.source ? modelData.icon.source - : "" - visible: true - color: control.enabled ? VLCStyle.colors.playerFg : VLCStyle.colors.playerFgInactive - } - } - } - - ColorImage { - x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding - y: control.topPadding + (control.availableHeight - height) / 2 - - width: VLCStyle.icon_xsmall - height: VLCStyle.icon_xsmall - - visible: !!modelData["subMenu"] - mirror: control.mirrored - color: control.enabled ? VLCStyle.colors.playerFg : VLCStyle.colors.playerFgInactive - source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/arrow-indicator.png" - } - } - - onClicked: { - - if (!!modelData["subMenu"]) { - pushMenu(modelData["subMenu"]) - } else { - modelData.trigger() - overlayMenu.close() - } - } - - Keys.onPressed: { - if (KeyHelper.matchRight(event)) { - if (!!modelData["subMenu"]) { - pushMenu(modelData["subMenu"]) - event.accepted = true - } - } else if (KeyHelper.matchLeft(event)) { - if (playlistMenu.menuHierachy.length > 0) { - playlistMenu.currentModel = playlistMenu.menuHierachy.pop() - event.accepted = true - } else { - overlayMenu.close() - } - } - } - - Keys.onReleased: { - if (KeyHelper.matchCancel(event)) { - event.accepted = true - if (playlistMenu.menuHierachy.length > 0) { - playlistMenu.currentModel = playlistMenu.menuHierachy.pop() - } else { - overlayMenu.close() - } - } - } - } - } - } -} diff --git a/modules/gui/qt/playlist/qml/PlaylistOverlayMenu.qml b/modules/gui/qt/playlist/qml/PlaylistOverlayMenu.qml new file mode 100644 index 000000000000..01d3f89bff19 --- /dev/null +++ b/modules/gui/qt/playlist/qml/PlaylistOverlayMenu.qml @@ -0,0 +1,306 @@ +/***************************************************************************** + * Copyright (C) 2020 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 org.videolan.vlc 0.1 + +import "qrc:///widgets/" as Widgets +import "qrc:///style/" + +Widgets.OverlayMenu { + id: overlayMenu + + Action { + id: playAction + text: i18n.qtr("Play") + onTriggered: mainPlaylistController.goTo(root.plmodel.getSelection()[0], true) + property string fontIcon: VLCIcons.play + } + + Action { + id: streamAction + text: i18n.qtr("Stream") + onTriggered: dialogProvider.streamingDialog(root.plmodel.getSelection().map(function(i) { return root.plmodel.itemAt(i).url; }), false) + property string fontIcon: VLCIcons.stream + } + + Action { + id: saveAction + text: i18n.qtr("Save") + onTriggered: dialogProvider.streamingDialog(root.plmodel.getSelection().map(function(i) { return root.plmodel.itemAt(i).url; })) + } + + Action { + id: infoAction + text: i18n.qtr("Information") + onTriggered: dialogProvider.mediaInfoDialog(root.plmodel.itemAt(root.plmodel.getSelection()[0])) + icon.source: "qrc:/menu/info.svg" + } + + Action { + id: exploreAction + text: i18n.qtr("Show Containing Directory") + onTriggered: mainPlaylistController.explore(root.plmodel.itemAt(root.plmodel.getSelection()[0])) + icon.source: "qrc:/type/folder-grey.svg" + } + + Action { + id: addFileAction + text: i18n.qtr("Add File...") + onTriggered: dialogProvider.simpleOpenDialog(false) + icon.source: "qrc:/buttons/playlist/playlist_add.svg" + } + + Action { + id: addDirAction + text: i18n.qtr("Add Directory...") + onTriggered: dialogProvider.PLAppendDir() + icon.source: "qrc:/buttons/playlist/playlist_add.svg" + } + + Action { + id: addAdvancedAction + text: i18n.qtr("Advanced Open...") + onTriggered: dialogProvider.PLAppendDialog() + icon.source: "qrc:/buttons/playlist/playlist_add.svg" + } + + Action { + id: savePlAction + text: i18n.qtr("Save Playlist to File...") + onTriggered: dialogProvider.savePlayingToPlaylist(); + } + + Action { + id: clearAllAction + text: i18n.qtr("Clear Playlist") + onTriggered: mainPlaylistController.clear() + icon.source: "qrc:/toolbar/clear.svg" + } + + Action { + id: selectAllAction + text: i18n.qtr("Select All") + onTriggered: root.plmodel.selectAll() + } + + Action { + id: shuffleAction + text: i18n.qtr("Shuffle Playlist") + onTriggered: mainPlaylistController.shuffle() + icon.source: "qrc:/buttons/playlist/shuffle_on.svg" + } + + Action { + id: sortAction + text: i18n.qtr("Sort") + property alias model: overlayMenu.sortMenu + } + + Action { + id: selectTracksAction + text: i18n.qtr("Select Tracks") + onTriggered: view.mode = "select" + } + + Action { + id: moveTracksAction + text: i18n.qtr("Move Selection") + onTriggered: view.mode = "move" + } + + Action { + id: deleteAction + text: i18n.qtr("Remove Selected") + onTriggered: view.onDelete() + } + + property var rootMenu: ({ + + title: i18n.qtr("Playlist Menu"), + entries: [ + playAction, + streamAction, + saveAction, + infoAction, + exploreAction, + addFileAction, + addDirAction, + addAdvancedAction, + savePlAction, + clearAllAction, + selectAllAction, + shuffleAction, + sortAction, + selectTracksAction, + moveTracksAction, + deleteAction + ] + }) + + property var rootMenu_PLEmpty: ({ + title: i18n.qtr("Playlist Menu"), + entries: [ + addFileAction, + addDirAction, + addAdvancedAction + ] + }) + + property var rootMenu_noSelection: ({ + title: i18n.qtr("Playlist Menu"), + entries: [ + addFileAction, + addDirAction, + addAdvancedAction, + savePlAction, + clearAllAction, + sortAction, + selectTracksAction + ] + }) + + model: { + if (root.plmodel.count === 0) + rootMenu_PLEmpty + else if (root.plmodel.selectedCount === 0) + rootMenu_noSelection + else + rootMenu + } + + // Sort menu: + + function sortOrderMarkRetriever(key) { + if (key === mainPlaylistController.sortKey) { + return (mainPlaylistController.sortOrder === PlaylistControllerModel.SORT_ORDER_ASC ? "↓" : "↑") + } + else { + return null + } + } + + Action { + id: sortTitleAction + text: i18n.qtr("Title") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_TITLE + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortDurationAction + text: i18n.qtr("Duration") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_DURATION + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortArtistAction + text: i18n.qtr("Artist") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_ARTIST + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortAlbumAction + text: i18n.qtr("Album") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_ALBUM + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortAlbumArtistAction + text: i18n.qtr("Album Artist") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_ALBUM_ARTIST + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortGenreAction + text: i18n.qtr("Genre") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_GENRE + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortDateAction + text: i18n.qtr("Date") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_DATE + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortTrackNumberAction + text: i18n.qtr("Track Number") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_TRACK_NUMBER + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortURLAction + text: i18n.qtr("URL") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_URL + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + Action { + id: sortRatingAction + text: i18n.qtr("Rating") + onTriggered: root.sortPL(key) + readonly property int key: PlaylistControllerModel.SORT_KEY_RATING + readonly property string marking: sortOrderMarkRetriever(key) + readonly property bool tickMark: (key === mainPlaylistController.sortKey) + } + + property var sortMenu: ({ + title: i18n.qtr("Sort Menu"), + entries: [ + sortTitleAction, + sortDurationAction, + sortArtistAction, + sortAlbumAction, + sortAlbumArtistAction, + sortGenreAction, + sortDateAction, + sortTrackNumberAction, + sortURLAction, + sortRatingAction + ] + }) + + +} diff --git a/modules/gui/qt/vlc.qrc b/modules/gui/qt/vlc.qrc index d836a59a45f7..eee7cb049a59 100644 --- a/modules/gui/qt/vlc.qrc +++ b/modules/gui/qt/vlc.qrc @@ -292,7 +292,7 @@ <file alias="PLItem.qml">playlist/qml/PLItem.qml</file> <file alias="PlaylistDroppable.qml">playlist/qml/PlaylistDroppable.qml</file> <file alias="PlaylistListView.qml">playlist/qml/PlaylistListView.qml</file> - <file alias="PlaylistMenu.qml">playlist/qml/PlaylistMenu.qml</file> + <file alias="PlaylistOverlayMenu.qml">playlist/qml/PlaylistOverlayMenu.qml</file> <file alias="PlaylistToolbar.qml">playlist/qml/PlaylistToolbar.qml</file> <file alias="PlaylistDetachedWindow.qml">playlist/qml/PlaylistDetachedWindow.qml</file> </qresource> diff --git a/po/POTFILES.in b/po/POTFILES.in index d39a436aff35..677f7af478f6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -836,6 +836,7 @@ modules/gui/qt/player/qml/VolumeWidget.qml modules/gui/qt/playlist/qml/PLItem.qml modules/gui/qt/playlist/qml/PlaylistDetachedWindow.qml modules/gui/qt/playlist/qml/PlaylistListView.qml +modules/gui/qt/playlist/qml/PlaylistOverlayMenu.qml modules/gui/qt/playlist/qml/PlaylistToolbar.qml modules/gui/qt/widgets/qml/DNDLabel.qml modules/gui/qt/widgets/qml/DragItem.qml -- GitLab