import QtQuick import QtQuick.Window import QtQuick.Controls import QtQuick.Layouts import QtQuick.Dialogs import PageEnum 1.0 import Style 1.0 import "Config" import "Controls2" import "Components" import "Pages2" 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: AmneziaStyle.color.midnightBlack onClosing: function() { PageController.closeWindow() } title: "AmneziaVPN" Item { // This item is needed for focus handling id: defaultFocusItem objectName: "defaultFocusItem" focus: true Keys.onPressed: function(event) { switch (event.key) { case Qt.Key_Tab: case Qt.Key_Down: case Qt.Key_Right: FocusController.nextKeyTabItem() break case Qt.Key_Backtab: case Qt.Key_Up: case Qt.Key_Left: FocusController.previousKeyTabItem() break default: PageController.keyPressEvent(event.key) event.accepted = true } } } Connections { objectName: "pageControllerConnections" target: PageController 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.openTriggered() } function onGoToPageSettingsBackup() { PageController.goToPage(PageEnum.PageSettingsBackup) } function onShowBusyIndicator(visible) { busyIndicator.visible = visible PageController.disableControls(visible) } } Connections { objectName: "settingsControllerConnections" target: SettingsController function onChangeSettingsFinished(finishedMessage) { PageController.showNotificationMessage(finishedMessage) } } PageStart { objectName: "pageStart" width: root.width height: root.height } Item { objectName: "popupNotificationItem" 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 { objectName: "popupErrorMessageItem" anchors.right: parent.right anchors.left: parent.left anchors.bottom: parent.bottom implicitHeight: popupErrorMessage.height PopupType { id: popupErrorMessage } } Item { objectName: "privateKeyPassphraseDrawerItem" anchors.fill: parent DrawerType2 { id: privateKeyPassphraseDrawer anchors.fill: parent expandedHeight: root.height * 0.35 expandedStateContent: 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.textField.text = "" passphrase.textField.forceActiveFocus() } function onAboutToHide() { if (passphrase.textField.text !== "") { 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 } } BasicButtonType { id: saveButton Layout.fillWidth: true defaultColor: AmneziaStyle.color.transparent hoveredColor: AmneziaStyle.color.translucentWhite pressedColor: AmneziaStyle.color.sheerWhite disabledColor: AmneziaStyle.color.mutedGray textColor: AmneziaStyle.color.paleGray borderWidth: 1 text: qsTr("Save") clickedFunc: function() { privateKeyPassphraseDrawer.closeTriggered() PageController.passphraseRequestDrawerClosed(passphrase.textField.text) } } } } } Item { objectName: "questionDrawerItem" anchors.fill: parent QuestionDrawer { id: questionDrawer anchors.fill: parent } } Item { objectName: "busyIndicatorItem" anchors.fill: parent BusyIndicatorType { id: busyIndicator anchors.centerIn: parent z: 1 } } function showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) { questionDrawer.headerText = headerText questionDrawer.descriptionText = descriptionText questionDrawer.yesButtonText = yesButtonText questionDrawer.noButtonText = noButtonText questionDrawer.yesButtonFunction = function() { questionDrawer.closeTriggered() if (yesButtonFunction && typeof yesButtonFunction === "function") { yesButtonFunction() } } questionDrawer.noButtonFunction = function() { questionDrawer.closeTriggered() if (noButtonFunction && typeof noButtonFunction === "function") { noButtonFunction() } } questionDrawer.openTriggered() } FileDialog { id: mainFileDialog objectName: "mainFileDialog" property bool isSaveMode: false fileMode: isSaveMode ? FileDialog.SaveFile : FileDialog.OpenFile onAccepted: SystemController.fileDialogClosed(true) onRejected: SystemController.fileDialogClosed(false) } }