[vlc-commits] QML: implement keyboard navigation to the mini player

Adrien Maglo git at videolan.org
Tue Jul 16 16:01:22 CEST 2019


vlc | branch: master | Adrien Maglo <magsoft at videolan.org> | Tue Jun 18 15:11:15 2019 +0200| [72d205abec9b7742a763ff96bc9c653e8a170c15] | committer: Jean-Baptiste Kempf

QML: implement keyboard navigation to the mini player

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=72d205abec9b7742a763ff96bc9c653e8a170c15
---

 modules/gui/qt/qml/mediacenter/MCMainDisplay.qml | 161 ++++++++++++++---------
 modules/gui/qt/qml/mediacenter/MiniPlayer.qml    |  12 +-
 2 files changed, 110 insertions(+), 63 deletions(-)

diff --git a/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml b/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
index d5d07e9f2e..3e74cf9a4d 100644
--- a/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
+++ b/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
@@ -130,82 +130,121 @@ Utils.NavigableFocusScope {
                         contentModel = stackView.currentItem.contentModel
                     }
 
-                    onActionDown: stackView.focus = true
+                    onActionDown: stackViewZone.focus = true
                     onActionLeft: root.actionLeft(index)
                     onActionRight: root.actionRight(index)
                     onActionUp: root.actionUp(index)
                     onActionCancel: root.actionCancel(index)
                 }
 
-                Utils.StackViewExt {
-                    id: stackView
+                Item {
                     Layout.fillWidth: true
                     Layout.fillHeight: true
-                    Component.onCompleted: {
-                        var found = stackView.loadView(root.pageModel, root.view, root.viewProperties)
-                        sourcesBanner.subTabModel = stackView.currentItem.tabModel
-                        sourcesBanner.sortModel = stackView.currentItem.sortModel
-                        sourcesBanner.contentModel = stackView.currentItem.contentModel
-                        // Restore sourcesBanner state
-                        sourcesBanner.selectedIndex = pageModel.findIndex(function (e) {
-                            return e.name === root.view
-                        })
-                        if (stackView.currentItem.pageModel !== undefined)
-                            sourcesBanner.subSelectedIndex = stackView.currentItem.pageModel.findIndex(function (e) {
-                                return e.name === stackView.currentItem.view
-                            })
-                    }
 
-                    Utils.Drawer {
-                        z: 1
-                        id: playlist
-                        anchors {
-                            top: parent.top
-                            right: parent.right
-                            bottom: parent.bottom
+                    Utils.NavigableFocusScope {
+                        id: stackViewZone
+                        anchors.fill: parent
+
+                        Rectangle {
+                            visible: parent.focus
+                            anchors.fill: parent
+                            color: "transparent"
+                            border.width: VLCStyle.selectedBorder
+                            border.color: VLCStyle.colors.accent
                         }
-                        focus: false
-                        expandHorizontally: true
 
-                        state: (rootWindow.playlistDocked && rootWindow.playlistVisible) ? "visible" : "hidden"
-                        onVisibleChanged: {
-                            if (playlist.visible)
-                                playlist.forceActiveFocus()
+                        onActionUp: sourcesBanner.focus = true
+                        onActionDown: {
+                            if (miniPlayer.expanded)
+                                miniPlayer.focus = true
+                        }
+
+                        Keys.onPressed: {
+                            if (!event.accepted)
+                                defaultKeyAction(event, 0)
+                        }
+                        Keys.onReleased: {
+                            if (!event.accepted && (event.key === Qt.Key_Return || event.key === Qt.Key_Space)) {
+                                event.accepted = true
+                                stackView.focus = true
+                            }
+                        }
+                    }
+
+                    Utils.StackViewExt {
+                        id: stackView
+                        anchors.fill: parent
+
+                        Component.onCompleted: {
+                            var found = stackView.loadView(root.pageModel, root.view, root.viewProperties)
+                            sourcesBanner.subTabModel = stackView.currentItem.tabModel
+                            sourcesBanner.sortModel = stackView.currentItem.sortModel
+                            sourcesBanner.contentModel = stackView.currentItem.contentModel
+                            // Restore sourcesBanner state
+                            sourcesBanner.selectedIndex = pageModel.findIndex(function (e) {
+                                return e.name === root.view
+                            })
+                            if (stackView.currentItem.pageModel !== undefined)
+                                sourcesBanner.subSelectedIndex = stackView.currentItem.pageModel.findIndex(function (e) {
+                                    return e.name === stackView.currentItem.view
+                                })
                         }
-                        component: Rectangle {
-                            color: VLCStyle.colors.setColorAlpha(VLCStyle.colors.banner, 0.9)
-                            width: root.width/3
-                            height: playlist.height
-
-                            MouseArea {
-                                anchors.fill: parent
-                                propagateComposedEvents: false
-                                hoverEnabled: true
-                                preventStealing: true
-                                onWheel: event.accepted = true
-
-                                PL.PlaylistListView {
-                                    id: playlistView
-                                    focus: true
+
+                        Utils.Drawer {
+                            z: 1
+                            id: playlist
+                            anchors {
+                                top: parent.top
+                                right: parent.right
+                                bottom: parent.bottom
+                            }
+                            focus: false
+                            expandHorizontally: true
+
+                            state: (rootWindow.playlistDocked && rootWindow.playlistVisible) ? "visible" : "hidden"
+                            onVisibleChanged: {
+                                if (playlist.visible)
+                                    playlist.forceActiveFocus()
+                            }
+                            component: Rectangle {
+                                color: VLCStyle.colors.setColorAlpha(VLCStyle.colors.banner, 0.9)
+                                width: root.width/3
+                                height: playlist.height
+
+                                MouseArea {
                                     anchors.fill: parent
-                                    onActionLeft: playlist.closeAndFocus(stackView.currentItem)
-                                    onActionCancel: playlist.closeAndFocus(stackView.currentItem)
-                                    onActionUp: playlist.closeAndFocus(sourcesBanner)
+                                    propagateComposedEvents: false
+                                    hoverEnabled: true
+                                    preventStealing: true
+                                    onWheel: event.accepted = true
+
+                                    PL.PlaylistListView {
+                                        id: playlistView
+                                        focus: true
+                                        anchors.fill: parent
+                                        onActionLeft: playlist.closeAndFocus(stackView.currentItem)
+                                        onActionCancel: playlist.closeAndFocus(stackView.currentItem)
+                                        onActionUp: playlist.closeAndFocus(sourcesBanner)
+                                    }
                                 }
                             }
-                        }
-                        function closeAndFocus(item){
-                            if (!item)
-                                return
+                            function closeAndFocus(item){
+                                if (!item)
+                                    return
 
-                            rootWindow.playlistVisible = false
-                            item.forceActiveFocus()
+                                rootWindow.playlistVisible = false
+                                item.forceActiveFocus()
+                            }
                         }
                     }
                 }
 
                 MiniPlayer {
                     id: miniPlayer
+
+                    onActionUp: stackViewZone.focus = true
+                    onActionCancel: sourcesBanner.focus = true
+                    onActionDown: medialibId.actionDown(index)
                 }
             }
 
@@ -214,11 +253,15 @@ Utils.NavigableFocusScope {
                 ignoreUnknownSignals: true
 
                 onActionUp: sourcesBanner.focus = true
-                onActionCancel: sourcesBanner.focus = true
-
-                onActionLeft:   medialibId.actionLeft(index)
-                onActionRight:  medialibId.actionRight(index)
-                onActionDown:   medialibId.actionDown(index)
+                onActionCancel: stackViewZone.focus = true
+                onActionLeft: medialibId.actionLeft(index)
+                onActionRight: medialibId.actionRight(index)
+                onActionDown: {
+                    if (miniPlayer.expanded)
+                        miniPlayer.focus = true
+                    else
+                        medialibId.actionDown(index)
+                }
             }
         }
 
diff --git a/modules/gui/qt/qml/mediacenter/MiniPlayer.qml b/modules/gui/qt/qml/mediacenter/MiniPlayer.qml
index b302b53063..f9c953be2e 100644
--- a/modules/gui/qt/qml/mediacenter/MiniPlayer.qml
+++ b/modules/gui/qt/qml/mediacenter/MiniPlayer.qml
@@ -13,6 +13,8 @@ Utils.NavigableFocusScope {
 
     Layout.fillWidth: true
 
+    readonly property bool expanded: root.implicitHeight === root.childrenRect.height
+
     Component.onCompleted : {
         if (player.playingState === PlayerController.PLAYING_STATE_STOPPED)
             root.implicitHeight = 0;
@@ -90,10 +92,7 @@ Utils.NavigableFocusScope {
             }
 
             Row {
-                focus: true
-
                 Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
-
                 rightPadding: VLCStyle.margin_normal
 
                 Utils.IconToolButton {
@@ -137,7 +136,7 @@ Utils.NavigableFocusScope {
                     id: repeatBtn
                     size: VLCStyle.icon_normal
                     checked: mainPlaylistController.repeatMode !== PlaylistControllerModel.PLAYBACK_REPEAT_NONE
-                    text: (mainPlaylistController.repeatMode == PlaylistControllerModel.PLAYBACK_REPEAT_CURRENT)
+                    text: (mainPlaylistController.repeatMode === PlaylistControllerModel.PLAYBACK_REPEAT_CURRENT)
                                  ? VLCIcons.repeat_one
                                  : VLCIcons.repeat_all
                     onClicked: mainPlaylistController.toggleRepeatMode()
@@ -145,4 +144,9 @@ Utils.NavigableFocusScope {
             }
         }
     }
+
+    Keys.onPressed: {
+        if (!event.accepted)
+            defaultKeyAction(event, 0)
+    }
 }



More information about the vlc-commits mailing list