From 72f7b3750315cca39fc73c0d56567c6dd878aac8 Mon Sep 17 00:00:00 2001
From: Franck LAURENT <franck.laurent@savoirfairelinux.com>
Date: Tue, 4 Apr 2023 15:44:38 -0400
Subject: [PATCH] SettingsPage: dynamically load the individual pages of the
 settings view

Replace StackLayout with StackView. The StackView manages the lifetime of the view.

GitLab: #897

Change-Id: I25892310eb83ad70f4b06f91e94ec5ea8b87ef86
---
 src/app/settingsview/SettingsView.qml         | 132 ++++++++++--------
 .../components/AdvancedSettingsPage.qml       |   3 -
 .../components/AppearenceSettingsPage.qml     |   3 -
 .../components/AudioSettingsPage.qml          |   3 -
 .../components/CallRecordingSettingsPage.qml  |   3 -
 .../components/CallSettingsPage.qml           |   3 -
 .../components/CustomizeProfilePage.qml       |   4 +-
 .../components/FileTransferSettingsPage.qml   |   3 -
 .../components/LinkedDevicesPage.qml          |   3 -
 .../LocationSharingSettingsPage.qml           |   3 -
 .../components/ManageAccountPage.qml          |   7 +-
 .../components/ScreenSharingSettingsPage.qml  |   2 -
 .../components/SettingsPageBase.qml           |   1 +
 .../components/SystemSettingsPage.qml         |   2 -
 .../components/TroubleshootSettingsPage.qml   |   2 -
 .../components/UpdatesSettingsPage.qml        |   2 -
 .../components/VideoSettingsPage.qml          |  25 ++--
 17 files changed, 94 insertions(+), 107 deletions(-)

diff --git a/src/app/settingsview/SettingsView.qml b/src/app/settingsview/SettingsView.qml
index 68dbb17b2..1021282aa 100644
--- a/src/app/settingsview/SettingsView.qml
+++ b/src/app/settingsview/SettingsView.qml
@@ -36,23 +36,24 @@ ListSelectionView {
     id: viewNode
     objectName: "SettingsView"
 
-    enum SettingsMenu {
-        ManageAccount,
-        CustomizeProfile,
-        LinkedDevices,
-        AdvancedSettings,
-        System,
-        CallSettings,
-        Appearence,
-        LocationSharing,
-        FileTransfer,
-        CallRecording,
-        Troubleshoot,
-        Update,
-        Audio,
-        Video,
-        Screensharing,
-        Plugin
+    // A map of view names to file paths for QML files that define each view.
+    property variant resources: {
+        "ManageAccountPage": Qt.resolvedUrl("components/ManageAccountPage.qml"),
+        "CustomizeProfilePage": Qt.resolvedUrl("components/CustomizeProfilePage.qml"),
+        "LinkedDevicesPage": Qt.resolvedUrl("components/LinkedDevicesPage.qml"),
+        "CallSettingsPage": Qt.resolvedUrl("components/CallSettingsPage.qml"),
+        "AdvancedSettingsPage": Qt.resolvedUrl("components/AdvancedSettingsPage.qml"),
+        "SystemSettingsPage": Qt.resolvedUrl("components/SystemSettingsPage.qml"),
+        "AppearenceSettingsPage": Qt.resolvedUrl("components/AppearenceSettingsPage.qml"),
+        "LocationSharingSettingsPage": Qt.resolvedUrl("components/LocationSharingSettingsPage.qml"),
+        "FileTransferSettingsPage": Qt.resolvedUrl("components/FileTransferSettingsPage.qml"),
+        "CallRecordingSettingsPage": Qt.resolvedUrl("components/CallRecordingSettingsPage.qml"),
+        "TroubleshootSettingsPage": Qt.resolvedUrl("components/TroubleshootSettingsPage.qml"),
+        "UpdatesSettingsPage": Qt.resolvedUrl("components/UpdatesSettingsPage.qml"),
+        "AudioSettingsPage": Qt.resolvedUrl("components/AudioSettingsPage.qml"),
+        "VideoSettingsPage": Qt.resolvedUrl("components/VideoSettingsPage.qml"),
+        "ScreenSharingSettingsPage": Qt.resolvedUrl("components/ScreenSharingSettingsPage.qml"),
+        "PluginSettingsPage": Qt.resolvedUrl("components/PluginSettingsPage.qml"),
     }
 
     splitViewStateKey: "Main"
@@ -83,50 +84,71 @@ ListSelectionView {
         }
     }
 
-    rightPaneItem: StackLayout {
-        id: settingsViewRect
+    rightPaneItem: StackView {
+        id: settingsView
+        objectName: "settingsView"
 
-        currentIndex: selectedMenu !== -1 ? selectedMenu : 0
+        property var currentIndex: selectedMenu !== -1 ? selectedMenu : 0
         anchors.fill: parent
 
         signal stopBooth
 
-        property bool isSIP: CurrentAccount.type === Profile.Type.SIP
+        initialItem: ManageAccountPage {}
+
+        onCurrentIndexChanged: {
+
+            switch(currentIndex) {
+                default:
+                case 0:
+                    replace(currentItem, viewNode.resources["ManageAccountPage"], StackView.Immediate)
+                    break
+                case 1:
+                    replace(currentItem, viewNode.resources["CustomizeProfilePage"], StackView.Immediate)
+                    break
+                case 2:
+                    replace(currentItem, viewNode.resources["LinkedDevicesPage"], StackView.Immediate)
+                    break
+                case 3:
+                    replace(currentItem, viewNode.resources["CallSettingsPage"], StackView.Immediate)
+                    break
+                case 4:
+                    replace(currentItem, viewNode.resources["AdvancedSettingsPage"], StackView.Immediate)
+                    break
+                case 5:
+                    replace(currentItem, viewNode.resources["SystemSettingsPage"], StackView.Immediate)
+                    break
+                case 6:
+                    replace(currentItem, viewNode.resources["AppearenceSettingsPage"], StackView.Immediate)
+                    break
+                case 7:
+                    replace(currentItem, viewNode.resources["LocationSharingSettingsPage"], StackView.Immediate)
+                    break
+                case 8:
+                    replace(currentItem, viewNode.resources["FileTransferSettingsPage"], StackView.Immediate)
+                    break
+                case 9:
+                    replace(currentItem, viewNode.resources["CallRecordingSettingsPage"], StackView.Immediate)
+                    break
+                case 10:
+                    replace(currentItem, viewNode.resources["TroubleshootSettingsPage"], StackView.Immediate)
+                    break
+                case 11:
+                    replace(currentItem, viewNode.resources["UpdatesSettingsPage"], StackView.Immediate)
+                    break
+                case 12:
+                    replace(currentItem, viewNode.resources["AudioSettingsPage"], StackView.Immediate)
+                    break
+                case 13:
+                    replace(currentItem, viewNode.resources["VideoSettingsPage"], StackView.Immediate)
+                    break
+                case 14:
+                    replace(currentItem, viewNode.resources["ScreenSharingSettingsPage"], StackView.Immediate)
+                    break
+                case 15:
+                    replace(currentItem, viewNode.resources["PluginSettingsPage"], StackView.Immediate)
+                    break
+            }
 
-        ManageAccountPage {
-            isSIP: settingsViewRect.isSIP
-            onNavigateToMainView: dismiss()
-            onNavigateToNewWizardView: dismiss()
         }
-
-        CustomizeProfilePage {}
-
-        LinkedDevicesPage {}
-
-        CallSettingsPage {}
-
-        AdvancedSettingsPage {}
-
-        SystemSettingsPage {}
-
-        AppearenceSettingsPage {}
-
-        LocationSharingSettingsPage {}
-
-        FileTransferSettingsPage{}
-
-        CallRecordingSettingsPage {}
-
-        TroubleshootSettingsPage {}
-
-        UpdatesSettingsPage {}
-
-        AudioSettingsPage {}
-
-        VideoSettingsPage {}
-
-        ScreenSharingSettingsPage {}
-
-        PluginSettingsPage {}
     }
 }
diff --git a/src/app/settingsview/components/AdvancedSettingsPage.qml b/src/app/settingsview/components/AdvancedSettingsPage.qml
index 7d0b31440..f27549db0 100644
--- a/src/app/settingsview/components/AdvancedSettingsPage.qml
+++ b/src/app/settingsview/components/AdvancedSettingsPage.qml
@@ -33,9 +33,6 @@ SettingsPageBase {
     property int itemWidth
     signal showAdvancedSettingsRequest
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
-
     title: JamiStrings.advancedSettingsTitle
 
     flickableContent: ColumnLayout {
diff --git a/src/app/settingsview/components/AppearenceSettingsPage.qml b/src/app/settingsview/components/AppearenceSettingsPage.qml
index 8bfb5e6ee..860daa765 100644
--- a/src/app/settingsview/components/AppearenceSettingsPage.qml
+++ b/src/app/settingsview/components/AppearenceSettingsPage.qml
@@ -36,9 +36,6 @@ SettingsPageBase {
 
     property int itemWidth: 188
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
-
     title: JamiStrings.appearence
 
     flickableContent: ColumnLayout {
diff --git a/src/app/settingsview/components/AudioSettingsPage.qml b/src/app/settingsview/components/AudioSettingsPage.qml
index 067130fcd..de2e919f3 100644
--- a/src/app/settingsview/components/AudioSettingsPage.qml
+++ b/src/app/settingsview/components/AudioSettingsPage.qml
@@ -30,9 +30,6 @@ SettingsPageBase {
     id: root
 
     property int itemWidth: 188
-
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.audio
 
     flickableContent: ColumnLayout {
diff --git a/src/app/settingsview/components/CallRecordingSettingsPage.qml b/src/app/settingsview/components/CallRecordingSettingsPage.qml
index d8f72b532..352d164d0 100644
--- a/src/app/settingsview/components/CallRecordingSettingsPage.qml
+++ b/src/app/settingsview/components/CallRecordingSettingsPage.qml
@@ -38,9 +38,6 @@ SettingsPageBase {
     property string screenshotPathBestName: UtilsAdapter.dirName(UtilsAdapter.getDirScreenshot())
 
     property int itemWidth: 188
-
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.callRecording
 
     onRecordPathChanged: {
diff --git a/src/app/settingsview/components/CallSettingsPage.qml b/src/app/settingsview/components/CallSettingsPage.qml
index 6c30770da..b23db21ff 100644
--- a/src/app/settingsview/components/CallSettingsPage.qml
+++ b/src/app/settingsview/components/CallSettingsPage.qml
@@ -37,9 +37,6 @@ SettingsPageBase {
 
     property bool isSIP
     property int itemWidth: 132
-
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.callSettingsTitle
 
     function updateAndShowModeratorsSlot() {
diff --git a/src/app/settingsview/components/CustomizeProfilePage.qml b/src/app/settingsview/components/CustomizeProfilePage.qml
index 932b63b28..dbb053ac2 100644
--- a/src/app/settingsview/components/CustomizeProfilePage.qml
+++ b/src/app/settingsview/components/CustomizeProfilePage.qml
@@ -30,8 +30,6 @@ import "../../commoncomponents"
 SettingsPageBase {
     id: root
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.customizeProfile
 
     function stopBooth() {
@@ -53,7 +51,7 @@ SettingsPageBase {
             Layout.preferredWidth: parent.width
 
             Connections {
-                target: settingsViewRect
+                target: settingsView
 
                 function onStopBooth() {
                     stopBooth()
diff --git a/src/app/settingsview/components/FileTransferSettingsPage.qml b/src/app/settingsview/components/FileTransferSettingsPage.qml
index c2c0a7e22..4db804f22 100644
--- a/src/app/settingsview/components/FileTransferSettingsPage.qml
+++ b/src/app/settingsview/components/FileTransferSettingsPage.qml
@@ -32,9 +32,6 @@ SettingsPageBase {
     id: root
 
     property int itemWidth: 164
-
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.fileTransfer
 
 
diff --git a/src/app/settingsview/components/LinkedDevicesPage.qml b/src/app/settingsview/components/LinkedDevicesPage.qml
index 74c26b95d..f9de7c82f 100644
--- a/src/app/settingsview/components/LinkedDevicesPage.qml
+++ b/src/app/settingsview/components/LinkedDevicesPage.qml
@@ -32,11 +32,8 @@ import "../../commoncomponents"
 SettingsPageBase {
     id: root
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.linkedDevicesSettingsTitle
 
-
     flickableContent: ColumnLayout {
         id: currentAccountEnableColumnLayout
 
diff --git a/src/app/settingsview/components/LocationSharingSettingsPage.qml b/src/app/settingsview/components/LocationSharingSettingsPage.qml
index 9c5479cdd..0f84707d5 100644
--- a/src/app/settingsview/components/LocationSharingSettingsPage.qml
+++ b/src/app/settingsview/components/LocationSharingSettingsPage.qml
@@ -36,9 +36,6 @@ SettingsPageBase {
     id: root
 
     property int itemWidth: 578
-
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.locationSharingLabel
 
 
diff --git a/src/app/settingsview/components/ManageAccountPage.qml b/src/app/settingsview/components/ManageAccountPage.qml
index 807cf3a39..f25d2eb28 100644
--- a/src/app/settingsview/components/ManageAccountPage.qml
+++ b/src/app/settingsview/components/ManageAccountPage.qml
@@ -31,11 +31,12 @@ import "../../commoncomponents"
 SettingsPageBase {
     id: root
 
-    property bool isSIP
+    property bool isSIP: CurrentAccount.type === Profile.Type.SIP
     property int itemWidth: 250
-
     signal navigateToMainView
-    signal navigateToNewWizardView
+
+    onNavigateToMainView: viewNode.dismiss()
+
     title: JamiStrings.manageAccountSettingsTitle
 
     flickableContent: ColumnLayout {
diff --git a/src/app/settingsview/components/ScreenSharingSettingsPage.qml b/src/app/settingsview/components/ScreenSharingSettingsPage.qml
index 171d26ca9..756dae08a 100644
--- a/src/app/settingsview/components/ScreenSharingSettingsPage.qml
+++ b/src/app/settingsview/components/ScreenSharingSettingsPage.qml
@@ -34,8 +34,6 @@ SettingsPageBase {
 
     property int itemWidth: 150
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.screenSharing
 
     flickableContent: ColumnLayout {
diff --git a/src/app/settingsview/components/SettingsPageBase.qml b/src/app/settingsview/components/SettingsPageBase.qml
index 8ddfeaee0..c5adeca43 100644
--- a/src/app/settingsview/components/SettingsPageBase.qml
+++ b/src/app/settingsview/components/SettingsPageBase.qml
@@ -62,5 +62,6 @@ Page {
         contentItem.children: [flickableContent]
         topMargin: JamiTheme.preferredSettingsBottomMarginSize
         bottomMargin: JamiTheme.preferredSettingsBottomMarginSize
+        ScrollBar.horizontal.visible: false
     }
 }
diff --git a/src/app/settingsview/components/SystemSettingsPage.qml b/src/app/settingsview/components/SystemSettingsPage.qml
index bed6a358f..17ef1c8e3 100644
--- a/src/app/settingsview/components/SystemSettingsPage.qml
+++ b/src/app/settingsview/components/SystemSettingsPage.qml
@@ -37,8 +37,6 @@ SettingsPageBase {
 
     property bool isSIP
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.system
 
 
diff --git a/src/app/settingsview/components/TroubleshootSettingsPage.qml b/src/app/settingsview/components/TroubleshootSettingsPage.qml
index 7e2332272..8e8154fc9 100644
--- a/src/app/settingsview/components/TroubleshootSettingsPage.qml
+++ b/src/app/settingsview/components/TroubleshootSettingsPage.qml
@@ -35,8 +35,6 @@ SettingsPageBase {
 
     property int itemWidth
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.troubleshootTitle
 
 
diff --git a/src/app/settingsview/components/UpdatesSettingsPage.qml b/src/app/settingsview/components/UpdatesSettingsPage.qml
index ce4fa733a..35155d008 100644
--- a/src/app/settingsview/components/UpdatesSettingsPage.qml
+++ b/src/app/settingsview/components/UpdatesSettingsPage.qml
@@ -34,8 +34,6 @@ import "../../commoncomponents"
 SettingsPageBase {
     id: root
 
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.updatesTitle
 
     function presentInfoDialog(infoText) {
diff --git a/src/app/settingsview/components/VideoSettingsPage.qml b/src/app/settingsview/components/VideoSettingsPage.qml
index c093404fc..61768b950 100644
--- a/src/app/settingsview/components/VideoSettingsPage.qml
+++ b/src/app/settingsview/components/VideoSettingsPage.qml
@@ -36,9 +36,6 @@ SettingsPageBase {
 
     property int itemWidth: 266
     property real aspectRatio: 0.75
-
-    signal navigateToMainView
-    signal navigateToNewWizardView
     title: JamiStrings.video
 
     flickableContent: ColumnLayout {
@@ -63,17 +60,6 @@ SettingsPageBase {
                 previewWidget.startWithId(VideoDevices.getDefaultDevice(), force)
             }
 
-            onVisibleChanged: {
-                flipControl.checked = UtilsAdapter.getAppValue(Settings.FlipSelf)
-                if (visible) {
-                    hardwareAccelControl.checked = AvAdapter.getHardwareAcceleration()
-                    if (previewWidget.visible)
-                        generalSettings.startPreviewing(true)
-                } else {
-                    previewWidget.startWithId("")
-                }
-            }
-
             Connections {
                 target: VideoDevices
 
@@ -114,6 +100,17 @@ SettingsPageBase {
                 }
             }
 
+            Component.onCompleted: {
+                flipControl.checked = UtilsAdapter.getAppValue(Settings.FlipSelf)
+                hardwareAccelControl.checked = AvAdapter.getHardwareAcceleration()
+                if (previewWidget.visible)
+                    startPreviewing(true)
+            }
+
+            Component.onDestruction: {
+                previewWidget.startWithId("")
+            }
+
             // video Preview
             Rectangle {
                 visible: VideoDevices.listSize !== 0
-- 
GitLab