diff --git a/client/containers/containers_defs.h b/client/containers/containers_defs.h index 762c20dd..ee7e5783 100644 --- a/client/containers/containers_defs.h +++ b/client/containers/containers_defs.h @@ -2,14 +2,16 @@ #define CONTAIERNS_DEFS_H #include +#include #include "../protocols/protocols_defs.h" using namespace amnezia; namespace amnezia { -Q_NAMESPACE +namespace ContainerEnumNS { +Q_NAMESPACE enum class DockerContainer { None, OpenVpn, @@ -18,6 +20,10 @@ enum class DockerContainer { WireGuard }; Q_ENUM_NS(DockerContainer) +} // namespace ContainerEnumNS + +using namespace ContainerEnumNS; +using namespace ProtocolEnumNS; DockerContainer containerFromString(const QString &container); QString containerToString(DockerContainer container); @@ -30,6 +36,16 @@ bool isContainerVpnType(DockerContainer c); QVector protocolsForContainer(DockerContainer container); +static void declareQmlContainerEnum() { + qmlRegisterUncreatableMetaObject( + ContainerEnumNS::staticMetaObject, + "ContainerEnum", + 1, 0, + "ContainerEnum", + "Error: only enums" + ); +} + } // namespace amnezia QDebug operator<<(QDebug debug, const amnezia::DockerContainer &c); diff --git a/client/main.cpp b/client/main.cpp index b70b37ba..6117a46e 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -119,12 +119,15 @@ int main(int argc, char *argv[]) qRegisterMetaType("amnezia::DockerContainer"); qRegisterMetaType("amnezia::Protocol"); + qRegisterMetaType("PageProtocolLogicBase *"); + UiLogic *uiLogic = new UiLogic; QQmlApplicationEngine engine; - PageEnumNS::declareQML(); + declareQmlPageEnum(); declareQmlProtocolEnum(); + declareQmlContainerEnum(); const QUrl url(QStringLiteral("qrc:/ui/qml/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, @@ -149,9 +152,9 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("VpnLogic", uiLogic->vpnLogic()); engine.rootContext()->setContextProperty("WizardLogic", uiLogic->wizardLogic()); - engine.rootContext()->setContextProperty("OpenVpnLogic", uiLogic->openVpnLogic()); - engine.rootContext()->setContextProperty("ShadowSocksLogic", uiLogic->shadowSocksLogic()); - engine.rootContext()->setContextProperty("CloakLogic", uiLogic->cloakLogic()); +// engine.rootContext()->setContextProperty("OpenVpnLogic", uiLogic->openVpnLogic()); +// engine.rootContext()->setContextProperty("ShadowSocksLogic", uiLogic->shadowSocksLogic()); +// engine.rootContext()->setContextProperty("CloakLogic", uiLogic->cloakLogic()); engine.load(url); diff --git a/client/protocols/protocols_defs.cpp b/client/protocols/protocols_defs.cpp index d697692e..1a9ea8a8 100644 --- a/client/protocols/protocols_defs.cpp +++ b/client/protocols/protocols_defs.cpp @@ -1,9 +1,9 @@ #include "protocols_defs.h" -QDebug operator<<(QDebug debug, const amnezia::Protocol &p) +QDebug operator<<(QDebug debug, const amnezia::ProtocolEnumNS::Protocol &p) { QDebugStateSaver saver(debug); - debug.nospace() << protoToString(p); + debug.nospace() << amnezia::protoToString(p); return debug; } @@ -53,7 +53,7 @@ QMap amnezia::protocolDescriptions() return {}; } -bool amnezia::isProtocolVpnType(Protocol p) +bool amnezia::isProtocolVpnType(ProtocolEnumNS::Protocol p) { switch (p) { case Protocol::Any : return false; diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index d371ec7a..4b7b1007 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -3,6 +3,7 @@ #include #include +#include namespace amnezia { namespace config_key { @@ -113,6 +114,7 @@ constexpr char serverPskKeyPath[] = "/opt/amnezia/wireguard/wireguard_psk.key"; } // namespace protocols +namespace ProtocolEnumNS { Q_NAMESPACE enum class Protocol { Any, @@ -122,6 +124,9 @@ enum class Protocol { WireGuard }; Q_ENUM_NS(Protocol) +} // namespace ProtocolEnumNS + +using namespace ProtocolEnumNS; QVector allProtocols(); @@ -134,7 +139,7 @@ bool isProtocolVpnType(Protocol p); static void declareQmlProtocolEnum() { qmlRegisterUncreatableMetaObject( - PageEnumNS::staticMetaObject, + ProtocolEnumNS::staticMetaObject, "ProtocolEnum", 1, 0, "ProtocolEnum", diff --git a/client/resources.qrc b/client/resources.qrc index e9e78e01..4471d19b 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -108,5 +108,6 @@ ui/qml/Controls/Caption.qml ui/qml/Controls/Logo.qml ui/qml/Pages/InstallSettings/SelectContainer.qml + ui/qml/Pages/Protocols/PageProtocolBase.qml diff --git a/client/ui/pages.h b/client/ui/pages.h index 2ee0eede..746addc6 100644 --- a/client/ui/pages.h +++ b/client/ui/pages.h @@ -11,10 +11,10 @@ enum Page {Start = 0, NewServer, NewServerProtocols, Vpn, Wizard, WizardLow, WizardMedium, WizardHigh, WizardVpnMode, ServerConfiguring, GeneralSettings, AppSettings, NetworkSettings, ServerSettings, ServerContainers, ServersList, ShareConnection, Sites, - OpenVpnSettings, ShadowSocksSettings, CloakSettings}; + ProtocolSettings}; Q_ENUM_NS(Page) -static void declareQML() { +static void declareQmlPageEnum() { qmlRegisterUncreatableMetaObject( PageEnumNS::staticMetaObject, "PageEnum", diff --git a/client/ui/pages_logic/PageLogicBase.cpp b/client/ui/pages_logic/PageLogicBase.cpp index 47218b7a..f0638213 100644 --- a/client/ui/pages_logic/PageLogicBase.cpp +++ b/client/ui/pages_logic/PageLogicBase.cpp @@ -9,15 +9,3 @@ PageLogicBase::PageLogicBase(UiLogic *logic, QObject *parent): } -Page PageLogicBase::pageForProto(Protocol p) -{ - switch (p) { - case Protocol::OpenVpn: return Page::OpenVpnSettings; - case Protocol::ShadowSocks: return Page::ShadowSocksSettings; - case Protocol::OpenVpn: return Page::OpenVpnSettings; - case Protocol::OpenVpn: return Page::OpenVpnSettings; - - default: - break; - } -} diff --git a/client/ui/pages_logic/PageLogicBase.h b/client/ui/pages_logic/PageLogicBase.h index 7eeb96ed..ddde53c6 100644 --- a/client/ui/pages_logic/PageLogicBase.h +++ b/client/ui/pages_logic/PageLogicBase.h @@ -20,7 +20,6 @@ public: ~PageLogicBase() = default; Q_INVOKABLE virtual void updatePage() {} - Q_INVOKABLE Page pageForProto(amnezia::Protocol p); protected: UiLogic *uiLogic() const { return m_uiLogic; } diff --git a/client/ui/pages_logic/ServerContainersLogic.cpp b/client/ui/pages_logic/ServerContainersLogic.cpp index 565e554d..d85c565c 100644 --- a/client/ui/pages_logic/ServerContainersLogic.cpp +++ b/client/ui/pages_logic/ServerContainersLogic.cpp @@ -128,7 +128,7 @@ void ServerContainersLogic::onPushButtonProtoSettingsClicked(amnezia::DockerCont uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); - emit uiLogic()->goToPage(Page::OpenVpnSettings); + emit uiLogic()->goToProtocolPage(static_cast(p)); } @@ -258,50 +258,3 @@ void ServerContainersLogic::setupProtocolsPageConnections() } } -//void ServerContainersLogic::onPushButtonProtoCloakOpenVpnContOpenvpnConfigClicked() -//{ -// uiLogic()->selectedDockerContainer = DockerContainer::OpenVpnOverCloak; -// uiLogic()->openVpnLogic()->updateOpenVpnPage(m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::OpenVpn), -// uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); -// uiLogic()->goToPage(Page::OpenVpnSettings); -//} - -//void ServerContainersLogic::onPushButtonProtoCloakOpenVpnContSsConfigClicked() -//{ -// uiLogic()->selectedDockerContainer = DockerContainer::OpenVpnOverCloak; -// uiLogic()->shadowSocksLogic()->updateShadowSocksPage(m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::ShadowSocks), -// uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); -// uiLogic()->goToPage(Page::ShadowSocksSettings); -//} - -//void ServerContainersLogic::onPushButtonProtoCloakOpenVpnContCloakConfigClicked() -//{ -// uiLogic()->selectedDockerContainer = DockerContainer::OpenVpnOverCloak; -// uiLogic()->cloakLogic()->updateCloakPage(m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::Cloak), -// uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); -// uiLogic()->goToPage(Page::CloakSettings); -//} - -//void ServerContainersLogic::onPushButtonProtoOpenVpnContOpenvpnConfigClicked() -//{ -// uiLogic()->selectedDockerContainer = DockerContainer::OpenVpn; -// uiLogic()->openVpnLogic()->updateOpenVpnPage(m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::OpenVpn), -// uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); -// uiLogic()->goToPage(Page::OpenVpnSettings); -//} - -//void ServerContainersLogic::onPushButtonProtoSsOpenVpnContOpenvpnConfigClicked() -//{ -// uiLogic()->selectedDockerContainer = DockerContainer::OpenVpnOverShadowSocks; -// uiLogic()->openVpnLogic()->updateOpenVpnPage(m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::OpenVpn), -// uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); -// uiLogic()->goToPage(Page::OpenVpnSettings); -//} - -//void ServerContainersLogic::onPushButtonProtoSsOpenVpnContSsConfigClicked() -//{ -// uiLogic()->selectedDockerContainer = DockerContainer::OpenVpnOverShadowSocks; -// uiLogic()->shadowSocksLogic()->updateShadowSocksPage(m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::ShadowSocks), -// uiLogic()->selectedDockerContainer, m_settings.haveAuthData(uiLogic()->selectedServerIndex)); -// uiLogic()->goToPage(Page::ShadowSocksSettings); -//} diff --git a/client/ui/pages_logic/ServerContainersLogic.h b/client/ui/pages_logic/ServerContainersLogic.h index e4414567..d90c29b0 100644 --- a/client/ui/pages_logic/ServerContainersLogic.h +++ b/client/ui/pages_logic/ServerContainersLogic.h @@ -42,14 +42,6 @@ class ServerContainersLogic : public PageLogicBase public: Q_INVOKABLE void updateServerContainersPage(); - -// Q_INVOKABLE void onPushButtonProtoCloakOpenVpnContOpenvpnConfigClicked(); -// Q_INVOKABLE void onPushButtonProtoCloakOpenVpnContSsConfigClicked(); -// Q_INVOKABLE void onPushButtonProtoCloakOpenVpnContCloakConfigClicked(); -// Q_INVOKABLE void onPushButtonProtoOpenVpnContOpenvpnConfigClicked(); -// Q_INVOKABLE void onPushButtonProtoSsOpenVpnContOpenvpnConfigClicked(); -// Q_INVOKABLE void onPushButtonProtoSsOpenVpnContSsConfigClicked(); - Q_INVOKABLE void onPushButtonProtoSettingsClicked(amnezia::DockerContainer c, amnezia::Protocol p); public: diff --git a/client/ui/pages_logic/protocols/OpenVpnLogic.cpp b/client/ui/pages_logic/protocols/OpenVpnLogic.cpp index 3bf65eef..32a8d771 100644 --- a/client/ui/pages_logic/protocols/OpenVpnLogic.cpp +++ b/client/ui/pages_logic/protocols/OpenVpnLogic.cpp @@ -8,24 +8,26 @@ using namespace PageEnumNS; OpenVpnLogic::OpenVpnLogic(UiLogic *logic, QObject *parent): PageProtocolLogicBase(logic, parent), - m_lineEditProtoOpenVpnSubnetText{}, + m_lineEditProtoOpenVpnSubnetText{""}, + + m_radioButtonProtoOpenVpnTcpEnabled{true}, + m_radioButtonProtoOpenVpnTcpChecked{false}, + m_radioButtonProtoOpenVpnUdpEnabled{true}, m_radioButtonProtoOpenVpnUdpChecked{false}, + m_checkBoxProtoOpenVpnAutoEncryptionChecked{}, m_comboBoxProtoOpenVpnCipherText{"AES-256-GCM"}, m_comboBoxProtoOpenVpnHashText{"SHA512"}, m_checkBoxProtoOpenVpnBlockDnsChecked{false}, m_lineEditProtoOpenVpnPortText{}, m_checkBoxProtoOpenVpnTlsAuthChecked{false}, - m_widgetProtoOpenVpnEnabled{false}, + m_widgetProtoOpenVpnEnabled{true}, m_pushButtonOpenvpnSaveVisible{false}, m_progressBarProtoOpenVpnResetVisible{false}, - m_radioButtonProtoOpenVpnUdpEnabled{false}, - m_radioButtonProtoOpenVpnTcpEnabled{false}, - m_radioButtonProtoOpenVpnTcpChecked{false}, + m_lineEditProtoOpenVpnPortEnabled{false}, m_comboBoxProtoOpenVpnCipherEnabled{true}, m_comboBoxProtoOpenVpnHashEnabled{true}, - m_pageProtoOpenVpnEnabled{true}, m_labelProtoOpenVpnInfoVisible{true}, m_labelProtoOpenVpnInfoText{}, m_progressBarProtoOpenVpnResetValue{0}, @@ -36,6 +38,7 @@ OpenVpnLogic::OpenVpnLogic(UiLogic *logic, QObject *parent): void OpenVpnLogic::updateProtocolPage(const QJsonObject &openvpnConfig, DockerContainer container, bool haveAuthData) { + qDebug() << "OpenVpnLogic::updateProtocolPage"; set_widgetProtoOpenVpnEnabled(haveAuthData); set_pushButtonOpenvpnSaveVisible(haveAuthData); set_progressBarProtoOpenVpnResetVisible(haveAuthData); @@ -88,7 +91,7 @@ void OpenVpnLogic::onCheckBoxProtoOpenVpnAutoEncryptionClicked() void OpenVpnLogic::onPushButtonProtoOpenVpnSaveClicked() { QJsonObject protocolConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::OpenVpn); - protocolConfig = getOpenVpnConfigFromPage(protocolConfig); + protocolConfig = getProtocolConfigFromPage(protocolConfig); QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); QJsonObject newContainerConfig = containerConfig; @@ -96,7 +99,7 @@ void OpenVpnLogic::onPushButtonProtoOpenVpnSaveClicked() UiLogic::PageFunc page_proto_openvpn; page_proto_openvpn.setEnabledFunc = [this] (bool enabled) -> void { - set_pageProtoOpenVpnEnabled(enabled); + set_pageEnabled(enabled); }; UiLogic::ButtonFunc pushButton_proto_openvpn_save; pushButton_proto_openvpn_save.setVisibleFunc = [this] (bool visible) ->void { diff --git a/client/ui/pages_logic/protocols/OpenVpnLogic.h b/client/ui/pages_logic/protocols/OpenVpnLogic.h index 049362c1..3b55547d 100644 --- a/client/ui/pages_logic/protocols/OpenVpnLogic.h +++ b/client/ui/pages_logic/protocols/OpenVpnLogic.h @@ -10,7 +10,12 @@ class OpenVpnLogic : public PageProtocolLogicBase Q_OBJECT AUTO_PROPERTY(QString, lineEditProtoOpenVpnSubnetText) + + AUTO_PROPERTY(bool, radioButtonProtoOpenVpnTcpEnabled) + AUTO_PROPERTY(bool, radioButtonProtoOpenVpnUdpEnabled) + AUTO_PROPERTY(bool, radioButtonProtoOpenVpnTcpChecked) AUTO_PROPERTY(bool, radioButtonProtoOpenVpnUdpChecked) + AUTO_PROPERTY(bool, checkBoxProtoOpenVpnAutoEncryptionChecked) AUTO_PROPERTY(QString, comboBoxProtoOpenVpnCipherText) AUTO_PROPERTY(QString, comboBoxProtoOpenVpnHashText) @@ -21,14 +26,11 @@ class OpenVpnLogic : public PageProtocolLogicBase AUTO_PROPERTY(bool, widgetProtoOpenVpnEnabled) AUTO_PROPERTY(bool, pushButtonOpenvpnSaveVisible) AUTO_PROPERTY(bool, progressBarProtoOpenVpnResetVisible) - AUTO_PROPERTY(bool, radioButtonProtoOpenVpnUdpEnabled) - AUTO_PROPERTY(bool, radioButtonProtoOpenVpnTcpEnabled) - AUTO_PROPERTY(bool, radioButtonProtoOpenVpnTcpChecked) + AUTO_PROPERTY(bool, lineEditProtoOpenVpnPortEnabled) AUTO_PROPERTY(bool, comboBoxProtoOpenVpnCipherEnabled) AUTO_PROPERTY(bool, comboBoxProtoOpenVpnHashEnabled) - AUTO_PROPERTY(bool, pageProtoOpenVpnEnabled) AUTO_PROPERTY(bool, labelProtoOpenVpnInfoVisible) AUTO_PROPERTY(QString, labelProtoOpenVpnInfoText) AUTO_PROPERTY(int, progressBarProtoOpenVpnResetValue) diff --git a/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp b/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp index 7a3a6e9a..0f6f25a7 100644 --- a/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp +++ b/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp @@ -49,7 +49,7 @@ QJsonObject ShadowSocksLogic::getProtocolConfigFromPage(QJsonObject oldConfig) void ShadowSocksLogic::onPushButtonProtoShadowSocksSaveClicked() { QJsonObject protocolConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Protocol::ShadowSocks); - protocolConfig = getShadowSocksConfigFromPage(protocolConfig); + //protocolConfig = getShadowSocksConfigFromPage(protocolConfig); QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); QJsonObject newContainerConfig = containerConfig; diff --git a/client/ui/qml/Pages/PageBase.qml b/client/ui/qml/Pages/PageBase.qml index aedfd481..c787f5d1 100644 --- a/client/ui/qml/Pages/PageBase.qml +++ b/client/ui/qml/Pages/PageBase.qml @@ -7,8 +7,10 @@ import "../Config" Item { id: root - property int protocol: PageEnum.Start - property var logic: null + property int page: PageEnum.Start + property var logic: UiLogic + enabled: logic.pageEnabled + // width: GC.screenWidth // height: GC.screenHeight diff --git a/client/ui/qml/Pages/PageServerContainers.qml b/client/ui/qml/Pages/PageServerContainers.qml index 7f1ac621..f5247e39 100644 --- a/client/ui/qml/Pages/PageServerContainers.qml +++ b/client/ui/qml/Pages/PageServerContainers.qml @@ -210,7 +210,10 @@ PageBase { textItem.font.pixelSize: 16 icon.source: "qrc:/images/settings.png" onClicked: { - ServerContainersLogic.onPushButtonProtoCloakOpenVpnContSsConfigClicked() + tb_p.currentIndex = index + ServerContainersLogic.onPushButtonProtoSettingsClicked( + proxyContainersModel.mapToSource(tb_c.currentIndex), + proxyProtocolsModel.mapToSource(tb_p.currentIndex)) } } } diff --git a/client/ui/qml/Pages/Protocols/PageProtoCloak.qml b/client/ui/qml/Pages/Protocols/PageProtoCloak.qml index bf00e7f9..1db7388a 100644 --- a/client/ui/qml/Pages/Protocols/PageProtoCloak.qml +++ b/client/ui/qml/Pages/Protocols/PageProtoCloak.qml @@ -1,16 +1,16 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -import PageEnum 1.0 +import ProtocolEnum 1.0 import "../" import "../../Controls" import "../../Config" -PageBase { +PageProtocolBase { id: root - page: PageEnum.CloakSettings - logic: CloakLogic + protocol: ProtocolEnum.Cloak + logic: UiLogic.protocolLogic(protocol) - enabled: CloakLogic.pageProtoCloakEnabled + enabled: logic.pageProtoCloakEnabled BackButton { id: back } @@ -19,7 +19,7 @@ PageBase { y: 40 width: 380 height: 600 - enabled: CloakLogic.widgetProtoCloakEnabled + enabled: logic.widgetProtoCloakEnabled ComboBoxType { x: 190 y: 60 @@ -33,14 +33,14 @@ PageBase { ] currentIndex: { for (let i = 0; i < model.length; ++i) { - if (CloakLogic.comboBoxProtoCloakCipherText === model[i]) { + if (logic.comboBoxProtoCloakCipherText === model[i]) { return i } } return -1 } onCurrentTextChanged: { - CloakLogic.comboBoxProtoCloakCipherText = currentText + logic.comboBoxProtoCloakCipherText = currentText } } LabelType { @@ -84,8 +84,8 @@ PageBase { y: 550 width: 321 height: 41 - visible: CloakLogic.labelProtoCloakInfoVisible - text: CloakLogic.labelProtoCloakInfoText + visible: logic.labelProtoCloakInfoVisible + text: logic.labelProtoCloakInfoText } TextFieldType { id: lineEdit_proto_cloak_port @@ -93,11 +93,11 @@ PageBase { y: 160 width: 151 height: 31 - text: CloakLogic.lineEditProtoCloakPortText + text: logic.lineEditProtoCloakPortText onEditingFinished: { - CloakLogic.lineEditProtoCloakPortText = text + logic.lineEditProtoCloakPortText = text } - enabled: CloakLogic.lineEditProtoCloakPortEnabled + enabled: logic.lineEditProtoCloakPortEnabled } TextFieldType { id: lineEdit_proto_cloak_site @@ -105,9 +105,9 @@ PageBase { y: 110 width: 151 height: 31 - text: CloakLogic.lineEditProtoCloakSiteText + text: logic.lineEditProtoCloakSiteText onEditingFinished: { - CloakLogic.lineEditProtoCloakSiteText = text + logic.lineEditProtoCloakSiteText = text } } ProgressBar { @@ -117,8 +117,8 @@ PageBase { width: 321 height: 40 from: 0 - to: CloakLogic.progressBarProtoCloakResetMaximium - value: CloakLogic.progressBarProtoCloakResetValue + to: logic.progressBarProtoCloakResetMaximium + value: logic.progressBarProtoCloakResetValue background: Rectangle { implicitWidth: parent.width implicitHeight: parent.height @@ -136,7 +136,7 @@ PageBase { color: Qt.rgba(255, 255, 255, 0.15); } } - visible: CloakLogic.progressBarProtoCloakResetVisible + visible: logic.progressBarProtoCloakResetVisible } BlueButtonType { anchors.horizontalCenter: parent.horizontalCenter @@ -144,9 +144,9 @@ PageBase { width: 321 height: 40 text: qsTr("Save and restart VPN") - visible: CloakLogic.pushButtonCloakSaveVisible + visible: logic.pushButtonCloakSaveVisible onClicked: { - CloakLogic.onPushButtonProtoCloakSaveClicked() + logic.onPushButtonProtoCloakSaveClicked() } } } diff --git a/client/ui/qml/Pages/Protocols/PageProtoOpenVPN.qml b/client/ui/qml/Pages/Protocols/PageProtoOpenVPN.qml index f35a6822..95f8626e 100644 --- a/client/ui/qml/Pages/Protocols/PageProtoOpenVPN.qml +++ b/client/ui/qml/Pages/Protocols/PageProtoOpenVPN.qml @@ -1,16 +1,15 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -import PageEnum 1.0 +import ProtocolEnum 1.0 import "../" import "../../Controls" import "../../Config" -PageBase { +PageProtocolBase { id: root - page: PageEnum.OpenVpnSettings - logic: OpenVpnLogic + protocol: ProtocolEnum.OpenVpn + logic: UiLogic.protocolLogic(protocol) - enabled: OpenVpnLogic.pageProtoOpenVpnEnabled BackButton { id: back } @@ -19,19 +18,19 @@ PageBase { y: 40 width: 380 height: 600 - enabled: OpenVpnLogic.widgetProtoOpenVpnEnabled + enabled: logic.widgetProtoOpenVpnEnabled CheckBoxType { x: 30 y: 280 width: 321 height: 21 text: qsTr("Auto-negotiate encryption") - checked: OpenVpnLogic.checkBoxProtoOpenVpnAutoEncryptionChecked + checked: logic.checkBoxProtoOpenVpnAutoEncryptionChecked onCheckedChanged: { - OpenVpnLogic.checkBoxProtoOpenVpnAutoEncryptionChecked = checked + logic.checkBoxProtoOpenVpnAutoEncryptionChecked = checked } onClicked: { - OpenVpnLogic.checkBoxProtoOpenVpnAutoEncryptionClicked() + logic.checkBoxProtoOpenVpnAutoEncryptionClicked() } } CheckBoxType { @@ -40,9 +39,9 @@ PageBase { width: 321 height: 21 text: qsTr("Block DNS requests outside of VPN") - checked: OpenVpnLogic.checkBoxProtoOpenVpnBlockDnsChecked + checked: logic.checkBoxProtoOpenVpnBlockDnsChecked onCheckedChanged: { - OpenVpnLogic.checkBoxProtoOpenVpnBlockDnsChecked = checked + logic.checkBoxProtoOpenVpnBlockDnsChecked = checked } } CheckBoxType { @@ -51,9 +50,9 @@ PageBase { width: 321 height: 21 text: qsTr("Enable TLS auth") - checked: OpenVpnLogic.checkBoxProtoOpenVpnTlsAuthChecked + checked: logic.checkBoxProtoOpenVpnTlsAuthChecked onCheckedChanged: { - OpenVpnLogic.checkBoxProtoOpenVpnTlsAuthChecked = checked + logic.checkBoxProtoOpenVpnTlsAuthChecked = checked } } @@ -76,16 +75,16 @@ PageBase { ] currentIndex: { for (let i = 0; i < model.length; ++i) { - if (OpenVpnLogic.comboBoxProtoOpenVpnCipherText === model[i]) { + if (logic.comboBoxProtoOpenVpnCipherText === model[i]) { return i } } return -1 } onCurrentTextChanged: { - OpenVpnLogic.comboBoxProtoOpenVpnCipherText = currentText + logic.comboBoxProtoOpenVpnCipherText = currentText } - enabled: OpenVpnLogic.comboBoxProtoOpenVpnCipherEnabled + enabled: logic.comboBoxProtoOpenVpnCipherEnabled } ComboBoxType { x: 200 @@ -106,16 +105,16 @@ PageBase { ] currentIndex: { for (let i = 0; i < model.length; ++i) { - if (OpenVpnLogic.comboBoxProtoOpenVpnHashText === model[i]) { + if (logic.comboBoxProtoOpenVpnHashText === model[i]) { return i } } return -1 } onCurrentTextChanged: { - OpenVpnLogic.comboBoxProtoOpenVpnHashText = currentText + logic.comboBoxProtoOpenVpnHashText = currentText } - enabled: OpenVpnLogic.comboBoxProtoOpenVpnHashEnabled + enabled: logic.comboBoxProtoOpenVpnHashEnabled } Rectangle { x: 30 @@ -131,8 +130,8 @@ PageBase { width: 171 height: 19 text: qsTr("TCP") - enabled: OpenVpnLogic.radioButtonProtoOpenVpnTcpEnabled - checked: OpenVpnLogic.radioButtonProtoOpenVpnTcpChecked + enabled: logic.radioButtonProtoOpenVpnTcpEnabled + checked: logic.radioButtonProtoOpenVpnTcpChecked onCheckedChanged: { UiLogic.radioButtonProtoOpenVpnTcpChecked = checked } @@ -143,11 +142,11 @@ PageBase { width: 171 height: 19 text: qsTr("UDP") - checked: OpenVpnLogic.radioButtonProtoOpenVpnUdpChecked + checked: logic.radioButtonProtoOpenVpnUdpChecked onCheckedChanged: { - OpenVpnLogic.radioButtonProtoOpenVpnUdpChecked = checked + logic.radioButtonProtoOpenVpnUdpChecked = checked } - enabled: OpenVpnLogic.radioButtonProtoOpenVpnUdpEnabled + enabled: logic.radioButtonProtoOpenVpnUdpEnabled } } LabelType { @@ -204,8 +203,8 @@ PageBase { y: 550 width: 321 height: 41 - visible: OpenVpnLogic.labelProtoOpenVpnInfoVisible - text: OpenVpnLogic.labelProtoOpenVpnInfoText + visible: logic.labelProtoOpenVpnInfoVisible + text: logic.labelProtoOpenVpnInfoText } TextFieldType { id: lineEdit_proto_openvpn_port @@ -213,11 +212,11 @@ PageBase { y: 230 width: 151 height: 31 - text: OpenVpnLogic.lineEditProtoOpenVpnPortText + text: logic.lineEditProtoOpenVpnPortText onEditingFinished: { - OpenVpnLogic.lineEditProtoOpenVpnPortText = text + logic.lineEditProtoOpenVpnPortText = text } - enabled: OpenVpnLogic.lineEditProtoOpenVpnPortEnabled + enabled: logic.lineEditProtoOpenVpnPortEnabled } TextFieldType { id: lineEdit_proto_openvpn_subnet @@ -225,9 +224,9 @@ PageBase { y: 65 width: 321 height: 31 - text: OpenVpnLogic.lineEditProtoOpenVpnSubnetText + text: logic.lineEditProtoOpenVpnSubnetText onEditingFinished: { - OpenVpnLogic.lineEditProtoOpenVpnSubnetText = text + logic.lineEditProtoOpenVpnSubnetText = text } } ProgressBar { @@ -237,9 +236,9 @@ PageBase { width: 321 height: 40 from: 0 - to: OpenVpnLogic.progressBarProtoOpenVpnResetMaximium - value: OpenVpnLogic.progressBarProtoOpenVpnResetValue - visible: OpenVpnLogic.progressBarProtoOpenVpnResetVisible + to: logic.progressBarProtoOpenVpnResetMaximium + value: logic.progressBarProtoOpenVpnResetValue + visible: logic.progressBarProtoOpenVpnResetVisible background: Rectangle { implicitWidth: parent.width implicitHeight: parent.height @@ -264,9 +263,9 @@ PageBase { width: 321 height: 40 text: qsTr("Save and restart VPN") - visible: OpenVpnLogic.pushButtonOpenvpnSaveVisible + visible: logic.pushButtonOpenvpnSaveVisible onClicked: { - OpenVpnLogic.onPushButtonProtoOpenVpnSaveClicked() + logic.onPushButtonProtoOpenVpnSaveClicked() } } } diff --git a/client/ui/qml/Pages/Protocols/PageProtoShadowSocks.qml b/client/ui/qml/Pages/Protocols/PageProtoShadowSocks.qml index d868333b..347e5910 100644 --- a/client/ui/qml/Pages/Protocols/PageProtoShadowSocks.qml +++ b/client/ui/qml/Pages/Protocols/PageProtoShadowSocks.qml @@ -1,16 +1,16 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -import PageEnum 1.0 +import ProtocolEnum 1.0 import "../" import "../../Controls" import "../../Config" -PageBase { +PageProtocolBase { id: root - page: PageEnum.ShadowSocksSettings - logic: ShadowSocksLogic + protocol: ProtocolEnum.ShadowSocks + logic: UiLogic.protocolLogic(protocol) - enabled: ShadowSocksLogic.pageProtoShadowSocksEnabled + enabled: logic.pageProtoShadowSocksEnabled BackButton { id: back } @@ -19,7 +19,7 @@ PageBase { y: 40 width: 380 height: 600 - enabled: ShadowSocksLogic.widgetProtoShadowSocksEnabled + enabled: logic.widgetProtoShadowSocksEnabled ComboBoxType { x: 190 y: 60 @@ -32,14 +32,14 @@ PageBase { ] currentIndex: { for (let i = 0; i < model.length; ++i) { - if (ShadowSocksLogic.comboBoxProtoShadowSocksCipherText === model[i]) { + if (logic.comboBoxProtoShadowSocksCipherText === model[i]) { return i } } return -1 } onCurrentTextChanged: { - ShadowSocksLogic.comboBoxProtoShadowSocksCipherText = currentText + logic.comboBoxProtoShadowSocksCipherText = currentText } } LabelType { @@ -75,8 +75,8 @@ PageBase { y: 550 width: 321 height: 41 - visible: ShadowSocksLogic.labelProtoShadowSocksInfoVisible - text: ShadowSocksLogic.labelProtoShadowSocksInfoText + visible: logic.labelProtoShadowSocksInfoVisible + text: logic.labelProtoShadowSocksInfoText } TextFieldType { id: lineEdit_proto_shadowsocks_port @@ -84,11 +84,11 @@ PageBase { y: 110 width: 151 height: 31 - text: ShadowSocksLogic.lineEditProtoShadowSocksPortText + text: logic.lineEditProtoShadowSocksPortText onEditingFinished: { - ShadowSocksLogic.lineEditProtoShadowSocksPortText = text + logic.lineEditProtoShadowSocksPortText = text } - enabled: ShadowSocksLogic.lineEditProtoShadowSocksPortEnabled + enabled: logic.lineEditProtoShadowSocksPortEnabled } ProgressBar { id: progressBar_proto_shadowsocks_reset @@ -97,9 +97,9 @@ PageBase { width: 321 height: 40 from: 0 - to: ShadowSocksLogic.progressBarProtoShadowSocksResetMaximium - value: ShadowSocksLogic.progressBarProtoShadowSocksResetValue - visible: ShadowSocksLogic.progressBarProtoShadowSocksResetVisible + to: logic.progressBarProtoShadowSocksResetMaximium + value: logic.progressBarProtoShadowSocksResetValue + visible: logic.progressBarProtoShadowSocksResetVisible background: Rectangle { implicitWidth: parent.width implicitHeight: parent.height @@ -124,9 +124,9 @@ PageBase { width: 321 height: 40 text: qsTr("Save and restart VPN") - visible: ShadowSocksLogic.pushButtonShadowSocksSaveVisible + visible: logic.pushButtonShadowSocksSaveVisible onClicked: { - ShadowSocksLogic.onPushButtonProtoShadowSocksSaveClicked() + logic.onPushButtonProtoShadowSocksSaveClicked() } } } diff --git a/client/ui/qml/Pages/Protocols/PageProtocolBase.qml b/client/ui/qml/Pages/Protocols/PageProtocolBase.qml new file mode 100644 index 00000000..00638aa1 --- /dev/null +++ b/client/ui/qml/Pages/Protocols/PageProtocolBase.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 int protocol: ProtocolEnum.Any + page: PageEnum.ProtocolSettings +} diff --git a/client/ui/qml/main.qml b/client/ui/qml/main.qml index bab6c101..049206f5 100644 --- a/client/ui/qml/main.qml +++ b/client/ui/qml/main.qml @@ -80,6 +80,17 @@ Window { } } + function gotoProtocolPage(protocol, reset, slide) { + if (reset) { + protocolPages[protocol].logic.updatePage(); + } + if (slide) { + pageLoader.push(protocolPages[protocol], {}, StackView.PushTransition) + } else { + pageLoader.push(protocolPages[protocol], {}, StackView.Immediate) + } + } + function close_page() { if (pageLoader.depth <= 1) { return @@ -169,7 +180,7 @@ Window { onStatusChanged: if (status == FolderListModel.Ready) { for (var i=0; iinsert(Protocol::OpenVpn, new OpenVpnLogic(this)); - m_protocolLogicMap->insert(Protocol::ShadowSocks, new ShadowSocksLogic(this)); - m_protocolLogicMap->insert(Protocol::Cloak, new CloakLogic(this)); + m_protocolLogicMap.insert(Protocol::OpenVpn, new OpenVpnLogic(this)); + m_protocolLogicMap.insert(Protocol::ShadowSocks, new ShadowSocksLogic(this)); + m_protocolLogicMap.insert(Protocol::Cloak, new CloakLogic(this)); //m_protocolLogicMap->insert(Protocol::WireGuard, new WireguardLogic(this)); } diff --git a/client/ui/uilogic.h b/client/ui/uilogic.h index 812e4817..df5a6318 100644 --- a/client/ui/uilogic.h +++ b/client/ui/uilogic.h @@ -41,6 +41,8 @@ class UiLogic : public QObject { Q_OBJECT + AUTO_PROPERTY(bool, pageEnabled) + READONLY_PROPERTY(QObject *, containersModel) READONLY_PROPERTY(QObject *, protocolsModel) @@ -104,6 +106,7 @@ signals: void goToPage(int page, bool reset = true, bool slide = true); + void goToProtocolPage(int protocol, bool reset = true, bool slide = true); void closePage(); void setStartPage(int page, bool slide = true); void showPublicKeyWarning(); @@ -169,18 +172,14 @@ public: NewServerProtocolsLogic *newServerProtocolsLogic() { return m_newServerProtocolsLogic; } ServerListLogic *serverListLogic() { return m_serverListLogic; } ServerSettingsLogic *serverSettingsLogic() { return m_serverSettingsLogic; } - ServerContainersLogic *serverVpnProtocolsLogic() { return m_serverVpnProtocolsLogic; } + ServerContainersLogic *serverVpnProtocolsLogic() { return m_serverVpnProtocolsLogic; } ShareConnectionLogic *shareConnectionLogic() { return m_shareConnectionLogic; } SitesLogic *sitesLogic() { return m_sitesLogic; } StartPageLogic *startPageLogic() { return m_startPageLogic; } VpnLogic *vpnLogic() { return m_vpnLogic; } WizardLogic *wizardLogic() { return m_wizardLogic; } - OpenVpnLogic *openVpnLogic() { return m_openVpnLogic; } - ShadowSocksLogic *shadowSocksLogic() { return m_shadowSocksLogic; } - CloakLogic *cloakLogic() { return m_cloakLogic; } - - Q_INVOKABLE PageProtocolLogicBase *protocolLogic(amnezia::Protocol p) { return m_protocolLogicMap->value(p); } + Q_INVOKABLE PageProtocolLogicBase *protocolLogic(amnezia::Protocol p) { return m_protocolLogicMap.value(p); } private: AppSettingsLogic *m_appSettingsLogic; @@ -197,11 +196,7 @@ private: VpnLogic *m_vpnLogic; WizardLogic *m_wizardLogic; - OpenVpnLogic *m_openVpnLogic; - ShadowSocksLogic *m_shadowSocksLogic; - CloakLogic *m_cloakLogic; - - QMap *m_protocolLogicMap; + QMap m_protocolLogicMap; VpnConnection* m_vpnConnection; Settings m_settings;