// Copyright (c) 2021 Proton Technologies AG // // This file is part of ProtonMail Bridge. // // ProtonMail Bridge 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 3 of the License, or // (at your option) any later version. // // ProtonMail Bridge 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 ProtonMail Bridge. If not, see . import QtQuick 2.13 import QtQuick.Layouts 1.12 import QtQuick.Controls 2.12 import Proton 4.0 Item { id: root property ColorScheme colorScheme property var backend property var notifications signal login(string username, string password) signal login2FA(string username, string code) signal login2Password(string username, string password) signal loginAbort(string username) signal showSetupGuide(var user, string address) property var noUser: QtObject { property var avatarText: "" property var username: "" property var password: "" property var usedBytes: 1 property var totalBytes: 1 property var loggedIn: false property var splitMode: false property var addresses: [] } RowLayout { anchors.fill: parent spacing: 0 Rectangle { id: leftBar property ColorScheme colorScheme: root.colorScheme.prominent Layout.minimumWidth: 264 Layout.maximumWidth: 320 Layout.preferredWidth: 320 Layout.fillHeight: true color: colorScheme.background_norm ColumnLayout { anchors.fill: parent spacing: 0 RowLayout { id:topLeftBar Layout.fillWidth: true Layout.minimumHeight: 60 Layout.maximumHeight: 60 Layout.preferredHeight: 60 spacing: 0 Status { colorScheme: leftBar.colorScheme Layout.leftMargin: 16 Layout.topMargin: 24 Layout.bottomMargin: 17 Layout.alignment: Qt.AlignHCenter } // just a placeholder Item { Layout.fillHeight: true Layout.fillWidth: true } Button { colorScheme: leftBar.colorScheme Layout.minimumHeight: 36 Layout.maximumHeight: 36 Layout.preferredHeight: 36 Layout.minimumWidth: 36 Layout.maximumWidth: 36 Layout.preferredWidth: 36 Layout.topMargin: 16 Layout.bottomMargin: 9 Layout.rightMargin: 4 horizontalPadding: 0 icon.source: "./icons/ic-question-circle.svg" onClicked: rightContent.showHelpView() } Button { colorScheme: leftBar.colorScheme Layout.minimumHeight: 36 Layout.maximumHeight: 36 Layout.preferredHeight: 36 Layout.minimumWidth: 36 Layout.maximumWidth: 36 Layout.preferredWidth: 36 Layout.topMargin: 16 Layout.bottomMargin: 9 Layout.rightMargin: 16 horizontalPadding: 0 icon.source: "./icons/ic-cog-wheel.svg" onClicked: rightContent.showGeneralSettings() } } Item {implicitHeight:10} // Separator line Rectangle { Layout.fillWidth: true Layout.minimumHeight: 1 Layout.maximumHeight: 1 color: leftBar.colorScheme.border_weak } ListView { id: accounts property var _topBottomMargins: 24 property var _leftRightMargins: 16 Layout.fillWidth: true Layout.fillHeight: true Layout.leftMargin: accounts._leftRightMargins Layout.rightMargin: accounts._leftRightMargins Layout.topMargin: accounts._topBottomMargins Layout.bottomMargin: accounts._topBottomMargins spacing: 12 clip: true boundsBehavior: Flickable.StopAtBounds header: Rectangle { height: headerLabel.height+16 // color: ProtonStyle.transparent Label{ colorScheme: leftBar.colorScheme id: headerLabel text: qsTr("Accounts") type: Label.LabelType.Body } } highlight: Rectangle { color: leftBar.colorScheme.interaction_default_active radius: 4 } model: root.backend.users delegate: AccountDelegate{ width: leftBar.width - 2*accounts._leftRightMargins id: accountDelegate colorScheme: leftBar.colorScheme user: root.backend.users.get(index) onClicked: { var user = root.backend.users.get(index) accounts.currentIndex = index if (user.loggedIn) { rightContent.showAccount() } else { signIn.username = user.username rightContent.showSignIn() } } } } // Separator Rectangle { Layout.fillWidth: true Layout.minimumHeight: 1 Layout.maximumHeight: 1 color: leftBar.colorScheme.border_weak } Item { id: bottomLeftBar Layout.fillWidth: true Layout.minimumHeight: 52 Layout.maximumHeight: 52 Layout.preferredHeight: 52 Button { colorScheme: leftBar.colorScheme width: 36 height: 36 anchors.left: parent.left anchors.top: parent.top anchors.leftMargin: 16 anchors.topMargin: 7 horizontalPadding: 0 icon.source: "./icons/ic-plus.svg" onClicked: { signIn.username = "" rightContent.showSignIn() } } } } } Rectangle { // right content background Layout.fillWidth: true Layout.fillHeight: true color: colorScheme.background_norm StackLayout { id: rightContent anchors.fill: parent AccountView { // 0 colorScheme: root.colorScheme backend: root.backend notifications: root.notifications user: { if (accounts.currentIndex < 0) return root.noUser if (root.backend.users.count == 0) return root.noUser return root.backend.users.get(accounts.currentIndex) } onShowSignIn: { signIn.username = this.user.username rightContent.showSignIn() } onShowSetupGuide: { root.showSetupGuide(user,address) } } GridLayout { // 1 columns: 2 Button { id: backButton Layout.leftMargin: 18 Layout.topMargin: 10 Layout.alignment: Qt.AlignTop colorScheme: root.colorScheme onClicked: rightContent.showAccount() icon.source: "icons/ic-arrow-left.svg" secondary: true horizontalPadding: 8 } SignIn { id: signIn Layout.topMargin: 68 Layout.leftMargin: 80 - backButton.width - 18 Layout.rightMargin: 80 Layout.bottomMargin: 68 Layout.preferredWidth: 320 Layout.fillWidth: true Layout.fillHeight: true colorScheme: root.colorScheme backend: root.backend onLogin : { root.backend.login ( username , password ) } onLogin2FA : { root.backend.login2FA ( username , code ) } onLogin2Password : { root.backend.login2Password ( username , password ) } onLoginAbort : { root.backend.loginAbort ( username ) } } } GeneralSettings { // 2 colorScheme: root.colorScheme backend: root.backend notifications: root.notifications } PortSettings { // 3 colorScheme: root.colorScheme backend: root.backend } SMTPSettings { // 4 colorScheme: root.colorScheme backend: root.backend } LocalCacheSettings { // 5 colorScheme: root.colorScheme backend: root.backend notifications: root.notifications } HelpView { // 6 colorScheme: root.colorScheme backend: root.backend } BugReportView { // 7 colorScheme: root.colorScheme backend: root.backend selectedAddress: { if (accounts.currentIndex < 0) return "" if (root.backend.users.count == 0) return "" return root.backend.users.get(accounts.currentIndex).addresses[0] } } function showAccount () { rightContent.currentIndex = 0 } function showSignIn () { rightContent.currentIndex = 1 } function showGeneralSettings () { rightContent.currentIndex = 2 } function showPortSettings () { rightContent.currentIndex = 3 } function showSMTPSettings () { rightContent.currentIndex = 4 } function showLocalCacheSettings () { rightContent.currentIndex = 5 } function showHelpView () { rightContent.currentIndex = 6 } function showBugReport () { rightContent.currentIndex = 7 } } } } function showLocalCacheSettings(){rightContent.showLocalCacheSettings() } function showSettings(){rightContent.showGeneralSettings() } function showHelp(){rightContent.showHelpView() } function showSignIn(username){ signIn.username = username rightContent.showSignIn() } }