diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index bbd48c960..3e227863a 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -139,7 +139,8 @@ void AmneziaApplication::init() &ConnectionController::openConnection); connect(m_notificationHandler.get(), &NotificationHandler::disconnectRequested, m_connectionController.get(), &ConnectionController::closeConnection); - connect(this, &AmneziaApplication::translationsUpdated, m_notificationHandler.get(), &NotificationHandler::onTranslationsUpdated); + connect(this, &AmneziaApplication::translationsUpdated, m_notificationHandler.get(), + &NotificationHandler::onTranslationsUpdated); m_engine->load(url); m_systemController->setQmlRoot(m_engine->rootObjects().value(0)); @@ -226,14 +227,13 @@ void AmneziaApplication::loadTranslator() updateTranslator(locale); } - void AmneziaApplication::updateTranslator(const QLocale &locale) { if (!m_translator->isEmpty()) { QCoreApplication::removeTranslator(m_translator.get()); } - QString strFileName = QString(":/translations/amneziavpn")+QLatin1String("_")+locale.name()+".qm"; + QString strFileName = QString(":/translations/amneziavpn") + QLatin1String("_") + locale.name() + ".qm"; if (m_translator->load(strFileName)) { if (QCoreApplication::installTranslator(m_translator.get())) { m_settings->setAppLanguage(locale); @@ -297,11 +297,13 @@ void AmneziaApplication::initModels() m_sitesModel.reset(new SitesModel(m_settings, this)); m_engine->rootContext()->setContextProperty("SitesModel", m_sitesModel.get()); connect(m_containersModel.get(), &ContainersModel::defaultContainerChanged, this, [this]() { - if (m_containersModel->getDefaultContainer() == DockerContainer::WireGuard - && m_sitesModel->getRouteMode() != Settings::RouteMode::VpnAllSites) { - m_sitesModel->setRouteMode(Settings::RouteMode::VpnAllSites); + if ((m_containersModel->getDefaultContainer() == DockerContainer::WireGuard + || m_containersModel->getDefaultContainer() == DockerContainer::Awg) + && m_sitesModel->isSplitTunnelingEnabled()) { + m_sitesModel->toggleSplitTunneling(false); emit m_pageController->showNotificationMessage( - tr("Split tunneling for WireGuard is not implemented, the option was disabled")); + tr("Split tunneling for %1 is not implemented, the option was disabled") + .arg(ContainerProps::containerHumanNames().value(m_containersModel->getDefaultContainer()))); } }); @@ -337,7 +339,8 @@ void AmneziaApplication::initControllers() m_connectionController.reset(new ConnectionController(m_serversModel, m_containersModel, m_vpnConnection)); m_engine->rootContext()->setContextProperty("ConnectionController", m_connectionController.get()); - connect(this, &AmneziaApplication::translationsUpdated, m_connectionController.get(), &ConnectionController::onTranslationsUpdated); + connect(this, &AmneziaApplication::translationsUpdated, m_connectionController.get(), + &ConnectionController::onTranslationsUpdated); m_pageController.reset(new PageController(m_serversModel, m_settings)); m_engine->rootContext()->setContextProperty("PageController", m_pageController.get()); diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 316cd0763..f94e0514e 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -4,9 +4,13 @@ AmneziaApplication - Split tunneling for WireGuard is not implemented, the option was disabled - Раздельное туннелирование для "Wireguard" не реализовано,опция отключена + Раздельное туннелирование для "Wireguard" не реализовано,опция отключена + + + + Split tunneling for %1 is not implemented, the option was disabled + Раздельное туннелирование для %1 не реализовано, опция отключена @@ -1496,75 +1500,75 @@ Already installed containers were found on the server. All installed containers Раздельное VPN-туннелирование - + Mode Режим - + Remove Удалить - + Continue Продолжить - + Cancel Отменить - + Site or IP Сайт или IP - + Import/Export Sites Импорт/экспорт Сайтов - + Import Импорт - + Save site list Сохранить список сайтов - + Save sites Сохранить - - - + + + Sites files (*.json) Sites files (*.json) - + Import a list of sites Импортировать список с сайтами - + Replace site list Заменить список сайтов - - + + Open sites file Открыть список с сайтами - + Add imported sites to existing ones Добавить импортированные сайты к существующим diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 592717ab9..8833d5c6c 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -4,9 +4,13 @@ AmneziaApplication - Split tunneling for WireGuard is not implemented, the option was disabled - 未启用选项,还未实现基于WireGuard协议的VPN分离 + 未启用选项,还未实现基于WireGuard协议的VPN分离 + + + + Split tunneling for %1 is not implemented, the option was disabled + @@ -1602,75 +1606,75 @@ And if you don't like the app, all the more support it - the donation will 隧道分离 - + Mode 规则 - + Remove 移除 - + Continue 继续 - + Cancel 取消 - + Site or IP 网站或IP地址 - + Import/Export Sites 导入/导出网站 - + Import 导入 - + Save site list 保存网址 - + Save sites 保存网址 - - - + + + Sites files (*.json) - + Import a list of sites 导入网址列表 - + Replace site list 替换网址列表 - - + + Open sites file 打开网址文件 - + Add imported sites to existing ones 将导入的网址添加到现有网址中 diff --git a/client/ui/models/sites_model.cpp b/client/ui/models/sites_model.cpp index 5fd9a38b3..f6cb9b136 100644 --- a/client/ui/models/sites_model.cpp +++ b/client/ui/models/sites_model.cpp @@ -3,7 +3,14 @@ SitesModel::SitesModel(std::shared_ptr settings, QObject *parent) : QAbstractListModel(parent), m_settings(settings) { - m_currentRouteMode = m_settings->routeMode(); + auto routeMode = m_settings->routeMode(); + if (routeMode == Settings::RouteMode::VpnAllSites) { + m_isSplitTunnelingEnabled = false; + m_currentRouteMode = Settings::RouteMode::VpnOnlyForwardSites; + } else { + m_isSplitTunnelingEnabled = true; + m_currentRouteMode = routeMode; + } fillSites(); } @@ -93,6 +100,21 @@ void SitesModel::setRouteMode(int routeMode) emit routeModeChanged(); } +bool SitesModel::isSplitTunnelingEnabled() +{ + return m_isSplitTunnelingEnabled; +} + +void SitesModel::toggleSplitTunneling(bool enabled) +{ + if (enabled) { + setRouteMode(m_currentRouteMode); + } else { + m_settings->setRouteMode(Settings::RouteMode::VpnAllSites); + } + m_isSplitTunnelingEnabled = enabled; +} + QVector > SitesModel::getCurrentSites() { return m_sites; diff --git a/client/ui/models/sites_model.h b/client/ui/models/sites_model.h index 70def0ec5..ad16b7a33 100644 --- a/client/ui/models/sites_model.h +++ b/client/ui/models/sites_model.h @@ -31,6 +31,9 @@ public slots: int getRouteMode(); void setRouteMode(int routeMode); + bool isSplitTunnelingEnabled(); + void toggleSplitTunneling(bool enabled); + QVector> getCurrentSites(); signals: @@ -44,6 +47,7 @@ private: std::shared_ptr m_settings; + bool m_isSplitTunnelingEnabled; Settings::RouteMode m_currentRouteMode; QVector> m_sites; diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index cc4973f14..873ae9977 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -93,22 +93,15 @@ PageType { SwitcherType { id: switcher - property int lastActiveRouteMode: routeMode.onlyForwardSites - enabled: root.pageEnabled Layout.fillWidth: true Layout.rightMargin: 16 - checked: SitesModel.routeMode !== routeMode.allSites - onToggled: { - if (checked) { - SitesModel.routeMode = lastActiveRouteMode - } else { - lastActiveRouteMode = SitesModel.routeMode - selector.text = root.routeModesModel[getRouteModesModelIndex()].name - SitesModel.routeMode = routeMode.allSites - } + checked: SitesModel.isSplitTunnelingEnabled() + onToggled: { + SitesModel.toggleSplitTunneling(checked) + selector.text = root.routeModesModel[getRouteModesModelIndex()].name } } } @@ -123,7 +116,7 @@ PageType { drawerHeight: 0.4375 - enabled: switcher.checked && root.pageEnabled + enabled: root.pageEnabled headerText: qsTr("Mode") @@ -165,7 +158,7 @@ PageType { anchors.topMargin: 16 contentHeight: col.implicitHeight + addSiteButton.implicitHeight + addSiteButton.anchors.bottomMargin + addSiteButton.anchors.topMargin - enabled: switcher.checked && root.pageEnabled + enabled: root.pageEnabled Column { id: col