[vlc-devel] [PATCH 1/2] qml: factorize page loading

Pierre Lamot pierre at videolabs.io
Wed Sep 30 17:52:55 CEST 2020


---
 modules/gui/qt/Makefile.am                    |  1 +
 .../medialibrary/qml/MusicArtistsDisplay.qml  | 35 ++-------
 .../gui/qt/medialibrary/qml/MusicDisplay.qml  | 57 ++++-----------
 .../medialibrary/qml/MusicGenresDisplay.qml   | 41 +++--------
 .../gui/qt/network/qml/DiscoverDisplay.qml    | 59 ++++-----------
 .../qt/network/qml/ServicesHomeDisplay.qml    | 37 ++--------
 modules/gui/qt/vlc.qrc                        |  1 +
 modules/gui/qt/widgets/qml/PageLoader.qml     | 71 +++++++++++++++++++
 8 files changed, 119 insertions(+), 183 deletions(-)
 create mode 100644 modules/gui/qt/widgets/qml/PageLoader.qml

diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index f775bbb5d1..cfd24af76e 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -716,6 +716,7 @@ libqt_plugin_la_QML = \
 	gui/qt/widgets/qml/SortControl.qml \
 	gui/qt/widgets/qml/SpinBoxExt.qml \
 	gui/qt/widgets/qml/StackViewExt.qml \
+	gui/qt/widgets/qml/PageLoader.qml \
 	gui/qt/widgets/qml/TabButtonExt.qml \
 	gui/qt/widgets/qml/TableColumns.qml \
 	gui/qt/widgets/qml/TextToolButton.qml \
diff --git a/modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml b/modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml
index a7ca1b6646..1e7161f4d6 100644
--- a/modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml
+++ b/modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml
@@ -27,15 +27,13 @@ import "qrc:///widgets/" as Widgets
 import "qrc:///style/"
 
 
-Widgets.NavigableFocusScope {
+Widgets.PageLoader {
     id: root
 
-    //name and properties of the tab to be initially loaded
-    property string view: "all"
-    property var viewProperties: ({})
     property var model
 
-    readonly property var pageModel: [{
+    defaultPage: "all"
+    pageModel: [{
         name: "all",
         component: artistGridComponent
     }, {
@@ -43,24 +41,8 @@ Widgets.NavigableFocusScope {
         component: artistAlbumsComponent
     }]
 
-    Component.onCompleted: loadView()
-    onViewChanged: {
-        viewProperties = {}
-        loadView()
-    }
-    onViewPropertiesChanged: loadView()
-
-    function loadDefaultView() {
-        root.view = "all"
-        root.viewProperties= ({})
-    }
-
-    function loadView() {
-        var found = stackView.loadView(root.pageModel, view, viewProperties)
-        if (!found)
-            stackView.replace(root.pageModel[0].component)
-        stackView.currentItem.navigationParent = root
-        model = stackView.currentItem.model
+    onCurrentItemChanged: {
+        model = currentItem.model
     }
 
     function _updateArtistsAllHistory(currentIndex) {
@@ -261,11 +243,4 @@ Widgets.NavigableFocusScope {
             onCurrentAlbumIndexChanged: _updateArtistsAlbumsHistory(currentIndex, currentAlbumIndex)
         }
     }
-
-    Widgets.StackViewExt {
-        id: stackView
-
-        anchors.fill: parent
-        focus: true
-    }
 }
diff --git a/modules/gui/qt/medialibrary/qml/MusicDisplay.qml b/modules/gui/qt/medialibrary/qml/MusicDisplay.qml
index ca33a1fc46..5e693f9fc8 100644
--- a/modules/gui/qt/medialibrary/qml/MusicDisplay.qml
+++ b/modules/gui/qt/medialibrary/qml/MusicDisplay.qml
@@ -27,44 +27,14 @@ import "qrc:///style/"
 
 import org.videolan.medialib 0.1
 
-Widgets.NavigableFocusScope {
+Widgets.PageLoader {
     id: root
 
-    //name and properties of the tab to be initially loaded
-    property string view: "artists"
-    property var viewProperties: ({})
-
     property var sortModel
     property var contentModel
 
-    onViewChanged: {
-        viewProperties = ({})
-        loadView()
-    }
-    onViewPropertiesChanged: loadView()
-    Component.onCompleted: loadView()
-
-    function loadView() {
-        var found = stackView.loadView(root.pageModel, view, viewProperties)
-        if (!found)
-            stackView.replace(root.pageModel[0].component)
-
-        stackView.currentItem.navigationParent = root
-        sortModel = stackView.currentItem.sortModel
-        contentModel = stackView.currentItem.model
-    }
-
-    //reset view
-    function loadDefaultView() {
-        root.view = "artists"
-        root.viewProperties= ({})
-    }
-
-    function loadIndex(index) {
-        history.push(["mc", "music", root.pageModel[index].name])
-    }
-
-    readonly property var pageModel: [{
+    defaultPage: "artists"
+    pageModel: [{
             displayText: i18n.qtr("Artists"),
             name: "artists",
             url: "qrc:///medialibrary/MusicArtistsDisplay.qml"
@@ -83,6 +53,15 @@ Widgets.NavigableFocusScope {
         }
     ]
 
+    onCurrentItemChanged: {
+        sortModel = currentItem.sortModel
+        contentModel = currentItem.model
+    }
+
+    function loadIndex(index) {
+        history.push(["mc", "music", root.pageModel[index].name])
+    }
+
     property var tabModel: ListModel {
         Component.onCompleted: {
             pageModel.forEach(function(e) {
@@ -93,16 +72,4 @@ Widgets.NavigableFocusScope {
             })
         }
     }
-
-    /* The data elements */
-    Widgets.StackViewExt  {
-        id: stackView
-        anchors.fill: parent
-        focus: true
-
-        onCurrentItemChanged: {
-            sortModel = stackView.currentItem.sortModel
-            contentModel = stackView.currentItem.model
-        }
-    }
 }
diff --git a/modules/gui/qt/medialibrary/qml/MusicGenresDisplay.qml b/modules/gui/qt/medialibrary/qml/MusicGenresDisplay.qml
index ced5c1acc9..16afffff07 100644
--- a/modules/gui/qt/medialibrary/qml/MusicGenresDisplay.qml
+++ b/modules/gui/qt/medialibrary/qml/MusicGenresDisplay.qml
@@ -25,17 +25,11 @@ import "qrc:///util/" as Util
 import "qrc:///widgets/" as Widgets
 import "qrc:///style/"
 
-Widgets.NavigableFocusScope {
+Widgets.PageLoader {
     id: root
 
-    //name and properties of the tab to be initially loaded
-    property string view: "all"
-    property var viewProperties: ({})
-
-    property var sortModel
-    property var model
-
-    readonly property var pageModel: [{
+    defaultPage: "all"
+    pageModel: [{
         name: "all",
         component: genresComponent
     }, {
@@ -43,26 +37,14 @@ Widgets.NavigableFocusScope {
         component: albumGenreComponent
     }]
 
-    Component.onCompleted: loadView()
-    onViewChanged: {
-        viewProperties = {}
-        loadView()
-    }
-    onViewPropertiesChanged: loadView()
+    property var sortModel
+    property var model
 
-    function loadDefaultView() {
-        root.view = "all"
-        root.viewProperties= ({})
+    onCurrentItemChanged: {
+        sortModel = currentItem.sortModel
+        model = currentItem.model
     }
 
-    function loadView() {
-        var found = stackView.loadView(root.pageModel, view, viewProperties)
-        if (!found)
-            stackView.replace(root.pageModel[0].component)
-        stackView.currentItem.navigationParent = root
-        sortModel = stackView.currentItem.sortModel
-        model = stackView.currentItem.model
-    }
 
     function _updateGenresAllHistory(currentIndex) {
         history.update(["mc", "music", "genres", "all", { "initialIndex": currentIndex }])
@@ -107,11 +89,4 @@ Widgets.NavigableFocusScope {
             onCurrentIndexChanged: _updateGenresAlbumsHistory(currentIndex, parentId, genreName)
         }
     }
-
-    Widgets.StackViewExt {
-        id: stackView
-
-        anchors.fill: parent
-        focus: true
-    }
 }
diff --git a/modules/gui/qt/network/qml/DiscoverDisplay.qml b/modules/gui/qt/network/qml/DiscoverDisplay.qml
index c03a3e3ec5..fc2275549a 100644
--- a/modules/gui/qt/network/qml/DiscoverDisplay.qml
+++ b/modules/gui/qt/network/qml/DiscoverDisplay.qml
@@ -27,44 +27,16 @@ import "qrc:///widgets/" as Widgets
 import "qrc:///util/" as Util
 import "qrc:///style/"
 
-Widgets.NavigableFocusScope {
+Widgets.PageLoader {
     id: root
 
-    //name and properties of the tab to be initially loaded
-    property string view: "services"
-    property var viewProperties: ({})
-
     property var sortModel
     property var contentModel
 
-    onViewChanged: {
-        viewProperties = ({})
-        loadView()
-    }
-    onViewPropertiesChanged: loadView()
-    Component.onCompleted: loadView()
-
-    function loadView() {
-        var found = stackView.loadView(root.pageModel, view, viewProperties)
-        if (!found)
-            stackView.replace(root.pageModel[0].component)
-
-        stackView.currentItem.navigationParent = root
-        sortModel = stackView.currentItem.sortModel
-        contentModel = stackView.currentItem.model
-    }
-
-    //reset view
-    function loadDefaultView() {
-        root.view = "services"
-        root.viewProperties= ({})
-    }
-
-    function loadIndex(index) {
-        history.push(["mc", "discover", root.pageModel[index].name])
-    }
+    //name and properties of the tab to be initially loaded
+    defaultPage: "services"
 
-    readonly property var pageModel: [{
+    pageModel: [{
             displayText: i18n.qtr("Services"),
             name: "services",
             url: "qrc:///network/ServicesHomeDisplay.qml"
@@ -75,6 +47,17 @@ Widgets.NavigableFocusScope {
         }
     ]
 
+    onCurrentItemChanged: {
+        sortModel = currentItem.sortModel
+        contentModel = currentItem.model
+    }
+
+
+    function loadIndex(index) {
+        history.push(["mc", "discover", root.pageModel[index].name])
+    }
+
+
     property var tabModel: ListModel {
         Component.onCompleted: {
             pageModel.forEach(function(e) {
@@ -85,16 +68,4 @@ Widgets.NavigableFocusScope {
             })
         }
     }
-
-    /* The data elements */
-    Widgets.StackViewExt  {
-        id: stackView
-        anchors.fill: parent
-        focus: true
-
-        onCurrentItemChanged: {
-            sortModel = stackView.currentItem.sortModel
-            contentModel = stackView.currentItem.model
-        }
-    }
 }
diff --git a/modules/gui/qt/network/qml/ServicesHomeDisplay.qml b/modules/gui/qt/network/qml/ServicesHomeDisplay.qml
index cc8c7135f4..0277039de1 100644
--- a/modules/gui/qt/network/qml/ServicesHomeDisplay.qml
+++ b/modules/gui/qt/network/qml/ServicesHomeDisplay.qml
@@ -27,16 +27,14 @@ import "qrc:///widgets/" as Widgets
 import "qrc:///util/" as Util
 import "qrc:///style/"
 
-Widgets.NavigableFocusScope {
+Widgets.PageLoader {
     id: root
 
-    property string view: "all"
-    property var viewProperties: ({})
-
     property var sortModel
     property var model
 
-    readonly property var pageModel: [{
+    defaultPage: "all"
+    pageModel: [{
         name: "all",
         component: allSourcesComponent
     }, {
@@ -50,23 +48,9 @@ Widgets.NavigableFocusScope {
         component: sourceBrowseComponent
     }]
 
-    Component.onCompleted: loadView()
-    onViewChanged: {
-        viewProperties = {}
-        loadView()
-    }
-    onViewPropertiesChanged: loadView()
-
-    function loadDefaultView() {
-        root.view = "all"
-        root.viewProperties = ({})
-    }
-
-    function loadView() {
-        var found = stackView.loadView(root.pageModel, view, viewProperties)
-        if (!found)
-            stackView.replace(root.pageModel[0].component)
-        stackView.currentItem.navigationParent = root
+    onCurrentItemChanged: {
+        sortModel = currentItem.sortModel
+        contentModel = currentItem.model
     }
 
     Component {
@@ -360,13 +344,4 @@ Widgets.NavigableFocusScope {
             }
         }
     }
-
-
-
-    Widgets.StackViewExt {
-        id: stackView
-
-        anchors.fill: parent
-        focus: true
-    }
 }
diff --git a/modules/gui/qt/vlc.qrc b/modules/gui/qt/vlc.qrc
index ec13267124..8c495e9c55 100644
--- a/modules/gui/qt/vlc.qrc
+++ b/modules/gui/qt/vlc.qrc
@@ -225,6 +225,7 @@
         <file alias="HorizontalResizeHandle.qml">widgets/qml/HorizontalResizeHandle.qml</file>
         <file alias="PointingTooltip.qml">widgets/qml/PointingTooltip.qml</file>
         <file alias="FrostedGlassEffect.qml">widgets/qml/FrostedGlassEffect.qml</file>
+	<file alias="PageLoader.qml">widgets/qml/PageLoader.qml</file>
     </qresource>
     <qresource prefix="/util">
         <file alias="SelectableDelegateModel.qml">util/qml/SelectableDelegateModel.qml</file>
diff --git a/modules/gui/qt/widgets/qml/PageLoader.qml b/modules/gui/qt/widgets/qml/PageLoader.qml
new file mode 100644
index 0000000000..b6d02c9259
--- /dev/null
+++ b/modules/gui/qt/widgets/qml/PageLoader.qml
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * 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.0
+
+NavigableFocusScope {
+    id: root
+
+    property string view: defaultPage
+    property var viewProperties: ({})
+
+    property string defaultPage: ""
+
+    property var pageModel: []
+
+    signal pageChanged(string page)
+    signal currentItemChanged(var currentItem)
+
+    Component.onCompleted: loadView()
+    onViewChanged: {
+        viewProperties = {}
+        loadView()
+    }
+    onViewPropertiesChanged: loadView()
+
+    function loadDefaultView() {
+        root.view = defaultPage
+        root.viewProperties = ({})
+    }
+
+    function loadView() {
+        if (view === "") {
+            console.error("view is not defined")
+            return
+        }
+        if (pageModel === []) {
+            console.error("pageModel is not defined")
+            return
+        }
+        var found = stackView.loadView(root.pageModel, view, viewProperties)
+        if (!found)
+            stackView.replace(root.pageModel[0].component)
+
+        if (stackView.currentItem && stackView.currentItem.hasOwnProperty("navigationParent")) {
+            stackView.currentItem.navigationParent = root
+        }
+    }
+
+    StackViewExt {
+        id: stackView
+
+        anchors.fill: parent
+        focus: true
+
+        onCurrentItemChanged: root.currentItemChanged(stackView.currentItem)
+    }
+}
-- 
2.25.1



More information about the vlc-devel mailing list