From 7c8ae9c3114e4fc597f8dc81ea1d704dba8ed157 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Fri, 31 Jan 2025 10:06:35 +0700 Subject: [PATCH] refactoring: moved api info pages from ServerInfo --- client/resources.qrc | 3 +- client/ui/controllers/pageController.h | 2 + .../ui/qml/Components/RenameServerDrawer.qml | 55 ++++++++++++ client/ui/qml/Components/ServersListView.qml | 13 ++- client/ui/qml/Pages2/PageHome.qml | 12 ++- ... => PageSettingsApiAvailableCountries.qml} | 72 +++++++++++++++- .../qml/Pages2/PageSettingsApiServerInfo.qml | 79 ++++++++++++++++- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 85 ++----------------- .../ui/qml/Pages2/PageSettingsServersList.qml | 12 ++- 9 files changed, 245 insertions(+), 88 deletions(-) create mode 100644 client/ui/qml/Components/RenameServerDrawer.qml rename client/ui/qml/Pages2/{PageSettingsApiLanguageList.qml => PageSettingsApiAvailableCountries.qml} (63%) diff --git a/client/resources.qrc b/client/resources.qrc index ff03a6e7..c5563618 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -192,7 +192,7 @@ ui/qml/Pages2/PageServiceTorWebsiteSettings.qml ui/qml/Pages2/PageSettings.qml ui/qml/Pages2/PageSettingsAbout.qml - ui/qml/Pages2/PageSettingsApiLanguageList.qml + ui/qml/Pages2/PageSettingsApiAvailableCountries.qml ui/qml/Pages2/PageSettingsApiServerInfo.qml ui/qml/Pages2/PageSettingsApplication.qml ui/qml/Pages2/PageSettingsAppSplitTunneling.qml @@ -224,6 +224,7 @@ ui/qml/Pages2/PageShare.qml ui/qml/Pages2/PageShareFullAccess.qml ui/qml/Pages2/PageStart.qml + ui/qml/Components/RenameServerDrawer.qml images/flagKit/ZW.svg diff --git a/client/ui/controllers/pageController.h b/client/ui/controllers/pageController.h index ffbdd3a1..428cf4f8 100644 --- a/client/ui/controllers/pageController.h +++ b/client/ui/controllers/pageController.h @@ -31,6 +31,8 @@ namespace PageLoader PageSettingsLogging, PageSettingsSplitTunneling, PageSettingsAppSplitTunneling, + PageSettingsApiServerInfo, + PageSettingsApiAvailableCountries, PageServiceSftpSettings, PageServiceTorWebsiteSettings, diff --git a/client/ui/qml/Components/RenameServerDrawer.qml b/client/ui/qml/Components/RenameServerDrawer.qml new file mode 100644 index 00000000..d65b9bba --- /dev/null +++ b/client/ui/qml/Components/RenameServerDrawer.qml @@ -0,0 +1,55 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import Style 1.0 + +import "../Controls2" +import "../Controls2/TextTypes" + +import "../Config" + +DrawerType2 { + property string serverNameText + + id: root + objectName: "serverNameEditDrawer" + + expandedStateContent: ColumnLayout { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 32 + anchors.leftMargin: 16 + anchors.rightMargin: 16 + + TextFieldWithHeaderType { + id: serverName + + Layout.fillWidth: true + headerText: qsTr("Server name") + textField.text: root.serverNameText + textField.maximumLength: 30 + checkEmptyText: true + } + + BasicButtonType { + id: saveButton + + Layout.fillWidth: true + + text: qsTr("Save") + + clickedFunc: function() { + if (serverName.textField.text === "") { + return + } + + if (serverName.textField.text !== root.serverNameText) { + ServersModel.setProcessedServerData("name", serverName.textField.text); + } + root.closeTriggered() + } + } + } +} diff --git a/client/ui/qml/Components/ServersListView.qml b/client/ui/qml/Components/ServersListView.qml index dc5c5a33..8d591d86 100644 --- a/client/ui/qml/Components/ServersListView.qml +++ b/client/ui/qml/Components/ServersListView.qml @@ -110,7 +110,18 @@ ListView { onClicked: function() { ServersModel.processedIndex = index - PageController.goToPage(PageEnum.PageSettingsServerInfo) + + if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) { + if (ServersModel.getProcessedServerData("isCountrySelectionAvailable")) { + PageController.goToPage(PageEnum.PageSettingsApiAvailableCountries) + + } else { + PageController.goToPage(PageEnum.PageSettingsApiServerInfo) + } + } else { + PageController.goToPage(PageEnum.PageSettingsServerInfo) + } + drawer.closeTriggered() } } diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index ae29b80c..fc5f5326 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -297,7 +297,17 @@ PageType { onClicked: { ServersModel.processedIndex = ServersModel.defaultIndex - PageController.goToPage(PageEnum.PageSettingsServerInfo) + + if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) { + if (ServersModel.getProcessedServerData("isCountrySelectionAvailable")) { + PageController.goToPage(PageEnum.PageSettingsApiAvailableCountries) + + } else { + PageController.goToPage(PageEnum.PageSettingsApiServerInfo) + } + } else { + PageController.goToPage(PageEnum.PageSettingsServerInfo) + } } } } diff --git a/client/ui/qml/Pages2/PageSettingsApiLanguageList.qml b/client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml similarity index 63% rename from client/ui/qml/Pages2/PageSettingsApiLanguageList.qml rename to client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml index 30968b38..853a44a3 100644 --- a/client/ui/qml/Pages2/PageSettingsApiLanguageList.qml +++ b/client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml @@ -3,6 +3,8 @@ import QtQuick.Controls import QtQuick.Layouts import QtQuick.Dialogs +import SortFilterProxyModel 0.2 + import PageEnum 1.0 import Style 1.0 @@ -15,22 +17,86 @@ import "../Components" PageType { id: root + property var processedServer + + Connections { + target: ServersModel + + function onProcessedServerChanged() { + root.processedServer = proxyServersModel.get(0) + } + } + + SortFilterProxyModel { + id: proxyServersModel + objectName: "proxyServersModel" + + sourceModel: ServersModel + filters: [ + ValueFilter { + roleName: "isCurrentlyProcessed" + value: true + } + ] + + Component.onCompleted: { + root.processedServer = proxyServersModel.get(0) + } + } + ListView { id: menuContent property bool isFocusable: true - width: parent.width - height: parent.height + anchors.fill: parent + + ScrollBar.vertical: ScrollBarType {} clip: true - interactive: true + reuseItems: true + snapMode: ListView.SnapToItem + model: ApiCountryModel + currentIndex: 0 + ButtonGroup { id: containersRadioButtonGroup } + header: ColumnLayout { + width: menuContent.width + + spacing: 4 + + BackButtonType { + id: backButton + objectName: "backButton" + + Layout.topMargin: 20 + } + + HeaderType { + id: headerContent + objectName: "headerContent" + + Layout.fillWidth: true + Layout.leftMargin: 16 + Layout.rightMargin: 16 + Layout.bottomMargin: 10 + + actionButtonImage: "qrc:/images/controls/settings.svg" + + headerText: root.processedServer.name + descriptionText: ApiServicesModel.getSelectedServiceData("serviceDescription") + + actionButtonFunction: function() { + PageController.goToPage(PageEnum.PageSettingsApiServerInfo) + } + } + } + delegate: ColumnLayout { id: content diff --git a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml index 1fc17218..4346e617 100644 --- a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml @@ -3,6 +3,8 @@ import QtQuick.Controls import QtQuick.Layouts import QtQuick.Dialogs +import SortFilterProxyModel 0.2 + import PageEnum 1.0 import Style 1.0 @@ -54,12 +56,40 @@ PageType { readonly property string objectImageSource: "qrc:/images/controls/gauge.svg" } + property var processedServer + + Connections { + target: ServersModel + + function onProcessedServerChanged() { + root.processedServer = proxyServersModel.get(0) + } + } + + SortFilterProxyModel { + id: proxyServersModel + objectName: "proxyServersModel" + + sourceModel: ServersModel + filters: [ + ValueFilter { + roleName: "isCurrentlyProcessed" + value: true + } + ] + + Component.onCompleted: { + root.processedServer = proxyServersModel.get(0) + } + } + ListView { id: listView - anchors.fill: parent property bool isFocusable: true + anchors.fill: parent + Keys.onTabPressed: { FocusController.nextKeyTabItem() } @@ -86,9 +116,54 @@ PageType { ScrollBar.vertical: ScrollBarType {} - model: labelsModel clip: true reuseItems: true + snapMode: ListView.SnapToItem + + model: labelsModel + + header: ColumnLayout { + width: listView.width + + spacing: 4 + + BackButtonType { + id: backButton + objectName: "backButton" + + Layout.topMargin: 20 + } + + HeaderType { + id: headerContent + objectName: "headerContent" + + Layout.fillWidth: true + Layout.leftMargin: 16 + Layout.rightMargin: 16 + Layout.bottomMargin: 10 + + actionButtonImage: "qrc:/images/controls/edit-3.svg" + + headerText: root.processedServer.name + descriptionText: ApiServicesModel.getSelectedServiceData("serviceDescription") + + actionButtonFunction: function() { + serverNameEditDrawer.openTriggered() + } + } + + RenameServerDrawer { + id: serverNameEditDrawer + + parent: root + + anchors.fill: parent + expandedHeight: root.height * 0.35 + + serverNameText: root.processedServer.name + } + } delegate: ColumnLayout { width: listView.width diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index 9abb6ae2..d350ebef 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -22,8 +22,6 @@ PageType { readonly property int pageSettingsServerProtocols: 0 readonly property int pageSettingsServerServices: 1 readonly property int pageSettingsServerData: 2 - readonly property int pageSettingsApiServerInfo: 3 - readonly property int pageSettingsApiLanguageList: 4 property var processedServer @@ -71,15 +69,6 @@ PageType { BackButtonType { id: backButton objectName: "backButton" - - backButtonFunction: function() { - if (nestedStackView.currentIndex === root.pageSettingsApiServerInfo && - root.processedServer.isCountrySelectionAvailable) { - nestedStackView.currentIndex = root.pageSettingsApiLanguageList - } else { - PageController.closePage() - } - } } HeaderType { @@ -91,18 +80,11 @@ PageType { Layout.rightMargin: 16 Layout.bottomMargin: 10 - actionButtonImage: nestedStackView.currentIndex === root.pageSettingsApiLanguageList ? "qrc:/images/controls/settings.svg" - : "qrc:/images/controls/edit-3.svg" + actionButtonImage: "qrc:/images/controls/edit-3.svg" headerText: root.processedServer.name descriptionText: { - if (root.processedServer.isServerFromGatewayApi) { - if (nestedStackView.currentIndex === root.pageSettingsApiLanguageList) { - return qsTr("Subscription is valid until ") + ApiServicesModel.getSelectedServiceData("endDate") - } else { - return ApiServicesModel.getSelectedServiceData("serviceDescription") - } - } else if (root.processedServer.isServerFromTelegramApi) { + if (root.processedServer.isServerFromTelegramApi) { return root.processedServer.serverDescription } else if (root.processedServer.hasWriteAccess) { return root.processedServer.credentialsLogin + " ยท " + root.processedServer.hostName @@ -112,60 +94,19 @@ PageType { } actionButtonFunction: function() { - if (nestedStackView.currentIndex === root.pageSettingsApiLanguageList) { - nestedStackView.currentIndex = root.pageSettingsApiServerInfo - } else { - serverNameEditDrawer.openTriggered() - } + serverNameEditDrawer.openTriggered() } } - DrawerType2 { + RenameServerDrawer { id: serverNameEditDrawer - objectName: "serverNameEditDrawer" parent: root anchors.fill: parent expandedHeight: root.height * 0.35 - expandedStateContent: ColumnLayout { - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 32 - anchors.leftMargin: 16 - anchors.rightMargin: 16 - - TextFieldWithHeaderType { - id: serverName - - Layout.fillWidth: true - headerText: qsTr("Server name") - textField.text: root.processedServer.name - textField.maximumLength: 30 - checkEmptyText: true - } - - BasicButtonType { - id: saveButton - - Layout.fillWidth: true - - text: qsTr("Save") - - clickedFunc: function() { - if (serverName.textField.text === "") { - return - } - - if (serverName.textField.text !== root.processedServer.name) { - ServersModel.setProcessedServerData("name", serverName.textField.text); - } - serverNameEditDrawer.closeTriggered() - } - } - } + serverNameText: root.processedServer.name } TabBar { @@ -181,8 +122,6 @@ PageType { color: AmneziaStyle.color.transparent } - visible: !ServersModel.getProcessedServerData("isServerFromGatewayApi") - TabButtonType { id: protocolsTab @@ -221,9 +160,7 @@ PageType { Layout.fillWidth: true - currentIndex: ServersModel.getProcessedServerData("isServerFromGatewayApi") ? - (ServersModel.getProcessedServerData("isCountrySelectionAvailable") ? - root.pageSettingsApiLanguageList : root.pageSettingsApiServerInfo) : tabBar.currentIndex + currentIndex: tabBar.currentIndex PageSettingsServerProtocols { id: protocolsPage @@ -239,16 +176,6 @@ PageType { id: dataPage stackView: root.stackView } - - PageSettingsApiServerInfo { - id: apiInfoPage - stackView: root.stackView - } - - PageSettingsApiLanguageList { - id: apiLanguageListPage - stackView: root.stackView - } } } } diff --git a/client/ui/qml/Pages2/PageSettingsServersList.qml b/client/ui/qml/Pages2/PageSettingsServersList.qml index 17337a48..b13f4947 100644 --- a/client/ui/qml/Pages2/PageSettingsServersList.qml +++ b/client/ui/qml/Pages2/PageSettingsServersList.qml @@ -93,7 +93,17 @@ PageType { clickedFunction: function() { ServersModel.processedIndex = index - PageController.goToPage(PageEnum.PageSettingsServerInfo) + + if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) { + if (ServersModel.getProcessedServerData("isCountrySelectionAvailable")) { + PageController.goToPage(PageEnum.PageSettingsApiAvailableCountries) + + } else { + PageController.goToPage(PageEnum.PageSettingsApiServerInfo) + } + } else { + PageController.goToPage(PageEnum.PageSettingsServerInfo) + } } }