[vlc-devel] [PATCH 03/10] qml: support custom delegate in local menu group

Prince Gupta guptaprince8832 at gmail.com
Fri Nov 20 18:29:36 CET 2020


---
 .../qt/maininterface/qml/BannerSources.qml    | 58 ++++++++++---------
 .../gui/qt/maininterface/qml/MainDisplay.qml  | 18 ++----
 .../gui/qt/medialibrary/qml/MusicDisplay.qml  |  7 +++
 .../gui/qt/network/qml/DiscoverDisplay.qml    | 13 +++++
 4 files changed, 57 insertions(+), 39 deletions(-)

diff --git a/modules/gui/qt/maininterface/qml/BannerSources.qml b/modules/gui/qt/maininterface/qml/BannerSources.qml
index 9a7c91d69c..50572ec303 100644
--- a/modules/gui/qt/maininterface/qml/BannerSources.qml
+++ b/modules/gui/qt/maininterface/qml/BannerSources.qml
@@ -26,7 +26,7 @@ import QtQml.Models 2.11
 import "qrc:///style/"
 import "qrc:///widgets/" as Widgets
 import "qrc:///menus/" as Menus
-
+import "qrc:///util/KeyHelper.js" as KeyHelper
 
 Widgets.NavigableFocusScope {
     id: root
@@ -41,16 +41,15 @@ Widgets.NavigableFocusScope {
     property int subSelectedIndex: 0
 
     signal itemClicked(int index)
-    signal subItemClicked(int index)
 
     property alias sortModel: sortControl.model
     property var contentModel
 
     property alias model: pLBannerSources.model
-    property alias subTabModel: localMenuGroup.model
     signal toogleMenu()
 
     property var extraLocalActions: undefined
+    property alias localMenuDelegate: localMenuGroup.sourceComponent
 
     // Triggered when the toogleView button is selected
     function toggleView () {
@@ -280,42 +279,49 @@ Widgets.NavigableFocusScope {
                     }
 
                     navigationParent: root
-                    navigationRightItem: localMenuGroup
+                    navigationRightItem: localMenuGroup.visible ? localMenuGroup : playlistGroup
                     navigationUpItem: globalMenuGroup
                 }
 
-                Widgets.NavigableRow {
+                Loader {
                     id: localMenuGroup
-                    anchors {
-                        top: parent.top
-                        bottom: parent.bottom
-                        horizontalCenter: parent.horizontalCenter
-                    }
 
-                    visible: !!model
-                    enabled: !!model
+                    anchors.centerIn: parent
+                    focus: !!item && item.focus && item.visible
+                    visible: !!item
+
                     onVisibleChanged: {
                         //reset the focus on the global group when the local group is hidden,
                         //this avoids losing the focus if the subview changes
                         if (!visible && localMenuGroup.focus) {
-                                        localMenuGroup.focus = false
-                                        globalMenuGroup.focus = true
+                            localMenuGroup.focus = false
+                            globalMenuGroup.focus = true
                         }
                     }
 
-                    delegate: Widgets.BannerTabButton {
-                        text: model.displayText
-                        selected: model.index === subSelectedIndex
-                        onClicked:  root.subItemClicked(model.index)
-                        height: localMenuGroup.height
-                        color: VLCStyle.colors.bg
-                        colorSelected: VLCStyle.colors.bg
+                    onItemChanged: {
+                        if (!item)
+                            return
+                        if (item.hasOwnProperty("navigationParent")) {
+                            item.navigationParent = root
+                            item.navigationLeftItem = localContextGroup.enabled ? localContextGroup : undefined
+                            item.navigationRightItem = playlistGroup.enabled ? playlistGroup : undefined
+                            item.navigationUpItem = globalMenuGroup
+                        } else {
+                            item.KeyNavigation.left = localContextGroup.enabled ? localContextGroup : undefined
+                            item.KeyNavigation.right = playlistGroup.enabled ? playlistGroup : undefined
+                            item.KeyNavigation.up = globalMenuGroup
+                            item.Keys.pressed.connect(function (event) {
+                                if (event.accepted)
+                                    return
+                                if (KeyHelper.matchDown(event)) {
+                                    root.navigationDown()
+                                    event.accepted = true
+                                }
+                            })
+                        }
                     }
 
-                    navigationParent: root
-                    navigationLeftItem: localContextGroup.enabled ? localContextGroup : undefined
-                    navigationRightItem: playlistGroup.enabled ? playlistGroup : undefined
-                    navigationUpItem:  globalMenuGroup
                 }
 
                 Widgets.NavigableRow {
@@ -368,7 +374,7 @@ Widgets.NavigableFocusScope {
                     }
 
                     navigationParent: root
-                    navigationLeftItem: localMenuGroup
+                    navigationLeftItem: localMenuGroup.visible ? localMenuGroup : localContextGroup
                     navigationUpItem: globalMenuGroup
                 }
             }
diff --git a/modules/gui/qt/maininterface/qml/MainDisplay.qml b/modules/gui/qt/maininterface/qml/MainDisplay.qml
index ed40c8f714..2579db8650 100644
--- a/modules/gui/qt/maininterface/qml/MainDisplay.qml
+++ b/modules/gui/qt/maininterface/qml/MainDisplay.qml
@@ -56,10 +56,10 @@ Widgets.NavigableFocusScope {
             return miniPlayer.expanded ? miniPlayer : medialibId
         })
 
-        sourcesBanner.subTabModel = stackView.currentItem.tabModel
-        sourcesBanner.sortModel = stackView.currentItem.sortModel
-        sourcesBanner.contentModel = stackView.currentItem.contentModel
-        sourcesBanner.extraLocalActions = stackView.currentItem.extraLocalActions
+        sourcesBanner.localMenuDelegate = Qt.binding(function () { return !!stackView.currentItem.localMenuDelegate ? stackView.currentItem.localMenuDelegate : null })
+        sourcesBanner.sortModel = Qt.binding(function () { return stackView.currentItem.sortModel  })
+        sourcesBanner.contentModel = Qt.binding(function () { return stackView.currentItem.contentModel })
+        sourcesBanner.extraLocalActions = Qt.binding(function () { return stackView.currentItem.extraLocalActions })
         // Restore sourcesBanner state
         sourcesBanner.selectedIndex = pageModel.filter(function (e) {
             return e.listed;
@@ -169,20 +169,12 @@ Widgets.NavigableFocusScope {
                     model: root.tabModel
 
                     onItemClicked: {
-                        sourcesBanner.subTabModel = undefined
+                        sourcesBanner.localMenuDelegate = null
                         var name = root.tabModel.get(index).name
                         selectedIndex = index
                         history.push(["mc", name])
                     }
 
-                    onSubItemClicked: {
-                        subSelectedIndex = index
-                        stackView.currentItem.loadIndex(index)
-                        sortModel = stackView.currentItem.sortModel
-                        contentModel = stackView.currentItem.contentModel
-                        extraLocalActions = stackView.currentItem.extraLocalActions
-                    }
-
                     navigationParent: medialibId
                     navigationDownItem: stackView
                 }
diff --git a/modules/gui/qt/medialibrary/qml/MusicDisplay.qml b/modules/gui/qt/medialibrary/qml/MusicDisplay.qml
index 5e693f9fc8..5dc10cd8d8 100644
--- a/modules/gui/qt/medialibrary/qml/MusicDisplay.qml
+++ b/modules/gui/qt/medialibrary/qml/MusicDisplay.qml
@@ -72,4 +72,11 @@ Widgets.PageLoader {
             })
         }
     }
+
+    property Component localMenuDelegate: Widgets.LocalTabBar {
+        currentView: root.view
+        model: tabModel
+
+        onClicked: root.loadIndex(index)
+    }
 }
diff --git a/modules/gui/qt/network/qml/DiscoverDisplay.qml b/modules/gui/qt/network/qml/DiscoverDisplay.qml
index c5c733edbf..49b0f21f24 100644
--- a/modules/gui/qt/network/qml/DiscoverDisplay.qml
+++ b/modules/gui/qt/network/qml/DiscoverDisplay.qml
@@ -67,4 +67,17 @@ Widgets.PageLoader {
             })
         }
     }
+
+    property Component localMenuDelegate: menuDelegate
+
+    Component {
+        id: menuDelegate
+
+        Widgets.LocalTabBar {
+            currentView: root.view
+            model: tabModel
+
+            onClicked: root.loadIndex(index)
+        }
+    }
 }
-- 
2.25.1



More information about the vlc-devel mailing list