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

325 lines
9.6 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-11-06 13:47:52 +03:00
import PageType 1.0
2021-07-28 16:13:29 +07:00
import Qt.labs.platform 1.1
2021-09-14 00:39:07 +03:00
import Qt.labs.folderlistmodel 2.12
2021-07-28 16:13:29 +07:00
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-11-06 13:47:52 +03:00
import "Pages/Share"
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-09-14 00:39:07 +03:00
property var pages: ({})
2021-09-16 16:19:14 +03:00
property var protocolPages: ({})
2021-11-06 13:47:52 +03:00
property var sharePages: ({})
2021-08-19 01:27:22 +03:00
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"
2021-11-06 13:47:52 +03:00
function gotoPage(type, page, reset, slide) {
2021-09-19 14:31:38 +03:00
2021-11-06 13:47:52 +03:00
let p_obj;
if (type === PageType.Basic) p_obj = pages[page]
else if (type === PageType.Proto) p_obj = protocolPages[page]
else if (type === PageType.ShareProto) p_obj = sharePages[page]
else return
2021-09-20 21:51:28 +03:00
2021-11-06 13:47:52 +03:00
console.debug("QML gotoPage " + type + " " + page + " " + p_obj)
2021-07-28 16:13:29 +07:00
2021-09-19 14:31:38 +03:00
2021-09-16 19:49:50 +03:00
if (slide) {
2021-11-06 13:47:52 +03:00
pageLoader.push(p_obj, {}, StackView.PushTransition)
2021-09-16 19:49:50 +03:00
} else {
2021-11-06 13:47:52 +03:00
pageLoader.push(p_obj, {}, StackView.Immediate)
2021-09-16 19:49:50 +03:00
}
2021-09-20 21:51:28 +03:00
2021-11-06 13:47:52 +03:00
if (reset) {
p_obj.logic.onUpdatePage();
}
p_obj.activated(reset)
2021-09-16 19:49:50 +03:00
}
2021-07-28 16:13:29 +07:00
function close_page() {
if (pageLoader.depth <= 1) {
return
}
pageLoader.pop()
}
function set_start_page(page, slide) {
pageLoader.clear()
if (slide) {
2021-09-14 00:39:07 +03:00
pageLoader.push(pages[page], {}, StackView.PushTransition)
2021-07-28 16:13:29 +07:00
} else {
2021-09-14 00:39:07 +03:00
pageLoader.push(pages[page], {}, StackView.Immediate)
2021-07-28 16:13:29 +07:00
}
2021-08-09 00:41:52 +07:00
if (page === PageEnum.Start) {
2021-07-28 16:13:29 +07:00
UiLogic.pushButtonBackFromStartVisible = !pageLoader.empty
UiLogic.onUpdatePage();
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"
}
2021-11-06 13:47:52 +03:00
//PageShareProtoCloak {}
2021-07-28 16:13:29 +07:00
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-07-28 16:13:29 +07:00
onCurrentItemChanged: {
console.debug("QML onCurrentItemChanged " + pageLoader.currentItem)
2021-09-14 00:39:07 +03:00
UiLogic.currentPageValue = currentItem.page
2021-07-28 16:13:29 +07:00
}
2021-09-13 17:36:48 +03:00
2021-11-06 13:47:52 +03:00
onDepthChanged: {
UiLogic.pagesStackDepth = depth
}
Keys.onPressed: {
UiLogic.keyPressEvent(event.key)
2021-10-21 18:10:28 +03:00
event.accepted = true
2021-09-13 17:36:48 +03:00
}
2021-07-28 16:13:29 +07:00
}
2021-09-14 00:39:07 +03:00
FolderListModel {
id: folderModelPages
folder: "qrc:/ui/qml/Pages/"
nameFilters: ["*.qml"]
showDirs: false
onStatusChanged: if (status == FolderListModel.Ready) {
for (var i=0; i<folderModelPages.count; i++) {
2021-11-06 13:47:52 +03:00
createPagesObjects(folderModelPages.get(i, "filePath"), PageType.Basic);
2021-09-14 00:39:07 +03:00
}
UiLogic.initalizeUiLogic()
}
2021-07-28 16:13:29 +07:00
}
2021-09-14 00:39:07 +03:00
FolderListModel {
id: folderModelProtocols
folder: "qrc:/ui/qml/Pages/Protocols/"
nameFilters: ["*.qml"]
showDirs: false
onStatusChanged: if (status == FolderListModel.Ready) {
for (var i=0; i<folderModelProtocols.count; i++) {
2021-11-06 13:47:52 +03:00
createPagesObjects(folderModelProtocols.get(i, "filePath"), PageType.Proto);
2021-09-14 00:39:07 +03:00
}
}
2021-07-28 16:13:29 +07:00
}
2021-11-06 13:47:52 +03:00
FolderListModel {
id: folderModelShareProtocols
folder: "qrc:/ui/qml/Pages/Share/"
nameFilters: ["*.qml"]
showDirs: false
onStatusChanged: if (status == FolderListModel.Ready) {
for (var i=0; i<folderModelShareProtocols.count; i++) {
createPagesObjects(folderModelShareProtocols.get(i, "filePath"), PageType.ShareProto);
}
}
}
function createPagesObjects(file, type) {
2021-09-19 14:31:38 +03:00
if (file.indexOf("Base") !== -1) return; // skip Base Pages
2021-11-06 13:47:52 +03:00
//console.debug("Creating compenent " + file + " for " + type);
2021-09-19 14:31:38 +03:00
2021-09-14 00:39:07 +03:00
var c = Qt.createComponent("qrc" + file);
var finishCreation = function (component){
2021-11-06 13:47:52 +03:00
if (component.status === Component.Ready) {
2021-09-14 00:39:07 +03:00
var obj = component.createObject(root);
2021-11-06 13:47:52 +03:00
if (obj === null) {
2021-09-14 00:39:07 +03:00
console.debug("Error creating object " + component.url);
}
else {
obj.visible = false
2021-11-06 13:47:52 +03:00
if (type === PageType.Basic) {
pages[obj.page] = obj
}
else if (type === PageType.Proto) {
2021-09-16 19:49:50 +03:00
protocolPages[obj.protocol] = obj
}
2021-11-06 13:47:52 +03:00
else if (type === PageType.ShareProto) {
sharePages[obj.protocol] = obj
2021-09-16 19:49:50 +03:00
}
2021-11-06 13:47:52 +03:00
//console.debug("Created compenent " + component.url + " for " + type);
2021-09-14 00:39:07 +03:00
}
2021-11-06 13:47:52 +03:00
} else if (component.status === Component.Error) {
2021-09-14 00:39:07 +03:00
console.debug("Error loading component:", component.errorString());
}
}
2021-11-06 13:47:52 +03:00
if (c.status === Component.Ready)
2021-09-14 00:39:07 +03:00
finishCreation(c);
else {
console.debug("Warning: Pages components are not ready");
}
}
2021-07-28 16:13:29 +07:00
Connections {
target: UiLogic
function onGoToPage(page, reset, slide) {
2021-11-06 13:47:52 +03:00
console.debug("Qml Connections onGoToPage " + page);
root.gotoPage(PageType.Basic, page, reset, slide)
2021-07-28 16:13:29 +07:00
}
function onGoToProtocolPage(protocol, reset, slide) {
2021-11-06 13:47:52 +03:00
console.debug("Qml Connections onGoToProtocolPage " + protocol);
root.gotoPage(PageType.Proto, protocol, reset, slide)
}
function onGoToShareProtocolPage(protocol, reset, slide) {
console.debug("Qml Connections onGoToShareProtocolPage " + protocol);
root.gotoPage(PageType.ShareProto, protocol, reset, slide)
2021-09-16 19:49:50 +03:00
}
2021-11-06 13:47:52 +03:00
function onClosePage() {
2021-07-28 16:13:29 +07:00
root.close_page()
}
function onSetStartPage(page, slide) {
2021-07-28 16:13:29 +07:00
root.set_start_page(page, slide)
}
function onShowPublicKeyWarning() {
2021-08-09 00:41:52 +07:00
publicKeyWarning.visible = true
}
function onShowConnectErrorDialog() {
2021-08-09 00:41:52 +07:00
connectErrorDialog.visible = true
}
function onShow() {
2021-08-09 00:41:52 +07:00
root.show()
}
function onHide() {
2021-08-09 00:41:52 +07:00
root.hide()
}
2021-07-28 16:13:29 +07:00
}
2021-09-16 19:49:50 +03:00
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
}