From a89104127ae147e0ab49460bc2c86b227b492d3a Mon Sep 17 00:00:00 2001 From: pokamest Date: Sat, 6 Nov 2021 13:47:52 +0300 Subject: [PATCH] Share page refactoring part 1 --- client/containers/containers_defs.cpp | 3 +- client/main.cpp | 2 + client/protocols/protocols_defs.cpp | 3 + client/resources.qrc | 8 + client/ui/pages.h | 13 + .../ui/pages_logic/GeneralSettingsLogic.cpp | 5 +- client/ui/pages_logic/PageLogicBase.h | 2 + .../ServerConfiguringProgressLogic.cpp | 5 + .../ServerConfiguringProgressLogic.h | 1 + .../ui/pages_logic/ShareConnectionLogic.cpp | 17 - client/ui/pages_logic/ShareConnectionLogic.h | 5 - client/ui/pages_logic/SitesLogic.cpp | 10 +- client/ui/pages_logic/SitesLogic.h | 2 +- client/ui/pages_logic/StartPageLogic.cpp | 2 + client/ui/pages_logic/VpnLogic.cpp | 2 +- client/ui/pages_logic/VpnLogic.h | 2 +- client/ui/pages_logic/WizardLogic.cpp | 1 + client/ui/qml/Controls/ContextMenu.qml | 33 + .../Controls/ShareConnectionButtonType.qml | 1 + .../qml/Controls/ShareConnectionContent.qml | 9 - client/ui/qml/Controls/TextAreaType.qml | 51 + client/ui/qml/Controls/TextFieldType.qml | 25 +- client/ui/qml/Pages/PageShareConnection.qml | 927 ++++++++++-------- .../qml/Pages/Share/PageShareProtoCloak.qml | 50 + .../qml/Pages/Share/PageShareProtoOpenVPN.qml | 80 ++ .../ui/qml/Pages/Share/PageShareProtoSftp.qml | 22 + .../Pages/Share/PageShareProtoShadowSocks.qml | 48 + .../Pages/Share/PageShareProtoTorWebSite.qml | 21 + .../qml/Pages/Share/PageShareProtocolBase.qml | 13 + client/ui/qml/main.qml | 148 ++- client/ui/uilogic.cpp | 29 +- client/ui/uilogic.h | 14 +- 32 files changed, 985 insertions(+), 569 deletions(-) create mode 100644 client/ui/qml/Controls/ContextMenu.qml create mode 100644 client/ui/qml/Controls/TextAreaType.qml create mode 100644 client/ui/qml/Pages/Share/PageShareProtoCloak.qml create mode 100644 client/ui/qml/Pages/Share/PageShareProtoOpenVPN.qml create mode 100644 client/ui/qml/Pages/Share/PageShareProtoSftp.qml create mode 100644 client/ui/qml/Pages/Share/PageShareProtoShadowSocks.qml create mode 100644 client/ui/qml/Pages/Share/PageShareProtoTorWebSite.qml create mode 100644 client/ui/qml/Pages/Share/PageShareProtocolBase.qml diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index b56145bf2..4db5a704d 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -43,7 +43,7 @@ QVector ContainerProps::protocolsForContainer(amnezia::Docker return { Protocol::OpenVpn, Protocol::ShadowSocks, Protocol::Cloak }; case DockerContainer::Ipsec: - return { Protocol::Ikev2, Protocol::L2tp }; + return { Protocol::Ikev2 /*, Protocol::L2tp */}; case DockerContainer::Dns: return { }; @@ -129,6 +129,7 @@ Protocol ContainerProps::defaultProtocol(DockerContainer c) case DockerContainer::Dns : return Protocol::Dns; case DockerContainer::FileShare : return Protocol::FileShare; case DockerContainer::Sftp : return Protocol::Sftp; + default: return Protocol::Any; } } diff --git a/client/main.cpp b/client/main.cpp index 0dad4aa25..4e18d6402 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -136,6 +136,8 @@ int main(int argc, char *argv[]) declareQmlProtocolEnum(); declareQmlContainerEnum(); + qmlRegisterType("PageType", 1, 0, "PageType"); + QScopedPointer containerProps(new ContainerProps); qmlRegisterSingletonInstance("ContainerProps", 1, 0, "ContainerProps", containerProps.get()); diff --git a/client/protocols/protocols_defs.cpp b/client/protocols/protocols_defs.cpp index de54424a8..30f1a2f10 100644 --- a/client/protocols/protocols_defs.cpp +++ b/client/protocols/protocols_defs.cpp @@ -73,6 +73,9 @@ QMap ProtocolProps::protocolHumanNames() {Protocol::ShadowSocks, "ShadowSocks"}, {Protocol::Cloak, "Cloak"}, {Protocol::WireGuard, "WireGuard"}, + {Protocol::Ikev2, "IKEv2"}, + {Protocol::L2tp, "L2TP"}, + {Protocol::TorWebSite, "Web site in TOR network"}, {Protocol::Dns, "DNS Service"}, {Protocol::FileShare, "File Sharing Service"}, diff --git a/client/resources.qrc b/client/resources.qrc index e16f82c60..6ff4a3da7 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -126,5 +126,13 @@ server_scripts/ipsec/Dockerfile server_scripts/ipsec/run_container.sh server_scripts/ipsec/start.sh + ui/qml/Pages/Share/PageShareProtoCloak.qml + ui/qml/Pages/Share/PageShareProtocolBase.qml + ui/qml/Pages/Share/PageShareProtoOpenVPN.qml + ui/qml/Pages/Share/PageShareProtoSftp.qml + ui/qml/Pages/Share/PageShareProtoShadowSocks.qml + ui/qml/Pages/Share/PageShareProtoTorWebSite.qml + ui/qml/Controls/TextAreaType.qml + ui/qml/Controls/ContextMenu.qml diff --git a/client/ui/pages.h b/client/ui/pages.h index 645374723..902358e65 100644 --- a/client/ui/pages.h +++ b/client/ui/pages.h @@ -4,6 +4,19 @@ #include #include +class PageType : public QObject +{ + Q_GADGET + +public: + enum Type { + Basic, + Proto, + ShareProto + }; + Q_ENUM(Type) +}; + namespace PageEnumNS { Q_NAMESPACE diff --git a/client/ui/pages_logic/GeneralSettingsLogic.cpp b/client/ui/pages_logic/GeneralSettingsLogic.cpp index 33d281856..42c506bc7 100644 --- a/client/ui/pages_logic/GeneralSettingsLogic.cpp +++ b/client/ui/pages_logic/GeneralSettingsLogic.cpp @@ -2,6 +2,7 @@ #include "ShareConnectionLogic.h" #include "../uilogic.h" +#include "../models/protocols_model.h" GeneralSettingsLogic::GeneralSettingsLogic(UiLogic *logic, QObject *parent): PageLogicBase(logic, parent) @@ -24,7 +25,9 @@ void GeneralSettingsLogic::onPushButtonGeneralSettingsShareConnectionClicked() { uiLogic()->selectedServerIndex = m_settings.defaultServerIndex(); uiLogic()->selectedDockerContainer = m_settings.defaultContainer(uiLogic()->selectedServerIndex); + qobject_cast(uiLogic()->protocolsModel())->setSelectedServerIndex(uiLogic()->selectedServerIndex); + qobject_cast(uiLogic()->protocolsModel())->setSelectedDockerContainer(uiLogic()->selectedDockerContainer); - uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), uiLogic()->selectedDockerContainer); + //uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), uiLogic()->selectedDockerContainer); uiLogic()->goToPage(Page::ShareConnection); } diff --git a/client/ui/pages_logic/PageLogicBase.h b/client/ui/pages_logic/PageLogicBase.h index 26858ee09..2e7e8d524 100644 --- a/client/ui/pages_logic/PageLogicBase.h +++ b/client/ui/pages_logic/PageLogicBase.h @@ -14,6 +14,8 @@ class PageLogicBase : public QObject { Q_OBJECT AUTO_PROPERTY(bool, pageEnabled) +// AUTO_PROPERTY(int, serverIndex) +// AUTO_PROPERTY(DockerContainer, dockerContainer) public: explicit PageLogicBase(UiLogic *uiLogic, QObject *parent = nullptr); diff --git a/client/ui/pages_logic/ServerConfiguringProgressLogic.cpp b/client/ui/pages_logic/ServerConfiguringProgressLogic.cpp index 8909a9f53..32ae366d0 100644 --- a/client/ui/pages_logic/ServerConfiguringProgressLogic.cpp +++ b/client/ui/pages_logic/ServerConfiguringProgressLogic.cpp @@ -18,6 +18,11 @@ ServerConfiguringProgressLogic::ServerConfiguringProgressLogic(UiLogic *logic, Q } +void ServerConfiguringProgressLogic::onUpdatePage() +{ + set_progressBarValue(0); +} + ErrorCode ServerConfiguringProgressLogic::doInstallAction(const std::function &action) { diff --git a/client/ui/pages_logic/ServerConfiguringProgressLogic.h b/client/ui/pages_logic/ServerConfiguringProgressLogic.h index edd2f4e9e..9620d4c36 100644 --- a/client/ui/pages_logic/ServerConfiguringProgressLogic.h +++ b/client/ui/pages_logic/ServerConfiguringProgressLogic.h @@ -22,6 +22,7 @@ public: explicit ServerConfiguringProgressLogic(UiLogic *uiLogic, QObject *parent = nullptr); ~ServerConfiguringProgressLogic() = default; + void onUpdatePage() override; ErrorCode doInstallAction(const std::function &action); private: diff --git a/client/ui/pages_logic/ShareConnectionLogic.cpp b/client/ui/pages_logic/ShareConnectionLogic.cpp index a75edd710..176b704df 100644 --- a/client/ui/pages_logic/ShareConnectionLogic.cpp +++ b/client/ui/pages_logic/ShareConnectionLogic.cpp @@ -21,11 +21,6 @@ ShareConnectionLogic::ShareConnectionLogic(UiLogic *logic, QObject *parent): PageLogicBase(logic, parent), - m_pageShareAmneziaVisible{true}, - m_pageShareOpenVpnVisible{true}, - m_pageShareShadowSocksVisible{true}, - m_pageShareCloakVisible{true}, - m_pageShareFullAccessVisible{true}, m_textEditShareOpenVpnCodeText{}, m_pushButtonShareOpenVpnCopyEnabled{false}, m_pushButtonShareOpenVpnSaveEnabled{false}, @@ -222,12 +217,6 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden //const QJsonObject &containerConfig = m_settings.containerConfig(serverIndex, container); - set_pageShareAmneziaVisible(false); - set_pageShareOpenVpnVisible(false); - set_pageShareShadowSocksVisible(false); - set_pageShareCloakVisible(false); - set_pageShareFullAccessVisible(false); - enum currentWidget { full_access = 0, share_amezia, @@ -237,8 +226,6 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden }; if (container == DockerContainer::OpenVpn) { - set_pageShareAmneziaVisible(true); - set_pageShareOpenVpnVisible(true); QString cfg = tr("Press Generate config"); set_textEditShareOpenVpnCodeText(cfg); @@ -250,8 +237,6 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden if (container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - set_pageShareAmneziaVisible(true); - set_pageShareShadowSocksVisible(true); QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::ShadowSocks); QString cfg = protoConfig.value(config_key::last_config).toString(); @@ -289,7 +274,6 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden if (container == DockerContainer::Cloak) { //ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client")); - set_pageShareCloakVisible(true); set_plainTextEditShareCloakText(QString("")); QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::Cloak); @@ -313,7 +297,6 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden // Full access if (container == DockerContainer::None) { - set_pageShareFullAccessVisible(true); const QJsonObject &server = m_settings.server(uiLogic()->selectedServerIndex); diff --git a/client/ui/pages_logic/ShareConnectionLogic.h b/client/ui/pages_logic/ShareConnectionLogic.h index cdf8961b6..49cfe032b 100644 --- a/client/ui/pages_logic/ShareConnectionLogic.h +++ b/client/ui/pages_logic/ShareConnectionLogic.h @@ -11,11 +11,6 @@ class ShareConnectionLogic: public PageLogicBase Q_OBJECT public: - AUTO_PROPERTY(bool, pageShareAmneziaVisible) - AUTO_PROPERTY(bool, pageShareOpenVpnVisible) - AUTO_PROPERTY(bool, pageShareShadowSocksVisible) - AUTO_PROPERTY(bool, pageShareCloakVisible) - AUTO_PROPERTY(bool, pageShareFullAccessVisible) AUTO_PROPERTY(QString, textEditShareOpenVpnCodeText) AUTO_PROPERTY(bool, pushButtonShareOpenVpnCopyEnabled) AUTO_PROPERTY(bool, pushButtonShareOpenVpnSaveEnabled) diff --git a/client/ui/pages_logic/SitesLogic.cpp b/client/ui/pages_logic/SitesLogic.cpp index 9607aee08..a035e0651 100644 --- a/client/ui/pages_logic/SitesLogic.cpp +++ b/client/ui/pages_logic/SitesLogic.cpp @@ -22,7 +22,7 @@ SitesLogic::SitesLogic(UiLogic *logic, QObject *parent): sitesModels.insert(Settings::VpnAllExceptSites, new SitesModel(Settings::VpnAllExceptSites)); } -void SitesLogic::updateSitesPage() +void SitesLogic::onUpdatePage() { Settings::RouteMode m = m_settings.routeMode(); if (m == Settings::VpnAllSites) return; @@ -71,7 +71,7 @@ void SitesLogic::onPushButtonAddCustomSitesClicked() uiLogic()->m_vpnConnection->flushDns(); } - updateSitesPage(); + onUpdatePage(); }; const auto &cbResolv = [this, cbProcess](const QHostInfo &hostInfo){ @@ -93,7 +93,7 @@ void SitesLogic::onPushButtonAddCustomSitesClicked() } else { cbProcess(newSite, ""); - updateSitesPage(); + onUpdatePage(); QHostInfo::lookupHost(newSite, this, cbResolv); } } @@ -123,7 +123,7 @@ void SitesLogic::onPushButtonSitesDeleteClicked(int row) uiLogic()->m_vpnConnection->flushDns(); } - updateSitesPage(); + onUpdatePage(); } void SitesLogic::onPushButtonSitesImportClicked(const QString& fileName) @@ -153,6 +153,6 @@ void SitesLogic::onPushButtonSitesImportClicked(const QString& fileName) uiLogic()->m_vpnConnection->addRoutes(QStringList() << ips); uiLogic()->m_vpnConnection->flushDns(); - updateSitesPage(); + onUpdatePage(); } diff --git a/client/ui/pages_logic/SitesLogic.h b/client/ui/pages_logic/SitesLogic.h index a3e199842..fdc5ec82b 100644 --- a/client/ui/pages_logic/SitesLogic.h +++ b/client/ui/pages_logic/SitesLogic.h @@ -15,7 +15,7 @@ class SitesLogic : public PageLogicBase AUTO_PROPERTY(QString, lineEditSitesAddCustomText) public: - Q_INVOKABLE void updateSitesPage(); + Q_INVOKABLE void onUpdatePage() override; Q_INVOKABLE void onPushButtonAddCustomSitesClicked(); Q_INVOKABLE void onPushButtonSitesDeleteClicked(int row); diff --git a/client/ui/pages_logic/StartPageLogic.cpp b/client/ui/pages_logic/StartPageLogic.cpp index 394f70c7d..a7ec7e498 100644 --- a/client/ui/pages_logic/StartPageLogic.cpp +++ b/client/ui/pages_logic/StartPageLogic.cpp @@ -35,6 +35,8 @@ void StartPageLogic::onUpdatePage() set_pushButtonConnectVisible(true); set_pushButtonConnectKeyChecked(false); + + set_pushButtonBackFromStartVisible(uiLogic()->pagesStackDepth() > 0); } void StartPageLogic::onPushButtonConnect() diff --git a/client/ui/pages_logic/VpnLogic.cpp b/client/ui/pages_logic/VpnLogic.cpp index b01407ebc..53906ab86 100644 --- a/client/ui/pages_logic/VpnLogic.cpp +++ b/client/ui/pages_logic/VpnLogic.cpp @@ -36,7 +36,7 @@ VpnLogic::VpnLogic(UiLogic *logic, QObject *parent): } -void VpnLogic::updateVpnPage() +void VpnLogic::onUpdatePage() { Settings::RouteMode mode = m_settings.routeMode(); set_radioButtonVpnModeAllSitesChecked(mode == Settings::VpnAllSites); diff --git a/client/ui/pages_logic/VpnLogic.h b/client/ui/pages_logic/VpnLogic.h index 071469525..cf54f3666 100644 --- a/client/ui/pages_logic/VpnLogic.h +++ b/client/ui/pages_logic/VpnLogic.h @@ -24,7 +24,7 @@ class VpnLogic : public PageLogicBase AUTO_PROPERTY(bool, radioButtonVpnModeExceptSitesChecked) public: - Q_INVOKABLE void updateVpnPage(); + Q_INVOKABLE void onUpdatePage() override; Q_INVOKABLE void onRadioButtonVpnModeAllSitesToggled(bool checked); Q_INVOKABLE void onRadioButtonVpnModeForwardSitesToggled(bool checked); diff --git a/client/ui/pages_logic/WizardLogic.cpp b/client/ui/pages_logic/WizardLogic.cpp index aeffc21b0..af245c1ee 100644 --- a/client/ui/pages_logic/WizardLogic.cpp +++ b/client/ui/pages_logic/WizardLogic.cpp @@ -15,6 +15,7 @@ WizardLogic::WizardLogic(UiLogic *logic, QObject *parent): void WizardLogic::onUpdatePage() { set_lineEditHighWebsiteMaskingText(protocols::cloak::defaultRedirSite); + set_radioButtonMediumChecked(true); } QMap WizardLogic::getInstallConfigsFromWizardPage() const diff --git a/client/ui/qml/Controls/ContextMenu.qml b/client/ui/qml/Controls/ContextMenu.qml new file mode 100644 index 000000000..a0d0202d1 --- /dev/null +++ b/client/ui/qml/Controls/ContextMenu.qml @@ -0,0 +1,33 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import Qt.labs.platform 1.0 + +Menu { + property var textObj + + MenuItem { + text: qsTr("C&ut") + shortcut: StandardKey.Cut + enabled: textObj.selectedText + onTriggered: textObj.cut() + } + MenuItem { + text: qsTr("&Copy") + shortcut: StandardKey.Copy + enabled: textObj.selectedText + onTriggered: textObj.copy() + } + MenuItem { + text: qsTr("&Paste") + shortcut: StandardKey.Paste + enabled: textObj.canPaste + onTriggered: textObj.paste() + } + + MenuItem { + text: qsTr("&SelectAll") + shortcut: StandardKey.SelectAll + enabled: textObj.length > 0 + onTriggered: textObj.selectAll() + } +} diff --git a/client/ui/qml/Controls/ShareConnectionButtonType.qml b/client/ui/qml/Controls/ShareConnectionButtonType.qml index a45e5fee2..9a13a07e6 100644 --- a/client/ui/qml/Controls/ShareConnectionButtonType.qml +++ b/client/ui/qml/Controls/ShareConnectionButtonType.qml @@ -4,6 +4,7 @@ import QtQuick.Controls 2.12 BasicButtonType { id: root + height: 40 background: Rectangle { anchors.fill: parent radius: 4 diff --git a/client/ui/qml/Controls/ShareConnectionContent.qml b/client/ui/qml/Controls/ShareConnectionContent.qml index df126db10..22b274b06 100644 --- a/client/ui/qml/Controls/ShareConnectionContent.qml +++ b/client/ui/qml/Controls/ShareConnectionContent.qml @@ -5,9 +5,7 @@ import QtGraphicalEffects 1.12 Item { id: root property bool active: false - property Component content: undefined property string text: "" - width: 360 height: active ? contentLoader.item.height + 40 + 5 * 2 : 40 signal clicked() @@ -64,12 +62,5 @@ Item { onClicked: root.clicked() } } - Loader { - x: 0 - y: 40 + 5 - id: contentLoader - sourceComponent: root.content - visible: root.active - } } diff --git a/client/ui/qml/Controls/TextAreaType.qml b/client/ui/qml/Controls/TextAreaType.qml new file mode 100644 index 000000000..8a7880194 --- /dev/null +++ b/client/ui/qml/Controls/TextAreaType.qml @@ -0,0 +1,51 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import Qt.labs.platform 1.0 + +Flickable +{ + property alias textArea: root + id: flickable + flickableDirection: Flickable.VerticalFlick + clip: true + TextArea.flickable: + +TextArea { + id: root + property bool error: false + + width: parent.width - 80 + height: 40 + anchors.topMargin: 5 + selectByMouse: false + + + selectionColor: "darkgray" + font.pixelSize: 16 + color: "#333333" + background: Rectangle { + implicitWidth: 200 + implicitHeight: 40 + border.width: 1 + color: { + if (root.error) { + return Qt.rgba(213, 40, 60, 255) + } + return root.enabled ? "#F4F4F4" : Qt.rgba(127, 127, 127, 255) + } + border.color: { + if (!root.enabled) { + return Qt.rgba(127, 127, 127, 255) + } + if (root.error) { + return Qt.rgba(213, 40, 60, 255) + } + if (root.focus) { + return "#A7A7A7" + } + return "#A7A7A7" + } + } +} + +} diff --git a/client/ui/qml/Controls/TextFieldType.qml b/client/ui/qml/Controls/TextFieldType.qml index a809a3d51..836a233cb 100644 --- a/client/ui/qml/Controls/TextFieldType.qml +++ b/client/ui/qml/Controls/TextFieldType.qml @@ -44,29 +44,8 @@ TextField { onClicked: contextMenu.open() } - Menu { + ContextMenu { id: contextMenu - - onAboutToShow: console.log("aboutToShow") - onAboutToHide: console.log("aboutToHide") - - MenuItem { - text: qsTr("C&ut") - shortcut: StandardKey.Cut - enabled: root.selectedText - onTriggered: root.cut() - } - MenuItem { - text: qsTr("&Copy") - shortcut: StandardKey.Copy - enabled: root.selectedText - onTriggered: root.copy() - } - MenuItem { - text: qsTr("&Paste") - shortcut: StandardKey.Paste - enabled: root.canPaste - onTriggered: root.paste() - } + textObj: root } } diff --git a/client/ui/qml/Pages/PageShareConnection.qml b/client/ui/qml/Pages/PageShareConnection.qml index f7b0c6390..a5953a5fd 100644 --- a/client/ui/qml/Pages/PageShareConnection.qml +++ b/client/ui/qml/Pages/PageShareConnection.qml @@ -1,6 +1,13 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 +import QtQuick.Dialogs 1.1 +import QtQuick.Layouts 1.15 +import QtGraphicalEffects 1.12 +import SortFilterProxyModel 0.2 +import ContainerProps 1.0 +import ProtocolProps 1.0 import PageEnum 1.0 +import ProtocolEnum 1.0 import "./" import "../Controls" import "../Config" @@ -13,403 +20,543 @@ PageBase { BackButton { id: back } - ScrollView { - x: 10 - y: 40 - width: 360 - height: 580 - Item { - id: ct - width: parent.width - height: childrenRect.height + 10 - property var contentList: [ - full_access, - share_amezia, - share_openvpn, - share_shadowshock, - share_cloak - ] - property int currentIndex: ShareConnectionLogic.toolBoxShareConnectionCurrentIndex - onCurrentIndexChanged: { - ShareConnectionLogic.toolBoxShareConnectionCurrentIndex = currentIndex - for (let i = 0; i < contentList.length; ++i) { - if (i == currentIndex) { - contentList[i].active = true - } else { - contentList[i].active = false - } + + Caption { + id: caption + text: qsTr("Share protocol config") + width: undefined + } + + + Flickable { + clip: true + width: parent.width + anchors.top: caption.bottom + anchors.bottom: root.bottom + contentHeight: col.height + + Column { + id: col + anchors { + left: parent.left; + right: parent.right; + } + topPadding: 20 + spacing: 10 + +// Caption { +// id: cap1 +// text: qsTr("Installed Protocols and Services") +// font.pixelSize: 20 + +// } + + SortFilterProxyModel { + id: proxyProtocolsModel + sourceModel: UiLogic.protocolsModel + filters: ValueFilter { + roleName: "is_installed_role" + value: true } } - function clearActive() { - for (let i = 0; i < contentList.length; ++i) { - contentList[i].active = false - } - currentIndex = -1; + + ShareConnectionContent { + x: 10 + text: qsTr("Share for Amnezia") + height: 40 + width: tb_c.width - 10 } - Column { - spacing: 5 - ShareConnectionContent { - id: full_access - x: 0 - text: qsTr("Full access") - visible: ShareConnectionLogic.pageShareFullAccessVisible - content: Component { - Item { - width: 360 - height: 380 - Text { - x: 10 - y: 250 - width: 341 - height: 111 - font.family: "Lato" - font.styleName: "normal" - font.pixelSize: 16 - color: "#181922" - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - wrapMode: Text.Wrap - text: qsTr("Anyone who logs in with this code will have the same permissions to use VPN and your server as you. \nThis code includes your server credentials!\nProvide this code only to TRUSTED users.") - } - ShareConnectionButtonType { - x: 10 - y: 130 - width: 341 - height: 40 - text: ShareConnectionLogic.pushButtonShareFullCopyText - onClicked: { - ShareConnectionLogic.onPushButtonShareFullCopyClicked() - } - } - ShareConnectionButtonType { - x: 10 - y: 180 - width: 341 - height: 40 - text: qsTr("Save file") - onClicked: { - ShareConnectionLogic.onPushButtonShareFullSaveClicked() - } - } - TextFieldType { - x: 10 - y: 10 - width: 341 - height: 100 - verticalAlignment: Text.AlignTop - text: ShareConnectionLogic.textEditShareFullCodeText - onEditingFinished: { - ShareConnectionLogic.textEditShareFullCodeText = text - } - } - } - } - onClicked: { - if (active) { - ct.currentIndex = -1 - } else { - ct.clearActive() - ct.currentIndex = 0 - } - } - } - ShareConnectionContent { - id: share_amezia - x: 0 - text: qsTr("Share for Amnezia client") - visible: ShareConnectionLogic.pageShareAmneziaVisible - content: Component { - Item { - width: 360 - height: 380 - Text { - x: 10 - y: 280 - width: 341 - height: 111 - font.family: "Lato" - font.styleName: "normal" - font.pixelSize: 16 - color: "#181922" - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - wrapMode: Text.Wrap - text: qsTr("Anyone who logs in with this code will be able to connect to this VPN server. \nThis code does not include server credentials.") - } - ShareConnectionButtonType { - x: 10 - y: 180 - width: 341 - height: 40 - text: ShareConnectionLogic.pushButtonShareAmneziaCopyText - onClicked: { - ShareConnectionLogic.onPushButtonShareAmneziaCopyClicked() - } - enabled: ShareConnectionLogic.pushButtonShareAmneziaCopyEnabled - } - ShareConnectionButtonType { - x: 10 - y: 130 - width: 341 - height: 40 - text: ShareConnectionLogic.pushButtonShareAmneziaGenerateText - enabled: ShareConnectionLogic.pushButtonShareAmneziaGenerateEnabled - onClicked: { - ShareConnectionLogic.onPushButtonShareAmneziaGenerateClicked() - } - } - ShareConnectionButtonType { - x: 10 - y: 230 - width: 341 - height: 40 - text: qsTr("Save file") - onClicked: { - ShareConnectionLogic.onPushButtonShareAmneziaSaveClicked() - } - } - TextFieldType { - x: 10 - y: 10 - width: 341 - height: 100 - verticalAlignment: Text.AlignTop - text: ShareConnectionLogic.textEditShareAmneziaCodeText - onEditingFinished: { - ShareConnectionLogic.textEditShareAmneziaCodeText = text - } - } - } - } - onClicked: { - if (active) { - ct.currentIndex = -1 - } else { - ct.clearActive() - ct.currentIndex = 1 - } - } - } - ShareConnectionContent { - id: share_openvpn - x: 0 - text: qsTr("Share for OpenVPN client") - visible: ShareConnectionLogic.pageShareOpenVpnVisible - content: Component { - Item { - width: 360 - height: 380 - ShareConnectionButtonType { - x: 10 - y: 180 - width: 341 - height: 40 - text: ShareConnectionLogic.pushButtonShareOpenVpnCopyText - enabled: ShareConnectionLogic.pushButtonShareOpenVpnCopyEnabled - onClicked: { - ShareConnectionLogic.onPushButtonShareOpenVpnCopyClicked() - } - } - ShareConnectionButtonType { - x: 10 - y: 130 - width: 341 - height: 40 - text: ShareConnectionLogic.pushButtonShareOpenVpnGenerateText - onClicked: { - ShareConnectionLogic.onPushButtonShareOpenVpnGenerateClicked() - } - enabled: ShareConnectionLogic.pushButtonShareOpenVpnGenerateEnabled - } - ShareConnectionButtonType { - x: 10 - y: 230 - width: 341 - height: 40 - text: qsTr("Save file") - enabled: ShareConnectionLogic.pushButtonShareOpenVpnSaveEnabled - onClicked: { - ShareConnectionLogic.onPushButtonShareOpenVpnSaveClicked() - } - } - TextFieldType { - x: 10 - y: 10 - width: 341 - height: 100 - verticalAlignment: Text.AlignTop - text: ShareConnectionLogic.textEditShareOpenVpnCodeText - onEditingFinished: { - ShareConnectionLogic.textEditShareOpenVpnCodeText = text - } - } - } - } - onClicked: { - if (active) { - ct.currentIndex = -1 - } else { - ct.clearActive() - ct.currentIndex = 2 - } - } - } - ShareConnectionContent { - id: share_shadowshock - x: 0 - text: qsTr("Share for ShadowSocks client") - visible: ShareConnectionLogic.pageShareShadowSocksVisible - content: Component { - Item { - width: 360 - height: 380 - LabelType { - x: 10 - y: 70 - width: 100 - height: 20 - text: qsTr("Password") - } - LabelType { - x: 10 - y: 10 - width: 100 - height: 20 - text: qsTr("Server:") - } - LabelType { - x: 10 - y: 50 - width: 100 - height: 20 - text: qsTr("Encryption:") - } - LabelType { - x: 10 - y: 30 - width: 100 - height: 20 - text: qsTr("Port:") - } - LabelType { - x: 10 - y: 100 - width: 191 - height: 20 - text: qsTr("Connection string") - } - LabelType { - x: 130 - y: 70 - width: 100 - height: 20 - text: ShareConnectionLogic.labelShareShadowSocksPasswordText - } - LabelType { - x: 130 - y: 10 - width: 100 - height: 20 - text: ShareConnectionLogic.labelShareShadowSocksServerText - } - LabelType { - x: 130 - y: 50 - width: 100 - height: 20 - text: ShareConnectionLogic.labelShareShadowSocksMethodText - } - LabelType { - x: 130 - y: 30 - width: 100 - height: 20 - text: ShareConnectionLogic.labelShareShadowSocksPortText - } - Image { - id: label_share_ss_qr_code - x: 85 - y: 235 - width: 200 - height: 200 - source: ShareConnectionLogic.labelShareShadowSocksQrCodeText === "" ? "" : "data:image/png;base64," + UiLogic.labelShareShadowSocksQrCodeText - } - ShareConnectionButtonType { - x: 10 - y: 180 - width: 331 - height: 40 - text: ShareConnectionLogic.pushButtonShareShadowSocksCopyText - enabled: ShareConnectionLogic.pushButtonShareShadowSocksCopyEnabled - onClicked: { - ShareConnectionLogic.onPushButtonShareShadowSocksCopyClicked() - } - } - TextFieldType { - x: 10 - y: 130 - width: 331 - height: 100 - horizontalAlignment: Text.AlignHCenter - text: ShareConnectionLogic.lineEditShareShadowSocksStringText - onEditingFinished: { - ShareConnectionLogic.lineEditShareShadowSocksStringText = text - } - } - } - } - onClicked: { - if (active) { - ct.currentIndex = -1 - } else { - ct.clearActive() - ct.currentIndex = 3 - } - } - } - ShareConnectionContent { - id: share_cloak - x: 0 - text: qsTr("Share for Cloak client") - visible: ShareConnectionLogic.pageShareCloakVisible - content: Component { - Item { - width: 360 - height: 380 - ShareConnectionButtonType { - x: 10 - y: 290 - width: 331 - height: 40 - text: ShareConnectionLogic.pushButtonShareCloakCopyText - enabled: ShareConnectionLogic.pushButtonShareCloakCopyEnabled - onClicked: { - ShareConnectionLogic.onPushButtonShareCloakCopyClicked() - } - } - TextInput { - x: 10 - y: 30 - width: 331 - height: 100 - text: ShareConnectionLogic.plainTextEditShareCloakText - onEditingFinished: { - ShareConnectionLogic.plainTextEditShareCloakText = text - } - } - } - } - onClicked: { - if (active) { - ct.currentIndex = -1 - } else { - ct.clearActive() - ct.currentIndex = 4 - } + + ListView { + id: tb_c + x: 10 + width: parent.width - 10 + height: tb_c.contentItem.height + currentIndex: -1 + spacing: 10 + clip: true + interactive: false + model: proxyProtocolsModel + + delegate: Item { + implicitWidth: tb_c.width - 10 + implicitHeight: c_item.height + + ShareConnectionContent { + id: c_item + text: qsTr("Share for ") + name_role + height: 40 + width: tb_c.width - 10 + onClicked: UiLogic.onGotoShareProtocolPage(proxyProtocolsModel.mapToSource(index)) + } + +// Rectangle { +// id: c_item +// x: 0 +// y: 0 +// width: parent.width +// height: 40 +// color: "transparent" +// clip: true +// radius: 2 +// LinearGradient { +// anchors.fill: parent +// start: Qt.point(0, 0) +// end: Qt.point(0, height) +// gradient: Gradient { +// GradientStop { position: 0.0; color: "#E1E1E1" } +// GradientStop { position: 0.4; color: "#DDDDDD" } +// GradientStop { position: 0.5; color: "#D8D8D8" } +// GradientStop { position: 1.0; color: "#D3D3D3" } +// } +// } +// Image { +// anchors.verticalCenter: parent.verticalCenter +// anchors.left: parent.left +// anchors.leftMargin: 10 +// source: "qrc:/images/share.png" +// } +// Rectangle { +// anchors.left: parent.left +// anchors.right: parent.right +// anchors.bottom: parent.bottom +// height: 2 +// color: "#148CD2" +// visible: ms.containsMouse ? true : false +// } +// Text { +// x: 40 +// anchors.verticalCenter: parent.verticalCenter +// font.family: "Lato" +// font.styleName: "normal" +// font.pixelSize: 18 +// color: "#100A44" +// font.bold: true +// text: name_role +// horizontalAlignment: Text.AlignLeft +// verticalAlignment: Text.AlignVCenter +// wrapMode: Text.Wrap +// } +// MouseArea { +// id: ms +// anchors.fill: parent +// hoverEnabled: true +// onClicked: UiLogic.onGotoShareProtocolPage(proxyProtocolsModel.mapToSource(index)) +// } +// } + + + + + + + + + + + + +// Item { +// id: c_item +// width: parent.width +// height: row_container.height +// anchors.left: parent.left +// Rectangle { +// anchors.top: parent.top +// width: parent.width +// height: 1 +// color: "lightgray" +// visible: index !== tb_c.currentIndex +// } +// Rectangle { +// anchors.top: row_container.top +// anchors.bottom: row_container.bottom +// anchors.left: parent.left +// anchors.right: parent.right + +// color: "#63B4FB" +// visible: index === tb_c.currentIndex +// } + +// RowLayout { +// id: row_container +// //width: parent.width +// anchors.left: parent.left +// anchors.right: parent.right + +//// anchors.top: lb_container_name.top +//// anchors.bottom: lb_container_name.bottom + +// Text { +// id: lb_container_name +// text: name_role +// font.pixelSize: 17 +// //font.bold: true +// color: "#100A44" +// topPadding: 5 +// bottomPadding: 5 +// leftPadding: 10 +// verticalAlignment: Text.AlignVCenter +// wrapMode: Text.WordWrap +// Layout.fillWidth: true + +// MouseArea { +// enabled: col.visible +// anchors.top: lb_container_name.top +// anchors.bottom: lb_container_name.bottom +// anchors.left: parent.left +// anchors.right: parent.right +// propagateComposedEvents: true +// onClicked: { +// if (tb_c.currentIndex === index) tb_c.currentIndex = -1 +// else tb_c.currentIndex = index + +// UiLogic.protocolsModel.setSelectedDockerContainer(proxyContainersModel.mapToSource(index)) +// } +// } +// } +// } + +// } } } } } + + + + + + + + + + + + + + + + +// ScrollView { +// x: 10 +// y: 40 +// width: 360 +// height: 580 +// Item { +// id: ct +// width: parent.width +// height: childrenRect.height + 10 +// property var contentList: [ +// full_access, +// share_amezia, +// share_openvpn, +// share_shadowshock, +// share_cloak +// ] +// property int currentIndex: ShareConnectionLogic.toolBoxShareConnectionCurrentIndex +// onCurrentIndexChanged: { +// ShareConnectionLogic.toolBoxShareConnectionCurrentIndex = currentIndex +// for (let i = 0; i < contentList.length; ++i) { +// if (i == currentIndex) { +// contentList[i].active = true +// } else { +// contentList[i].active = false +// } +// } +// } + +// function clearActive() { +// for (let i = 0; i < contentList.length; ++i) { +// contentList[i].active = false +// } +// currentIndex = -1; +// } +// Column { +// spacing: 5 +// ShareConnectionContent { +// id: full_access +// x: 0 +// text: qsTr("Full access") +// visible: ShareConnectionLogic.pageShareFullAccessVisible +// content: Component { +// Item { +// width: 360 +// height: 380 +// Text { +// x: 10 +// y: 250 +// width: 341 +// height: 111 +// font.family: "Lato" +// font.styleName: "normal" +// font.pixelSize: 16 +// color: "#181922" +// horizontalAlignment: Text.AlignLeft +// verticalAlignment: Text.AlignVCenter +// wrapMode: Text.Wrap +// text: qsTr("Anyone who logs in with this code will have the same permissions to use VPN and your server as you. \nThis code includes your server credentials!\nProvide this code only to TRUSTED users.") +// } +// ShareConnectionButtonType { +// x: 10 +// y: 130 +// width: 341 +// height: 40 +// text: ShareConnectionLogic.pushButtonShareFullCopyText +// onClicked: { +// ShareConnectionLogic.onPushButtonShareFullCopyClicked() +// } +// } +// ShareConnectionButtonType { +// x: 10 +// y: 180 +// width: 341 +// height: 40 +// text: qsTr("Save file") +// onClicked: { +// ShareConnectionLogic.onPushButtonShareFullSaveClicked() +// } +// } +// TextFieldType { +// x: 10 +// y: 10 +// width: 341 +// height: 100 +// verticalAlignment: Text.AlignTop +// text: ShareConnectionLogic.textEditShareFullCodeText +// onEditingFinished: { +// ShareConnectionLogic.textEditShareFullCodeText = text +// } +// } +// } +// } +// onClicked: { +// if (active) { +// ct.currentIndex = -1 +// } else { +// ct.clearActive() +// ct.currentIndex = 0 +// } +// } +// } +// ShareConnectionContent { +// id: share_amezia +// x: 0 +// text: qsTr("Share for Amnezia client") +// visible: ShareConnectionLogic.pageShareAmneziaVisible +// content: Component { +// Item { +// width: 360 +// height: 380 +// Text { +// x: 10 +// y: 280 +// width: 341 +// height: 111 +// font.family: "Lato" +// font.styleName: "normal" +// font.pixelSize: 16 +// color: "#181922" +// horizontalAlignment: Text.AlignLeft +// verticalAlignment: Text.AlignVCenter +// wrapMode: Text.Wrap +// text: qsTr("Anyone who logs in with this code will be able to connect to this VPN server. \nThis code does not include server credentials.") +// } +// ShareConnectionButtonType { +// x: 10 +// y: 180 +// width: 341 +// height: 40 +// text: ShareConnectionLogic.pushButtonShareAmneziaCopyText +// onClicked: { +// ShareConnectionLogic.onPushButtonShareAmneziaCopyClicked() +// } +// enabled: ShareConnectionLogic.pushButtonShareAmneziaCopyEnabled +// } +// ShareConnectionButtonType { +// x: 10 +// y: 130 +// width: 341 +// height: 40 +// text: ShareConnectionLogic.pushButtonShareAmneziaGenerateText +// enabled: ShareConnectionLogic.pushButtonShareAmneziaGenerateEnabled +// onClicked: { +// ShareConnectionLogic.onPushButtonShareAmneziaGenerateClicked() +// } +// } +// ShareConnectionButtonType { +// x: 10 +// y: 230 +// width: 341 +// height: 40 +// text: qsTr("Save file") +// onClicked: { +// ShareConnectionLogic.onPushButtonShareAmneziaSaveClicked() +// } +// } +// TextFieldType { +// x: 10 +// y: 10 +// width: 341 +// height: 100 +// verticalAlignment: Text.AlignTop +// text: ShareConnectionLogic.textEditShareAmneziaCodeText +// onEditingFinished: { +// ShareConnectionLogic.textEditShareAmneziaCodeText = text +// } +// } +// } +// } +// onClicked: { +// if (active) { +// ct.currentIndex = -1 +// } else { +// ct.clearActive() +// ct.currentIndex = 1 +// } +// } +// } + +// ShareConnectionContent { +// id: share_shadowshock +// x: 0 +// text: qsTr("Share for ShadowSocks client") +// visible: ShareConnectionLogic.pageShareShadowSocksVisible +// content: Component { +// Item { +// width: 360 +// height: 380 +// LabelType { +// x: 10 +// y: 70 +// width: 100 +// height: 20 +// text: qsTr("Password") +// } +// LabelType { +// x: 10 +// y: 10 +// width: 100 +// height: 20 +// text: qsTr("Server:") +// } +// LabelType { +// x: 10 +// y: 50 +// width: 100 +// height: 20 +// text: qsTr("Encryption:") +// } +// LabelType { +// x: 10 +// y: 30 +// width: 100 +// height: 20 +// text: qsTr("Port:") +// } +// LabelType { +// x: 10 +// y: 100 +// width: 191 +// height: 20 +// text: qsTr("Connection string") +// } +// LabelType { +// x: 130 +// y: 70 +// width: 100 +// height: 20 +// text: ShareConnectionLogic.labelShareShadowSocksPasswordText +// } +// LabelType { +// x: 130 +// y: 10 +// width: 100 +// height: 20 +// text: ShareConnectionLogic.labelShareShadowSocksServerText +// } +// LabelType { +// x: 130 +// y: 50 +// width: 100 +// height: 20 +// text: ShareConnectionLogic.labelShareShadowSocksMethodText +// } +// LabelType { +// x: 130 +// y: 30 +// width: 100 +// height: 20 +// text: ShareConnectionLogic.labelShareShadowSocksPortText +// } +// Image { +// id: label_share_ss_qr_code +// x: 85 +// y: 235 +// width: 200 +// height: 200 +// source: ShareConnectionLogic.labelShareShadowSocksQrCodeText === "" ? "" : "data:image/png;base64," + UiLogic.labelShareShadowSocksQrCodeText +// } +// ShareConnectionButtonType { +// x: 10 +// y: 180 +// width: 331 +// height: 40 +// text: ShareConnectionLogic.pushButtonShareShadowSocksCopyText +// enabled: ShareConnectionLogic.pushButtonShareShadowSocksCopyEnabled +// onClicked: { +// ShareConnectionLogic.onPushButtonShareShadowSocksCopyClicked() +// } +// } +// TextFieldType { +// x: 10 +// y: 130 +// width: 331 +// height: 100 +// horizontalAlignment: Text.AlignHCenter +// text: ShareConnectionLogic.lineEditShareShadowSocksStringText +// onEditingFinished: { +// ShareConnectionLogic.lineEditShareShadowSocksStringText = text +// } +// } +// } +// } +// onClicked: { +// if (active) { +// ct.currentIndex = -1 +// } else { +// ct.clearActive() +// ct.currentIndex = 3 +// } +// } +// } +// ShareConnectionContent { +// id: share_cloak +// x: 0 +// text: qsTr("Share for Cloak client") +// visible: ShareConnectionLogic.pageShareCloakVisible +// content: Component { +// Item { +// width: 360 +// height: 380 + +// } +// } +// onClicked: { +// if (active) { +// ct.currentIndex = -1 +// } else { +// ct.clearActive() +// ct.currentIndex = 4 +// } +// } +// } +// } +// } +// } + + + } diff --git a/client/ui/qml/Pages/Share/PageShareProtoCloak.qml b/client/ui/qml/Pages/Share/PageShareProtoCloak.qml new file mode 100644 index 000000000..279b214f2 --- /dev/null +++ b/client/ui/qml/Pages/Share/PageShareProtoCloak.qml @@ -0,0 +1,50 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 +import ProtocolEnum 1.0 +import "../" +import "../../Controls" +import "../../Config" + +PageShareProtocolBase { + id: root + protocol: ProtocolEnum.Cloak + logic: UiLogic.protocolLogic(protocol) + + BackButton { + id: back + } + Caption { + id: caption + text: qsTr("Share Cloak Settings") + } + + + TextAreaType { + anchors.top: caption.bottom + anchors.topMargin: 20 + anchors.bottom: pb_save.top + anchors.bottomMargin: 20 + anchors.horizontalCenter: root.horizontalCenter + width: parent.width - 60 + + textArea.readOnly: true + + textArea.text: ShareConnectionLogic.plainTextEditShareCloakText + } + + ShareConnectionButtonType { + id: pb_save + anchors.bottom: root.bottom + anchors.bottomMargin: 10 + anchors.horizontalCenter: root.horizontalCenter + width: parent.width - 60 + text: ShareConnectionLogic.pushButtonShareCloakCopyText + enabled: ShareConnectionLogic.pushButtonShareCloakCopyEnabled + onClicked: { + ShareConnectionLogic.onPushButtonShareCloakCopyClicked() + } + } + + +} diff --git a/client/ui/qml/Pages/Share/PageShareProtoOpenVPN.qml b/client/ui/qml/Pages/Share/PageShareProtoOpenVPN.qml new file mode 100644 index 000000000..b230ea11c --- /dev/null +++ b/client/ui/qml/Pages/Share/PageShareProtoOpenVPN.qml @@ -0,0 +1,80 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 +import ProtocolEnum 1.0 +import "../" +import "../../Controls" +import "../../Config" + +PageShareProtocolBase { + id: root + protocol: ProtocolEnum.OpenVpn + logic: ShareConnectionLogic + + BackButton { + id: back + } + Caption { + id: caption + text: qsTr("Share OpenVPN Settings") + } + + TextAreaType { + anchors.top: caption.bottom + anchors.topMargin: 20 + anchors.bottom: pb_gen.top + anchors.bottomMargin: 20 + + anchors.horizontalCenter: root.horizontalCenter + width: parent.width - 60 + + textArea.readOnly: true + + textArea.verticalAlignment: Text.AlignTop + textArea.text: ShareConnectionLogic.textEditShareOpenVpnCodeText + } + + + ShareConnectionButtonType { + id: pb_gen + anchors.bottom: pb_copy.top + anchors.bottomMargin: 10 + anchors.horizontalCenter: root.horizontalCenter + width: parent.width - 60 + + text: ShareConnectionLogic.pushButtonShareOpenVpnGenerateText + onClicked: { + ShareConnectionLogic.onPushButtonShareOpenVpnGenerateClicked() + } + enabled: ShareConnectionLogic.pushButtonShareOpenVpnGenerateEnabled + } + ShareConnectionButtonType { + id: pb_copy + anchors.bottom: pb_save.top + anchors.bottomMargin: 10 + anchors.horizontalCenter: root.horizontalCenter + width: parent.width - 60 + + text: ShareConnectionLogic.pushButtonShareOpenVpnCopyText + enabled: ShareConnectionLogic.pushButtonShareOpenVpnCopyEnabled + onClicked: { + ShareConnectionLogic.onPushButtonShareOpenVpnCopyClicked() + } + } + ShareConnectionButtonType { + id: pb_save + anchors.bottom: root.bottom + anchors.bottomMargin: 10 + anchors.horizontalCenter: root.horizontalCenter + width: parent.width - 60 + + text: qsTr("Save file") + enabled: ShareConnectionLogic.pushButtonShareOpenVpnSaveEnabled + onClicked: { + ShareConnectionLogic.onPushButtonShareOpenVpnSaveClicked() + } + } + + + +} diff --git a/client/ui/qml/Pages/Share/PageShareProtoSftp.qml b/client/ui/qml/Pages/Share/PageShareProtoSftp.qml new file mode 100644 index 000000000..ea1eec6a4 --- /dev/null +++ b/client/ui/qml/Pages/Share/PageShareProtoSftp.qml @@ -0,0 +1,22 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import ProtocolEnum 1.0 +import "../" +import "../../Controls" +import "../../Config" + +PageShareProtocolBase { + id: root + protocol: ProtocolEnum.Sftp + logic: UiLogic.protocolLogic(protocol) + + BackButton { + id: back + } + + Caption { + id: caption + text: qsTr("Share SFTF settings") + } + + } diff --git a/client/ui/qml/Pages/Share/PageShareProtoShadowSocks.qml b/client/ui/qml/Pages/Share/PageShareProtoShadowSocks.qml new file mode 100644 index 000000000..ee3c26696 --- /dev/null +++ b/client/ui/qml/Pages/Share/PageShareProtoShadowSocks.qml @@ -0,0 +1,48 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 +import ProtocolEnum 1.0 +import "../" +import "../../Controls" +import "../../Config" + +PageShareProtocolBase { + id: root + protocol: ProtocolEnum.ShadowSocks + logic: UiLogic.protocolLogic(protocol) + + BackButton { + id: back + } + Caption { + id: caption + text: qsTr("Share ShadowSocks Settings") + } + + Flickable { + id: fl + width: root.width + anchors.top: caption.bottom + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.bottomMargin: 20 + anchors.left: root.left + anchors.leftMargin: 30 + anchors.right: root.right + anchors.rightMargin: 30 + + contentHeight: content.height + clip: true + + ColumnLayout { + id: content + enabled: logic.pageEnabled + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + } + + } + +} diff --git a/client/ui/qml/Pages/Share/PageShareProtoTorWebSite.qml b/client/ui/qml/Pages/Share/PageShareProtoTorWebSite.qml new file mode 100644 index 000000000..269135b06 --- /dev/null +++ b/client/ui/qml/Pages/Share/PageShareProtoTorWebSite.qml @@ -0,0 +1,21 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import ProtocolEnum 1.0 +import "../" +import "../../Controls" +import "../../Config" + +PageShareProtocolBase { + id: root + protocol: ProtocolEnum.TorWebSite + logic: UiLogic.protocolLogic(protocol) + + BackButton { + id: back + } + + Caption { + id: caption + text: qsTr("Share TOR Web site") + } +} diff --git a/client/ui/qml/Pages/Share/PageShareProtocolBase.qml b/client/ui/qml/Pages/Share/PageShareProtocolBase.qml new file mode 100644 index 000000000..3ab95af65 --- /dev/null +++ b/client/ui/qml/Pages/Share/PageShareProtocolBase.qml @@ -0,0 +1,13 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import PageEnum 1.0 +import ProtocolEnum 1.0 +import "./.." +import "../../Controls" +import "../../Config" + +PageBase { + id: root + property var protocol: ProtocolEnum.Any + page: PageEnum.ProtocolSettings +} diff --git a/client/ui/qml/main.qml b/client/ui/qml/main.qml index 1576b640f..ac0798d70 100644 --- a/client/ui/qml/main.qml +++ b/client/ui/qml/main.qml @@ -3,17 +3,20 @@ import QtQuick.Window 2.14 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 import PageEnum 1.0 +import PageType 1.0 import Qt.labs.platform 1.1 import Qt.labs.folderlistmodel 2.12 import QtQuick.Dialogs 1.1 import "./" import "Pages" import "Pages/Protocols" +import "Pages/Share" import "Config" Window { property var pages: ({}) property var protocolPages: ({}) + property var sharePages: ({}) id: root visible: true @@ -28,73 +31,28 @@ Window { //flags: Qt.FramelessWindowHint title: "AmneziaVPN" - function gotoPage(page, reset, slide) { + function gotoPage(type, page, reset, slide) { + + let p_obj; + if (type === PageType.Basic) p_obj = pages[page] + else if (type === PageType.Proto) p_obj = protocolPages[page] + else if (type === PageType.ShareProto) p_obj = sharePages[page] + else return + + console.debug("QML gotoPage " + type + " " + page + " " + p_obj) + + + if (slide) { + pageLoader.push(p_obj, {}, StackView.PushTransition) + } else { + pageLoader.push(p_obj, {}, StackView.Immediate) + } + if (reset) { - if (page === PageEnum.ServerSettings) { - ServerSettingsLogic.onUpdatePage(); - } - if (page === PageEnum.ShareConnection) { - } - if (page === PageEnum.Wizard) { - WizardLogic.radioButtonMediumChecked = true - } - if (page === PageEnum.WizardHigh) { - WizardLogic.onUpdatePage(); - } - if (page === PageEnum.ServerConfiguringProgress) { - ServerConfiguringProgressLogic.progressBarValue = 0; - } - if (page === PageEnum.GeneralSettings) { - GeneralSettingsLogic.onUpdatePage(); - } - if (page === PageEnum.ServersList) { - ServerListLogic.onUpdatePage(); - } - if (page === PageEnum.Start) { - StartPageLogic.pushButtonBackFromStartVisible = !pageLoader.empty - StartPageLogic.onUpdatePage(); - } - if (page === PageEnum.NewServerProtocols) { - NewServerProtocolsLogic.onUpdatePage() - } - if (page === PageEnum.ServerContainers) { - ServerContainersLogic.onUpdatePage() - } - if (page === PageEnum.AppSettings) { - AppSettingsLogic.onUpdatePage() - } - if (page === PageEnum.NetworkSettings) { - NetworkSettingsLogic.onUpdatePage() - } - if (page === PageEnum.Sites) { - SitesLogic.updateSitesPage() - } - if (page === PageEnum.Vpn) { - VpnLogic.updateVpnPage() - } + p_obj.logic.onUpdatePage(); } - if (slide) { - pageLoader.push(pages[page], {}, StackView.PushTransition) - } else { - pageLoader.push(pages[page], {}, StackView.Immediate) - } - - pages[page].activated(reset) - } - - function gotoProtocolPage(protocol, reset, slide) { - if (reset && protocolPages[protocol] !== "undefined") { - protocolPages[protocol].logic.onUpdatePage(); - } - - if (slide) { - pageLoader.push(protocolPages[protocol], {}, StackView.PushTransition) - } else { - pageLoader.push(protocolPages[protocol], {}, StackView.Immediate) - } - - protocolPages[protocol].activated(reset) + p_obj.activated(reset) } function close_page() { @@ -146,6 +104,8 @@ Window { color: "white" } + //PageShareProtoCloak {} + StackView { id: pageLoader y: GC.isDesktop() ? titleBar.height : 0 @@ -157,6 +117,10 @@ Window { UiLogic.currentPageValue = currentItem.page } + onDepthChanged: { + UiLogic.pagesStackDepth = depth + } + Keys.onPressed: { UiLogic.keyPressEvent(event.key) event.accepted = true @@ -171,7 +135,7 @@ Window { onStatusChanged: if (status == FolderListModel.Ready) { for (var i=0; ilineEdit_proto_shadowsocks_port->setValidator(&m_ipPortValidator); // ui->lineEdit_proto_cloak_port->setValidator(&m_ipPortValidator); - - - -} - - - - - - - - - - - -int UiLogic::getCurrentPageValue() const -{ - return m_currentPageValue; -} - -void UiLogic::setCurrentPageValue(int currentPageValue) -{ - if (m_currentPageValue != currentPageValue) { - m_currentPageValue = currentPageValue; - emit currentPageValueChanged(); - } } QString UiLogic::getTrayIconUrl() const @@ -676,7 +649,7 @@ PageProtocolLogicBase *UiLogic::protocolLogic(Protocol p) { PageEnumNS::Page UiLogic::currentPage() { - return static_cast(getCurrentPageValue()); + return static_cast(currentPageValue()); } void UiLogic::setTrayState(VpnProtocol::ConnectionState state) diff --git a/client/ui/uilogic.h b/client/ui/uilogic.h index 21ea70667..e7ba4c6db 100644 --- a/client/ui/uilogic.h +++ b/client/ui/uilogic.h @@ -46,15 +46,16 @@ class UiLogic : public QObject Q_OBJECT AUTO_PROPERTY(bool, pageEnabled) + AUTO_PROPERTY(int, pagesStackDepth) + AUTO_PROPERTY(int, currentPageValue) READONLY_PROPERTY(QObject *, containersModel) READONLY_PROPERTY(QObject *, protocolsModel) - Q_PROPERTY(int currentPageValue READ getCurrentPageValue WRITE setCurrentPageValue NOTIFY currentPageValueChanged) + // TODO: review Q_PROPERTY(QString trayIconUrl READ getTrayIconUrl WRITE setTrayIconUrl NOTIFY trayIconUrlChanged) Q_PROPERTY(bool trayActionDisconnectEnabled READ getTrayActionDisconnectEnabled WRITE setTrayActionDisconnectEnabled NOTIFY trayActionDisconnectEnabledChanged) Q_PROPERTY(bool trayActionConnectEnabled READ getTrayActionConnectEnabled WRITE setTrayActionConnectEnabled NOTIFY trayActionConnectEnabledChanged) - Q_PROPERTY(QString dialogConnectErrorText READ getDialogConnectErrorText WRITE setDialogConnectErrorText NOTIFY dialogConnectErrorTextChanged) public: @@ -83,6 +84,8 @@ public: friend class OtherProtocolsLogic; + Q_INVOKABLE virtual void onUpdatePage() {} // UiLogic is set as logic class for some qml pages + Q_INVOKABLE void initalizeUiLogic(); Q_INVOKABLE void onCloseWindow(); @@ -91,12 +94,11 @@ public: Q_INVOKABLE void onGotoPage(PageEnumNS::Page p, bool reset = true, bool slide = true) { emit goToPage(p, reset, slide); } Q_INVOKABLE void onGotoProtocolPage(Protocol p, bool reset = true, bool slide = true) { emit goToProtocolPage(p, reset, slide); } + Q_INVOKABLE void onGotoShareProtocolPage(Protocol p, bool reset = true, bool slide = true) { emit goToShareProtocolPage(p, reset, slide); } Q_INVOKABLE void keyPressEvent(Qt::Key key); - int getCurrentPageValue() const; - void setCurrentPageValue(int currentPageValue); QString getTrayIconUrl() const; void setTrayIconUrl(const QString &trayIconUrl); bool getTrayActionDisconnectEnabled() const; @@ -108,7 +110,6 @@ public: void setDialogConnectErrorText(const QString &dialogConnectErrorText); signals: - void currentPageValueChanged(); void trayIconUrlChanged(); void trayActionDisconnectEnabledChanged(); void trayActionConnectEnabledChanged(); @@ -117,6 +118,8 @@ signals: void goToPage(PageEnumNS::Page page, bool reset = true, bool slide = true); void goToProtocolPage(Protocol protocol, bool reset = true, bool slide = true); + void goToShareProtocolPage(Protocol protocol, bool reset = true, bool slide = true); + void closePage(); void setStartPage(PageEnumNS::Page page, bool slide = true); void showPublicKeyWarning(); @@ -125,7 +128,6 @@ signals: void hide(); private: - int m_currentPageValue; QString m_trayIconUrl; bool m_trayActionDisconnectEnabled; bool m_trayActionConnectEnabled;