Change pages organization

- UI (previously MainUI) is back to being the only component loaded
  as Window's child

- UI has the background image previously only for the SignInPage

- If there are no accounts, the UI Loader's initialItem is the
  SignInPage

- The SidePane becomes visible when there's >=1 account connected
This commit is contained in:
miruka 2019-04-27 18:54:33 -04:00
parent e09efaecda
commit 0db5a3233d
6 changed files with 131 additions and 136 deletions

View File

@ -0,0 +1,51 @@
import QtQuick 2.7
import QtQuick.Controls 1.4 as Controls1
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.4
import "base" as Base
import "sidePane" as SidePane
import "chat" as Chat
Base.HImage {
id: loginPage
fillMode: Image.PreserveAspectCrop
source: "../images/login_background.jpg"
anchors.fill: parent
property bool accountsLoggedIn: Backend.clientManager.clientCount > 0
//https://doc.qt.io/qt-5/qml-qtquick-controls-splitview.html
Controls1.SplitView {
anchors.fill: parent
SidePane.Root {
Layout.minimumWidth: 36
width: 200
visible: accountsLoggedIn
}
StackView {
function showPage(path, properties) {
pageStack.replace(path, properties || {})
}
function showRoom(userId, roomId) {
pageStack.replace(
"chat/Root.qml", { userId: userId, roomId: roomId }
)
}
id: pageStack
initialItem: accountsLoggedIn ? undefined : "pages/SignIn.qml"
onCurrentItemChanged: if (currentItem) {
currentItem.forceActiveFocus()
}
// Buggy
replaceExit: null
popExit: null
pushExit: null
}
}
}

View File

@ -9,8 +9,7 @@ ApplicationWindow {
Loader { Loader {
anchors.fill: parent anchors.fill: parent
source: Backend.clientManager.clientCount < 1 ? source: "UI.qml"
"pages/LoginPage/LoginPage.qml" : "pages/MainUI.qml"
objectName: "UILoader" objectName: "UILoader"
} }
} }

View File

@ -1,17 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.4
import "../../base" as Base
Base.HImage {
id: loginPage
fillMode: Image.PreserveAspectCrop
source: "../../../images/login_background.jpg"
Loader {
anchors.centerIn: parent
Component.onCompleted: setSource(
"SignInBox.qml", { "container": loginPage }
)
}
}

View File

@ -1,75 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.4
import "../../base" as Base
Base.HInterfaceBox {
id: signInBox
title: "Sign in"
property string loginWith: "username"
enterButtonTarget: "login"
buttonModel: [
{ name: "register", text: qsTr("Register") },
{ name: "login", text: qsTr("Login") },
{ name: "forgot", text: qsTr("Forgot?") }
]
buttonCallbacks: {
"register": function(button) {},
"login": function(button) {
button.loadingUntilFutureDone(
Backend.clientManager.new(
"matrix.org", identifierField.text, passwordField.text
)
)
},
"forgot": function(button) {}
}
Base.HRowLayout {
spacing: signInBox.margins * 1.25
Layout.margins: signInBox.margins
Layout.alignment: Qt.AlignHCenter
Repeater {
model: ["username", "email", "phone"]
Base.HButton {
iconName: modelData
circle: true
checked: loginWith == modelData
autoExclusive: true
onClicked: loginWith = modelData
}
}
}
Base.HTextField {
id: identifierField
placeholderText: qsTr(
loginWith === "email" ? "Email" :
loginWith === "phone" ? "Phone" :
"Username"
)
onAccepted: signInBox.clickEnterButtonTarget()
Component.onCompleted: forceActiveFocus()
Layout.fillWidth: true
Layout.margins: signInBox.margins
}
Base.HTextField {
id: passwordField
placeholderText: qsTr("Password")
echoMode: TextField.Password
onAccepted: signInBox.clickEnterButtonTarget()
Layout.fillWidth: true
Layout.margins: signInBox.margins
}
}

View File

@ -1,42 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 1.4 as Controls1
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.4
import "../sidePane" as SidePane
import "../chat" as Chat
//https://doc.qt.io/qt-5/qml-qtquick-controls-splitview.html
Controls1.SplitView {
anchors.fill: parent
SidePane.Root {
Layout.minimumWidth: 36
width: 200
}
StackView {
function showRoom(userId, roomId) {
pageStack.replace(
"../chat/Root.qml", { userId: userId, roomId: roomId }
)
}
id: pageStack
onCurrentItemChanged: if (currentItem) {
currentItem.forceActiveFocus()
}
initialItem: Item { // TODO: (test, remove)
Keys.onEnterPressed: pageStack.showRoom(
"@test_mary:matrix.org", "!TSXGsbBbdwsdylIOJZ:matrix.org"
//"@test_mary:matrix.org", "!TEXkdeErtVCMqClNfb:matrix.org"
)
}
// Buggy
replaceExit: null
popExit: null
pushExit: null
}
}

View File

@ -0,0 +1,79 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.4
import "../base" as Base
Item {
property string loginWith: "username"
onFocusChanged: identifierField.forceActiveFocus()
Base.HInterfaceBox {
id: signInBox
title: "Sign in"
anchors.centerIn: parent
enterButtonTarget: "login"
buttonModel: [
{ name: "register", text: qsTr("Register") },
{ name: "login", text: qsTr("Login") },
{ name: "forgot", text: qsTr("Forgot?") }
]
buttonCallbacks: {
"register": function(button) {},
"login": function(button) {
button.loadingUntilFutureDone(
Backend.clientManager.new(
"matrix.org", identifierField.text, passwordField.text
)
)
},
"forgot": function(button) {}
}
Base.HRowLayout {
spacing: signInBox.margins * 1.25
Layout.margins: signInBox.margins
Layout.alignment: Qt.AlignHCenter
Repeater {
model: ["username", "email", "phone"]
Base.HButton {
iconName: modelData
circle: true
checked: loginWith == modelData
autoExclusive: true
onClicked: loginWith = modelData
}
}
}
Base.HTextField {
id: identifierField
placeholderText: qsTr(
loginWith === "email" ? "Email" :
loginWith === "phone" ? "Phone" :
"Username"
)
onAccepted: signInBox.clickEnterButtonTarget()
Layout.fillWidth: true
Layout.margins: signInBox.margins
}
Base.HTextField {
id: passwordField
placeholderText: qsTr("Password")
echoMode: TextField.Password
onAccepted: signInBox.clickEnterButtonTarget()
Layout.fillWidth: true
Layout.margins: signInBox.margins
}
}
}