Files
amnezia-client/client/ui/qml/main.qml
T

475 lines
13 KiB
QML
Raw Normal View History

2021-07-28 16:13:29 +07:00
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.12
2021-08-19 01:27:22 +03:00
import QtQuick.Controls.Material 2.12
2021-08-09 00:41:52 +07:00
import PageEnum 1.0
2021-07-28 16:13:29 +07:00
import Qt.labs.platform 1.1
import QtQuick.Dialogs 1.1
import "./"
2021-08-19 01:27:22 +03:00
import "Pages"
2021-09-06 12:30:26 +03:00
import "Pages/Protocols"
2021-08-19 01:27:22 +03:00
import "Config"
2021-07-28 16:13:29 +07:00
2021-09-13 17:36:48 +03:00
Window {
2021-08-19 01:27:22 +03:00
Material.theme: Material.Dark
Material.accent: Material.Purple
2021-07-28 16:13:29 +07:00
id: root
visible: true
width: GC.screenWidth
height: GC.isDesktop() ? GC.screenHeight + titleBar.height : GC.screenHeight
2021-09-13 17:36:48 +03:00
Keys.enabled: true
2021-08-09 00:41:52 +07:00
onClosing: {
2021-09-13 17:36:48 +03:00
console.debug("QML onClosing signal")
2021-08-09 00:41:52 +07:00
UiLogic.onCloseWindow()
}
2021-08-19 01:27:22 +03:00
//flags: Qt.FramelessWindowHint
2021-07-28 16:13:29 +07:00
title: "AmneziaVPN"
function getPageComponent(page) {
switch (page) {
2021-08-09 00:41:52 +07:00
case PageEnum.Start:
2021-07-28 16:13:29 +07:00
return page_start;
2021-08-09 00:41:52 +07:00
case PageEnum.NewServer:
2021-07-28 16:13:29 +07:00
return page_new_server
2021-08-09 00:41:52 +07:00
case PageEnum.NewServerProtocols:
2021-07-28 16:13:29 +07:00
return page_new_server_protocols
2021-08-09 00:41:52 +07:00
case PageEnum.Wizard:
2021-07-28 16:13:29 +07:00
return page_setup_wizard
2021-08-09 00:41:52 +07:00
case PageEnum.WizardHigh:
2021-07-28 16:13:29 +07:00
return page_setup_wizard_high_level
2021-08-09 00:41:52 +07:00
case PageEnum.WizardLow:
2021-07-28 16:13:29 +07:00
return page_setup_wizard_low_level
2021-08-09 00:41:52 +07:00
case PageEnum.WizardMedium:
2021-07-28 16:13:29 +07:00
return page_setup_wizard_medium_level
2021-08-09 00:41:52 +07:00
case PageEnum.WizardVpnMode:
2021-07-28 16:13:29 +07:00
return page_setup_wizard_vpn_mode
2021-08-09 00:41:52 +07:00
case PageEnum.ServerConfiguring:
2021-07-28 16:13:29 +07:00
return page_new_server_configuring
2021-08-09 00:41:52 +07:00
case PageEnum.Vpn:
2021-07-28 16:13:29 +07:00
return page_vpn
2021-08-09 00:41:52 +07:00
case PageEnum.GeneralSettings:
2021-07-28 16:13:29 +07:00
return page_general_settings
2021-08-09 00:41:52 +07:00
case PageEnum.AppSettings:
2021-07-28 16:13:29 +07:00
return page_app_settings
2021-08-09 00:41:52 +07:00
case PageEnum.NetworkSettings:
2021-07-28 16:13:29 +07:00
return page_network_settings
2021-08-09 00:41:52 +07:00
case PageEnum.ServerSettings:
2021-07-28 16:13:29 +07:00
return page_server_settings
2021-09-07 19:26:58 +03:00
case PageEnum.ServerContainers:
return page_server_containers
2021-08-09 00:41:52 +07:00
case PageEnum.ServersList:
2021-07-28 16:13:29 +07:00
return page_servers
2021-08-09 00:41:52 +07:00
case PageEnum.ShareConnection:
2021-07-28 16:13:29 +07:00
return page_share_connection
2021-08-09 00:41:52 +07:00
case PageEnum.Sites:
2021-07-28 16:13:29 +07:00
return page_sites
2021-08-09 00:41:52 +07:00
case PageEnum.OpenVpnSettings:
2021-07-28 16:13:29 +07:00
return page_proto_openvpn
2021-08-09 00:41:52 +07:00
case PageEnum.ShadowSocksSettings:
2021-07-28 16:13:29 +07:00
return page_proto_shadowsocks
2021-08-09 00:41:52 +07:00
case PageEnum.CloakSettings:
2021-07-28 16:13:29 +07:00
return page_proto_cloak
}
return undefined;
}
function getPageEnum(item) {
if (item instanceof PageStart) {
2021-08-09 00:41:52 +07:00
return PageEnum.Start
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageNewServer) {
2021-08-09 00:41:52 +07:00
return PageEnum.NewServer
2021-07-28 16:13:29 +07:00
}
2021-09-07 11:48:25 +03:00
if (item instanceof PageNewServerProtocols) {
2021-08-09 00:41:52 +07:00
return PageEnum.NewServerProtocols
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageSetupWizard) {
2021-08-09 00:41:52 +07:00
return PageEnum.Wizard
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageSetupWizardHighLevel) {
2021-08-09 00:41:52 +07:00
return PageEnum.WizardHigh
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageSetupWizardLowLevel) {
2021-08-09 00:41:52 +07:00
return PageEnum.WizardLow
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageSetupWizardMediumLevel) {
2021-08-09 00:41:52 +07:00
return PageEnum.WizardMedium
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageSetupWizardVPNMode) {
2021-08-09 00:41:52 +07:00
return PageEnum.WizardVpnMode
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageNewServerConfiguring) {
2021-08-09 00:41:52 +07:00
return PageEnum.ServerConfiguring
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageVPN) {
2021-08-09 00:41:52 +07:00
return PageEnum.Vpn
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageGeneralSettings) {
2021-08-09 00:41:52 +07:00
return PageEnum.GeneralSettings
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageAppSetting) {
2021-08-09 00:41:52 +07:00
return PageEnum.AppSettings
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageNetworkSetting) {
2021-08-09 00:41:52 +07:00
return PageEnum.NetworkSettings
2021-07-28 16:13:29 +07:00
}
2021-09-07 19:26:58 +03:00
if (item instanceof PageServerSettings) {
2021-08-09 00:41:52 +07:00
return PageEnum.ServerSettings
2021-07-28 16:13:29 +07:00
}
2021-09-07 19:26:58 +03:00
if (item instanceof PageServerContainers) {
return PageEnum.ServerContainers
2021-07-28 16:13:29 +07:00
}
2021-09-03 22:15:05 +03:00
if (item instanceof PageServerList) {
2021-08-09 00:41:52 +07:00
return PageEnum.ServersList
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageShareConnection) {
2021-08-09 00:41:52 +07:00
return PageEnum.ShareConnection
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageSites) {
2021-08-09 00:41:52 +07:00
return PageEnum.Sites
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageProtoOpenVPN) {
2021-08-09 00:41:52 +07:00
return PageEnum.OpenVpnSettings
2021-07-28 16:13:29 +07:00
}
2021-09-06 14:35:57 +03:00
if (item instanceof PageProtoShadowSocks) {
2021-08-09 00:41:52 +07:00
return PageEnum.ShadowSocksSettings
2021-07-28 16:13:29 +07:00
}
if (item instanceof PageProtoCloak) {
2021-08-09 00:41:52 +07:00
return PageEnum.CloakSettings
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
return PageEnum.Start
2021-07-28 16:13:29 +07:00
}
function gotoPage(page, reset, slide) {
let pageComponent = getPageComponent(page)
2021-08-09 00:41:52 +07:00
console.debug(pageComponent)
2021-07-28 16:13:29 +07:00
if (reset) {
2021-08-09 00:41:52 +07:00
if (page === PageEnum.ServerSettings) {
2021-09-08 14:23:02 +03:00
ServerSettingsLogic.updatePage();
}
if (page === PageEnum.ShareConnection) {
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.Wizard) {
2021-09-08 14:23:02 +03:00
WizardLogic.radioButtonMediumChecked = true
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.WizardHigh) {
2021-09-08 14:23:02 +03:00
WizardLogic.updatePage();
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.ServerConfiguring) {
2021-09-08 14:23:02 +03:00
ServerConfiguringLogic.progressBarValue = 0;
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.GeneralSettings) {
2021-09-08 13:52:36 +03:00
GeneralSettingsLogic.updatePage();
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.ServersList) {
2021-09-08 14:23:02 +03:00
ServerListLogic.updatePage();
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.Start) {
2021-09-04 12:53:58 +03:00
StartPageLogic.pushButtonBackFromStartVisible = !pageLoader.empty
2021-09-08 14:23:02 +03:00
StartPageLogic.updatePage();
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.NewServerProtocols) {
2021-09-07 22:11:43 +03:00
NewServerProtocolsLogic.updatePage()
2021-07-28 16:13:29 +07:00
}
2021-09-07 19:26:58 +03:00
if (page === PageEnum.ServerContainers) {
ServerContainersLogic.updateServerContainersPage()
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.AppSettings) {
2021-09-07 22:11:43 +03:00
AppSettingsLogic.updatePage()
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.NetworkSettings) {
2021-09-07 22:11:43 +03:00
NetworkSettingsLogic.updatePage()
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.Sites) {
2021-09-03 20:17:13 +03:00
SitesLogic.updateSitesPage()
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.Vpn) {
2021-09-07 21:01:56 +03:00
VpnLogic.updateVpnPage()
2021-07-28 16:13:29 +07:00
}
}
if (slide) {
pageLoader.push(pageComponent, {}, StackView.PushTransition)
} else {
pageLoader.push(pageComponent, {}, StackView.Immediate)
}
}
function close_page() {
if (pageLoader.depth <= 1) {
return
}
pageLoader.pop()
}
function set_start_page(page, slide) {
pageLoader.clear()
let pageComponent = getPageComponent(page)
if (slide) {
pageLoader.push(pageComponent, {}, StackView.PushTransition)
} else {
pageLoader.push(pageComponent, {}, StackView.Immediate)
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.Start) {
2021-07-28 16:13:29 +07:00
UiLogic.pushButtonBackFromStartVisible = !pageLoader.empty
2021-09-08 14:23:02 +03:00
UiLogic.updatePage();
2021-07-28 16:13:29 +07:00
}
}
TitleBar {
id: titleBar
anchors.top: root.top
visible: GC.isDesktop()
DragHandler {
grabPermissions: TapHandler.CanTakeOverFromAnything
onActiveChanged: {
if (active) {
root.startSystemMove();
}
}
target: null
}
onCloseButtonClicked: {
2021-08-09 00:41:52 +07:00
if (UiLogic.currentPageValue === PageEnum.Start ||
UiLogic.currentPageValue === PageEnum.NewServer) {
2021-07-28 16:13:29 +07:00
Qt.quit()
} else {
root.hide()
}
}
}
Rectangle {
y: GC.isDesktop() ? titleBar.height : 0
2021-08-19 01:27:22 +03:00
anchors.fill: parent
2021-07-28 16:13:29 +07:00
color: "white"
}
StackView {
id: pageLoader
y: GC.isDesktop() ? titleBar.height : 0
2021-08-19 01:27:22 +03:00
anchors.fill: parent
2021-09-13 17:36:48 +03:00
focus: true
2021-08-19 01:27:22 +03:00
2021-08-09 00:41:52 +07:00
// initialItem: page_servers
2021-07-28 16:13:29 +07:00
onCurrentItemChanged: {
let pageEnum = root.getPageEnum(currentItem)
UiLogic.currentPageValue = pageEnum
}
2021-09-13 17:36:48 +03:00
Keys.onReleased: {
if (event.key === Qt.Key_Back || event.key === Qt.Key_Escape) {
console.debug("Back button captured")
if (UiLogic.currentPageValue !== PageEnum.VPN &&
UiLogic.currentPageValue !== PageEnum.ServerConfiguring &&
!(UiLogic.currentPageValue === PageEnum.Start && pageLoader.depth < 2)) {
close_page();
}
// TODO: fix
//if (ui->stackedWidget_main->currentWidget()->isEnabled()) {
// closePage();
//}
event.accepted = true
}
}
2021-07-28 16:13:29 +07:00
}
Component {
id: page_start
PageStart {}
}
Component {
id: page_new_server
PageNewServer {}
}
Component {
id: page_setup_wizard
PageSetupWizard {}
}
Component {
id: page_setup_wizard_high_level
PageSetupWizardHighLevel {}
}
Component {
id: page_setup_wizard_vpn_mode
PageSetupWizardVPNMode {}
}
Component {
id: page_setup_wizard_medium_level
PageSetupWizardMediumLevel {}
}
Component {
id: page_setup_wizard_low_level
PageSetupWizardLowLevel {}
}
Component {
id: page_new_server_protocols
2021-09-07 11:48:25 +03:00
PageNewServerProtocols {}
2021-07-28 16:13:29 +07:00
}
Component {
id: page_vpn
PageVPN {}
}
Component {
id: page_sites
PageSites {}
}
Component {
id: page_general_settings
PageGeneralSettings {}
}
Component {
id: page_servers
2021-09-03 22:15:05 +03:00
PageServerList {}
2021-07-28 16:13:29 +07:00
}
Component {
id: page_app_settings
PageAppSetting {}
}
Component {
id: page_network_settings
PageNetworkSetting {}
}
Component {
id: page_server_settings
2021-09-07 19:26:58 +03:00
PageServerSettings {}
2021-07-28 16:13:29 +07:00
}
Component {
2021-09-07 19:26:58 +03:00
id: page_server_containers
PageServerContainers {}
2021-07-28 16:13:29 +07:00
}
Component {
id: page_share_connection
PageShareConnection {}
}
Component {
id: page_proto_openvpn
PageProtoOpenVPN {}
}
Component {
id: page_proto_shadowsocks
2021-09-06 14:35:57 +03:00
PageProtoShadowSocks {}
2021-07-28 16:13:29 +07:00
}
Component {
id: page_proto_cloak
PageProtoCloak {}
}
Component {
id: page_new_server_configuring
PageNewServerConfiguring {}
}
Component.onCompleted: {
UiLogic.initalizeUiLogic()
}
Connections {
target: UiLogic
onGoToPage: {
root.gotoPage(page, reset, slide)
}
onClosePage: {
root.close_page()
}
onSetStartPage: {
root.set_start_page(page, slide)
}
2021-08-09 00:41:52 +07:00
onShowPublicKeyWarning: {
publicKeyWarning.visible = true
}
onShowConnectErrorDialog: {
connectErrorDialog.visible = true
}
onShow: {
root.show()
}
onHide: {
root.hide()
}
2021-07-28 16:13:29 +07:00
}
MessageDialog {
id: closePrompt
// x: (root.width - width) / 2
// y: (root.height - height) / 2
title: qsTr("Exit")
text: qsTr("Do you really want to quit?")
standardButtons: StandardButton.Yes | StandardButton.No
onYes: {
Qt.quit()
}
visible: false
}
SystemTrayIcon {
visible: true
icon.source: UiLogic.trayIconUrl
onActivated: {
if (Qt.platform.os == "osx" ||
Qt.platform.os == "linux") {
if (reason === SystemTrayIcon.DoubleClick ||
reason === SystemTrayIcon.Trigger) {
root.show()
root.raise()
root.requestActivate()
}
}
}
menu: Menu {
MenuItem {
iconSource: "qrc:/images/tray/application.png"
text: qsTr("Show") + " " + "AmneziaVPN"
onTriggered: {
root.show()
root.raise()
}
}
MenuSeparator { }
MenuItem {
text: qsTr("Connect")
enabled: UiLogic.trayActionConnectEnabled
onTriggered: {
UiLogic.onConnect()
}
}
MenuItem {
text: qsTr("Disconnect")
enabled: UiLogic.trayActionDisconnectEnabled
onTriggered: {
UiLogic.onDisconnect()
}
}
MenuSeparator { }
MenuItem {
iconSource: "qrc:/images/tray/link.png"
text: qsTr("Visit Website")
onTriggered: {
Qt.openUrlExternally("https://amnezia.org")
}
}
MenuItem {
iconSource: "qrc:/images/tray/cancel.png"
text: qsTr("Quit") + " " + "AmneziaVPN"
onTriggered: {
closePrompt.open()
}
}
}
}
2021-08-09 00:41:52 +07:00
MessageDialog {
id: publicKeyWarning
title: "AmneziaVPN"
text: qsTr("It's public key. Private key required")
visible: false
}
MessageDialog {
id: connectErrorDialog
title: "AmneziaVPN"
text: UiLogic.dialogConnectErrorText
visible: false
}
2021-07-28 16:13:29 +07:00
}