From 4e01784158b85701d33885885d14a5bcaa5643ef Mon Sep 17 00:00:00 2001
From: Ming Rui Zhang <mingrui.zhang@savoirfairelinux.com>
Date: Mon, 14 Sep 2020 15:04:21 -0400
Subject: [PATCH] mainview: change settings responsive behavior and stacklayout
 page arrangement

Change-Id: I3f7e2050be74cd8cc9f6d732cc96b0f218cd1676
---
 src/conversationsadapter.cpp                  |   1 -
 src/mainview/MainView.qml                     | 184 ++++++++----------
 src/mainview/components/CallOverlay.qml       |   2 +-
 src/mainview/components/UserInfoCallPage.qml  |   2 +-
 .../components/SettingsHeader.qml             |   2 +-
 5 files changed, 86 insertions(+), 105 deletions(-)

diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index 8eedc4b9f..e52fb0070 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -119,7 +119,6 @@ ConversationsAdapter::deselectConversation()
         return;
     }
 
-    currentConversationModel->selectConversation("");
     LRCInstance::setSelectedConvId();
 }
 
diff --git a/src/mainview/MainView.qml b/src/mainview/MainView.qml
index 58a22578d..6d9e8d4cf 100644
--- a/src/mainview/MainView.qml
+++ b/src/mainview/MainView.qml
@@ -33,7 +33,7 @@ import "../settingsview/components"
 Window {
     id: mainViewWindow
 
-    property int minWidth: 400
+    property int minWidth: settingsViewPreferredWidth
     property int minHeight: aboutPopUpDialog.contentHeight
 
     property int mainViewWindowPreferredWidth: 650
@@ -41,12 +41,14 @@ Window {
     property int sidePanelViewStackPreferredWidth: 250
     property int mainViewStackPreferredWidth: 250
     property int aboutPopUpPreferredWidth: 400
+    property int settingsViewPreferredWidth: 445
+    property int onWidthChangedTriggerDistance: 5
 
     property int savedSidePanelViewMinWidth: 0
     property int savedSidePanelViewMaxWidth: 0
     property int savedWelcomeViewMinWidth: 0
     property int savedWelcomeViewMaxWidth: 0
-    property bool sidePanelHidden: !mainViewStack.visible
+    property bool sidePanelOnly: !mainViewStack.visible
 
     // To calculate tab bar bottom border hidden rect left margin.
     property int tabBarLeftMargin: 8
@@ -60,7 +62,7 @@ Window {
         mainViewWindowSidePanel.deselectConversationSmartList()
         if (communicationPageMessageWebView.visible || callStackView.visible) {
             sidePanelViewStack.pop(StackView.Immediate)
-            if (!sidePanelHidden) {
+            if (!sidePanelOnly) {
                 mainViewStack.pop(welcomePage, StackView.Immediate)
             }
         }
@@ -92,8 +94,6 @@ Window {
             }
         }
 
-        pushCallStackView()
-
         callStackView.responsibleAccountId = currentAccount
         callStackView.responsibleConvUid = currentCallConv
         callStackView.updateCorrespondingUI()
@@ -101,20 +101,21 @@ Window {
 
 
     function pushCallStackView() {
-        if (sidePanelHidden) {
+        if (sidePanelOnly) {
             sidePanelViewStack.push(callStackView, StackView.Immediate)
         } else {
             sidePanelViewStack.pop(StackView.Immediate)
-            mainViewStack.pop(null, StackView.Immediate)
+            mainViewStack.pop(welcomePage, StackView.Immediate)
             mainViewStack.push(callStackView, StackView.Immediate)
         }
     }
 
     function pushCommunicationMessageWebView() {
-        if (sidePanelHidden) {
+        if (sidePanelOnly) {
+            sidePanelViewStack.pop(StackView.Immediate)
             sidePanelViewStack.push(communicationPageMessageWebView, StackView.Immediate)
         } else {
-            mainViewStack.pop(null, StackView.Immediate)
+            mainViewStack.pop(welcomePage, StackView.Immediate)
             mainViewStack.push(communicationPageMessageWebView, StackView.Immediate)
         }
     }
@@ -128,7 +129,6 @@ Window {
     }
 
     function recursionStackViewItemMove(stackOne, stackTwo, depth=1) {
-
         // Move all items (expect the bottom item) to stacktwo by the same order in stackone.
         if (stackOne.depth === depth) {
             return
@@ -140,39 +140,27 @@ Window {
     }
 
     function toggleSettingsView() {
-
         if (!inSettingsView) {
-
-            if (sidePanelHidden){
-                recursionStackViewItemMove(sidePanelViewStack, mainViewStack, 1)
-                mainViewStack.push(settingsView, StackView.Immediate)
+            if (sidePanelOnly)
                 sidePanelViewStack.push(leftPanelSettingsView, StackView.Immediate)
-                recursionStackViewItemMove(mainViewStack, sidePanelViewStack, 1)
-            } else {
+            else {
+                mainViewStack.pop(welcomePage, StackView.Immediate)
                 mainViewStack.push(settingsView, StackView.Immediate)
                 sidePanelViewStack.push(leftPanelSettingsView, StackView.Immediate)
-            }
-
-        } else {
 
-            if (sidePanelHidden) {
-                recursionStackViewItemMove(sidePanelViewStack, mainViewStack, 2)
-                sidePanelViewStack.pop(StackView.Immediate)
-                mainViewStack.pop(StackView.Immediate)
-                recursionStackViewItemMove(mainViewStack, sidePanelViewStack, 1)
+                mainViewWindow.width = settingsViewPreferredWidth
+                        + sidePanelViewStackPreferredWidth + onWidthChangedTriggerDistance
             }
+        } else {
+            sidePanelViewStack.pop(StackView.Immediate)
+            mainViewStack.pop(StackView.Immediate)
 
-            if (currentAccountIsCalling()) {
+            if (currentAccountIsCalling())
                 setCallStackView()
-            } else {
+            else
                 mainViewWindowSidePanel.deselectConversationSmartList()
-
-                sidePanelViewStack.pop(StackView.Immediate)
-                if (!sidePanelHidden) {
-                    mainViewStack.pop(welcomePage, StackView.Immediate)
-                }
-            }
         }
+
         inSettingsView = !inSettingsView
     }
 
@@ -222,8 +210,8 @@ Window {
 
             // Set up the call stack view that is needed by call overlay.
             if (!inSettingsView) {
-                mainViewStack.pop(null, StackView.Immediate)
-                sidePanelViewStack.pop(null, StackView.Immediate)
+                mainViewStack.pop(welcomePage, StackView.Immediate)
+                sidePanelViewStack.pop(mainViewWindowSidePanel, StackView.Immediate)
             } else {
                 toggleSettingsView()
             }
@@ -248,28 +236,6 @@ Window {
         }
     }
 
-    WizardView {
-        id: wizardView
-
-        anchors.fill: parent
-
-        onNeedToShowMainViewWindow: {
-            mainViewLoader.newAddedAccountIndex = accountIndex
-            if (mainViewLoader.source.toString() !== "qrc:/src/mainview/MainView.qml") {
-                mainViewLoader.loaded.disconnect(slotNewAccountAdded)
-                mainViewLoader.loaded.connect(slotNewAccountAdded)
-                mainViewLoader.setSource("qrc:/src/mainview/MainView.qml")
-            } else {
-                slotNewAccountAdded()
-            }
-            mainViewStackLayout.currentIndex = 0
-        }
-
-        onWizardViewIsClosed: {
-            mainViewStackLayout.currentIndex = 0
-        }
-    }
-
     StackLayout {
         id: mainViewStackLayout
 
@@ -303,11 +269,10 @@ Window {
                 id: mainViewSidePanelRect
 
                 SplitView.minimumWidth: sidePanelViewStackPreferredWidth
-                SplitView.maximumWidth: (sidePanelHidden ? splitView.width :
-                                                           splitView.width - sidePanelViewStackPreferredWidth)
+                SplitView.maximumWidth: (sidePanelOnly ? splitView.width :
+                                                      splitView.width - sidePanelViewStackPreferredWidth)
                 SplitView.fillHeight: true
 
-
                 // AccountComboBox is always visible
                 AccountComboBox {
                     id: accountComboBox
@@ -388,24 +353,48 @@ Window {
 
                 initialItem: welcomePage
 
-                SplitView.maximumWidth: sidePanelHidden ? splitView.width :
-                                                          splitView.width - sidePanelViewStackPreferredWidth
+                SplitView.maximumWidth: sidePanelOnly ? splitView.width :
+                                                        splitView.width - sidePanelViewStackPreferredWidth
                 SplitView.minimumWidth: sidePanelViewStackPreferredWidth
                 SplitView.fillHeight: true
 
                 clip: true
             }
         }
+
+        WizardView {
+            id: wizardView
+
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+
+            onNeedToShowMainViewWindow: {
+                mainViewLoader.newAddedAccountIndex = accountIndex
+                if (mainViewLoader.source.toString() !== "qrc:/src/mainview/MainView.qml") {
+                    mainViewLoader.loaded.disconnect(slotNewAccountAdded)
+                    mainViewLoader.loaded.connect(slotNewAccountAdded)
+                    mainViewLoader.setSource("qrc:/src/mainview/MainView.qml")
+                } else {
+                    slotNewAccountAdded()
+                }
+                mainViewStackLayout.currentIndex = 0
+            }
+
+            onWizardViewIsClosed: {
+                mainViewStackLayout.currentIndex = 0
+            }
+        }
     }
 
     AccountListModel {
         id: accountListModel
     }
 
-
     LeftPanelView {
         id: leftPanelSettingsView
 
+        objectName: "leftPanelSettingsView"
+
         visible: false
         contentViewportWidth: mainViewSidePanelRect.width
         contentViewPortHeight: mainViewSidePanelRect.height
@@ -414,36 +403,32 @@ Window {
             target: leftPanelSettingsView.btnAccountSettings
             function onCheckedToggledForRightPanel(checked) {
                 settingsView.setSelected(SettingsView.Account)
-                if (sidePanelHidden) {
-                    recursionStackViewItemMove(mainViewStack, sidePanelViewStack, 1)
-                }
+                if (sidePanelOnly)
+                    sidePanelViewStack.push(settingsView, StackView.Immediate)
             }
         }
         Connections {
             target: leftPanelSettingsView.btnGeneralSettings
             function onCheckedToggledForRightPanel(checked) {
                 settingsView.setSelected(SettingsView.General)
-                if (sidePanelHidden) {
-                    recursionStackViewItemMove(mainViewStack, sidePanelViewStack, 1)
-                }
+                if (sidePanelOnly)
+                    sidePanelViewStack.push(settingsView, StackView.Immediate)
             }
         }
         Connections {
             target: leftPanelSettingsView.btnMediaSettings
             function onCheckedToggledForRightPanel(checked) {
                 settingsView.setSelected(SettingsView.Media)
-                if (sidePanelHidden) {
-                    recursionStackViewItemMove(mainViewStack, sidePanelViewStack, 1)
-                }
+                if (sidePanelOnly)
+                    sidePanelViewStack.push(settingsView, StackView.Immediate)
             }
         }
         Connections {
             target: leftPanelSettingsView.btnPluginSettings
             function onCheckedToggledForRightPanel(checked) {
                 settingsView.setSelected(SettingsView.Plugin)
-                if (sidePanelHidden) {
-                    recursionStackViewItemMove(mainViewStack, sidePanelViewStack, 1)
-                }
+                if (sidePanelOnly)
+                    sidePanelViewStack.push(settingsView, StackView.Immediate)
             }
         }
     }
@@ -493,8 +478,8 @@ Window {
             }
 
             // Push messageWebView or callStackView onto the correct stackview
-            mainViewStack.pop(null, StackView.Immediate)
-            sidePanelViewStack.pop(null, StackView.Immediate)
+            mainViewStack.pop(welcomePage, StackView.Immediate)
+            sidePanelViewStack.pop(mainViewWindowSidePanel, StackView.Immediate)
 
             if (sidePanelViewStack.visible && mainViewStack.visible) {
                 if (callStackViewShouldShow) {
@@ -537,7 +522,7 @@ Window {
         }
 
         onNeedToAddNewAccount: {
-            mainViewStackLayout.currentIndex = 2
+            mainViewStackLayout.currentIndex = 1
         }
     }
 
@@ -559,9 +544,6 @@ Window {
 
         visible: false
 
-        width: Math.max(mainViewStackPreferredWidth, mainViewStack.width - 100)
-        height: mainViewWindow.minimumHeight
-
         onSettingsViewWindowNeedToShowMainViewWindow: {
             mainViewWindowSidePanel.refreshAccountComboBox(0)
             toggleSettingsView()
@@ -571,10 +553,7 @@ Window {
             mainViewWindow.noAccountIsAvailable()
         }
 
-        onSettingsBackArrowClicked: {
-            mainViewStack.pop(StackView.Immediate)
-            recursionStackViewItemMove(sidePanelViewStack, mainViewStack, 2)
-        }
+        onSettingsBackArrowClicked: sidePanelViewStack.pop(StackView.Immediate)
     }
 
     MessageWebView {
@@ -602,11 +581,6 @@ Window {
         }
 
         Component.onCompleted: {
-            mainViewSidePanelRect.SplitView.maximumWidth = Qt.binding(function() {
-                return sidePanelHidden ? splitView.width :
-                                         splitView.width - sidePanelViewStackPreferredWidth
-            })
-
             recordBox.x = Qt.binding(function() {
                 var i = ((mainViewStack.visible && mainViewStack.width > 1000) ?
                              Math.round((mainViewStack.width-1000)*0.5) :
@@ -629,8 +603,10 @@ Window {
 
     onWidthChanged: {
         // Hide unnecessary stackview when width is changed.
-        if (mainViewWindow.width < sidePanelViewStackPreferredWidth
-                + mainViewStackPreferredWidth - 5
+        var widthToCompare = sidePanelViewStackPreferredWidth +
+                (inSettingsView ? settingsViewPreferredWidth : mainViewStackPreferredWidth)
+
+        if (mainViewWindow.width < widthToCompare - onWidthChangedTriggerDistance
                 && mainViewStack.visible) {
             mainViewStack.visible = false
 
@@ -640,13 +616,15 @@ Window {
                             return index > 0
                         })
 
-            if (inWelcomeViewStack) {
-                recursionStackViewItemMove(mainViewStack, sidePanelViewStack)
+            if (inSettingsView) {
+                mainViewStack.pop(StackView.Immediate)
+                sidePanelViewStack.push(settingsView, StackView.Immediate)
             }
+            else if (inWelcomeViewStack)
+                recursionStackViewItemMove(mainViewStack, sidePanelViewStack)
 
             mainViewWindow.update()
-        } else if (mainViewWindow.width >= sidePanelViewStackPreferredWidth
-                   + mainViewStackPreferredWidth + 5
+        } else if (mainViewWindow.width >= widthToCompare + onWidthChangedTriggerDistance
                    && !mainViewStack.visible) {
             mainViewStack.visible = true
 
@@ -654,12 +632,16 @@ Window {
                         function (item, index) {
                             return index > 0
                         })
-            if (inSidePanelViewStack) {
-                recursionStackViewItemMove(sidePanelViewStack, mainViewStack, (inSettingsView ? 2 : 1))
-            }
 
-            if (!inSettingsView && currentAccountIsCalling())
-                pushCallStackView()
+            if (inSettingsView) {
+                if (sidePanelViewStack.currentItem.objectName !== leftPanelSettingsView.objectName)
+                    sidePanelViewStack.pop(StackView.Immediate)
+                mainViewStack.push(settingsView, StackView.Immediate)
+            } else if (inSidePanelViewStack) {
+                recursionStackViewItemMove(sidePanelViewStack, mainViewStack)
+                if (currentAccountIsCalling())
+                    pushCallStackView()
+            }
 
             mainViewWindow.update()
         }
diff --git a/src/mainview/components/CallOverlay.qml b/src/mainview/components/CallOverlay.qml
index 2a48c7912..86b4b8aaf 100644
--- a/src/mainview/components/CallOverlay.qml
+++ b/src/mainview/components/CallOverlay.qml
@@ -169,7 +169,7 @@ Rectangle {
                 toolTipText: qsTr("Toggle to display side panel")
                 hoverEnabled: true
 
-                visible: mainViewWindow.sidePanelHidden
+                visible: mainViewWindow.sidePanelOnly
 
                 onClicked: {
                     mainViewWindow.showWelcomeView() // TODO: refactor with msg manager
diff --git a/src/mainview/components/UserInfoCallPage.qml b/src/mainview/components/UserInfoCallPage.qml
index 1e18bed2f..922a66394 100644
--- a/src/mainview/components/UserInfoCallPage.qml
+++ b/src/mainview/components/UserInfoCallPage.qml
@@ -66,7 +66,7 @@ Rectangle {
             toolTipText: qsTr("Toggle to display side panel")
             hoverEnabled: true
 
-            visible: mainViewWindow.sidePanelHidden
+            visible: mainViewWindow.sidePanelOnly
 
             onClicked: {
                 mainViewWindow.showWelcomeView() // TODO: refactor with msg manager
diff --git a/src/settingsview/components/SettingsHeader.qml b/src/settingsview/components/SettingsHeader.qml
index 7c86ef35b..9d9c93d34 100644
--- a/src/settingsview/components/SettingsHeader.qml
+++ b/src/settingsview/components/SettingsHeader.qml
@@ -45,7 +45,7 @@ RowLayout {
         toolTipText: JamiStrings.back
         hoverEnabled: true
 
-        visible: mainViewWindow.sidePanelHidden
+        visible: mainViewWindow.sidePanelOnly
 
         onClicked: {
             backArrowClicked()
-- 
GitLab