From 52ecd6899bac5941d7a96de7384f5a0ebddf4905 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Fri, 24 Jan 2025 23:27:01 +0700 Subject: [PATCH 1/4] bugfix: fixed textFields on PageSetupWizardCredentials --- .../ui/qml/Components/InstalledAppsDrawer.qml | 2 +- .../qml/Controls2/TextFieldWithHeaderType.qml | 7 +- client/ui/qml/Pages2/PageDevMenu.qml | 10 +- .../Pages2/PageProtocolAwgClientSettings.qml | 38 +++---- .../ui/qml/Pages2/PageProtocolAwgSettings.qml | 70 ++++++------- .../qml/Pages2/PageProtocolCloakSettings.qml | 16 +-- .../Pages2/PageProtocolOpenVpnSettings.qml | 12 +-- .../PageProtocolShadowSocksSettings.qml | 6 +- .../PageProtocolWireGuardClientSettings.qml | 8 +- .../Pages2/PageProtocolWireGuardSettings.qml | 12 +-- .../qml/Pages2/PageProtocolXraySettings.qml | 10 +- .../Pages2/PageServiceSocksProxySettings.qml | 46 ++++----- .../Pages2/PageSettingsAppSplitTunneling.qml | 2 +- client/ui/qml/Pages2/PageSettingsDns.qml | 16 +-- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 8 +- .../qml/Pages2/PageSettingsSplitTunneling.qml | 6 +- .../Pages2/PageSetupWizardConfigSource.qml | 4 +- .../qml/Pages2/PageSetupWizardCredentials.qml | 99 ++++++++----------- .../PageSetupWizardProtocolSettings.qml | 4 +- .../ui/qml/Pages2/PageSetupWizardTextKey.qml | 4 +- client/ui/qml/Pages2/PageShare.qml | 28 +++--- client/ui/qml/main2.qml | 6 +- 22 files changed, 196 insertions(+), 218 deletions(-) diff --git a/client/ui/qml/Components/InstalledAppsDrawer.qml b/client/ui/qml/Components/InstalledAppsDrawer.qml index 5835e1c6..ce8ef837 100644 --- a/client/ui/qml/Components/InstalledAppsDrawer.qml +++ b/client/ui/qml/Components/InstalledAppsDrawer.qml @@ -135,7 +135,7 @@ DrawerType2 { backgroundColor: AmneziaStyle.color.slateGray - textFieldPlaceholderText: qsTr("application name") + textField.placeholderText: qsTr("application name") } BasicButtonType { diff --git a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml index fbea618b..c4ed91b3 100644 --- a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml +++ b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml @@ -22,11 +22,9 @@ Item { property var clickedFunc property alias textField: textField - property alias textFieldText: textField.text property string textFieldTextColor: AmneziaStyle.color.paleGray property string textFieldTextDisabledColor: AmneziaStyle.color.mutedGray - property string textFieldPlaceholderText property bool textFieldEditable: true property string borderColor: AmneziaStyle.color.slateGray @@ -101,7 +99,6 @@ Item { inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText - placeholderText: root.textFieldPlaceholderText placeholderTextColor: AmneziaStyle.color.charcoalGray selectionColor: AmneziaStyle.color.richBrown @@ -129,8 +126,8 @@ Item { } onActiveFocusChanged: { - if (checkEmptyText && textFieldText === "") { - errorText = qsTr("The field can't be empty") + if (root.checkEmptyText && text === "") { + root.errorText = qsTr("The field can't be empty") } } diff --git a/client/ui/qml/Pages2/PageDevMenu.qml b/client/ui/qml/Pages2/PageDevMenu.qml index d93e5a38..d7afde1d 100644 --- a/client/ui/qml/Pages2/PageDevMenu.qml +++ b/client/ui/qml/Pages2/PageDevMenu.qml @@ -66,18 +66,18 @@ PageType { Layout.leftMargin: 16 headerText: qsTr("Gateway endpoint") - textFieldText: SettingsController.gatewayEndpoint + textField.text: SettingsController.gatewayEndpoint - buttonImageSource: textFieldText !== "" ? "qrc:/images/controls/refresh-cw.svg" : "" + buttonImageSource: textField.text !== "" ? "qrc:/images/controls/refresh-cw.svg" : "" clickedFunc: function() { SettingsController.resetGatewayEndpoint() } textField.onEditingFinished: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== SettingsController.gatewayEndpoint) { - SettingsController.gatewayEndpoint = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== SettingsController.gatewayEndpoint) { + SettingsController.gatewayEndpoint = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml index d31f63e3..c22fdf0c 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml @@ -103,12 +103,12 @@ PageType { Layout.topMargin: 40 headerText: qsTr("MTU") - textFieldText: clientMtu + textField.text: clientMtu textField.validator: IntValidator { bottom: 576; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== clientMtu) { - clientMtu = textFieldText + if (textField.text !== clientMtu) { + clientMtu = textField.text } } checkEmptyText: true @@ -121,12 +121,12 @@ PageType { Layout.topMargin: 16 headerText: "Jc - Junk packet count" - textFieldText: clientJunkPacketCount + textField.text: clientJunkPacketCount textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== clientJunkPacketCount) { - clientJunkPacketCount = textFieldText + if (textField.text !== clientJunkPacketCount) { + clientJunkPacketCount = textField.text } } @@ -141,12 +141,12 @@ PageType { Layout.topMargin: 16 headerText: "Jmin - Junk packet minimum size" - textFieldText: clientJunkPacketMinSize + textField.text: clientJunkPacketMinSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== clientJunkPacketMinSize) { - clientJunkPacketMinSize = textFieldText + if (textField.text !== clientJunkPacketMinSize) { + clientJunkPacketMinSize = textField.text } } @@ -161,12 +161,12 @@ PageType { Layout.topMargin: 16 headerText: "Jmax - Junk packet maximum size" - textFieldText: clientJunkPacketMaxSize + textField.text: clientJunkPacketMaxSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== clientJunkPacketMaxSize) { - clientJunkPacketMaxSize = textFieldText + if (textField.text !== clientJunkPacketMaxSize) { + clientJunkPacketMaxSize = textField.text } } @@ -189,7 +189,7 @@ PageType { enabled: false headerText: qsTr("Port") - textFieldText: port + textField.text: port } TextFieldWithHeaderType { @@ -200,7 +200,7 @@ PageType { enabled: false headerText: "S1 - Init packet junk size" - textFieldText: serverInitPacketJunkSize + textField.text: serverInitPacketJunkSize } TextFieldWithHeaderType { @@ -211,7 +211,7 @@ PageType { enabled: false headerText: "S2 - Response packet junk size" - textFieldText: serverResponsePacketJunkSize + textField.text: serverResponsePacketJunkSize } TextFieldWithHeaderType { @@ -222,7 +222,7 @@ PageType { enabled: false headerText: "H1 - Init packet magic header" - textFieldText: serverInitPacketMagicHeader + textField.text: serverInitPacketMagicHeader } TextFieldWithHeaderType { @@ -233,7 +233,7 @@ PageType { enabled: false headerText: "H2 - Response packet magic header" - textFieldText: serverResponsePacketMagicHeader + textField.text: serverResponsePacketMagicHeader } TextFieldWithHeaderType { @@ -244,7 +244,7 @@ PageType { enabled: false headerText: "H3 - Underload packet magic header" - textFieldText: serverUnderloadPacketMagicHeader + textField.text: serverUnderloadPacketMagicHeader } TextFieldWithHeaderType { @@ -255,7 +255,7 @@ PageType { enabled: false headerText: "H4 - Transport packet magic header" - textFieldText: serverTransportPacketMagicHeader + textField.text: serverTransportPacketMagicHeader } } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 3594cd9d..8c629b68 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -106,11 +106,11 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("VPN address subnet") - textFieldText: subnetAddress + textField.text: subnetAddress textField.onEditingFinished: { - if (textFieldText !== subnetAddress) { - subnetAddress = textFieldText + if (textField.text !== subnetAddress) { + subnetAddress = textField.text } } @@ -125,13 +125,13 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } @@ -144,16 +144,16 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Jc - Junk packet count") - textFieldText: serverJunkPacketCount + textField.text: serverJunkPacketCount textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText === "") { - textFieldText = "0" + if (textField.text === "") { + textField.text = "0" } - if (textFieldText !== serverJunkPacketCount) { - serverJunkPacketCount = textFieldText + if (textField.text !== serverJunkPacketCount) { + serverJunkPacketCount = textField.text } } @@ -166,12 +166,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Jmin - Junk packet minimum size") - textFieldText: serverJunkPacketMinSize + textField.text: serverJunkPacketMinSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverJunkPacketMinSize) { - serverJunkPacketMinSize = textFieldText + if (textField.text !== serverJunkPacketMinSize) { + serverJunkPacketMinSize = textField.text } } @@ -184,12 +184,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Jmax - Junk packet maximum size") - textFieldText: serverJunkPacketMaxSize + textField.text: serverJunkPacketMaxSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverJunkPacketMaxSize) { - serverJunkPacketMaxSize = textFieldText + if (textField.text !== serverJunkPacketMaxSize) { + serverJunkPacketMaxSize = textField.text } } @@ -202,12 +202,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("S1 - Init packet junk size") - textFieldText: serverInitPacketJunkSize + textField.text: serverInitPacketJunkSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverInitPacketJunkSize) { - serverInitPacketJunkSize = textFieldText + if (textField.text !== serverInitPacketJunkSize) { + serverInitPacketJunkSize = textField.text } } @@ -226,12 +226,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("S2 - Response packet junk size") - textFieldText: serverResponsePacketJunkSize + textField.text: serverResponsePacketJunkSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverResponsePacketJunkSize) { - serverResponsePacketJunkSize = textFieldText + if (textField.text !== serverResponsePacketJunkSize) { + serverResponsePacketJunkSize = textField.text } } @@ -250,12 +250,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H1 - Init packet magic header") - textFieldText: serverInitPacketMagicHeader + textField.text: serverInitPacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverInitPacketMagicHeader) { - serverInitPacketMagicHeader = textFieldText + if (textField.text !== serverInitPacketMagicHeader) { + serverInitPacketMagicHeader = textField.text } } @@ -268,12 +268,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H2 - Response packet magic header") - textFieldText: serverResponsePacketMagicHeader + textField.text: serverResponsePacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverResponsePacketMagicHeader) { - serverResponsePacketMagicHeader = textFieldText + if (textField.text !== serverResponsePacketMagicHeader) { + serverResponsePacketMagicHeader = textField.text } } @@ -286,12 +286,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H4 - Transport packet magic header") - textFieldText: serverTransportPacketMagicHeader + textField.text: serverTransportPacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverTransportPacketMagicHeader) { - serverTransportPacketMagicHeader = textFieldText + if (textField.text !== serverTransportPacketMagicHeader) { + serverTransportPacketMagicHeader = textField.text } } @@ -304,12 +304,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H3 - Underload packet magic header") - textFieldText: serverUnderloadPacketMagicHeader + textField.text: serverUnderloadPacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverUnderloadPacketMagicHeader) { - serverUnderloadPacketMagicHeader = textFieldText + if (textField.text !== serverUnderloadPacketMagicHeader) { + serverUnderloadPacketMagicHeader = textField.text } } diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index e90325ba..686ccd7b 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -89,18 +89,18 @@ PageType { Layout.topMargin: 32 headerText: qsTr("Disguised as traffic from") - textFieldText: site + textField.text: site textField.onEditingFinished: { - if (textFieldText !== site) { - var tmpText = textFieldText + if (textField.text !== site) { + var tmpText = textField.text tmpText = tmpText.toLocaleLowerCase() var indexHttps = tmpText.indexOf("https://") if (indexHttps === 0) { - tmpText = textFieldText.substring(8) + tmpText = textField.text.substring(8) } else { - site = textFieldText + site = textField.text } } } @@ -113,13 +113,13 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 6c5ad23f..9cc628b7 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -88,13 +88,13 @@ PageType { Layout.topMargin: 32 headerText: qsTr("VPN address subnet") - textFieldText: subnetAddress + textField.text: subnetAddress parentFlickable: fl textField.onEditingFinished: { - if (textFieldText !== subnetAddress) { - subnetAddress = textFieldText + if (textField.text !== subnetAddress) { + subnetAddress = textField.text } } } @@ -137,13 +137,13 @@ PageType { enabled: isPortEditable headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 44cbd1ce..5786012b 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -93,13 +93,13 @@ PageType { enabled: isPortEditable headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml index 7413df38..a30c17e7 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml @@ -97,12 +97,12 @@ PageType { Layout.topMargin: 40 headerText: qsTr("MTU") - textFieldText: clientMtu + textField.text: clientMtu textField.validator: IntValidator { bottom: 576; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== clientMtu) { - clientMtu = textFieldText + if (textField.text !== clientMtu) { + clientMtu = textField.text } } checkEmptyText: true @@ -124,7 +124,7 @@ PageType { enabled: false headerText: qsTr("Port") - textFieldText: port + textField.text: port } } } diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml index f83d97fd..10523b74 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml @@ -90,11 +90,11 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("VPN address subnet") - textFieldText: subnetAddress + textField.text: subnetAddress textField.onEditingFinished: { - if (textFieldText !== subnetAddress) { - subnetAddress = textFieldText + if (textField.text !== subnetAddress) { + subnetAddress = textField.text } } @@ -109,13 +109,13 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } diff --git a/client/ui/qml/Pages2/PageProtocolXraySettings.qml b/client/ui/qml/Pages2/PageProtocolXraySettings.qml index 6d2ad3d1..90705d3e 100644 --- a/client/ui/qml/Pages2/PageProtocolXraySettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXraySettings.qml @@ -86,18 +86,18 @@ PageType { Layout.topMargin: 32 headerText: qsTr("Disguised as traffic from") - textFieldText: site + textField.text: site textField.onEditingFinished: { - if (textFieldText !== site) { - var tmpText = textFieldText + if (textField.text !== site) { + var tmpText = textField.text tmpText = tmpText.toLocaleLowerCase() var indexHttps = tmpText.indexOf("https://") if (indexHttps === 0) { - tmpText = textFieldText.substring(8) + tmpText = textField.text.substring(8) } else { - site = textFieldText + site = textField.text } } } diff --git a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml index 5eee9a1e..1b77267a 100644 --- a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml +++ b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml @@ -211,9 +211,9 @@ PageType { port = tempPort username = tempUsername password = tempPassword - portTextField.textFieldText = port - usernameTextField.textFieldText = username - passwordTextField.textFieldText = password + portTextField.textField.text = port + usernameTextField.textField.text = username + passwordTextField.textField.text = password } } @@ -231,14 +231,14 @@ PageType { parentFlickable: fl headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== port) { - port = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== port) { + port = textField.text } } } @@ -251,14 +251,14 @@ PageType { parentFlickable: fl headerText: qsTr("Username") - textFieldPlaceholderText: "username" - textFieldText: username + textField.placeholderText: "username" + textField.text: username textField.maximumLength: 32 textField.onEditingFinished: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== username) { - username = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== username) { + username = textField.text } } } @@ -273,12 +273,12 @@ PageType { parentFlickable: fl headerText: qsTr("Password") - textFieldPlaceholderText: "password" - textFieldText: password + textField.placeholderText: "password" + textField.text: password textField.maximumLength: 32 textField.echoMode: hidePassword ? TextInput.Password : TextInput.Normal - buttonImageSource: textFieldText !== "" ? (hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") + buttonImageSource: textField.text !== "" ? (hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" clickedFunc: function() { @@ -286,9 +286,9 @@ PageType { } textField.onFocusChanged: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== password) { - password = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== password) { + password = textField.text } } } @@ -309,19 +309,19 @@ PageType { portTextField.errorText = qsTr("The port must be in the range of 1 to 65535") return } - if (usernameTextField.textFieldText && passwordTextField.textFieldText === "") { + if (usernameTextField.textField.text && passwordTextField.textField.text === "") { passwordTextField.errorText = qsTr("Password cannot be empty") return - } else if (usernameTextField.textFieldText === "" && passwordTextField.textFieldText) { + } else if (usernameTextField.textField.text === "" && passwordTextField.textField.text) { usernameTextField.errorText = qsTr("Username cannot be empty") return } PageController.goToPage(PageEnum.PageSetupWizardInstalling) InstallController.updateContainer(Socks5ProxyConfigModel.getConfig()) - tempPort = portTextField.textFieldText - tempUsername = usernameTextField.textFieldText - tempPassword = passwordTextField.textFieldText + tempPort = portTextField.textField.text + tempUsername = usernameTextField.textField.text + tempPassword = passwordTextField.textField.text changeSettingsDrawer.closeTriggered() } } diff --git a/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml index a78ae446..b6920a8f 100644 --- a/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml @@ -252,7 +252,7 @@ PageType { Layout.fillWidth: true - textFieldPlaceholderText: qsTr("application name") + textField.placeholderText: qsTr("application name") buttonImageSource: "qrc:/images/controls/plus.svg" rightButtonClickedOnEnter: true diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index 11e49cf9..d78c5aa8 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -67,7 +67,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Primary DNS") - textFieldText: SettingsController.primaryDns + textField.text: SettingsController.primaryDns textField.validator: RegularExpressionValidator { regularExpression: InstallController.ipAddressRegExp() } @@ -79,7 +79,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Secondary DNS") - textFieldText: SettingsController.secondaryDns + textField.text: SettingsController.secondaryDns textField.validator: RegularExpressionValidator { regularExpression: InstallController.ipAddressRegExp() } @@ -105,9 +105,9 @@ PageType { var yesButtonFunction = function() { SettingsController.primaryDns = "1.1.1.1" - primaryDns.textFieldText = SettingsController.primaryDns + primaryDns.textField.text = SettingsController.primaryDns SettingsController.secondaryDns = "1.0.0.1" - secondaryDns.textFieldText = SettingsController.secondaryDns + secondaryDns.textField.text = SettingsController.secondaryDns PageController.showNotificationMessage(qsTr("Settings have been reset")) } var noButtonFunction = function() { @@ -125,11 +125,11 @@ PageType { text: qsTr("Save") clickedFunc: function() { - if (primaryDns.textFieldText !== SettingsController.primaryDns) { - SettingsController.primaryDns = primaryDns.textFieldText + if (primaryDns.textField.text !== SettingsController.primaryDns) { + SettingsController.primaryDns = primaryDns.textField.text } - if (secondaryDns.textFieldText !== SettingsController.secondaryDns) { - SettingsController.secondaryDns = secondaryDns.textFieldText + if (secondaryDns.textField.text !== SettingsController.secondaryDns) { + SettingsController.secondaryDns = secondaryDns.textField.text } PageController.showNotificationMessage(qsTr("Settings saved")) } diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index 3172d31b..9abb6ae2 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -142,7 +142,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Server name") - textFieldText: root.processedServer.name + textField.text: root.processedServer.name textField.maximumLength: 30 checkEmptyText: true } @@ -155,12 +155,12 @@ PageType { text: qsTr("Save") clickedFunc: function() { - if (serverName.textFieldText === "") { + if (serverName.textField.text === "") { return } - if (serverName.textFieldText !== root.processedServer.name) { - ServersModel.setProcessedServerData("name", serverName.textFieldText); + if (serverName.textField.text !== root.processedServer.name) { + ServersModel.setProcessedServerData("name", serverName.textField.text); } serverNameEditDrawer.closeTriggered() } diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 759ad9cd..9c355363 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -274,13 +274,13 @@ PageType { Layout.fillWidth: true rightButtonClickedOnEnter: true - textFieldPlaceholderText: qsTr("website or IP") + textField.placeholderText: qsTr("website or IP") buttonImageSource: "qrc:/images/controls/plus.svg" clickedFunc: function() { PageController.showBusyIndicator(true) - SitesController.addSite(textFieldText) - textFieldText = "" + SitesController.addSite(textField.text) + textField.text = "" PageController.showBusyIndicator(false) } } diff --git a/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml b/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml index 17d733d8..4ccfd247 100644 --- a/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml +++ b/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml @@ -163,12 +163,12 @@ PageType { Layout.rightMargin: 16 Layout.leftMargin: 16 - visible: textKey.textFieldText !== "" + visible: textKey.textField.text !== "" text: qsTr("Continue") clickedFunc: function() { - if (ImportController.extractConfigFromData(textKey.textFieldText)) { + if (ImportController.extractConfigFromData(textKey.textField.text)) { PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } diff --git a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml index 20b85550..ca7e3a7c 100644 --- a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml +++ b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml @@ -82,24 +82,19 @@ PageType { reuseItems: true delegate: ColumnLayout { - property alias textField: _textField.textField - width: listView.width TextFieldWithHeaderType { - id: _textField + id: delegate Layout.fillWidth: true Layout.leftMargin: 16 Layout.rightMargin: 16 - property bool hidePassword: hideText - headerText: title - textField.echoMode: hideText ? TextInput.Password : TextInput.Normal - buttonImageSource: imageSource - textFieldPlaceholderText: placeholderText - textField.text: textFieldText + textField.echoMode: hideContent ? TextInput.Password : TextInput.Normal + textField.placeholderText: placeholderContent + textField.text: textField.text rightButtonClickedOnEnter: true @@ -108,17 +103,12 @@ PageType { } textField.onFocusChanged: { - var _currentIndex = listView.currentIndex - var _currentItem = listView.itemAtIndex(_currentIndex).children[0] - listView.model[_currentIndex].textFieldText = _currentItem.textFieldText.replace(/^\s+|\s+$/g, '') + textField.text = textField.text.replace(/^\s+|\s+$/g, '') } textField.onTextChanged: { - var _currentIndex = listView.currentIndex - textFieldText = textField.text - - if (_currentIndex === vars.secretDataIndex) { - buttonImageSource = textFieldText !== "" ? (hideText ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" + if (hideContent) { + buttonImageSource = textField.text !== "" ? (hideContent ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" } } } @@ -143,9 +133,9 @@ PageType { } InstallController.setShouldCreateServer(true) - var _hostname = listView.itemAtIndex(vars.hostnameIndex).children[0].textFieldText - var _username = listView.itemAtIndex(vars.usernameIndex).children[0].textFieldText - var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0].textFieldText + var _hostname = listView.itemAtIndex(vars.hostnameIndex).children[0].textField.text + var _username = listView.itemAtIndex(vars.usernameIndex).children[0].textField.text + var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0].textField.text InstallController.setProcessedServerCredentials(_hostname, _username, _secretData) @@ -194,23 +184,23 @@ PageType { function isCredentialsFilled() { var hasEmptyField = false - var _hostname = listView.itemAtIndex(vars.hostnameIndex).children[0] - if (_hostname.textFieldText === "") { - _hostname.errorText = qsTr("Ip address cannot be empty") + var hostnameItem = listView.itemAtIndex(vars.hostnameIndex).children[0] + if (hostnameItem.textField.text === "") { + hostnameItem.errorText = qsTr("Ip address cannot be empty") hasEmptyField = true - } else if (!_hostname.textField.acceptableInput) { - _hostname.errorText = qsTr("Enter the address in the format 255.255.255.255:88") + } else if (!hostnameItem.textField.acceptableInput) { + hostnameItem.errorText = qsTr("Enter the address in the format 255.255.255.255:88") } - var _username = listView.itemAtIndex(vars.usernameIndex).children[0] - if (_username.textFieldText === "") { - _username.errorText = qsTr("Login cannot be empty") + var usernameItem = listView.itemAtIndex(vars.usernameIndex).children[0] + if (usernameItem.textField.text === "") { + usernameItem.errorText = qsTr("Login cannot be empty") hasEmptyField = true } - var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0] - if (_secretData.textFieldText === "") { - _secretData.errorText = qsTr("Password/private key cannot be empty") + var secretDataItem = listView.itemAtIndex(vars.secretDataIndex).children[0] + if (secretDataItem.textField.text === "") { + secretDataItem.errorText = qsTr("Password/private key cannot be empty") hasEmptyField = true } @@ -218,46 +208,37 @@ PageType { } property list inputFields: [ - hostname, - username, - secretData + hostnameObject, + usernameObject, + secretDataObject ] QtObject { - id: hostname + id: hostnameObject property string title: qsTr("Server IP address [:port]") - readonly property string placeholderText: qsTr("255.255.255.255:22") - property string textFieldText: "" - property bool hideText: false - property string imageSource: "" - readonly property var clickedHandler: function() { - console.debug(">>> Server IP address text field was clicked!!!") - clicked() - } - } - - QtObject { - id: username - - property string title: qsTr("SSH Username") - readonly property string placeholderText: "root" - property string textFieldText: "" - property bool hideText: false - property string imageSource: "" + readonly property string placeholderContent: qsTr("255.255.255.255:22") + property bool hideContent: false readonly property var clickedHandler: undefined } QtObject { - id: secretData + id: usernameObject + + property string title: qsTr("SSH Username") + readonly property string placeholderContent: "root" + property bool hideContent: false + readonly property var clickedHandler: undefined + } + + QtObject { + id: secretDataObject property string title: qsTr("Password or SSH private key") - readonly property string placeholderText: "" - property string textFieldText: "" - property bool hideText: true - property string imageSource: textFieldText !== "" ? (hideText ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" + readonly property string placeholderContent: "" + property bool hideContent: true readonly property var clickedHandler: function() { - hideText = !hideText + hideContent = !hideContent } } diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index 0de4da6b..50d1ea81 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -257,7 +257,7 @@ PageType { } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.install(dockerContainer, port.textFieldText, transportProtoSelector.currentIndex) + InstallController.install(dockerContainer, port.textField.text, transportProtoSelector.currentIndex) } } @@ -267,7 +267,7 @@ PageType { if (ProtocolProps.defaultPort(defaultContainerProto) < 0) { port.visible = false } else { - port.textFieldText = ProtocolProps.getPortForInstall(defaultContainerProto) + port.textField.text = ProtocolProps.getPortForInstall(defaultContainerProto) } transportProtoSelector.currentIndex = ProtocolProps.defaultTransportProto(defaultContainerProto) diff --git a/client/ui/qml/Pages2/PageSetupWizardTextKey.qml b/client/ui/qml/Pages2/PageSetupWizardTextKey.qml index 126a7c91..3cf154e4 100644 --- a/client/ui/qml/Pages2/PageSetupWizardTextKey.qml +++ b/client/ui/qml/Pages2/PageSetupWizardTextKey.qml @@ -51,7 +51,7 @@ PageType { Layout.leftMargin: 16 headerText: qsTr("Key") - textFieldPlaceholderText: "vpn://" + textField.placeholderText: "vpn://" buttonText: qsTr("Insert") clickedFunc: function() { @@ -75,7 +75,7 @@ PageType { text: qsTr("Continue") clickedFunc: function() { - if (ImportController.extractConfigFromData(textKey.textFieldText)) { + if (ImportController.extractConfigFromData(textKey.textField.text)) { PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index add4dc61..27e851de 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -51,25 +51,25 @@ PageType { switch (type) { case PageShare.ConfigType.AmneziaConnection: { - ExportController.generateConnectionConfig(clientNameTextField.textFieldText); + ExportController.generateConnectionConfig(clientNameTextField.textField.text); break; } case PageShare.ConfigType.OpenVpn: { - ExportController.generateOpenVpnConfig(clientNameTextField.textFieldText) + ExportController.generateOpenVpnConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") shareConnectionDrawer.configExtension = ".ovpn" shareConnectionDrawer.configFileName = "amnezia_for_openvpn" break } case PageShare.ConfigType.WireGuard: { - ExportController.generateWireGuardConfig(clientNameTextField.textFieldText) + ExportController.generateWireGuardConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save WireGuard config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_wireguard" break } case PageShare.ConfigType.Awg: { - ExportController.generateAwgConfig(clientNameTextField.textFieldText) + ExportController.generateAwgConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save AmneziaWG config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_awg" @@ -90,7 +90,7 @@ PageType { break } case PageShare.ConfigType.Xray: { - ExportController.generateXrayConfig(clientNameTextField.textFieldText) + ExportController.generateXrayConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save XRay config") shareConnectionDrawer.configExtension = ".json" shareConnectionDrawer.configFileName = "amnezia_for_xray" @@ -296,7 +296,7 @@ PageType { visible: accessTypeSelector.currentIndex === 0 headerText: qsTr("User name") - textFieldText: "New client" + textField.text: "New client" textField.maximumLength: 20 checkEmptyText: true @@ -525,7 +525,7 @@ PageType { parentFlickable: a clickedFunc: function(){ - if (clientNameTextField.textFieldText !== "") { + if (clientNameTextField.textField.text !== "") { ExportController.generateConfig(root.connectionTypesModel[exportTypeSelector.currentIndex].type) } } @@ -555,14 +555,14 @@ PageType { id: searchTextField Layout.fillWidth: true - textFieldPlaceholderText: qsTr("Search") + textField.placeholderText: qsTr("Search") Keys.onEscapePressed: { root.isSearchBarVisible = false } function navigateTo() { - if (searchTextField.textFieldText === "") { + if (searchTextField.textField.text === "") { root.isSearchBarVisible = false } } @@ -601,7 +601,7 @@ PageType { sourceModel: ClientManagementModel filters: RegExpFilter { roleName: "clientName" - pattern: ".*" + searchTextField.textFieldText + ".*" + pattern: ".*" + searchTextField.textField.text + ".*" caseSensitivity: Qt.CaseInsensitive } } @@ -765,7 +765,7 @@ PageType { id: clientNameEditor Layout.fillWidth: true headerText: qsTr("Client name") - textFieldText: clientName + textField.text: clientName textField.maximumLength: 20 checkEmptyText: true } @@ -778,14 +778,14 @@ PageType { text: qsTr("Save") clickedFunc: function() { - if (clientNameEditor.textFieldText === "") { + if (clientNameEditor.textField.text === "") { return } - if (clientNameEditor.textFieldText !== clientName) { + if (clientNameEditor.textField.text !== clientName) { PageController.showBusyIndicator(true) ExportController.renameClient(index, - clientNameEditor.textFieldText, + clientNameEditor.textField.text, ContainersModel.getProcessedContainerIndex(), ServersModel.getProcessedServerCredentials()) PageController.showBusyIndicator(false) diff --git a/client/ui/qml/main2.qml b/client/ui/qml/main2.qml index 8b73e62d..7cd5790b 100644 --- a/client/ui/qml/main2.qml +++ b/client/ui/qml/main2.qml @@ -176,12 +176,12 @@ Window { Connections { target: privateKeyPassphraseDrawer function onOpened() { - passphrase.textFieldText = "" + passphrase.textField.text = "" passphrase.textField.forceActiveFocus() } function onAboutToHide() { - if (passphrase.textFieldText !== "") { + if (passphrase.textField.text !== "") { PageController.showBusyIndicator(true) } } @@ -222,7 +222,7 @@ Window { clickedFunc: function() { privateKeyPassphraseDrawer.closeTriggered() - PageController.passphraseRequestDrawerClosed(passphrase.textFieldText) + PageController.passphraseRequestDrawerClosed(passphrase.textField.text) } } } From 36045c6694a94b3001ae40ba9f15f19531a6dc61 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Jan 2025 14:13:30 +0700 Subject: [PATCH 2/4] bugfix: fixed scrolling by keys on PageSettingsApiServerInfo --- .../qml/Pages2/PageSettingsApiServerInfo.qml | 125 ++++++++++++------ 1 file changed, 83 insertions(+), 42 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml index 39207486..1fc17218 100644 --- a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml @@ -15,61 +15,100 @@ import "../Components" PageType { id: root - FlickableType { - id: fl - anchors.top: parent.top - anchors.bottom: parent.bottom - contentHeight: content.height + property list labelsModel: [ + regionObject, + priceObject, + endDateObject, + speedObject + ] - ColumnLayout { - id: content + QtObject { + id: regionObject - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right + readonly property string title: qsTr("For the region") + readonly property string contentKey: "region" + readonly property string objectImageSource: "qrc:/images/controls/map-pin.svg" + } + QtObject { + id: priceObject + + readonly property string title: qsTr("Price") + readonly property string contentKey: "price" + readonly property string objectImageSource: "qrc:/images/controls/tag.svg" + } + + QtObject { + id: endDateObject + + readonly property string title: qsTr("Valid until") + readonly property string contentKey: "endDate" + readonly property string objectImageSource: "qrc:/images/controls/history.svg" + } + + QtObject { + id: speedObject + + readonly property string title: qsTr("Speed") + readonly property string contentKey: "speed" + readonly property string objectImageSource: "qrc:/images/controls/gauge.svg" + } + + ListView { + id: listView + anchors.fill: parent + + property bool isFocusable: true + + Keys.onTabPressed: { + FocusController.nextKeyTabItem() + } + + Keys.onBacktabPressed: { + FocusController.previousKeyTabItem() + } + + Keys.onUpPressed: { + FocusController.nextKeyUpItem() + } + + Keys.onDownPressed: { + FocusController.nextKeyDownItem() + } + + Keys.onLeftPressed: { + FocusController.nextKeyLeftItem() + } + + Keys.onRightPressed: { + FocusController.nextKeyRightItem() + } + + ScrollBar.vertical: ScrollBarType {} + + model: labelsModel + clip: true + reuseItems: true + + delegate: ColumnLayout { + width: listView.width spacing: 0 LabelWithImageType { Layout.fillWidth: true Layout.margins: 16 - imageSource: "qrc:/images/controls/map-pin.svg" - leftText: qsTr("For the region") - rightText: ApiServicesModel.getSelectedServiceData("region") - } - - LabelWithImageType { - Layout.fillWidth: true - Layout.margins: 16 - - imageSource: "qrc:/images/controls/tag.svg" - leftText: qsTr("Price") - rightText: ApiServicesModel.getSelectedServiceData("price") - } - - LabelWithImageType { - property bool showSubscriptionEndDate: ServersModel.getProcessedServerData("isCountrySelectionAvailable") - - Layout.fillWidth: true - Layout.margins: 16 - - imageSource: "qrc:/images/controls/history.svg" - leftText: showSubscriptionEndDate ? qsTr("Valid until") : qsTr("Work period") - rightText: showSubscriptionEndDate ? ApiServicesModel.getSelectedServiceData("endDate") - : ApiServicesModel.getSelectedServiceData("workPeriod") + imageSource: objectImageSource + leftText: title + rightText: ApiServicesModel.getSelectedServiceData(contentKey) visible: rightText !== "" } + } - LabelWithImageType { - Layout.fillWidth: true - Layout.margins: 16 - - imageSource: "qrc:/images/controls/gauge.svg" - leftText: qsTr("Speed") - rightText: ApiServicesModel.getSelectedServiceData("speed") - } + footer: ColumnLayout { + width: listView.width + spacing: 0 ParagraphTextType { Layout.fillWidth: true @@ -88,6 +127,8 @@ PageType { return text.replace("%1", LanguageModel.getCurrentSiteUrl()) } + visible: text !== "" + MouseArea { anchors.fill: parent acceptedButtons: Qt.NoButton From e707471b04b16a7a08456fccde3f568373a545b1 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Jan 2025 14:56:27 +0700 Subject: [PATCH 3/4] chore: fixed log output with split tunneling info --- client/vpnconnection.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index ac881bd7..eda93b6b 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -215,10 +215,15 @@ ErrorCode VpnConnection::lastError() const void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &vpnConfiguration) { - qDebug() << QString("ConnectToVpn, Server index is %1, container is %2, route mode is") + qDebug() << QString("Trying to connect to VPN, server index is %1, container is %2") .arg(serverIndex) - .arg(ContainerProps::containerToString(container)) - << m_settings->routeMode(); + .arg(ContainerProps::containerToString(container)); + qDebug() << QString("Site split tunneling is %1, route mode is %2") + .arg(m_settings->isSitesSplitTunnelingEnabled() ? "enabled" : "diabled") + .arg(m_settings->routeMode()); + qDebug() << QString("App split tunneling is %1, route mode is %2") + .arg(m_settings->isAppsSplitTunnelingEnabled() ? "enabled" : "diabled") + .arg(m_settings->getAppsRouteMode()); #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) if (!m_IpcClient) { m_IpcClient = new IpcClient(this); From 76640311abd34e072fc04c08ff39e778a2ff2f68 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Jan 2025 14:56:46 +0700 Subject: [PATCH 4/4] chore: hide "open logs folder" button for mobule platforms --- client/ui/qml/Pages2/PageSettingsLogging.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ui/qml/Pages2/PageSettingsLogging.qml b/client/ui/qml/Pages2/PageSettingsLogging.qml index 7d85e2b3..2c760e37 100644 --- a/client/ui/qml/Pages2/PageSettingsLogging.qml +++ b/client/ui/qml/Pages2/PageSettingsLogging.qml @@ -137,6 +137,8 @@ PageType { Layout.topMargin: -8 Layout.bottomMargin: -8 + visible: !GC.isMobile() + text: qsTr("Open logs folder") leftImageSource: "qrc:/images/controls/folder-open.svg" isSmallLeftImage: true