import QtQuick import QtQuick.Window import QtQuick.Controls import QtQuick.Layouts import QtQuick.Dialogs import PageEnum 1.0 import "Config" import "Controls2" import "Components" Window { id: root objectName: "mainWindow" visible: true width: GC.screenWidth height: GC.screenHeight minimumWidth: GC.isDesktop() ? 360 : 0 minimumHeight: GC.isDesktop() ? 640 : 0 maximumWidth: 600 maximumHeight: 800 color: "#0E0E11" onClosing: function() { console.debug("QML onClosing signal") PageController.closeWindow() } title: "AmneziaVPN" StackViewType { id: rootStackView anchors.fill: parent focus: true Component.onCompleted: { var pagePath = PageController.getInitialPage() rootStackView.push(pagePath, { "objectName" : pagePath }) } Keys.onPressed: function(event) { PageController.keyPressEvent(event.key) event.accepted = true } } Connections { target: PageController function onReplaceStartPage() { var pagePath = PageController.getInitialPage() rootStackView.clear() PageController.updateNavigationBarColor(PageController.getInitialPageNavigationBarColor()) rootStackView.replace(pagePath, { "objectName" : pagePath }) } function onRaiseMainWindow() { root.show() root.raise() root.requestActivate() } function onHideMainWindow() { root.hide() } function onShowErrorMessage(errorMessage) { popupErrorMessage.text = errorMessage popupErrorMessage.open() } function onShowNotificationMessage(message) { popupNotificationMessage.text = message popupNotificationMessage.closeButtonVisible = false popupNotificationMessage.open() popupNotificationTimer.start() } function onShowPassphraseRequestDrawer() { privateKeyPassphraseDrawer.open() } function onGoToPageSettingsBackup() { PageController.goToPage(PageEnum.PageSettingsBackup) } } Connections { target: SettingsController function onChangeSettingsFinished(finishedMessage) { PageController.showNotificationMessage(finishedMessage) } } Item { anchors.right: parent.right anchors.left: parent.left anchors.bottom: parent.bottom implicitHeight: popupNotificationMessage.height PopupType { id: popupNotificationMessage } Timer { id: popupNotificationTimer interval: 3000 repeat: false running: false onTriggered: { popupNotificationMessage.close() } } } Item { anchors.right: parent.right anchors.left: parent.left anchors.bottom: parent.bottom implicitHeight: popupErrorMessage.height PopupType { id: popupErrorMessage } } Item { anchors.fill: parent DrawerType2 { id: privateKeyPassphraseDrawer anchors.fill: parent expandedHeight: root.height * 0.35 expandedContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right anchors.topMargin: 16 anchors.leftMargin: 16 anchors.rightMargin: 16 Connections { target: privateKeyPassphraseDrawer function onOpened() { passphrase.textFieldText = "" passphrase.textField.forceActiveFocus() } function onAboutToHide() { if (passphrase.textFieldText !== "") { PageController.showBusyIndicator(true) } } function onAboutToShow() { PageController.showBusyIndicator(false) } } TextFieldWithHeaderType { id: passphrase property bool hidePassword: true Layout.fillWidth: true headerText: qsTr("Private key passphrase") textField.echoMode: hidePassword ? TextInput.Password : TextInput.Normal buttonImageSource: hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg" clickedFunc: function() { hidePassword = !hidePassword } KeyNavigation.tab: saveButton } BasicButtonType { id: saveButton Layout.fillWidth: true defaultColor: "transparent" hoveredColor: Qt.rgba(1, 1, 1, 0.08) pressedColor: Qt.rgba(1, 1, 1, 0.12) disabledColor: "#878B91" textColor: "#D7D8DB" borderWidth: 1 text: qsTr("Save") clickedFunc: function() { privateKeyPassphraseDrawer.close() PageController.passphraseRequestDrawerClosed(passphrase.textFieldText) } } } } } Item { anchors.fill: parent QuestionDrawer { id: questionDrawer anchors.fill: parent } } function showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) { questionDrawer.headerText = headerText questionDrawer.descriptionText = descriptionText questionDrawer.yesButtonText = yesButtonText questionDrawer.noButtonText = noButtonText questionDrawer.yesButtonFunction = function() { questionDrawer.close() if (yesButtonFunction && typeof yesButtonFunction === "function") { yesButtonFunction() } } questionDrawer.noButtonFunction = function() { questionDrawer.close() if (noButtonFunction && typeof noButtonFunction === "function") { noButtonFunction() } } questionDrawer.open() } FileDialog { id: mainFileDialog property bool isSaveMode: false objectName: "mainFileDialog" fileMode: isSaveMode ? FileDialog.SaveFile : FileDialog.OpenFile onAccepted: SystemController.fileDialogClosed(true) onRejected: SystemController.fileDialogClosed(false) } }