Merge branch 'tor_site_container' into teplitsa_tz

Containers page refactoring
This commit is contained in:
pokamest 2021-09-21 01:49:28 +03:00
commit 6ee203a21d
22 changed files with 10641 additions and 748 deletions

View file

@ -60,7 +60,7 @@ QMap<DockerContainer, QString> ContainerProps::containerHumanNames()
{DockerContainer::ShadowSocks, "OpenVpn over ShadowSocks"}, {DockerContainer::ShadowSocks, "OpenVpn over ShadowSocks"},
{DockerContainer::Cloak, "OpenVpn over Cloak"}, {DockerContainer::Cloak, "OpenVpn over Cloak"},
{DockerContainer::WireGuard, "WireGuard"}, {DockerContainer::WireGuard, "WireGuard"},
{DockerContainer::TorSite, QObject::tr("Web site under TOR")}, {DockerContainer::TorWebSite, QObject::tr("Web site in TOR network")},
{DockerContainer::Dns, QObject::tr("DNS Service")}, {DockerContainer::Dns, QObject::tr("DNS Service")},
{DockerContainer::FileShare, QObject::tr("File Sharing Service")} {DockerContainer::FileShare, QObject::tr("File Sharing Service")}
}; };
@ -74,10 +74,9 @@ QMap<DockerContainer, QString> ContainerProps::containerDescriptions()
{DockerContainer::Cloak, QObject::tr("Container with OpenVpn and ShadowSocks protocols " {DockerContainer::Cloak, QObject::tr("Container with OpenVpn and ShadowSocks protocols "
"configured with traffic masking by Cloak plugin")}, "configured with traffic masking by Cloak plugin")},
{DockerContainer::WireGuard, QObject::tr("WireGuard container")}, {DockerContainer::WireGuard, QObject::tr("WireGuard container")},
{DockerContainer::TorSite, QObject::tr("Web site under TOR")}, {DockerContainer::TorWebSite, QObject::tr("Web site in TOR network")},
{DockerContainer::Dns, QObject::tr("DNS Service")}, {DockerContainer::Dns, QObject::tr("DNS Service")},
{DockerContainer::FileShare, QObject::tr("File Sharing Service")} {DockerContainer::FileShare, QObject::tr("File Sharing Service")}
}; };
} }
@ -89,7 +88,7 @@ amnezia::ServiceType ContainerProps::containerService(DockerContainer c)
case DockerContainer::Cloak : return ServiceType::Vpn; case DockerContainer::Cloak : return ServiceType::Vpn;
case DockerContainer::ShadowSocks : return ServiceType::Vpn; case DockerContainer::ShadowSocks : return ServiceType::Vpn;
case DockerContainer::WireGuard : return ServiceType::Vpn; case DockerContainer::WireGuard : return ServiceType::Vpn;
case DockerContainer::TorSite : return ServiceType::Other; case DockerContainer::TorWebSite : return ServiceType::Other;
case DockerContainer::Dns : return ServiceType::Other; case DockerContainer::Dns : return ServiceType::Other;
case DockerContainer::FileShare : return ServiceType::Other; case DockerContainer::FileShare : return ServiceType::Other;
default: return ServiceType::Other; default: return ServiceType::Other;

View file

@ -20,7 +20,7 @@ enum DockerContainer {
WireGuard, WireGuard,
//non-vpn //non-vpn
TorSite, TorWebSite,
Dns, Dns,
FileShare FileShare
}; };

View file

@ -11,6 +11,7 @@ QString amnezia::scriptFolder(amnezia::DockerContainer container)
case DockerContainer::Cloak: return QLatin1String("openvpn_cloak"); case DockerContainer::Cloak: return QLatin1String("openvpn_cloak");
case DockerContainer::ShadowSocks: return QLatin1String("openvpn_shadowsocks"); case DockerContainer::ShadowSocks: return QLatin1String("openvpn_shadowsocks");
case DockerContainer::WireGuard: return QLatin1String("wireguard"); case DockerContainer::WireGuard: return QLatin1String("wireguard");
case DockerContainer::TorWebSite: return QLatin1String("website_tor");
default: return ""; default: return "";
} }
} }

BIN
client/images/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

View file

@ -68,7 +68,7 @@ QMap<amnezia::Protocol, QString> ProtocolProps::protocolHumanNames()
{Protocol::ShadowSocks, "ShadowSocks"}, {Protocol::ShadowSocks, "ShadowSocks"},
{Protocol::Cloak, "Cloak"}, {Protocol::Cloak, "Cloak"},
{Protocol::WireGuard, "WireGuard"}, {Protocol::WireGuard, "WireGuard"},
{Protocol::TorSite, "Web site under TOR"}, {Protocol::TorWebSite, "Web site in TOR network"},
{Protocol::Dns, "DNS Service"}, {Protocol::Dns, "DNS Service"},
{Protocol::FileShare, "File Sharing Service"} {Protocol::FileShare, "File Sharing Service"}
}; };
@ -87,7 +87,7 @@ amnezia::ServiceType ProtocolProps::protocolService(Protocol p)
case Protocol::Cloak : return ServiceType::Vpn; case Protocol::Cloak : return ServiceType::Vpn;
case Protocol::ShadowSocks : return ServiceType::Vpn; case Protocol::ShadowSocks : return ServiceType::Vpn;
case Protocol::WireGuard : return ServiceType::Vpn; case Protocol::WireGuard : return ServiceType::Vpn;
case Protocol::TorSite : return ServiceType::Other; case Protocol::TorWebSite : return ServiceType::Other;
case Protocol::Dns : return ServiceType::Other; case Protocol::Dns : return ServiceType::Other;
case Protocol::FileShare : return ServiceType::Other; case Protocol::FileShare : return ServiceType::Other;
default: return ServiceType::Other; default: return ServiceType::Other;
@ -102,7 +102,7 @@ int ProtocolProps::defaultPort(Protocol p)
case Protocol::Cloak : return 443; case Protocol::Cloak : return 443;
case Protocol::ShadowSocks : return 6789; case Protocol::ShadowSocks : return 6789;
case Protocol::WireGuard : return 51820; case Protocol::WireGuard : return 51820;
case Protocol::TorSite : return 443; case Protocol::TorWebSite : return 443;
case Protocol::Dns : return 53; case Protocol::Dns : return 53;
case Protocol::FileShare : return 139; case Protocol::FileShare : return 139;
default: return -1; default: return -1;
@ -117,7 +117,7 @@ bool ProtocolProps::defaultPortChangeable(Protocol p)
case Protocol::Cloak : return true; case Protocol::Cloak : return true;
case Protocol::ShadowSocks : return true; case Protocol::ShadowSocks : return true;
case Protocol::WireGuard : return true; case Protocol::WireGuard : return true;
case Protocol::TorSite : return true; case Protocol::TorWebSite : return true;
case Protocol::Dns : return false; case Protocol::Dns : return false;
case Protocol::FileShare : return false; case Protocol::FileShare : return false;
default: return -1; default: return -1;
@ -132,7 +132,7 @@ TransportProto ProtocolProps::defaultTransportProto(Protocol p)
case Protocol::Cloak : return TransportProto::Tcp; case Protocol::Cloak : return TransportProto::Tcp;
case Protocol::ShadowSocks : return TransportProto::Tcp; case Protocol::ShadowSocks : return TransportProto::Tcp;
case Protocol::WireGuard : return TransportProto::Udp; case Protocol::WireGuard : return TransportProto::Udp;
case Protocol::TorSite : return TransportProto::Tcp; case Protocol::TorWebSite : return TransportProto::Tcp;
case Protocol::Dns : return TransportProto::Udp; case Protocol::Dns : return TransportProto::Udp;
case Protocol::FileShare : return TransportProto::Tcp; case Protocol::FileShare : return TransportProto::Tcp;
default: return TransportProto::Udp; default: return TransportProto::Udp;
@ -147,7 +147,7 @@ bool ProtocolProps::defaultTransportProtoChangeable(Protocol p)
case Protocol::Cloak : return false; case Protocol::Cloak : return false;
case Protocol::ShadowSocks : return false; case Protocol::ShadowSocks : return false;
case Protocol::WireGuard : return false; case Protocol::WireGuard : return false;
case Protocol::TorSite : return false; case Protocol::TorWebSite : return false;
case Protocol::Dns : return false; case Protocol::Dns : return false;
case Protocol::FileShare : return false; case Protocol::FileShare : return false;
default: return -1; default: return -1;

View file

@ -118,7 +118,7 @@ enum Protocol {
ShadowSocks, ShadowSocks,
Cloak, Cloak,
WireGuard, WireGuard,
TorSite, TorWebSite,
Dns, Dns,
FileShare FileShare
}; };

View file

@ -64,6 +64,8 @@
<file>server_scripts/wireguard/run_container.sh</file> <file>server_scripts/wireguard/run_container.sh</file>
<file>server_scripts/wireguard/start.sh</file> <file>server_scripts/wireguard/start.sh</file>
<file>server_scripts/wireguard/template.conf</file> <file>server_scripts/wireguard/template.conf</file>
<file>server_scripts/website_tor/configure_container.sh</file>
<file>server_scripts/website_tor/run_container.sh</file>
<file>ui/qml/main.qml</file> <file>ui/qml/main.qml</file>
<file>ui/qml/TitleBar.qml</file> <file>ui/qml/TitleBar.qml</file>
<file>ui/qml/Pages/PageAppSetting.qml</file> <file>ui/qml/Pages/PageAppSetting.qml</file>
@ -109,5 +111,8 @@
<file>ui/qml/Controls/Logo.qml</file> <file>ui/qml/Controls/Logo.qml</file>
<file>ui/qml/Pages/InstallSettings/SelectContainer.qml</file> <file>ui/qml/Pages/InstallSettings/SelectContainer.qml</file>
<file>ui/qml/Pages/Protocols/PageProtocolBase.qml</file> <file>ui/qml/Pages/Protocols/PageProtocolBase.qml</file>
<file>images/delete.png</file>
<file>ui/qml/Controls/FadeBehavior.qml</file>
<file>ui/qml/Controls/VisibleBehavior.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -0,0 +1,13 @@
# Wireguard config
sudo docker exec -i $CONTAINER_NAME bash -c '\
mkdir -p /opt/amnezia/wireguard; \
cd /opt/amnezia/wireguard || exit 1; \
WIREGUARD_SERVER_PRIVATE_KEY=$(wg genkey) && echo $WIREGUARD_SERVER_PRIVATE_KEY > /opt/amnezia/wireguard/wireguard_server_private_key.key; \
WIREGUARD_SERVER_PUBLIC_KEY=$(echo $WIREGUARD_SERVER_PRIVATE_KEY | wg pubkey) && echo $WIREGUARD_SERVER_PUBLIC_KEY > /opt/amnezia/wireguard/wireguard_server_public_key.key; \
WIREGUARD_PSK=$(wg genpsk) && echo $WIREGUARD_PSK > /opt/amnezia/wireguard/wireguard_psk.key; \
echo -e "\
[Interface]\\n\
PrivateKey = $WIREGUARD_SERVER_PRIVATE_KEY \\n\
Address = $WIREGUARD_SUBNET_IP/$WIREGUARD_SUBNET_CIDR \\n\
ListenPort = $WIREGUARD_SERVER_PORT \\n\
" >/opt/amnezia/wireguard/wg0.conf'

View file

@ -0,0 +1,3 @@
# Run container
sudo docker run -d -p 80:80 --restart always --name amnezia-wp-tor tutum/wordpress
sudo docker run -d --link amnezia-wp-tor --name amnezia-tor goldy/tor-hidden-service

2383
client/ui/mainwindow.cpp Normal file

File diff suppressed because it is too large Load diff

7838
client/ui/mainwindow.ui Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,9 @@
#include "ServerConfiguringProgressLogic.h" #include "ServerConfiguringProgressLogic.h"
#include "defines.h"
#include "core/errorstrings.h"
#include <QTimer>
#include <QEventLoop>
#include <QMessageBox>
ServerConfiguringProgressLogic::ServerConfiguringProgressLogic(UiLogic *logic, QObject *parent): ServerConfiguringProgressLogic::ServerConfiguringProgressLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent), PageLogicBase(logic, parent),
@ -13,3 +18,105 @@ ServerConfiguringProgressLogic::ServerConfiguringProgressLogic(UiLogic *logic, Q
} }
ErrorCode ServerConfiguringProgressLogic::doInstallAction(const std::function<ErrorCode()> &action)
{
PageFunc page;
page.setEnabledFunc = [this] (bool enabled) -> void {
set_pageEnabled(enabled);
};
ButtonFunc button;
LabelFunc info;
ProgressFunc progress;
progress.setVisibleFunc = [this] (bool visible) ->void {
set_progressBarVisible(visible);
};
progress.setValueFunc = [this] (int value) ->void {
set_progressBarValue(value);
};
progress.getValueFunc = [this] (void) -> int {
return progressBarValue();
};
progress.getMaximiumFunc = [this] (void) -> int {
return progressBarMaximium();
};
progress.setVisibleFunc(true);
if (page.setEnabledFunc) {
page.setEnabledFunc(false);
}
if (button.setVisibleFunc) {
button.setVisibleFunc(false);
}
if (info.setVisibleFunc) {
info.setVisibleFunc(true);
}
if (info.setTextFunc) {
info.setTextFunc(tr("Please wait, configuring process may take up to 5 minutes"));
}
QTimer timer;
connect(&timer, &QTimer::timeout, [progress](){
progress.setValueFunc(progress.getValueFunc() + 1);
});
progress.setValueFunc(0);
timer.start(1000);
ErrorCode e = action();
qDebug() << "doInstallAction finished with code" << e;
if (e) {
if (page.setEnabledFunc) {
page.setEnabledFunc(true);
}
if (button.setVisibleFunc) {
button.setVisibleFunc(true);
}
if (info.setVisibleFunc) {
info.setVisibleFunc(false);
}
QMessageBox::warning(nullptr, APPLICATION_NAME,
tr("Error occurred while configuring server.") + "\n" +
errorString(e));
progress.setVisibleFunc(false);
return e;
}
// just ui progressbar tweak
timer.stop();
int remaining_val = progress.getMaximiumFunc() - progress.getValueFunc();
if (remaining_val > 0) {
QTimer timer1;
QEventLoop loop1;
connect(&timer1, &QTimer::timeout, [&](){
progress.setValueFunc(progress.getValueFunc() + 1);
if (progress.getValueFunc() >= progress.getMaximiumFunc()) {
loop1.quit();
}
});
timer1.start(5);
loop1.exec();
}
progress.setVisibleFunc(false);
if (button.setVisibleFunc) {
button.setVisibleFunc(true);
}
if (page.setEnabledFunc) {
page.setEnabledFunc(true);
}
if (info.setTextFunc) {
info.setTextFunc(tr("Operation finished"));
}
return ErrorCode::NoError;
}

View file

@ -1,6 +1,7 @@
#ifndef SERVER_CONFIGURING_PROGRESS_LOGIC_H #ifndef SERVER_CONFIGURING_PROGRESS_LOGIC_H
#define SERVER_CONFIGURING_PROGRESS_LOGIC_H #define SERVER_CONFIGURING_PROGRESS_LOGIC_H
#include <functional>
#include "PageLogicBase.h" #include "PageLogicBase.h"
class UiLogic; class UiLogic;
@ -21,5 +22,27 @@ public:
explicit ServerConfiguringProgressLogic(UiLogic *uiLogic, QObject *parent = nullptr); explicit ServerConfiguringProgressLogic(UiLogic *uiLogic, QObject *parent = nullptr);
~ServerConfiguringProgressLogic() = default; ~ServerConfiguringProgressLogic() = default;
ErrorCode doInstallAction(const std::function<ErrorCode()> &action);
private:
struct ProgressFunc {
std::function<void(bool)> setVisibleFunc;
std::function<void(int)> setValueFunc;
std::function<int(void)> getValueFunc;
std::function<int(void)> getMaximiumFunc;
std::function<void(bool)> setTextVisibleFunc;
std::function<void(const QString&)> setTextFunc;
};
struct PageFunc {
std::function<void(bool)> setEnabledFunc;
};
struct ButtonFunc {
std::function<void(bool)> setVisibleFunc;
};
struct LabelFunc {
std::function<void(bool)> setVisibleFunc;
std::function<void(const QString&)> setTextFunc;
};
}; };
#endif // SERVER_CONFIGURING_PROGRESS_LOGIC_H #endif // SERVER_CONFIGURING_PROGRESS_LOGIC_H

View file

@ -1,5 +1,9 @@
#include "ServerContainersLogic.h" #include "ServerContainersLogic.h"
#include "ShareConnectionLogic.h" #include "ShareConnectionLogic.h"
#include "ServerConfiguringProgressLogic.h"
#include <QApplication>
#include "protocols/CloakLogic.h" #include "protocols/CloakLogic.h"
#include "protocols/OpenVpnLogic.h" #include "protocols/OpenVpnLogic.h"
#include "protocols/ShadowSocksLogic.h" #include "protocols/ShadowSocksLogic.h"
@ -10,105 +14,17 @@
#include "../uilogic.h" #include "../uilogic.h"
ServerContainersLogic::ServerContainersLogic(UiLogic *logic, QObject *parent): ServerContainersLogic::ServerContainersLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent), PageLogicBase(logic, parent)
m_progressBarProtocolsContainerReinstallValue{0},
m_progressBarProtocolsContainerReinstallMaximium{100},
m_pushButtonOpenVpnContInstallEnabled{false},
m_pushButtonSsOpenVpnContInstallEnabled{false},
m_pushButtonCloakOpenVpnContInstallEnabled{false},
m_pushButtonWireguardContInstallEnabled{false},
m_pushButtonOpenVpnContDefaultChecked{false},
m_pushButtonSsOpenVpnContDefaultChecked{false},
m_pushButtonCloakOpenVpnContDefaultChecked{false},
m_pushButtonWireguardContDefaultChecked{false},
m_pushButtonOpenVpnContDefaultVisible{true},
m_pushButtonSsOpenVpnContDefaultVisible{false},
m_pushButtonCloakOpenVpnContDefaultVisible{false},
m_pushButtonWireguardContDefaultVisible{false},
m_pushButtonOpenVpnContShareVisible{false},
m_pushButtonSsOpenVpnContShareVisible{false},
m_pushButtonCloakOpenVpnContShareVisible{false},
m_pushButtonWireguardContShareVisible{false},
m_frameOpenvpnSettingsVisible{true},
m_frameOpenvpnSsSettingsVisible{true},
m_frameOpenvpnSsCloakSettingsVisible{true},
m_progressBarProtocolsContainerReinstallVisible{false},
m_frameWireguardSettingsVisible{false},
m_frameWireguardVisible{false}
{ {
setupProtocolsPageConnections();
set_frameWireguardSettingsVisible(false);
set_frameWireguardVisible(false);
} }
void ServerContainersLogic::updateServerContainersPage() void ServerContainersLogic::updateServerContainersPage()
{ {
set_progressBarProtocolsContainerReinstallVisible(false);
ContainersModel *c_model = qobject_cast<ContainersModel *>(uiLogic()->containersModel()); ContainersModel *c_model = qobject_cast<ContainersModel *>(uiLogic()->containersModel());
c_model->setSelectedServerIndex(uiLogic()->selectedServerIndex); c_model->setSelectedServerIndex(uiLogic()->selectedServerIndex);
ProtocolsModel *p_model = qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel()); ProtocolsModel *p_model = qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel());
p_model->setSelectedServerIndex(uiLogic()->selectedServerIndex); p_model->setSelectedServerIndex(uiLogic()->selectedServerIndex);
auto containers = m_settings.containers(uiLogic()->selectedServerIndex);
DockerContainer defaultContainer = m_settings.defaultContainer(uiLogic()->selectedServerIndex);
bool haveAuthData = m_settings.haveAuthData(uiLogic()->selectedServerIndex);
// all containers
QList<DockerContainer> allContainers {
DockerContainer::OpenVpn,
DockerContainer::ShadowSocks,
DockerContainer::Cloak,
DockerContainer::WireGuard
};
using SetVisibleFunc = std::function<void(bool)>;
using SetCheckedFunc = std::function<void(bool)>;
using SetEnabledFunc = std::function<void(bool)>;
QList<SetEnabledFunc> installButtonsEnabledFunc {
[this](bool enabled) ->void {set_pushButtonOpenVpnContInstallEnabled(enabled);},
[this](bool enabled) ->void {set_pushButtonSsOpenVpnContInstallEnabled(enabled);},
[this](bool enabled) ->void {set_pushButtonCloakOpenVpnContInstallEnabled(enabled);},
[this](bool enabled) ->void {set_pushButtonWireguardContInstallEnabled(enabled);},
};
QList<SetCheckedFunc> defaultButtonsCheckedFunc {
[this](bool checked) ->void {set_pushButtonOpenVpnContDefaultChecked(checked);},
[this](bool checked) ->void {set_pushButtonSsOpenVpnContDefaultChecked(checked);},
[this](bool checked) ->void {set_pushButtonCloakOpenVpnContDefaultChecked(checked);},
[this](bool checked) ->void {set_pushButtonWireguardContDefaultChecked(checked);},
};
QList<SetVisibleFunc> defaultButtonsVisibleFunc {
[this](bool visible) ->void {set_pushButtonOpenVpnContDefaultVisible(visible);},
[this](bool visible) ->void {set_pushButtonSsOpenVpnContDefaultVisible(visible);},
[this](bool visible) ->void {set_pushButtonCloakOpenVpnContDefaultVisible(visible);},
[this](bool visible) ->void {set_pushButtonWireguardContDefaultVisible(visible);},
};
QList<SetVisibleFunc> shareButtonsVisibleFunc {
[this](bool visible) ->void {set_pushButtonOpenVpnContShareVisible(visible);},
[this](bool visible) ->void {set_pushButtonSsOpenVpnContShareVisible(visible);},
[this](bool visible) ->void {set_pushButtonCloakOpenVpnContShareVisible(visible);},
[this](bool visible) ->void {set_pushButtonWireguardContShareVisible(visible);},
};
QList<SetVisibleFunc> framesVisibleFunc {
[this](bool visible) ->void {set_frameOpenvpnSettingsVisible(visible);},
[this](bool visible) ->void {set_frameOpenvpnSsSettingsVisible(visible);},
[this](bool visible) ->void {set_frameOpenvpnSsCloakSettingsVisible(visible);},
[this](bool visible) ->void {set_frameWireguardSettingsVisible(visible);},
};
for (int i = 0; i < allContainers.size(); ++i) {
defaultButtonsCheckedFunc.at(i)(defaultContainer == allContainers.at(i));
defaultButtonsVisibleFunc.at(i)(haveAuthData && containers.contains(allContainers.at(i)));
shareButtonsVisibleFunc.at(i)(haveAuthData && containers.contains(allContainers.at(i)));
installButtonsEnabledFunc.at(i)(haveAuthData);
framesVisibleFunc.at(i)(containers.contains(allContainers.at(i)));
}
} }
void ServerContainersLogic::onPushButtonProtoSettingsClicked(DockerContainer c, Protocol p) void ServerContainersLogic::onPushButtonProtoSettingsClicked(DockerContainer c, Protocol p)
@ -134,114 +50,48 @@ void ServerContainersLogic::onPushButtonShareClicked(DockerContainer c)
emit uiLogic()->goToPage(Page::ShareConnection); emit uiLogic()->goToPage(Page::ShareConnection);
} }
void ServerContainersLogic::setupProtocolsPageConnections() void ServerContainersLogic::onPushButtonRemoveClicked(DockerContainer container)
{ {
QJsonObject openvpnConfig; //buttonSetEnabledFunc(false);
// all containers
QList<DockerContainer> containers {
DockerContainer::OpenVpn,
DockerContainer::ShadowSocks,
DockerContainer::Cloak,
DockerContainer::WireGuard
};
using ButtonClickedFunc = void (ServerContainersLogic::*)(bool);
using ButtonSetEnabledFunc = std::function<void(bool)>;
// install buttons
QList<ButtonClickedFunc> installButtonsClickedSig {
&ServerContainersLogic::pushButtonOpenVpnContInstallClicked,
&ServerContainersLogic::pushButtonSsOpenVpnContInstallClicked,
&ServerContainersLogic::pushButtonCloakOpenVpnContInstallClicked,
&ServerContainersLogic::pushButtonWireguardContInstallClicked,
};
QList<ButtonSetEnabledFunc> installButtonsSetEnabledFunc {
[this] (bool enabled) -> void {
set_pushButtonOpenVpnContInstallEnabled(enabled);
},
[this] (bool enabled) -> void {
set_pushButtonSsOpenVpnContInstallEnabled(enabled);
},
[this] (bool enabled) -> void {
set_pushButtonCloakOpenVpnContInstallEnabled(enabled);
},
[this] (bool enabled) -> void {
set_pushButtonWireguardContInstallEnabled(enabled);
},
};
for (int i = 0; i < containers.size(); ++i) {
ButtonClickedFunc buttonClickedFunc = installButtonsClickedSig.at(i);
ButtonSetEnabledFunc buttonSetEnabledFunc = installButtonsSetEnabledFunc.at(i);
DockerContainer container = containers.at(i);
connect(this, buttonClickedFunc, [this, container, buttonSetEnabledFunc](bool checked){
if (checked) {
UiLogic::PageFunc page_server_containers;
page_server_containers.setEnabledFunc = [this] (bool enabled) -> void {
set_pageEnabled(enabled);
};
UiLogic::ButtonFunc no_button;
UiLogic::LabelFunc no_label;
UiLogic::ProgressFunc progressBar_protocols_container_reinstall;
progressBar_protocols_container_reinstall.setVisibleFunc = [this] (bool visible) ->void {
set_progressBarProtocolsContainerReinstallVisible(visible);
};
progressBar_protocols_container_reinstall.setValueFunc = [this] (int value) ->void {
set_progressBarProtocolsContainerReinstallValue(value);
};
progressBar_protocols_container_reinstall.getValueFunc = [this] (void) -> int {
return progressBarProtocolsContainerReinstallValue();
};
progressBar_protocols_container_reinstall.getMaximiumFunc = [this] (void) -> int {
return progressBarProtocolsContainerReinstallMaximium();
};
ErrorCode e = uiLogic()->doInstallAction([this, container](){
return ServerController::setupContainer(m_settings.serverCredentials(uiLogic()->selectedServerIndex), container);
},
page_server_containers, progressBar_protocols_container_reinstall,
no_button, no_label);
if (!e) {
m_settings.setContainerConfig(uiLogic()->selectedServerIndex, container, QJsonObject());
m_settings.setDefaultContainer(uiLogic()->selectedServerIndex, container);
}
}
else {
buttonSetEnabledFunc(false);
ErrorCode e = ServerController::removeContainer(m_settings.serverCredentials(uiLogic()->selectedServerIndex), container); ErrorCode e = ServerController::removeContainer(m_settings.serverCredentials(uiLogic()->selectedServerIndex), container);
m_settings.removeContainerConfig(uiLogic()->selectedServerIndex, container); m_settings.removeContainerConfig(uiLogic()->selectedServerIndex, container);
buttonSetEnabledFunc(true); //buttonSetEnabledFunc(true);
if (m_settings.defaultContainer(uiLogic()->selectedServerIndex) == container) { if (m_settings.defaultContainer(uiLogic()->selectedServerIndex) == container) {
const auto &c = m_settings.containers(uiLogic()->selectedServerIndex); const auto &c = m_settings.containers(uiLogic()->selectedServerIndex);
if (c.isEmpty()) m_settings.setDefaultContainer(uiLogic()->selectedServerIndex, DockerContainer::None); if (c.isEmpty()) m_settings.setDefaultContainer(uiLogic()->selectedServerIndex, DockerContainer::None);
else m_settings.setDefaultContainer(uiLogic()->selectedServerIndex, c.keys().first()); else m_settings.setDefaultContainer(uiLogic()->selectedServerIndex, c.keys().first());
} }
updateServerContainersPage();
}
void ServerContainersLogic::onPushButtonContinueClicked(DockerContainer c, int port, TransportProto tp)
{
QMap<DockerContainer, QJsonObject> containers;
Protocol mainProto = ContainerProps::defaultProtocol(c);
QJsonObject config {
{ config_key::container, ContainerProps::containerToString(c) },
{ ProtocolProps::protoToString(mainProto), QJsonObject {
{ config_key::port, QString::number(port) },
{ config_key::transport_proto, ProtocolProps::transportProtoToString(tp, mainProto) }}
}
};
containers.insert(c, config);
emit uiLogic()->goToPage(Page::ServerConfiguringProgress);
qApp->processEvents();
ErrorCode e = uiLogic()->serverConfiguringProgressLogic()->doInstallAction([this, c](){
return ServerController::setupContainer(m_settings.serverCredentials(uiLogic()->selectedServerIndex), c);
});
if (!e) {
m_settings.setContainerConfig(uiLogic()->selectedServerIndex, c, QJsonObject());
m_settings.setDefaultContainer(uiLogic()->selectedServerIndex, c);
} }
updateServerContainersPage(); updateServerContainersPage();
}); emit uiLogic()->closePage();
} }
// share buttons
QList<ButtonClickedFunc> shareButtonsClickedSig {
&ServerContainersLogic::pushButtonOpenVpnContShareClicked,
&ServerContainersLogic::pushButtonSsOpenVpnContShareClicked,
&ServerContainersLogic::pushButtonCloakOpenVpnContShareClicked,
&ServerContainersLogic::pushButtonWireguardContShareClicked,
};
for (int i = 0; i < containers.size(); ++i) {
ButtonClickedFunc buttonClickedFunc = shareButtonsClickedSig.at(i);
DockerContainer container = containers.at(i);
connect(this, buttonClickedFunc, [this, container](bool){
uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), container);
emit uiLogic()->goToPage(Page::ShareConnection);
});
}
}

View file

@ -9,67 +9,18 @@ class ServerContainersLogic : public PageLogicBase
{ {
Q_OBJECT Q_OBJECT
AUTO_PROPERTY(int, progressBarProtocolsContainerReinstallValue)
AUTO_PROPERTY(int, progressBarProtocolsContainerReinstallMaximium)
// AUTO_PROPERTY(bool, pushButtonOpenVpnContInstallChecked)
// AUTO_PROPERTY(bool, pushButtonSsOpenVpnContInstallChecked)
// AUTO_PROPERTY(bool, pushButtonCloakOpenVpnContInstallChecked)
// AUTO_PROPERTY(bool, pushButtonWireguardContInstallChecked)
AUTO_PROPERTY(bool, pushButtonOpenVpnContInstallEnabled)
AUTO_PROPERTY(bool, pushButtonSsOpenVpnContInstallEnabled)
AUTO_PROPERTY(bool, pushButtonCloakOpenVpnContInstallEnabled)
AUTO_PROPERTY(bool, pushButtonWireguardContInstallEnabled)
AUTO_PROPERTY(bool, pushButtonOpenVpnContDefaultChecked)
AUTO_PROPERTY(bool, pushButtonSsOpenVpnContDefaultChecked)
AUTO_PROPERTY(bool, pushButtonCloakOpenVpnContDefaultChecked)
AUTO_PROPERTY(bool, pushButtonWireguardContDefaultChecked)
AUTO_PROPERTY(bool, pushButtonOpenVpnContDefaultVisible)
AUTO_PROPERTY(bool, pushButtonSsOpenVpnContDefaultVisible)
AUTO_PROPERTY(bool, pushButtonCloakOpenVpnContDefaultVisible)
AUTO_PROPERTY(bool, pushButtonWireguardContDefaultVisible)
AUTO_PROPERTY(bool, pushButtonOpenVpnContShareVisible)
AUTO_PROPERTY(bool, pushButtonSsOpenVpnContShareVisible)
AUTO_PROPERTY(bool, pushButtonCloakOpenVpnContShareVisible)
AUTO_PROPERTY(bool, pushButtonWireguardContShareVisible)
AUTO_PROPERTY(bool, frameOpenvpnSettingsVisible)
AUTO_PROPERTY(bool, frameOpenvpnSsSettingsVisible)
AUTO_PROPERTY(bool, frameOpenvpnSsCloakSettingsVisible)
AUTO_PROPERTY(bool, progressBarProtocolsContainerReinstallVisible)
AUTO_PROPERTY(bool, frameWireguardSettingsVisible)
AUTO_PROPERTY(bool, frameWireguardVisible)
public: public:
Q_INVOKABLE void updateServerContainersPage(); Q_INVOKABLE void updateServerContainersPage();
Q_INVOKABLE void onPushButtonProtoSettingsClicked(DockerContainer c, Protocol p); Q_INVOKABLE void onPushButtonProtoSettingsClicked(DockerContainer c, Protocol p);
Q_INVOKABLE void onPushButtonDefaultClicked(DockerContainer c); Q_INVOKABLE void onPushButtonDefaultClicked(DockerContainer c);
Q_INVOKABLE void onPushButtonShareClicked(DockerContainer c); Q_INVOKABLE void onPushButtonShareClicked(DockerContainer c);
Q_INVOKABLE void onPushButtonRemoveClicked(DockerContainer c);
Q_INVOKABLE void onPushButtonContinueClicked(DockerContainer c, int port, TransportProto tp);
public: public:
explicit ServerContainersLogic(UiLogic *uiLogic, QObject *parent = nullptr); explicit ServerContainersLogic(UiLogic *uiLogic, QObject *parent = nullptr);
~ServerContainersLogic() = default; ~ServerContainersLogic() = default;
void setupProtocolsPageConnections();
signals:
void pushButtonOpenVpnContDefaultClicked(bool checked);
void pushButtonSsOpenVpnContDefaultClicked(bool checked);
void pushButtonCloakOpenVpnContDefaultClicked(bool checked);
void pushButtonWireguardContDefaultClicked(bool checked);
void pushButtonOpenVpnContInstallClicked(bool checked);
void pushButtonSsOpenVpnContInstallClicked(bool checked);
void pushButtonCloakOpenVpnContInstallClicked(bool checked);
void pushButtonWireguardContInstallClicked(bool checked);
void pushButtonOpenVpnContShareClicked(bool checked);
void pushButtonSsOpenVpnContShareClicked(bool checked);
void pushButtonCloakOpenVpnContShareClicked(bool checked);
void pushButtonWireguardContShareClicked(bool checked);
}; };
#endif // SERVER_CONTAINERS_LOGIC_H #endif // SERVER_CONTAINERS_LOGIC_H

View file

@ -0,0 +1,35 @@
import QtQuick 2.15
import QtQml 2.15
Behavior {
id: root
property QtObject fadeTarget: targetProperty.object
property string fadeProperty: "scale"
property int fadeDuration: 150
property string easingType: "Quad"
property alias outAnimation: outAnimation
property alias inAnimation: inAnimation
SequentialAnimation {
NumberAnimation {
id: outAnimation
target: root.fadeTarget
property: root.fadeProperty
duration: root.fadeDuration
to: 0
easing.type: Easing["In"+root.easingType]
}
PropertyAction { }
NumberAnimation {
id: inAnimation
target: root.fadeTarget
property: root.fadeProperty
duration: root.fadeDuration
to: target[property]
easing.type: Easing["Out"+root.easingType]
}
}
}

View file

@ -0,0 +1,6 @@
FadeBehavior {
fadeProperty: "opacity"
fadeDuration: 200
outAnimation.duration: targetValue ? 0 : fadeDuration
inAnimation.duration: targetValue ? fadeDuration : 0
}

View file

@ -10,7 +10,6 @@ Drawer {
id: root id: root
signal containerSelected(int c_index) signal containerSelected(int c_index)
property int selectedIndex: -1 property int selectedIndex: -1
property alias modelFilters: proxyModel.filters
z: -3 z: -3

View file

@ -2,6 +2,8 @@ import QtQuick 2.12
import QtQuick.Controls 2.12 import QtQuick.Controls 2.12
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import SortFilterProxyModel 0.2 import SortFilterProxyModel 0.2
import ContainerProps 1.0
import ProtocolProps 1.0
import PageEnum 1.0 import PageEnum 1.0
import "./" import "./"
import "../Controls" import "../Controls"
@ -19,33 +21,149 @@ PageBase {
} }
Caption { Caption {
id: caption id: caption
text: qsTr("Protocols") text: container_selector.selectedIndex > 0 ? qsTr("Install new service") : qsTr("Installed services")
} }
BlueButtonType {
id: pb_add_container SelectContainer {
anchors.horizontalCenter: parent.horizontalCenter id: container_selector
onContainerSelected: {
var containerProto = ContainerProps.defaultProtocol(c_index)
tf_port_num.text = ProtocolProps.defaultPort(containerProto)
cb_port_proto.currentIndex = ProtocolProps.defaultTransportProto(containerProto)
tf_port_num.enabled = ProtocolProps.defaultPortChangeable(containerProto)
cb_port_proto.enabled = ProtocolProps.defaultTransportProtoChangeable(containerProto)
}
}
Column {
id: c1
visible: container_selector.selectedIndex > 0
width: parent.width
anchors.top: caption.bottom anchors.top: caption.bottom
anchors.topMargin: 10 anchors.topMargin: 10
Caption {
font.pixelSize: 22
text: UiLogic.containerName(container_selector.selectedIndex)
}
Text {
width: parent.width
anchors.topMargin: 10
padding: 10
font.family: "Lato"
font.styleName: "normal"
font.pixelSize: 16
color: "#181922"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
text: UiLogic.containerDesc(container_selector.selectedIndex)
}
}
Rectangle {
id: frame_settings
visible: container_selector.selectedIndex > 0
width: parent.width
anchors.top: c1.bottom
anchors.topMargin: 10
border.width: 1
border.color: "lightgray"
anchors.bottomMargin: 5
anchors.horizontalCenter: parent.horizontalCenter
radius: 2
Grid {
id: grid
visible: container_selector.selectedIndex > 0
anchors.fill: parent
columns: 2
horizontalItemAlignment: Grid.AlignHCenter
verticalItemAlignment: Grid.AlignVCenter
topPadding: 5
leftPadding: 10
spacing: 5
LabelType {
width: 130
text: qsTr("Port")
}
TextFieldType {
id: tf_port_num
width: parent.width - 130 - parent.spacing - parent.leftPadding * 2
}
LabelType {
width: 130
text: qsTr("Network Protocol")
}
ComboBoxType {
id: cb_port_proto
width: parent.width - 130 - parent.spacing - parent.leftPadding * 2
model: [
qsTr("udp"),
qsTr("tcp"),
]
}
}
}
BlueButtonType {
id: pb_cancel_add
visible: container_selector.selectedIndex > 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: pb_continue_add.top
anchors.bottomMargin: 20
width: parent.width - 40 width: parent.width - 40
height: 40 height: 40
text: qsTr("Add protocols container") text: qsTr("Cancel")
font.pixelSize: 16 font.pixelSize: 16
onClicked: container_selector.visible ? container_selector.close() : container_selector.open() onClicked: container_selector.selectedIndex = -1
} }
SelectContainer {
id: container_selector BlueButtonType {
id: pb_continue_add
visible: container_selector.selectedIndex > 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: 20
width: parent.width - 40
height: 40
text: qsTr("Continue")
font.pixelSize: 16
onClicked: {
let cont = container_selector.selectedIndex
let tp = ProtocolProps.transportProtoFromString(cb_port_proto.currentText)
let port = tf_port_num.text
ServerContainersLogic.onPushButtonContinueClicked(cont, port, tp)
} }
}
Flickable { Flickable {
visible: container_selector.selectedIndex <= 0
clip: true clip: true
width: parent.width width: parent.width
anchors.top: pb_add_container.bottom anchors.top: caption.bottom
anchors.bottom: parent.bottom anchors.bottom: pb_add_container.top
contentHeight: col.height contentHeight: col.height
Column { Column {
visible: container_selector.selectedIndex <= 0
id: col id: col
anchors { anchors {
left: parent.left; left: parent.left;
@ -116,23 +234,6 @@ PageBase {
visible: index === tb_c.currentIndex visible: index === tb_c.currentIndex
} }
// ImageButtonType {
// id: button_default1
// z:10
// Layout.alignment: Qt.AlignRight
// checkable: true
// img.source: checked ? "qrc:/images/check.png" : "qrc:/images/uncheck.png"
// width: 20
// img.width: 20
// height: 20
// checked: default_role
// onClicked: {
// ServerContainersLogic.onPushButtonDefaultClicked(proxyContainersModel.mapToSource(index))
// }
// }
RowLayout { RowLayout {
id: row_container id: row_container
//width: parent.width //width: parent.width
@ -156,6 +257,7 @@ PageBase {
Layout.fillWidth: true Layout.fillWidth: true
MouseArea { MouseArea {
enabled: col.visible
anchors.top: lb_container_name.top anchors.top: lb_container_name.top
anchors.bottom: lb_container_name.bottom anchors.bottom: lb_container_name.bottom
anchors.left: parent.left anchors.left: parent.left
@ -191,6 +293,7 @@ PageBase {
ImageButtonType { ImageButtonType {
id: button_share id: button_share
visible: index === tb_c.currentIndex
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
icon.source: "qrc:/images/share.png" icon.source: "qrc:/images/share.png"
implicitWidth: 30 implicitWidth: 30
@ -198,6 +301,25 @@ PageBase {
onClicked: { onClicked: {
ServerContainersLogic.onPushButtonShareClicked(proxyContainersModel.mapToSource(index)) ServerContainersLogic.onPushButtonShareClicked(proxyContainersModel.mapToSource(index))
} }
VisibleBehavior on visible { }
}
ImageButtonType {
id: button_remove
visible: index === tb_c.currentIndex
Layout.alignment: Qt.AlignRight
checkable: true
icon.source: "qrc:/images/delete.png"
implicitWidth: 30
implicitHeight: 30
checked: default_role
onClicked: {
ServerContainersLogic.onPushButtonRemoveClicked(proxyContainersModel.mapToSource(index))
}
VisibleBehavior on visible { }
} }
} }
@ -218,6 +340,9 @@ PageBase {
interactive: false interactive: false
model: proxyProtocolsModel model: proxyProtocolsModel
VisibleBehavior on visible { }
delegate: Item { delegate: Item {
id: dp_item id: dp_item
@ -279,13 +404,7 @@ PageBase {
} }
} }
} }
}
// MouseArea {
// anchors.fill: parent
// onClicked: {
// tb_p.currentIndex = index
// }
// }
} }
} }
} }
@ -294,456 +413,20 @@ PageBase {
} }
BlueButtonType {
id: pb_add_container
visible: container_selector.selectedIndex < 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.topMargin: 10
anchors.bottomMargin: 20
width: parent.width - 40
height: 40
text: qsTr("Install new protocols container")
font.pixelSize: 16
onClicked: container_selector.visible ? container_selector.close() : container_selector.open()
} }
// ProgressBar {
// id: progress_bar
// anchors.horizontalCenter: parent.horizontalCenter
// y: 570
// width: 301
// height: 40
// from: 0
// to: ServerContainersLogic.progressBarProtocolsContainerReinstallMaximium
// value: ServerContainersLogic.progressBarProtocolsContainerReinstallValue
// visible: ServerContainersLogic.progressBarProtocolsContainerReinstallVisible
// background: Rectangle {
// implicitWidth: parent.width
// implicitHeight: parent.height
// color: "#100A44"
// radius: 4
// }
// contentItem: Item {
// implicitWidth: parent.width
// implicitHeight: parent.height
// Rectangle {
// width: progress_bar.visualPosition * parent.width
// height: parent.height
// radius: 4
// color: Qt.rgba(255, 255, 255, 0.15);
// }
// }
// LabelType {
// anchors.fill: parent
// text: qsTr("Configuring...")
// horizontalAlignment: Text.AlignHCenter
// font.family: "Lato"
// font.styleName: "normal"
// font.pixelSize: 16
// color: "#D4D4D4"
// }
// }
// ScrollView {
// x: 0
// y: 190
// width: 380
// height: 471
// clip: true
// Column {
// spacing: 5
// Rectangle {
// id: frame_openvpn_ss_cloak
// x: 9
// height: 135
// width: 363
// border.width: 1
// border.color: "lightgray"
// radius: 2
// visible: ServerContainersLogic.frameOpenvpnSsCloakSettingsVisible
// Item {
// x: 5
// y: 5
// width: parent.width - 10
// height: parent.height - 10
// LabelType {
// anchors.left: parent.left
// width: 239
// height: 24
// text: qsTr("Cloak container")
// leftPadding: 5
// }
// ImageButtonType {
// anchors.right: sr1.left
// anchors.rightMargin: 5
// checkable: true
// icon.source: checked ? "qrc:/images/check.png" : "qrc:/images/uncheck.png"
// width: 24
// height: 24
// checked: ServerContainersLogic.pushButtonCloakOpenVpnContDefaultChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonCloakOpenVpnContDefaultChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoCloakOpenVpnContDefaultClicked(checked)
// }
// visible: ServerContainersLogic.pushButtonCloakOpenVpnContDefaultVisible
// }
// ImageButtonType {
// id: sr1
// anchors.right: cn1.left
// anchors.rightMargin: 5
// icon.source: "qrc:/images/share.png"
// width: 24
// height: 24
// visible: ServerContainersLogic.pushButtonCloakOpenVpnContShareVisible
// onClicked: {
// ServerContainersLogic.onPushButtonProtoCloakOpenVpnContShareClicked(false)
// }
// }
// ImageButtonType {
// id: cn1
// anchors.right: parent.right
// checkable: true
// icon.source: checked ? "qrc:/images/connect_button_connected.png"
// : "qrc:/images/connect_button_disconnected.png"
// width: 36
// height: 24
// checked: ServerContainersLogic.pushButtonCloakOpenVpnContInstallChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonCloakOpenVpnContInstallChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoCloakOpenVpnContInstallClicked(checked)
// }
// enabled: ServerContainersLogic.pushButtonCloakOpenVpnContInstallEnabled
// }
// }
// Rectangle {
// x: 10
// y: 42
// height: 83
// width: 343
// border.width: 1
// border.color: "lightgray"
// radius: 2
// SettingButtonType {
// x: 10
// y: 10
// width: 323
// height: 24
// text: qsTr("OpenVPN settings")
// icon.source: "qrc:/images/settings.png"
// onClicked: {
// ServerContainersLogic.onPushButtonProtoCloakOpenVpnContOpenvpnConfigClicked()
// }
// }
// SettingButtonType {
// x: 10
// y: 33
// width: 323
// height: 24
// text: qsTr("ShadowSocks settings")
// icon.source: "qrc:/images/settings.png"
// onClicked: {
// ServerContainersLogic.onPushButtonProtoCloakOpenVpnContSsConfigClicked()
// }
// }
// SettingButtonType {
// x: 10
// y: 56
// width: 323
// height: 24
// text: qsTr("Cloak settings")
// icon.source: "qrc:/images/settings.png"
// onClicked: {
// ServerContainersLogic.onPushButtonProtoCloakOpenVpnContCloakConfigClicked()
// }
// }
// }
// }
// Rectangle {
// id: frame_openvpn_ss
// x: 9
// height: 105
// width: 363
// border.width: 1
// border.color: "lightgray"
// radius: 2
// visible: ServerContainersLogic.frameOpenvpnSsSettingsVisible
// Item {
// x: 5
// y: 5
// width: parent.width - 10
// height: parent.height - 10
// LabelType {
// anchors.left: parent.left
// width: 239
// height: 24
// text: qsTr("ShadowSocks container")
// leftPadding: 5
// }
// ImageButtonType {
// anchors.right: sr2.left
// anchors.rightMargin: 5
// checkable: true
// icon.source: checked ? "qrc:/images/check.png" : "qrc:/images/uncheck.png"
// width: 24
// height: 24
// checked: ServerContainersLogic.pushButtonSsOpenVpnContDefaultChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonSsOpenVpnContDefaultChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoSsOpenVpnContDefaultClicked(checked)
// }
// visible: ServerContainersLogic.pushButtonSsOpenVpnContDefaultVisible
// }
// ImageButtonType {
// id: sr2
// anchors.right: cn2.left
// anchors.rightMargin: 5
// icon.source: "qrc:/images/share.png"
// width: 24
// height: 24
// visible: ServerContainersLogic.pushButtonSsOpenVpnContShareVisible
// onClicked: {
// ServerContainersLogic.onPushButtonProtoSsOpenVpnContShareClicked(false)
// }
// }
// ImageButtonType {
// id: cn2
// anchors.right: parent.right
// checkable: true
// icon.source: checked ? "qrc:/images/connect_button_connected.png"
// : "qrc:/images/connect_button_disconnected.png"
// width: 36
// height: 24
// checked: ServerContainersLogic.pushButtonSsOpenVpnContInstallChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonSsOpenVpnContInstallChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoSsOpenVpnContInstallClicked(checked)
// }
// enabled: ServerContainersLogic.pushButtonSsOpenVpnContInstallEnabled
// }
// }
// Rectangle {
// x: 10
// y: 42
// height: 53
// width: 343
// border.width: 1
// border.color: "lightgray"
// radius: 2
// SettingButtonType {
// x: 10
// y: 5
// width: 323
// height: 24
// text: qsTr("OpenVPN settings")
// icon.source: "qrc:/images/settings.png"
// onClicked: {
// ServerContainersLogic.onPushButtonProtoSsOpenVpnContOpenvpnConfigClicked()
// }
// }
// SettingButtonType {
// x: 10
// y: 27
// width: 323
// height: 24
// text: qsTr("ShadowSocks settings")
// icon.source: "qrc:/images/settings.png"
// onClicked: {
// ServerContainersLogic.onPushButtonProtoSsOpenVpnContSsConfigClicked()
// }
// }
// }
// }
// Rectangle {
// id: frame_openvpn
// x: 9
// height: 100
// width: 363
// border.width: 1
// border.color: "lightgray"
// radius: 2
// visible: ServerContainersLogic.frameOpenvpnSettingsVisible
// Item {
// x: 5
// y: 5
// width: parent.width - 10
// height: parent.height - 10
// LabelType {
// anchors.left: parent.left
// width: 239
// height: 24
// text: qsTr("OpenVPN container")
// leftPadding: 5
// }
// ImageButtonType {
// anchors.right: sr3.left
// anchors.rightMargin: 5
// checkable: true
// icon.source: checked ? "qrc:/images/check.png" : "qrc:/images/uncheck.png"
// width: 24
// height: 24
// checked: ServerContainersLogic.pushButtonOpenVpnContDefaultChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonOpenVpnContDefaultChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoOpenVpnContDefaultClicked(checked)
// }
// visible: ServerContainersLogic.pushButtonOpenVpnContDefaultVisible
// }
// ImageButtonType {
// id: sr3
// anchors.right: cn3.left
// anchors.rightMargin: 5
// icon.source: "qrc:/images/share.png"
// width: 24
// height: 24
// visible: ServerContainersLogic.pushButtonOpenVpnContShareVisible
// onClicked: {
// ServerContainersLogic.onPushButtonProtoOpenVpnContShareClicked(false)
// }
// }
// ImageButtonType {
// id: cn3
// anchors.right: parent.right
// checkable: true
// icon.source: checked ? "qrc:/images/connect_button_connected.png"
// : "qrc:/images/connect_button_disconnected.png"
// width: 36
// height: 24
// checked: ServerContainersLogic.pushButtonOpenVpnContInstallChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonOpenVpnContInstallChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoOpenVpnContInstallClicked(checked)
// }
// enabled: ServerContainersLogic.pushButtonOpenVpnContInstallEnabled
// }
// }
// Rectangle {
// x: 10
// y: 42
// height: 44
// width: 343
// border.width: 1
// border.color: "lightgray"
// radius: 2
// SettingButtonType {
// x: 10
// y: 10
// width: 323
// height: 24
// text: qsTr("OpenVPN settings")
// icon.source: "qrc:/images/settings.png"
// onClicked: {
// ServerContainersLogic.onPushButtonProtoOpenVpnContOpenvpnConfigClicked()
// }
// }
// }
// }
// Rectangle {
// id: frame_wireguard
// x: 9
// height: 100
// width: 363
// border.width: 1
// border.color: "lightgray"
// radius: 2
// visible: ServerContainersLogic.frameWireguardVisible
// Item {
// x: 5
// y: 5
// width: parent.width - 10
// height: parent.height - 10
// LabelType {
// anchors.left: parent.left
// width: 239
// height: 24
// text: qsTr("WireGuard container")
// leftPadding: 5
// }
// ImageButtonType {
// anchors.right: sr4.left
// anchors.rightMargin: 5
// checkable: true
// icon.source: checked ? "qrc:/images/check.png" : "qrc:/images/uncheck.png"
// width: 24
// height: 24
// checked: ServerContainersLogic.pushButtonWireguardContDefaultChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonWireguardContDefaultChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoWireguardContDefaultClicked(checked)
// }
// visible: ServerContainersLogic.pushButtonWireguardContDefaultVisible
// }
// ImageButtonType {
// id: sr4
// anchors.right: cn4.left
// anchors.rightMargin: 5
// icon.source: "qrc:/images/share.png"
// width: 24
// height: 24
// visible: ServerContainersLogic.pushButtonWireguardContShareVisible
// onClicked: {
// ServerContainersLogic.onPushButtonProtoWireguardContShareClicked(false)
// }
// }
// ImageButtonType {
// id: cn4
// anchors.right: parent.right
// checkable: true
// icon.source: checked ? "qrc:/images/connect_button_connected.png"
// : "qrc:/images/connect_button_disconnected.png"
// width: 36
// height: 24
// checked: ServerContainersLogic.pushButtonWireguardContInstallChecked
// onCheckedChanged: {
// ServerContainersLogic.pushButtonWireguardContInstallChecked = checked
// }
// onClicked: {
// ServerContainersLogic.onPushButtonProtoWireguardContInstallClicked(checked)
// }
// enabled: ServerContainersLogic.pushButtonWireguardContInstallEnabled
// }
// }
// Rectangle {
// id: frame_wireguard_settings
// visible: ServerContainersLogic.frameWireguardSettingsVisible
// x: 10
// y: 42
// height: 44
// width: 343
// border.width: 1
// border.color: "lightgray"
// radius: 2
// SettingButtonType {
// x: 10
// y: 10
// width: 323
// height: 24
// text: qsTr("WireGuard settings")
// icon.source: "qrc:/images/settings.png"
// }
// }
// }
// }
// }
} }

View file

@ -100,7 +100,7 @@ PageBase {
y: 210 y: 210
width: 300 width: 300
height: 40 height: 40
text: qsTr("VPN protocols") text: qsTr("Protocols and services")
onClicked: { onClicked: {
UiLogic.goToPage(PageEnum.ServerContainers) UiLogic.goToPage(PageEnum.ServerContainers)
} }

View file

@ -33,18 +33,13 @@ PageProtocolBase {
qsTr("aes-128-gcm") qsTr("aes-128-gcm")
] ]
currentIndex: { currentIndex: {
console.debug("logic.comboBoxProtoShadowSocksCipherText " + logic.comboBoxProtoShadowSocksCipherText)
for (let i = 0; i < model.length; ++i) { for (let i = 0; i < model.length; ++i) {
console.debug("check " + model[i])
if (logic.comboBoxProtoShadowSocksCipherText === model[i]) { if (logic.comboBoxProtoShadowSocksCipherText === model[i]) {
return i return i
} }
} }
return -1 return -1
} }
// onCurrentTextChanged: {
// logic.comboBoxProtoShadowSocksCipherText = currentText
// }
} }
LabelType { LabelType {
x: 30 x: 30

View file

@ -83,6 +83,8 @@ public:
Q_INVOKABLE QString containerName(int container); Q_INVOKABLE QString containerName(int container);
Q_INVOKABLE QString containerDesc(int container); Q_INVOKABLE QString containerDesc(int container);
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); }
int getCurrentPageValue() const; int getCurrentPageValue() const;