[vlc-commits] [Git][videolan/vlc][master] 13 commits: qml/Helpers: Add the 'enforceFocus' function
Jean-Baptiste Kempf (@jbk)
gitlab at videolan.org
Mon Sep 6 13:04:29 UTC 2021
Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC
Commits:
38075493 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/Helpers: Add the 'enforceFocus' function
- - - - -
c05ca873 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/KeyNavigableListView: Update focus implementation
- - - - -
0c1ac5b0 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/ExpandGridView: Update focus implementation
- - - - -
c63d972f by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/VideoGroupsDisplay: Passing focus reason when navigating between pages
- - - - -
63910424 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/VideoPlaylistsDisplay: Passing focus reason when navigating between pages
- - - - -
0b1f6b69 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/MusicArtists(s): Add focusReason to requestArtistAlbumView signal
- - - - -
28bbf095 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/MusicGenres(s): Add focusReason to showAlbumView signal
- - - - -
1eba71a1 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/MusicPlaylistsDisplay: Passing focus reason when navigating between pages
- - - - -
08a5af88 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/NetworkHomeDeviceListView: Add focusReason to browse signal
- - - - -
3df8427b by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/NetworkHomeDisplay: Add focusReason and slight refactor
- - - - -
d7188546 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/NetworkBrowseDisplay: Add focusReason to browse signal
- - - - -
700ca96d by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/NetworkBrowseDisplay: Fix navigation on the Table view
- - - - -
484909d5 by Benjamin Arnaud at 2021-09-06T12:52:10+00:00
qml/NetworkDisplay: Refactor and update focus implementation
- - - - -
15 changed files:
- modules/gui/qt/medialibrary/qml/MusicAllArtists.qml
- modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml
- modules/gui/qt/medialibrary/qml/MusicGenres.qml
- modules/gui/qt/medialibrary/qml/MusicGenresDisplay.qml
- modules/gui/qt/medialibrary/qml/MusicPlaylistsDisplay.qml
- modules/gui/qt/medialibrary/qml/VideoGroupsDisplay.qml
- modules/gui/qt/medialibrary/qml/VideoPlaylistsDisplay.qml
- modules/gui/qt/network/qml/NetworkBrowseDisplay.qml
- modules/gui/qt/network/qml/NetworkDisplay.qml
- modules/gui/qt/network/qml/NetworkHomeDeviceListView.qml
- modules/gui/qt/network/qml/NetworkHomeDisplay.qml
- modules/gui/qt/network/qml/ServicesHomeDisplay.qml
- modules/gui/qt/util/qml/Helpers.js
- modules/gui/qt/widgets/qml/ExpandGridView.qml
- modules/gui/qt/widgets/qml/KeyNavigableListView.qml
Changes:
=====================================
modules/gui/qt/medialibrary/qml/MusicAllArtists.qml
=====================================
@@ -40,9 +40,7 @@ FocusScope {
onInitialIndexChanged: resetFocus()
- function requestArtistAlbumView() {
- console.assert(false, "must be reimplemented")
- }
+ signal requestArtistAlbumView(int reason)
function resetFocus() {
if (artistModel.count === 0)
@@ -137,7 +135,7 @@ FocusScope {
medialib.addAndPlay( artistModel.getIdsForIndexes( selectionModel.selectedIndexes ) )
} else {
_currentView.currentIndex = index
- requestArtistAlbumView()
+ requestArtistAlbumView(Qt.TabFocusReason)
medialib.addAndPlay( artistModel.getIdForIndex(index) )
}
}
@@ -171,7 +169,7 @@ FocusScope {
onItemClicked: artistGrid.leftClickOnItem(modifier, index)
- onItemDoubleClicked: root.requestArtistAlbumView(model)
+ onItemDoubleClicked: root.requestArtistAlbumView(Qt.MouseFocusReason)
onContextMenuButtonClicked: {
artistGrid.rightClickOnItem(index)
@@ -206,7 +204,7 @@ FocusScope {
if (selection.length > 1) {
medialib.addAndPlay( artistModel.getIdsForIndexes( selection ) )
} else if ( selection.length === 1) {
- requestArtistAlbumView()
+ requestArtistAlbumView(Qt.TabFocusReason)
medialib.addAndPlay( artistModel.getIdForIndex( selection[0] ) )
}
}
@@ -216,9 +214,8 @@ FocusScope {
{ criteria: "nb_tracks", width: VLCStyle.colWidth(1), text: i18n.qtr("Tracks") }
]
- onItemDoubleClicked: {
- root.requestArtistAlbumView(model)
- }
+ onItemDoubleClicked: root.requestArtistAlbumView(Qt.MouseFocusReason)
+
onContextMenuButtonClicked: contextMenu.popup(selectionModel.selectedIndexes, menuParent.mapToGlobal(0,0))
onRightClick: contextMenu.popup(selectionModel.selectedIndexes, globalMousePos)
=====================================
modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml
=====================================
@@ -64,8 +64,11 @@ Widgets.PageLoader {
MusicAllArtists {
onCurrentIndexChanged: _updateArtistsAllHistory(currentIndex)
- function requestArtistAlbumView() /* override */ {
- history.push([ "mc", "music", "artists", "albums", { initialIndex: currentIndex } ])
+ onRequestArtistAlbumView: {
+ history.push(["mc", "music", "artists", "albums",
+ { initialIndex: currentIndex } ]);
+
+ stackView.currentItem.setCurrentItemFocus(reason);
}
}
}
=====================================
modules/gui/qt/medialibrary/qml/MusicGenres.qml
=====================================
@@ -39,6 +39,8 @@ FocusScope {
property alias _currentView: view.currentItem
+ signal showAlbumView(variant id, string name, int reason)
+
onInitialIndexChanged: resetFocus()
Component.onCompleted: loadView()
@@ -51,10 +53,6 @@ FocusScope {
}
}
- function showAlbumView( m ) {
- history.push([ "mc", "music", "genres", "albums", { parentId: m.id, genreName: m.name } ])
- }
-
function resetFocus() {
if (genreModel.count === 0) {
return
@@ -87,7 +85,8 @@ FocusScope {
medialib.addAndPlay(model.getIdsForIndexes(selectionModel.selectedIndexes))
} else if (selectionModel.selectedIndexes.length === 1) {
var sel = selectionModel.selectedIndexes[0]
- showAlbumView( genreModel.getDataAt(sel) )
+ var model = genreModel.getDataAt(sel)
+ showAlbumView(model.id, model.name, Qt.TabFocusReason)
}
}
@@ -172,7 +171,7 @@ FocusScope {
unselectedUnderlay: shadows.unselected
selectedUnderlay: shadows.selected
- onItemDoubleClicked: root.showAlbumView(model)
+ onItemDoubleClicked: root.showAlbumView(model.id, model.name, Qt.MouseFocusReason)
onItemClicked: gridView_id.leftClickOnItem(modifier, item.index)
onPlayClicked: {
@@ -274,7 +273,7 @@ FocusScope {
]
onItemDoubleClicked: {
- root.showAlbumView(model)
+ root.showAlbumView(model.id, model.name, Qt.MouseFocusReason)
}
onContextMenuButtonClicked: contextMenu.popup(selectionModel.selectedIndexes, menuParent.mapToGlobal(0,0))
=====================================
modules/gui/qt/medialibrary/qml/MusicGenresDisplay.qml
=====================================
@@ -63,6 +63,13 @@ Widgets.PageLoader {
/* List View */
MusicGenres {
onCurrentIndexChanged: _updateGenresAllHistory(currentIndex)
+
+ onShowAlbumView: {
+ history.push(["mc", "music", "genres", "albums",
+ { parentId: id, genreName: name }]);
+
+ stackView.currentItem.setCurrentItemFocus(reason);
+ }
}
}
=====================================
modules/gui/qt/medialibrary/qml/MusicPlaylistsDisplay.qml
=====================================
@@ -96,8 +96,12 @@ Widgets.PageLoader {
onCurrentIndexChanged: _updateHistoryList(currentIndex)
- onShowList: history.push(["mc", "music", "playlists", "list",
- { parentId: model.id, name: model.name }])
+ onShowList: {
+ history.push(["mc", "music", "playlists", "list",
+ { parentId: model.id, name: model.name }]);
+
+ stackView.currentItem.setCurrentItemFocus(reason);
+ }
}
}
=====================================
modules/gui/qt/medialibrary/qml/VideoGroupsDisplay.qml
=====================================
@@ -96,8 +96,12 @@ Widgets.PageLoader {
onCurrentIndexChanged: _updateHistoryAll(currentIndex)
- onShowList: history.push(["mc", "video", "groups", "list",
- { parentId: model.id, name: model.name }])
+ onShowList: {
+ history.push(["mc", "video", "groups", "list",
+ { parentId: model.id, name: model.name }]);
+
+ stackView.currentItem.setCurrentItemFocus(reason);
+ }
}
}
=====================================
modules/gui/qt/medialibrary/qml/VideoPlaylistsDisplay.qml
=====================================
@@ -94,8 +94,12 @@ Widgets.PageLoader {
onCurrentIndexChanged: _updateHistoryList(currentIndex)
- onShowList: history.push(["mc", "video", "playlists", "list",
- { parentId: model.id, name: model.name }])
+ onShowList: {
+ history.push(["mc", "video", "playlists", "list",
+ { parentId: model.id, name: model.name }]);
+
+ stackView.currentItem.setCurrentItemFocus(reason);
+ }
}
}
=====================================
modules/gui/qt/network/qml/NetworkBrowseDisplay.qml
=====================================
@@ -33,8 +33,11 @@ FocusScope {
property var providerModel
property var contextMenu
property var tree
- onTreeChanged: providerModel.tree = tree
+
readonly property var currentIndex: _currentView.currentIndex
+
+ readonly property bool isViewMultiView: true
+
//the index to "go to" when the view is loaded
property var initialIndex: 0
property var sortModel: [
@@ -44,9 +47,13 @@ FocusScope {
property alias _currentView: view.currentItem
- function changeTree(new_tree) {
- history.push(["mc", "network", { tree: new_tree }]);
- }
+ signal browse(variant tree, int reason)
+
+ providerModel: modelMedia
+
+ contextMenu: NetworkMediaContextMenu { model: modelMedia }
+
+ onTreeChanged: providerModel.tree = tree
function playSelected() {
providerModel.addAndPlay(filterModel.mapIndexesToSource(selectionModel.selectedIndexes))
@@ -124,7 +131,7 @@ FocusScope {
var data = filterModel.getDataAt(index)
if (data.type === NetworkMediaModel.TYPE_DIRECTORY
|| data.type === NetworkMediaModel.TYPE_NODE) {
- changeTree(data.tree)
+ browse(data.tree, Qt.TabFocusReason)
} else {
playAt(index)
}
@@ -204,7 +211,7 @@ FocusScope {
onItemDoubleClicked: {
if (model.type === NetworkMediaModel.TYPE_NODE || model.type === NetworkMediaModel.TYPE_DIRECTORY)
- changeTree(model.tree)
+ browse(model.tree, Qt.MouseFocusReason)
else
playAt(index)
}
@@ -278,6 +285,7 @@ FocusScope {
height: layout.implicitHeight + VLCStyle.margin_large + VLCStyle.margin_small
Navigation.navigable: btn.visible
+ Navigation.parentItem: root
RowLayout {
id: layout
=====================================
modules/gui/qt/network/qml/NetworkDisplay.qml
=====================================
@@ -25,81 +25,95 @@ import org.videolan.vlc 0.1
import "qrc:///widgets/" as Widgets
import "qrc:///style/"
-// FIXME: We should refactor this to a PageLoader.
-FocusScope {
+Widgets.PageLoader {
id: root
- property var extraLocalActions: undefined
+ // Properties
+
+ property var sortModel
+ property var contentModel
property bool isViewMultiView: true
+
property var tree: undefined
- onTreeChanged: loadView()
- Component.onCompleted: loadView()
- property var contentModel
- property var sortModel
+ property Component localMenuDelegate
- property alias _currentView: view.currentItem
+ // Settings
- //reset view
- function loadDefaultView() {
- root.tree = undefined
- }
+ defaultPage: "home"
- function setCurrentItemFocus(reason) {
- _currentView.setCurrentItemFocus(reason);
- }
+ pageModel: [{
+ name: "home",
+ url: "qrc:///network/NetworkHomeDisplay.qml"
+ }, {
+ name: "browse",
+ url: "qrc:///network/NetworkBrowseDisplay.qml"
+ }]
- property Component localMenuDelegate
+ // Events
- function loadView() {
- var page = "";
- var props = undefined;
- if (root.tree === undefined) {
- page ="qrc:///network/NetworkHomeDisplay.qml"
- root.localMenuDelegate = null
- isViewMultiView = false
+ onCurrentItemChanged: {
+ sortModel = currentItem.sortModel;
+ contentModel = currentItem.model;
+
+ isViewMultiView = (currentItem.isViewMultiView === undefined
+ ||
+ currentItem.isViewMultiView);
+
+ if (tree) {
+ if (view == "home")
+ localMenuDelegate = null;
+ else
+ localMenuDelegate = componentBar;
} else {
- page = "qrc:///network/NetworkBrowseDisplay.qml"
- props = { providerModel: mediaModel, contextMenu: mediaContextMenu, tree: root.tree }
- root.localMenuDelegate = addressBar
- isViewMultiView = true
+ localMenuDelegate = null;
}
- view.replace(page, props)
+ }
- extraLocalActions = _currentView.extraLocalActions
- _currentView.Navigation.parentItem = root
+ // Functions
+ // PageLoader reimplementation
- if (_currentView.model)
- root.contentModel = _currentView.model
- root.sortModel = _currentView.sortModel
+ // FIXME: Maybe this could be done with a 'guard' mechanism on the pageModel.
+ function loadView() {
+ if (tree)
+ stackView.loadView(pageModel, view, viewProperties);
+ else
+ stackView.loadView(pageModel, "home", viewProperties);
+
+ stackView.currentItem.Navigation.parentItem = root;
+
+ currentItemChanged(stackView.currentItem);
}
- Component {
- id: addressBar
+ // Connections
- NetworkAddressbar {
- path: mediaModel.path
+ Connections {
+ target: stackView.currentItem
+
+ onBrowse: {
+ root.tree = tree;
+
+ history.push(["mc", "network", "browse", { tree: tree }]);
- onHomeButtonClicked: history.push(["mc", "network"])
+ stackView.currentItem.setCurrentItemFocus(reason);
}
}
+ // Children
+
NetworkMediaModel {
- id: mediaModel
+ id: modelMedia
ctx: mainctx
}
- NetworkMediaContextMenu {
- id: mediaContextMenu
-
- model: mediaModel
- }
+ Component {
+ id: componentBar
- Widgets.StackViewExt {
- id: view
+ NetworkAddressbar {
+ path: modelMedia.path
- anchors.fill:parent
- focus: true
+ onHomeButtonClicked: history.push(["mc", "network", "home"])
+ }
}
}
=====================================
modules/gui/qt/network/qml/NetworkHomeDeviceListView.qml
=====================================
@@ -36,6 +36,9 @@ FocusScope {
property int leftPadding: VLCStyle.margin_xlarge
property int _currentIndex: -1
+
+ signal browse(variant tree, int reason)
+
on_CurrentIndexChanged: {
deviceListView.currentIndex = _currentIndex
}
@@ -45,13 +48,14 @@ FocusScope {
}
function _actionAtIndex(index, model, selectionModel) {
- var data = model.getDataAt(index)
+ var data = model.getDataAt(index);
+
if (data.type === NetworkMediaModel.TYPE_DIRECTORY
- || data.type === NetworkMediaModel.TYPE_NODE) {
- history.push(["mc", "network", { tree: data.tree }]);
- } else {
- model.addAndPlay( selectionModel.selectedIndexes )
- }
+ ||
+ data.type === NetworkMediaModel.TYPE_NODE)
+ browse(data.tree, Qt.TabFocusReason);
+ else
+ model.addAndPlay( selectionModel.selectedIndexes);
}
onFocusChanged: {
@@ -110,10 +114,12 @@ FocusScope {
onPlayClicked: deviceModel.addAndPlay( index )
onItemDoubleClicked: {
- if (model.type === NetworkMediaModel.TYPE_NODE || model.type === NetworkMediaModel.TYPE_DIRECTORY)
- history.push( ["mc", "network", { tree: model.tree } ])
+ if (model.type === NetworkMediaModel.TYPE_NODE
+ ||
+ model.type === NetworkMediaModel.TYPE_DIRECTORY)
+ browse(model.tree, Qt.MouseFocusReason);
else
- deviceModel.addAndPlay( index )
+ deviceModel.addAndPlay(index);
}
}
=====================================
modules/gui/qt/network/qml/NetworkHomeDisplay.qml
=====================================
@@ -31,6 +31,13 @@ FocusScope {
id: topFocusScope
focus: true
+ readonly property bool isViewMultiView: false
+
+ signal browse(variant tree, int reason)
+
+ Component.onCompleted: resetFocus()
+ onActiveFocusChanged: resetFocus()
+
function setCurrentItemFocus(reason) {
deviceSection.setCurrentItemFocus(reason);
}
@@ -43,15 +50,6 @@ FocusScope {
}
}
- function _actionAtIndex(index, model, selectionModel) {
- if (selectionModel.items.get(index).model.type === NetworkMediaModel.TYPE_DIRECTORY
- || selectionModel.items.get(index).model.type === NetworkMediaModel.TYPE_NODE) {
- history.push(["mc", "network", { tree: selectionModel.items.get(index).model.tree }]);
- } else {
- model.addAndPlay( selectionModel.selectedIndexes )
- }
- }
-
Label {
anchors.centerIn: parent
visible: (deviceSection.model.count === 0 && lanSection.model.count === 0 )
@@ -89,6 +87,8 @@ FocusScope {
visible: deviceSection.model.count !== 0
onVisibleChanged: topFocusScope.resetFocus()
+ onBrowse: topFocusScope.browse(tree, reason)
+
Navigation.parentItem: topFocusScope
Navigation.downAction: function() {
@@ -122,6 +122,8 @@ FocusScope {
visible: lanSection.model.count !== 0
onVisibleChanged: topFocusScope.resetFocus()
+ onBrowse: topFocusScope.browse(tree, reason)
+
Navigation.parentItem: topFocusScope
Navigation.upAction: function() {
@@ -140,8 +142,6 @@ FocusScope {
}
- Component.onCompleted: resetFocus()
- onActiveFocusChanged: resetFocus()
function resetFocus() {
var widgetlist = [deviceSection, lanSection]
var i;
=====================================
modules/gui/qt/network/qml/ServicesHomeDisplay.qml
=====================================
@@ -67,17 +67,14 @@ Widgets.PageLoader {
path: [{display: deviceModel.name, tree: {}}]
onHomeButtonClicked: history.push(["mc", "discover", "services"])
-
- function changeTree(new_tree) {
- }
}
providerModel: deviceModel
contextMenu: contextMenu
- function changeTree(new_tree) {
- history.push(["mc", "discover", "services", "source_browse", { tree: new_tree, "root_name": deviceModel.name, "source_name": source_name }]);
- }
+ onBrowse: history.push(["mc", "discover", "services", "source_browse",
+ { tree: tree,
+ "root_name": deviceModel.name, "source_name": source_name }])
NetworkDeviceModel {
id: deviceModel
@@ -118,9 +115,8 @@ Widgets.PageLoader {
}
}
- function changeTree(new_tree) {
- history.push(["mc", "discover", "services", "source_browse", { tree: new_tree, "root": root_name }]);
- }
+ onBrowse: history.push(["mc", "discover", "services", "source_browse",
+ { tree: tree, "root": root_name }])
NetworkMediaModel {
id: mediaModel
=====================================
modules/gui/qt/util/qml/Helpers.js
=====================================
@@ -52,3 +52,10 @@ function get(dict, key, defaultValue) {
var v = typeof dict !== "undefined" ? dict[key] : undefined
return !v ? defaultValue : v
}
+
+// NOTE: This allows us to force another 'reason' even when the item has activeFocus.
+function enforceFocus(item, reason) {
+ item.focus = false;
+
+ item.forceActiveFocus(reason);
+}
=====================================
modules/gui/qt/widgets/qml/ExpandGridView.qml
=====================================
@@ -20,6 +20,7 @@ import QtQuick.Controls 2.4
import org.videolan.vlc 0.1
import "qrc:///style/"
+import "qrc:///util/Helpers.js" as Helpers
FocusScope {
id: root
@@ -101,16 +102,20 @@ FocusScope {
Accessible.role: Accessible.Table
function setCurrentItemFocus(reason) {
- if (!model || model.count === 0 || currentIndex === -1 || expandIndex !== -1)
- return;
+ // NOTE: Saving the focus reason for later.
_currentFocusReason = reason;
+ if (!model || model.count === 0 || currentIndex === -1 || expandIndex !== -1) {
+ // NOTE: By default we want the focus on the flickable.
+ flickable.forceActiveFocus(reason);
+
+ return;
+ }
+
if (_containsItem(currentIndex))
- _getItem(currentIndex).forceActiveFocus(reason);
+ Helpers.enforceFocus(_getItem(currentIndex), reason);
else
- // NOTE: By default we want the focus on the flickable. This is useful when no item is
- // instanciated.
flickable.forceActiveFocus(reason);
// NOTE: We make sure the current item is fully visible.
=====================================
modules/gui/qt/widgets/qml/KeyNavigableListView.qml
=====================================
@@ -20,6 +20,7 @@ import QtQuick.Controls 2.4
import org.videolan.vlc 0.1
import "qrc:///style/"
+import "qrc:///util/Helpers.js" as Helpers
FocusScope {
id: listview_id
@@ -38,6 +39,10 @@ FocusScope {
property bool keyNavigationWraps : false
+ // Private
+
+ property int _currentFocusReason: Qt.OtherFocusReason
+
// Aliases
//forward view properties
@@ -97,18 +102,34 @@ FocusScope {
Accessible.role: Accessible.List
+ // Events
+
+ onCurrentItemChanged: {
+ if (_currentFocusReason === Qt.OtherFocusReason)
+ return;
+
+ if (currentItem)
+ Helpers.enforceFocus(currentItem, _currentFocusReason);
+
+ _currentFocusReason = Qt.OtherFocusReason;
+ }
+
// Functions
function setCurrentItemFocus(reason) {
- if (!model || model.count === 0)
+ if (!model || model.count === 0) {
+ // NOTE: Saving the focus reason for later.
+ _currentFocusReason = reason;
+
return;
+ }
if (currentIndex === -1)
currentIndex = 0;
positionViewAtIndex(currentIndex, ItemView.Contain);
- currentItem.forceActiveFocus(reason);
+ Helpers.enforceFocus(currentItem, reason);
}
function nextPage() {
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/85e1eb7a50cb7e59bba3a3990af2f149cec5eac9...484909d5d5bf71976d59b5e7d0bdfde9fb2ca743
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/85e1eb7a50cb7e59bba3a3990af2f149cec5eac9...484909d5d5bf71976d59b5e7d0bdfde9fb2ca743
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list