You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
11 KiB
317 lines
11 KiB
// Copyright (c) 2022 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 <https://www.gnu.org/licenses/>. |
|
|
|
|
|
import QtQuick 2.13 |
|
import QtQuick.Layouts 1.12 |
|
import QtQuick.Controls 2.12 |
|
import QtQuick.Controls.impl 2.12 |
|
|
|
import Proton 4.0 |
|
|
|
Item { |
|
id:root |
|
|
|
property ColorScheme colorScheme |
|
property var backend |
|
property var user |
|
property string address |
|
|
|
signal dismissed() |
|
signal finished() |
|
|
|
implicitHeight: children[0].implicitHeight |
|
implicitWidth: children[0].implicitWidth |
|
|
|
|
|
ListModel { |
|
id: clients |
|
property string name : "Apple Mail" |
|
property string iconSource : "./icons/ic-apple-mail.svg" |
|
property bool haveAutoSetup: true |
|
property string link: "https://protonmail.com/bridge/applemail" |
|
|
|
Component.onCompleted : { |
|
if (root.backend.goos == "darwin") { |
|
append({ |
|
"name" : "Apple Mail", |
|
"iconSource" : "./icons/ic-apple-mail.svg", |
|
"haveAutoSetup" : true, |
|
"link" : "https://protonmail.com/bridge/applemail" |
|
}) |
|
append({ |
|
"name" : "Microsoft Outlook", |
|
"iconSource" : "./icons/ic-microsoft-outlook.svg", |
|
"haveAutoSetup" : false, |
|
"link" : "https://protonmail.com/bridge/outlook2019-mac" |
|
}) |
|
} |
|
if (root.backend.goos == "windows") { |
|
append({ |
|
"name" : "Microsoft Outlook", |
|
"iconSource" : "./icons/ic-microsoft-outlook.svg", |
|
"haveAutoSetup" : false, |
|
"link" : "https://protonmail.com/bridge/outlook2019" |
|
}) |
|
} |
|
|
|
append({ |
|
"name" : "Mozilla Thunderbird", |
|
"iconSource" : "./icons/ic-mozilla-thunderbird.svg", |
|
"haveAutoSetup" : false, |
|
"link" : "https://protonmail.com/bridge/thunderbird" |
|
}) |
|
|
|
append({ |
|
"name" : "Other", |
|
"iconSource" : "./icons/ic-other-mail-clients.svg", |
|
"haveAutoSetup" : false, |
|
"link" : "https://protonmail.com/bridge/clients" |
|
}) |
|
|
|
} |
|
} |
|
|
|
Rectangle { |
|
anchors.fill: root |
|
color: root.colorScheme.background_norm |
|
} |
|
|
|
StackLayout { |
|
id: guidePages |
|
anchors.fill: parent |
|
anchors.leftMargin: 80 |
|
anchors.rightMargin: 80 |
|
anchors.topMargin: 30 |
|
anchors.bottomMargin: 70 |
|
|
|
|
|
ColumnLayout { // 0: Client selection |
|
id: clientView |
|
Layout.fillHeight: true |
|
|
|
property int columnWidth: 268 |
|
|
|
spacing: 8 |
|
|
|
Label { |
|
colorScheme: root.colorScheme |
|
text: qsTr("Setting up email client") |
|
type: Label.LabelType.Heading |
|
} |
|
|
|
Label { |
|
colorScheme: root.colorScheme |
|
text: address |
|
color: root.colorScheme.text_weak |
|
type: Label.LabelType.Lead |
|
} |
|
|
|
RowLayout { |
|
Layout.topMargin: 32-clientView.spacing |
|
spacing: 24 |
|
|
|
ColumnLayout { |
|
id: clientColumn |
|
Layout.alignment: Qt.AlignTop |
|
|
|
Label { |
|
id: labelA |
|
colorScheme: root.colorScheme |
|
text: qsTr("Choose an email client") |
|
type: Label.LabelType.Body_semibold |
|
} |
|
|
|
ListView { |
|
id: clientList |
|
Layout.fillHeight: true |
|
width: clientView.columnWidth |
|
|
|
model: clients |
|
|
|
highlight: Rectangle { |
|
color: root.colorScheme.interaction_default_active |
|
radius: ProtonStyle.context_item_radius |
|
} |
|
|
|
delegate: Item { |
|
implicitWidth: clientRow.width |
|
implicitHeight: clientRow.height |
|
|
|
ColumnLayout { |
|
id: clientRow |
|
width: clientList.width |
|
|
|
RowLayout { |
|
Layout.topMargin: 12 |
|
Layout.bottomMargin: 12 |
|
Layout.leftMargin: 16 |
|
Layout.rightMargin: 16 |
|
|
|
ColorImage { |
|
source: model.iconSource |
|
height: 36 |
|
sourceSize.height: 36 |
|
} |
|
|
|
Label { |
|
colorScheme: root.colorScheme |
|
Layout.leftMargin: 12 |
|
text: model.name |
|
type: Label.LabelType.Body |
|
} |
|
} |
|
|
|
Rectangle { |
|
Layout.fillWidth: true |
|
Layout.preferredHeight: 1 |
|
color: root.colorScheme.border_weak |
|
} |
|
} |
|
|
|
MouseArea { |
|
anchors.fill: parent |
|
cursorShape: Qt.PointingHandCursor |
|
onClicked: { |
|
clientList.currentIndex = index |
|
if (!model.haveAutoSetup) { |
|
root.setupAction(1,index) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
ColumnLayout { |
|
id: actionColumn |
|
visible: clientList.currentIndex >= 0 && clients.get(clientList.currentIndex).haveAutoSetup |
|
Layout.alignment: Qt.AlignTop |
|
|
|
Label { |
|
colorScheme: root.colorScheme |
|
text: qsTr("Choose configuration mode") |
|
type: Label.LabelType.Body_semibold |
|
} |
|
|
|
ListView { |
|
id: actionList |
|
Layout.fillHeight: true |
|
width: clientView.columnWidth |
|
|
|
model: [ |
|
qsTr("Configure automatically"), |
|
qsTr("Configure manually"), |
|
] |
|
|
|
highlight: Rectangle { |
|
color: root.colorScheme.interaction_default_active |
|
radius: ProtonStyle.context_item_radius |
|
} |
|
|
|
delegate: Item { |
|
implicitWidth: children[0].width |
|
implicitHeight: children[0].height |
|
|
|
ColumnLayout { |
|
width: actionList.width |
|
|
|
Label { |
|
Layout.topMargin: 20 |
|
Layout.bottomMargin: 20 |
|
Layout.leftMargin: 16 |
|
Layout.rightMargin: 16 |
|
colorScheme: root.colorScheme |
|
text: modelData |
|
type: Label.LabelType.Body |
|
} |
|
|
|
Rectangle { |
|
Layout.fillWidth: true |
|
Layout.preferredHeight: 1 |
|
color: root.colorScheme.border_weak |
|
} |
|
} |
|
|
|
MouseArea { |
|
anchors.fill: parent |
|
cursorShape: Qt.PointingHandCursor |
|
onClicked: { |
|
actionList.currentIndex = index |
|
root.setupAction(index,clientList.currentIndex) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
Item { Layout.fillHeight: true } |
|
|
|
Button { |
|
colorScheme: root.colorScheme |
|
text: qsTr("Set up later") |
|
flat: true |
|
|
|
onClicked: { |
|
root.setupAction(-1,-1) |
|
if (user) { |
|
user.setupGuideSeen = true |
|
} |
|
root.dismissed() |
|
} |
|
} |
|
} |
|
} |
|
|
|
function setupAction(actionID,clientID){ |
|
if (user) { |
|
user.setupGuideSeen = true |
|
} |
|
|
|
switch (actionID) { |
|
case -1: root.dismissed(); break; // dismiss |
|
case 0: // automatic |
|
if (user) { |
|
switch (clientID) { |
|
case 0: |
|
root.user.configureAppleMail(root.address) |
|
break; |
|
} |
|
} |
|
root.finished() |
|
break; |
|
case 1: // manual |
|
var clientObj = clients.get(clientID) |
|
if (clientObj != undefined && clientObj.link != "" ) { |
|
Qt.openUrlExternally(clientObj.link) |
|
} else { |
|
console.log("unexpected client index", actionID, clientID) |
|
} |
|
root.finished(); |
|
break; |
|
default: |
|
console.log("unexpected client setup action", actionID, clientID) |
|
} |
|
} |
|
|
|
function reset(){ |
|
guidePages.currentIndex = 0 |
|
clientList.currentIndex = -1 |
|
actionList.currentIndex = -1 |
|
} |
|
}
|
|
|