Compare commits

...

4 Commits

Author SHA1 Message Date
vladimir.kuznetsov ab4f454c19 Merge branch 'fix/ui-fixes-after-merge-with-d20ed4a' of github.com:amnezia-vpn/amnezia-client into fix/ui-fixes-after-merge-with-d20ed4a 2025-08-09 22:21:38 +08:00
vladimir.kuznetsov e96dfe5800 chore: page settings dns margins 2025-08-09 22:20:48 +08:00
Cyril Anisimov 768c51dbbe update OpenVPN settings page 2025-08-09 14:19:11 +02:00
vladimir.kuznetsov 5acbdd7af6 fix: ui fixes after merge with d20ed4a 2025-08-08 11:45:20 +08:00
8 changed files with 389 additions and 421 deletions
@@ -34,7 +34,7 @@ PageType {
ListViewType { ListViewType {
id: listView id: listView
anchors.top: backButtonLayout.bottom anchors.top: backButton.bottom
anchors.bottom: saveButton.top anchors.bottom: saveButton.top
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.left anchors.left: parent.left
@@ -37,7 +37,7 @@ PageType {
ListViewType { ListViewType {
id: listView id: listView
anchors.top: backButtonLayout.bottom anchors.top: backButton.bottom
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
@@ -17,85 +17,65 @@ import "../Components"
PageType { PageType {
id: root id: root
ColumnLayout {
id: backButtonLayout
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 20
BackButtonType { BackButtonType {
id: backButton id: backButton
}
}
FlickableType {
id: fl
anchors.top: backButtonLayout.bottom
anchors.bottom: parent.bottom
contentHeight: content.implicitHeight
Column {
id: content
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.topMargin: 20
onActiveFocusChanged: {
if(backButton.enabled && backButton.activeFocus) {
listView.positionViewAtBeginning()
}
}
}
ListViewType {
id: listView
anchors.top: backButton.bottom
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.left: parent.left
enabled: ServersModel.isProcessedServerHasWriteAccess() enabled: ServersModel.isProcessedServerHasWriteAccess()
ListView { header: ColumnLayout {
id: listview width: listView.width
width: parent.width BaseHeaderType {
height: listview.contentItem.height id: header
clip: true Layout.fillWidth: true
interactive: false Layout.rightMargin: 16
Layout.leftMargin: 16
headerText: qsTr("OpenVPN Settings")
}
}
model: OpenVpnConfigModel model: OpenVpnConfigModel
delegate: Item { delegate: ColumnLayout {
id: delegateItem width: listView.width
property alias vpnAddressSubnetTextField: vpnAddressSubnetTextField
property bool isEnabled: ServersModel.isProcessedServerHasWriteAccess()
implicitWidth: listview.width
implicitHeight: col.implicitHeight
ColumnLayout {
id: col
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 16
anchors.rightMargin: 16
spacing: 0 spacing: 0
BaseHeaderType {
Layout.fillWidth: true
headerText: qsTr("OpenVPN settings")
}
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: vpnAddressSubnetTextField id: vpnAddressSubnetTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: delegateItem.isEnabled enabled: listView.enabled
headerText: qsTr("VPN address subnet") headerText: qsTr("VPN address subnet")
textField.text: subnetAddress textField.text: subnetAddress
parentFlickable: fl
textField.onEditingFinished: { textField.onEditingFinished: {
if (textField.text !== subnetAddress) { if (textField.text !== subnetAddress) {
subnetAddress = textField.text subnetAddress = textField.text
@@ -108,6 +88,8 @@ PageType {
ParagraphTextType { ParagraphTextType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
Layout.leftMargin: 16
Layout.rightMargin: 16
text: qsTr("Network protocol") text: qsTr("Network protocol")
} }
@@ -116,6 +98,9 @@ PageType {
id: transportProtoSelector id: transportProtoSelector
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
rootWidth: root.width rootWidth: root.width
enabled: isTransportProtoEditable enabled: isTransportProtoEditable
@@ -138,9 +123,10 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 40 Layout.topMargin: 40
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: delegateItem.isEnabled enabled: listView.enabled
headerText: qsTr("Port") headerText: qsTr("Port")
textField.text: port textField.text: port
@@ -161,7 +147,8 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
text: qsTr("Auto-negotiate encryption") text: qsTr("Auto-negotiate encryption")
checked: autoNegotiateEncryprion checked: autoNegotiateEncryprion
@@ -177,6 +164,8 @@ PageType {
id: hashDropDown id: hashDropDown
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 20 Layout.topMargin: 20
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: !autoNegotiateEncryprionSwitcher.checked enabled: !autoNegotiateEncryprionSwitcher.checked
@@ -225,6 +214,8 @@ PageType {
id: cipherDropDown id: cipherDropDown
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: !autoNegotiateEncryprionSwitcher.checked enabled: !autoNegotiateEncryprionSwitcher.checked
@@ -273,25 +264,18 @@ PageType {
id: contentRect id: contentRect
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
Layout.leftMargin: 16
Layout.rightMargin: 16
Layout.preferredHeight: checkboxLayout.implicitHeight Layout.preferredHeight: checkboxLayout.implicitHeight
color: AmneziaStyle.color.onyxBlack color: AmneziaStyle.color.onyxBlack
radius: 16 radius: 16
Connections {
target: tlsAuthCheckBox
enabled: !GC.isMobile()
function onFocusChanged() {
if (tlsAuthCheckBox.activeFocus) {
fl.ensureVisible(contentRect)
}
}
}
ColumnLayout { ColumnLayout {
id: checkboxLayout id: checkboxLayout
anchors.fill: parent anchors.fill: parent
CheckBoxType { CheckBoxType {
id: tlsAuthCheckBox id: tlsAuthCheckBox
Layout.fillWidth: true Layout.fillWidth: true
@@ -329,7 +313,8 @@ PageType {
id: additionalClientCommandsSwitcher id: additionalClientCommandsSwitcher
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
checked: additionalClientCommands !== "" checked: additionalClientCommands !== ""
@@ -346,11 +331,11 @@ PageType {
id: additionalClientCommandsTextArea id: additionalClientCommandsTextArea
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: additionalClientCommandsSwitcher.checked visible: additionalClientCommandsSwitcher.checked
parentFlickable: fl
textAreaText: additionalClientCommands textAreaText: additionalClientCommands
placeholderText: qsTr("Commands:") placeholderText: qsTr("Commands:")
@@ -365,7 +350,8 @@ PageType {
id: additionalServerCommandsSwitcher id: additionalServerCommandsSwitcher
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
checked: additionalServerCommands !== "" checked: additionalServerCommands !== ""
@@ -382,12 +368,14 @@ PageType {
id: additionalServerCommandsTextArea id: additionalServerCommandsTextArea
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: additionalServerCommandsSwitcher.checked visible: additionalServerCommandsSwitcher.checked
textAreaText: additionalServerCommands textAreaText: additionalServerCommands
placeholderText: qsTr("Commands:") placeholderText: qsTr("Commands:")
parentFlickable: fl
textArea.onEditingFinished: { textArea.onEditingFinished: {
if (additionalServerCommands !== textAreaText) { if (additionalServerCommands !== textAreaText) {
additionalServerCommands = textAreaText additionalServerCommands = textAreaText
@@ -401,12 +389,13 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
Layout.bottomMargin: 24 Layout.bottomMargin: 24
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: vpnAddressSubnetTextField.errorText === "" && enabled: vpnAddressSubnetTextField.errorText === "" &&
portTextField.errorText === "" portTextField.errorText === ""
text: qsTr("Save") text: qsTr("Save")
parentFlickable: fl
onClicked: function() { onClicked: function() {
forceActiveFocus() forceActiveFocus()
@@ -438,7 +427,4 @@ PageType {
} }
} }
} }
}
}
}
} }
@@ -66,8 +66,6 @@ PageType {
Layout.leftMargin: 16 Layout.leftMargin: 16
Layout.rightMargin: 16 Layout.rightMargin: 16
enabled: delegateItem.isEnabled
headerText: qsTr("VPN address subnet") headerText: qsTr("VPN address subnet")
textField.text: subnetAddress textField.text: subnetAddress
@@ -87,8 +85,6 @@ PageType {
Layout.leftMargin: 16 Layout.leftMargin: 16
Layout.rightMargin: 16 Layout.rightMargin: 16
enabled: delegateItem.isEnabled
headerText: qsTr("Port") headerText: qsTr("Port")
textField.text: port textField.text: port
textField.maximumLength: 5 textField.maximumLength: 5
-4
View File
@@ -43,8 +43,6 @@ PageType {
LabelWithButtonType { LabelWithButtonType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: isVisible visible: isVisible
@@ -68,8 +66,6 @@ PageType {
visible: GC.isDesktop() visible: GC.isDesktop()
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: 16
Layout.rightMargin: 16
text: qsTr("Close application") text: qsTr("Close application")
leftImageSource: "qrc:/images/controls/x-circle.svg" leftImageSource: "qrc:/images/controls/x-circle.svg"
+7 -11
View File
@@ -66,6 +66,13 @@ PageType {
text: qsTr("If AmneziaDNS is not used or installed") text: qsTr("If AmneziaDNS is not used or installed")
} }
}
model: 1 // fake model to force the ListView to be created without a model
delegate: ColumnLayout {
width: listView.width
spacing: 16
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: primaryDns id: primaryDns
@@ -96,13 +103,6 @@ PageType {
regularExpression: InstallController.ipAddressRegExp() regularExpression: InstallController.ipAddressRegExp()
} }
} }
}
model: 1 // fake model to force the ListView to be created without a model
spacing: 16
delegate: ColumnLayout {
width: listView.width
BasicButtonType { BasicButtonType {
id: restoreDefaultButton id: restoreDefaultButton
@@ -139,10 +139,6 @@ PageType {
showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)
} }
} }
}
footer: ColumnLayout {
width: listView.width
BasicButtonType { BasicButtonType {
id: saveButton id: saveButton
@@ -18,6 +18,8 @@ PageType {
signal lastItemTabClickedSignal() signal lastItemTabClickedSignal()
property bool isServerWithWriteAccess: ServersModel.isProcessedServerHasWriteAccess()
Connections { Connections {
target: InstallController target: InstallController
@@ -59,15 +61,13 @@ PageType {
target: ServersModel target: ServersModel
function onProcessedServerIndexChanged() { function onProcessedServerIndexChanged() {
listView.isServerWithWriteAccess = ServersModel.isProcessedServerHasWriteAccess() root.isServerWithWriteAccess = ServersModel.isProcessedServerHasWriteAccess()
} }
} }
ListViewType { ListViewType {
id: listView id: listView
property bool isServerWithWriteAccess: ServersModel.isProcessedServerHasWriteAccess()
anchors.fill: parent anchors.fill: parent
model: serverActions model: serverActions
@@ -107,7 +107,7 @@ PageType {
QtObject { QtObject {
id: check id: check
property bool isVisible: true property bool isVisible: root.isServerWithWriteAccess
readonly property string title: qsTr("Check the server for previously installed Amnezia services") readonly property string title: qsTr("Check the server for previously installed Amnezia services")
readonly property string description: qsTr("Add them to the application if they were not displayed") readonly property string description: qsTr("Add them to the application if they were not displayed")
readonly property var tColor: AmneziaStyle.color.paleGray readonly property var tColor: AmneziaStyle.color.paleGray
@@ -121,7 +121,7 @@ PageType {
QtObject { QtObject {
id: reboot id: reboot
property bool isVisible: true property bool isVisible: root.isServerWithWriteAccess
readonly property string title: qsTr("Reboot server") readonly property string title: qsTr("Reboot server")
readonly property string description: "" readonly property string description: ""
readonly property var tColor: AmneziaStyle.color.vibrantRed readonly property var tColor: AmneziaStyle.color.vibrantRed
@@ -181,7 +181,7 @@ PageType {
QtObject { QtObject {
id: clear id: clear
property bool isVisible: true property bool isVisible: root.isServerWithWriteAccess
readonly property string title: qsTr("Clear server from Amnezia software") readonly property string title: qsTr("Clear server from Amnezia software")
readonly property string description: "" readonly property string description: ""
readonly property var tColor: AmneziaStyle.color.vibrantRed readonly property var tColor: AmneziaStyle.color.vibrantRed
@@ -240,7 +240,7 @@ PageType {
QtObject { QtObject {
id: switch_to_premium id: switch_to_premium
property bool isVisible: ServersModel.getProcessedServerData("isServerFromTelegramApi") property bool isVisible: ServersModel.getProcessedServerData("isServerFromTelegramApi") && ServersModel.processedServerIsPremium
readonly property string title: qsTr("Switch to the new Amnezia Premium subscription") readonly property string title: qsTr("Switch to the new Amnezia Premium subscription")
readonly property string description: "" readonly property string description: ""
readonly property var tColor: AmneziaStyle.color.vibrantRed readonly property var tColor: AmneziaStyle.color.vibrantRed
@@ -161,10 +161,4 @@ PageType {
} }
} }
} }
ShareConnectionDrawer {
id: shareConnectionDrawer
anchors.fill: parent
}
} }