Qml Containers Page refact

This commit is contained in:
pokamest 2021-09-16 19:49:50 +03:00
parent 0faf6c8599
commit a390f2e988
22 changed files with 191 additions and 197 deletions

View file

@ -2,14 +2,16 @@
#define CONTAIERNS_DEFS_H
#include <QObject>
#include <QQmlEngine>
#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<Protocol> 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);

View file

@ -119,12 +119,15 @@ int main(int argc, char *argv[])
qRegisterMetaType<amnezia::DockerContainer>("amnezia::DockerContainer");
qRegisterMetaType<amnezia::Protocol>("amnezia::Protocol");
qRegisterMetaType<PageProtocolLogicBase *>("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);

View file

@ -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::Protocol, QString> amnezia::protocolDescriptions()
return {};
}
bool amnezia::isProtocolVpnType(Protocol p)
bool amnezia::isProtocolVpnType(ProtocolEnumNS::Protocol p)
{
switch (p) {
case Protocol::Any : return false;

View file

@ -3,6 +3,7 @@
#include <QObject>
#include <QDebug>
#include <QQmlEngine>
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<Protocol> allProtocols();
@ -134,7 +139,7 @@ bool isProtocolVpnType(Protocol p);
static void declareQmlProtocolEnum() {
qmlRegisterUncreatableMetaObject(
PageEnumNS::staticMetaObject,
ProtocolEnumNS::staticMetaObject,
"ProtocolEnum",
1, 0,
"ProtocolEnum",

View file

@ -108,5 +108,6 @@
<file>ui/qml/Controls/Caption.qml</file>
<file>ui/qml/Controls/Logo.qml</file>
<file>ui/qml/Pages/InstallSettings/SelectContainer.qml</file>
<file>ui/qml/Pages/Protocols/PageProtocolBase.qml</file>
</qresource>
</RCC>

View file

@ -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",

View file

@ -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;
}
}

View file

@ -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; }

View file

@ -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<int>(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);
//}

View file

@ -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:

View file

@ -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 {

View file

@ -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)

View file

@ -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;

View file

@ -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

View file

@ -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))
}
}
}

View file

@ -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()
}
}
}

View file

@ -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()
}
}
}

View file

@ -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()
}
}
}

View file

@ -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
}

View file

@ -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; i<folderModelPages.count; i++) {
createPagesObjects(folderModelPages.get(i, "filePath"));
createPagesObjects(folderModelPages.get(i, "filePath"), false);
}
UiLogic.initalizeUiLogic()
}
@ -183,12 +194,18 @@ Window {
onStatusChanged: if (status == FolderListModel.Ready) {
for (var i=0; i<folderModelProtocols.count; i++) {
createPagesObjects(folderModelProtocols.get(i, "filePath"));
createPagesObjects(folderModelProtocols.get(i, "filePath"), true);
}
}
}
function createPagesObjects(file) {
Component {
PageProtoOpenVPN {
}
}
function createPagesObjects(file, isProtocol) {
var c = Qt.createComponent("qrc" + file);
var finishCreation = function (component){
@ -199,7 +216,15 @@ Window {
}
else {
obj.visible = false
if (isProtocol) {
protocolPages[obj.protocol] = obj
console.debug("QML add proto page " + obj.protocol)
}
else {
pages[obj.page] = obj
}
}
} else if (component.status == Component.Error) {
@ -207,15 +232,10 @@ Window {
}
}
var lambdaFunc = function(){
finishCreation(c)
}
if (c.status == Component.Ready)
finishCreation(c);
else {
console.debug("Warning: Pages components are not ready");
c.statusChanged.connect(lambdaFunc);
}
}
@ -224,6 +244,9 @@ Window {
onGoToPage: {
root.gotoPage(page, reset, slide)
}
onGoToProtocolPage: {
root.gotoProtocolPage(protocol, reset, slide)
}
onClosePage: {
root.close_page()
}
@ -243,6 +266,7 @@ Window {
root.hide()
}
}
MessageDialog {
id: closePrompt
// x: (root.width - width) / 2

View file

@ -92,13 +92,9 @@ UiLogic::UiLogic(QObject *parent) :
m_vpnLogic = new VpnLogic(this);
m_wizardLogic = new WizardLogic(this);
m_openVpnLogic = new OpenVpnLogic(this);
m_shadowSocksLogic = new ShadowSocksLogic(this);
m_cloakLogic = 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::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));
}

View file

@ -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();
@ -176,11 +179,7 @@ public:
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<Protocol, PageProtocolLogicBase *> *m_protocolLogicMap;
QMap<Protocol, PageProtocolLogicBase *> m_protocolLogicMap;
VpnConnection* m_vpnConnection;
Settings m_settings;