Have a separate PageLoader component from UI
This commit is contained in:
		
							
								
								
									
										92
									
								
								src/gui/PageLoader.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/gui/PageLoader.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | |||||||
|  | import QtQuick 2.12 | ||||||
|  | import QtQuick.Controls 2.12 | ||||||
|  | import QtQuick.Layouts 1.12 | ||||||
|  | import QtQuick.Window 2.7 | ||||||
|  | import QtGraphicalEffects 1.12 | ||||||
|  | import "Base" | ||||||
|  | import "MainPane" | ||||||
|  |  | ||||||
|  | HLoader { | ||||||
|  |     id: pageLoader | ||||||
|  |     clip: appearAnimation.running | ||||||
|  |  | ||||||
|  |     onLoaded: { takeFocus(); appearAnimation.start() } | ||||||
|  |  | ||||||
|  |     Component.onCompleted: { | ||||||
|  |         if (! py.startupAnyAccountsSaved) { | ||||||
|  |             pageLoader.showPage("AddAccount/AddAccount") | ||||||
|  |             return | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         let page  = window.uiState.page | ||||||
|  |         let props = window.uiState.pageProperties | ||||||
|  |  | ||||||
|  |         if (page === "Pages/Chat/Chat.qml") { | ||||||
|  |             pageLoader.showRoom(props.userId, props.roomId) | ||||||
|  |         } else { | ||||||
|  |             pageLoader._show(page, props) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     property bool isWide: width > theme.contentIsWideAbove | ||||||
|  |  | ||||||
|  |     // List of previously loaded [componentUrl, {properties}] | ||||||
|  |     property var history: [] | ||||||
|  |     property int historyLength: 20 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     function _show(componentUrl, properties={}) { | ||||||
|  |         history.unshift([componentUrl, properties]) | ||||||
|  |         if (history.length > historyLength) history.pop() | ||||||
|  |  | ||||||
|  |         pageLoader.setSource(componentUrl, properties) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showPage(name, properties={}) { | ||||||
|  |         let path = `Pages/${name}.qml` | ||||||
|  |         _show(path, properties) | ||||||
|  |  | ||||||
|  |         window.uiState.page           = path | ||||||
|  |         window.uiState.pageProperties = properties | ||||||
|  |         window.uiStateChanged() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showRoom(userId, roomId) { | ||||||
|  |         _show("Pages/Chat/Chat.qml", {userId, roomId}) | ||||||
|  |  | ||||||
|  |         window.uiState.page           = "Pages/Chat/Chat.qml" | ||||||
|  |         window.uiState.pageProperties = {userId, roomId} | ||||||
|  |         window.uiStateChanged() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showPrevious(timesBack=1) { | ||||||
|  |         timesBack = Math.min(timesBack, history.length - 1) | ||||||
|  |         if (timesBack < 1) return false | ||||||
|  |  | ||||||
|  |         let [componentUrl, properties] = history[timesBack] | ||||||
|  |  | ||||||
|  |         _show(componentUrl, properties) | ||||||
|  |  | ||||||
|  |         window.uiState.page           = componentUrl | ||||||
|  |         window.uiState.pageProperties = properties | ||||||
|  |         window.uiStateChanged() | ||||||
|  |         return true | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function takeFocus() { | ||||||
|  |         pageLoader.item.forceActiveFocus() | ||||||
|  |         if (mainPane.collapse) mainPane.close() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     HNumberAnimation { | ||||||
|  |         id: appearAnimation | ||||||
|  |         target: pageLoader.item | ||||||
|  |         property: "x" | ||||||
|  |         from: -300 | ||||||
|  |         to: 0 | ||||||
|  |         easing.type: Easing.OutBack | ||||||
|  |         duration: theme.animationDuration * 2 | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										102
									
								
								src/gui/UI.qml
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								src/gui/UI.qml
									
									
									
									
									
								
							| @@ -9,13 +9,19 @@ import "MainPane" | |||||||
| Item { | Item { | ||||||
|     id: mainUI |     id: mainUI | ||||||
|     focus: true |     focus: true | ||||||
|  |  | ||||||
|     Component.onCompleted: window.mainUI = mainUI |     Component.onCompleted: window.mainUI = mainUI | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     property bool accountsPresent: | ||||||
|  |         (modelSources["Account"] || []).length > 0 || | ||||||
|  |         py.startupAnyAccountsSaved | ||||||
|  |  | ||||||
|     readonly property alias shortcuts: shortcuts |     readonly property alias shortcuts: shortcuts | ||||||
|     readonly property alias mainPane: mainPane |     readonly property alias mainPane: mainPane | ||||||
|     readonly property alias pageLoader: pageLoader |     readonly property alias pageLoader: pageLoader | ||||||
|     readonly property alias pressAnimation: pressAnimation |     readonly property alias pressAnimation: pressAnimation | ||||||
|     readonly property alias fullScreenPopup: fullScreenPopup |  | ||||||
|  |  | ||||||
|     SequentialAnimation { |     SequentialAnimation { | ||||||
|         id: pressAnimation |         id: pressAnimation | ||||||
| @@ -27,10 +33,6 @@ Item { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     property bool accountsPresent: |  | ||||||
|         (modelSources["Account"] || []).length > 0 || |  | ||||||
|         py.startupAnyAccountsSaved |  | ||||||
|  |  | ||||||
|     GlobalShortcuts { id: shortcuts } |     GlobalShortcuts { id: shortcuts } | ||||||
|  |  | ||||||
|     HImage { |     HImage { | ||||||
| @@ -56,102 +58,14 @@ Item { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     MainPane { |     MainPane { | ||||||
|         id: mainPane |         id: mainPane | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     HLoader { |     PageLoader { | ||||||
|         id: pageLoader |         id: pageLoader | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         anchors.leftMargin: mainPane.visibleSize |         anchors.leftMargin: mainPane.visibleSize | ||||||
|         visible: ! mainPane.hidden || anchors.leftMargin < width |         visible: ! mainPane.hidden || anchors.leftMargin < width | ||||||
|         clip: appearAnimation.running |  | ||||||
|         onLoaded: { takeFocus(); appearAnimation.start() } |  | ||||||
|         // onSourceChanged: if (mainPane.collapse) mainPane.close() |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         property bool isWide: width > theme.contentIsWideAbove |  | ||||||
|  |  | ||||||
|         // List of previously loaded [componentUrl, {properties}] |  | ||||||
|         property var history: [] |  | ||||||
|         property int historyLength: 20 |  | ||||||
|  |  | ||||||
|         Component.onCompleted: { |  | ||||||
|             if (! py.startupAnyAccountsSaved) { |  | ||||||
|                 pageLoader.showPage("AddAccount/AddAccount") |  | ||||||
|                 return |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             let page  = window.uiState.page |  | ||||||
|             let props = window.uiState.pageProperties |  | ||||||
|  |  | ||||||
|             if (page === "Pages/Chat/Chat.qml") { |  | ||||||
|                 pageLoader.showRoom(props.userId, props.roomId) |  | ||||||
|             } else { |  | ||||||
|                 pageLoader._show(page, props) |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         function _show(componentUrl, properties={}) { |  | ||||||
|             history.unshift([componentUrl, properties]) |  | ||||||
|             if (history.length > historyLength) history.pop() |  | ||||||
|  |  | ||||||
|             pageLoader.setSource(componentUrl, properties) |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         function showPage(name, properties={}) { |  | ||||||
|             let path = `Pages/${name}.qml` |  | ||||||
|             _show(path, properties) |  | ||||||
|  |  | ||||||
|             window.uiState.page           = path |  | ||||||
|             window.uiState.pageProperties = properties |  | ||||||
|             window.uiStateChanged() |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         function showRoom(userId, roomId) { |  | ||||||
|             _show("Pages/Chat/Chat.qml", {userId, roomId}) |  | ||||||
|  |  | ||||||
|             window.uiState.page           = "Pages/Chat/Chat.qml" |  | ||||||
|             window.uiState.pageProperties = {userId, roomId} |  | ||||||
|             window.uiStateChanged() |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         function showPrevious(timesBack=1) { |  | ||||||
|             timesBack = Math.min(timesBack, history.length - 1) |  | ||||||
|             if (timesBack < 1) return false |  | ||||||
|  |  | ||||||
|             let [componentUrl, properties] = history[timesBack] |  | ||||||
|  |  | ||||||
|             _show(componentUrl, properties) |  | ||||||
|  |  | ||||||
|             window.uiState.page           = componentUrl |  | ||||||
|             window.uiState.pageProperties = properties |  | ||||||
|             window.uiStateChanged() |  | ||||||
|             return true |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         function takeFocus() { |  | ||||||
|             pageLoader.item.forceActiveFocus() |  | ||||||
|             if (mainPane.collapse) mainPane.close() |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         HNumberAnimation { |  | ||||||
|             id: appearAnimation |  | ||||||
|             target: pageLoader.item |  | ||||||
|             property: "x" |  | ||||||
|             from: -300 |  | ||||||
|             to: 0 |  | ||||||
|             easing.type: Easing.OutBack |  | ||||||
|             duration: theme.animationDuration * 2 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     HPopup { |  | ||||||
|         id: fullScreenPopup |  | ||||||
|         dim: false |  | ||||||
|         width: window.width |  | ||||||
|         height: window.height |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	