From e8862a3811d7b0de79881f391bebb5ddbd617a4d Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 30 Aug 2023 15:10:44 +0500 Subject: [PATCH] removed the use of QFileDialog --- client/CMakeLists.txt | 23 ++++--- client/amnezia_application.h | 10 +-- client/core/servercontroller.cpp | 1 - client/fileUtilites.cpp | 69 +++++++++++++------ client/fileUtilites.h | 11 ++- client/platforms/ios/ios_controller.h | 2 +- client/ui/controllers/exportController.cpp | 31 +-------- client/ui/controllers/exportController.h | 2 +- client/ui/controllers/importController.cpp | 18 +---- client/ui/controllers/importController.h | 2 +- client/ui/controllers/settingsController.cpp | 32 ++------- client/ui/controllers/settingsController.h | 6 +- client/ui/controllers/sitesController.cpp | 27 ++------ client/ui/controllers/sitesController.h | 4 +- .../qml/Components/ShareConnectionDrawer.qml | 17 ++++- .../qml/Controls2/TextFieldWithHeaderType.qml | 10 +++ client/ui/qml/Pages2/PageSettingsBackup.qml | 42 +++++++++-- client/ui/qml/Pages2/PageSettingsLogging.qml | 18 ++++- .../qml/Pages2/PageSettingsSplitTunneling.qml | 44 +++++++++--- .../Pages2/PageSetupWizardConfigSource.qml | 13 +++- client/ui/uilogic.cpp | 4 +- client/vpnconnection.cpp | 2 +- 22 files changed, 224 insertions(+), 164 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 713a9165..47264fe6 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -10,31 +10,34 @@ set_property(GLOBAL PROPERTY AUTOMOC_TARGETS_FOLDER "Autogen") set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "Autogen") set(PACKAGES - Widgets Core Gui Network Xml + Core Gui Network Xml RemoteObjects Quick Svg QuickControls2 Core5Compat Concurrent LinguistTools ) + if(IOS) - set(PACKAGES - ${PACKAGES} - Multimedia - ) + set(PACKAGES ${PACKAGES} Multimedia) +endif() + +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) + set(PACKAGES ${PACKAGES} Widgets) endif() find_package(Qt6 REQUIRED COMPONENTS ${PACKAGES}) set(LIBS ${LIBS} - Qt6::Widgets Qt6::Core Qt6::Gui + Qt6::Core Qt6::Gui Qt6::Network Qt6::Xml Qt6::RemoteObjects Qt6::Quick Qt6::Svg Qt6::QuickControls2 Qt6::Core5Compat Qt6::Concurrent ) if(IOS) - set(LIBS - ${LIBS} - Qt6::Multimedia - ) + set(LIBS ${LIBS} Qt6::Multimedia) +endif() + +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) + set(LIBS ${LIBS} Qt6::Widgets) endif() qt_standard_project_setup() diff --git a/client/amnezia_application.h b/client/amnezia_application.h index c4f33753..e18fb70c 100644 --- a/client/amnezia_application.h +++ b/client/amnezia_application.h @@ -1,13 +1,15 @@ #ifndef AMNEZIA_APPLICATION_H #define AMNEZIA_APPLICATION_H -#include -#include - #include #include #include #include +#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) + #include +#else + #include +#endif #include "settings.h" #include "vpnconnection.h" @@ -39,7 +41,7 @@ #define amnApp (static_cast(QCoreApplication::instance())) #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) - #define AMNEZIA_BASE_CLASS QApplication + #define AMNEZIA_BASE_CLASS QGuiApp #else #define AMNEZIA_BASE_CLASS SingleApplication #define QAPPLICATION_CLASS QApplication diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index cbb87f11..0dad3020 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -1,6 +1,5 @@ #include "servercontroller.h" -#include #include #include #include diff --git a/client/fileUtilites.cpp b/client/fileUtilites.cpp index 87fa7aed..659243aa 100644 --- a/client/fileUtilites.cpp +++ b/client/fileUtilites.cpp @@ -3,35 +3,59 @@ #include #include -void FileUtilites::saveFile(const QString &fileExtension, const QString &caption, const QString &fileName, - const QString &data) -{ - QString docDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - QUrl fileUrl = QFileDialog::getSaveFileUrl(nullptr, caption, QUrl::fromLocalFile(docDir + "/" + fileName), - "*" + fileExtension); - if (fileUrl.isEmpty()) - return; - if (!fileUrl.toString().endsWith(fileExtension)) { - fileUrl = QUrl(fileUrl.toString() + fileExtension); - } - if (fileUrl.isEmpty()) - return; +#ifdef Q_OS_ANDROID + #include "platforms/android/android_controller.h" +#endif - QFile save(fileUrl.toLocalFile()); +#ifdef Q_OS_IOS + #include "platforms/ios/MobileUtils.h" + #include +#endif + +void FileUtilites::saveFile(QString fileName, const QString &data) +{ +#if defined Q_OS_ANDROID + AndroidController::instance()->shareConfig(data, fileName); + return; +#endif + +#ifdef Q_OS_IOS + QFile file(fileName); +#else + QUrl fileUrl = QUrl(fileName); + QFile file(fileUrl.toLocalFile()); +#endif // todo check if save successful - save.open(QIODevice::WriteOnly); - save.write(data.toUtf8()); - save.close(); + file.open(QIODevice::WriteOnly); + file.write(data.toUtf8()); + file.close(); + +#ifdef Q_OS_IOS + QStringList filesToSend; + filesToSend.append(fileName); + MobileUtils::shareText(filesToSend); + return; +#endif QFileInfo fi(fileUrl.toLocalFile()); QDesktopServices::openUrl(fi.absoluteDir().absolutePath()); } -QString FileUtilites::getFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, - QString *selectedFilter, QFileDialog::Options options) +QString FileUtilites::getFileName(QString fileName) { - QString fileName = QFileDialog::getOpenFileName(parent, caption, dir, filter, selectedFilter, options); +#ifdef Q_OS_IOS + CFURLRef url = CFURLCreateWithFileSystemPath( + kCFAllocatorDefault, + CFStringCreateWithCharacters(0, reinterpret_cast(fileName.unicode()), fileName.length()), + kCFURLPOSIXPathStyle, 0); + + if (!CFURLStartAccessingSecurityScopedResource(url)) { + qDebug() << "Could not access path " << QUrl::fromLocalFile(fileName).toString(); + } + + return fileName; +#endif #ifdef Q_OS_ANDROID // patch for files containing spaces etc @@ -42,6 +66,9 @@ QString FileUtilites::getFileName(QWidget *parent, const QString &caption, const rawUrl.replace(" ", "%20"); fileName = contentUrl + sep + rawUrl; } -#endif + return fileName; +#endif + + return QUrl(FileUtilites::getFileName(fileName)).toLocalFile(); } diff --git a/client/fileUtilites.h b/client/fileUtilites.h index 8cf4807c..21cb03a9 100644 --- a/client/fileUtilites.h +++ b/client/fileUtilites.h @@ -1,19 +1,16 @@ #ifndef FILEUTILITES_H #define FILEUTILITES_H -#include +#include +#include class FileUtilites : public QObject { Q_OBJECT public: - static void saveFile(const QString &fileExtension, const QString &caption, const QString &fileName, - const QString &data); - - static QString getFileName(QWidget *parent = nullptr, const QString &caption = QString(), - const QString &dir = QString(), const QString &filter = QString(), - QString *selectedFilter = nullptr, QFileDialog::Options options = QFileDialog::Options()); + static void saveFile(QString fileName, const QString &data); + static QString getFileName(QString fileName); }; #endif // FILEUTILITES_H diff --git a/client/platforms/ios/ios_controller.h b/client/platforms/ios/ios_controller.h index 0750f7cd..4d1122b2 100644 --- a/client/platforms/ios/ios_controller.h +++ b/client/platforms/ios/ios_controller.h @@ -47,7 +47,7 @@ public: void getBackendLogs(std::function &&callback); void checkStatus(); signals: - void connectionStateChanged(VpnProtocol::VpnConnectionState state); + void connectionStateChanged(Vpn::ConnectionState state); void bytesChanged(quint64 receivedBytes, quint64 sentBytes); protected slots: diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 4cee1dc9..ddc976cc 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -13,7 +13,6 @@ #include "core/errorstrings.h" #include "fileUtilites.h" #ifdef Q_OS_ANDROID - #include "platforms/android/android_controller.h" #include "platforms/android/androidutils.h" #endif #include "qrcodegen.hpp" @@ -201,35 +200,9 @@ QList ExportController::getQrCodes() return m_qrCodes; } -void ExportController::saveFile(const QString &fileExtension, const QString &caption, const QString &fileName) +void ExportController::saveFile(const QString &fileName) { -#if defined Q_OS_IOS -// ext.replace("*", ""); -// QString fileName = QDir::tempPath() + "/" + suggestedName; -// -// if (fileName.isEmpty()) -// return; -// if (!fileName.endsWith(ext)) -// fileName.append(ext); -// -// QFile::remove(fileName); -// -// QFile save(fileName); -// save.open(QIODevice::WriteOnly); -// save.write(data.toUtf8()); -// save.close(); -// -// QStringList filesToSend; -// filesToSend.append(fileName); -// MobileUtils::shareText(filesToSend); -// return; -#endif -#if defined Q_OS_ANDROID - AndroidController::instance()->shareConfig(m_config, "amnezia_config"); - return; -#endif - - FileUtilites::saveFile(fileExtension, caption, fileName, m_config); + FileUtilites::saveFile(fileName, m_config); } QList ExportController::generateQrCodeImageSeries(const QByteArray &data) diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index 913dfc3a..b526521e 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -35,7 +35,7 @@ public slots: QString getConfig(); QList getQrCodes(); - void saveFile(const QString &fileExtension, const QString &caption, const QString &fileName); + void saveFile(const QString &fileName); signals: void generateConfig(int type); diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index 7f8b82a9..9a374aa1 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -85,23 +85,9 @@ ImportController::ImportController(const QSharedPointer &serversMo #endif } -void ImportController::extractConfigFromFile() +void ImportController::extractConfigFromFile(const QString &fileName) { - QString fileName = FileUtilites::getFileName(Q_NULLPTR, tr("Open config file"), - QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), - "*.vpn *.ovpn *.conf"); - QFile file(fileName); - -#ifdef Q_OS_IOS - CFURLRef url = CFURLCreateWithFileSystemPath( - kCFAllocatorDefault, - CFStringCreateWithCharacters(0, reinterpret_cast(fileName.unicode()), fileName.length()), - kCFURLPOSIXPathStyle, 0); - - if (!CFURLStartAccessingSecurityScopedResource(url)) { - qDebug() << "Could not access path " << QUrl::fromLocalFile(fileName).toString(); - } -#endif + QFile file(FileUtilites::getFileName(fileName)); if (file.open(QIODevice::ReadOnly)) { QString data = file.readAll(); diff --git a/client/ui/controllers/importController.h b/client/ui/controllers/importController.h index cccdf4b7..7def7733 100644 --- a/client/ui/controllers/importController.h +++ b/client/ui/controllers/importController.h @@ -21,7 +21,7 @@ public: public slots: void importConfig(); - void extractConfigFromFile(); + void extractConfigFromFile(const QString &fileName); void extractConfigFromData(QString &data); void extractConfigFromCode(QString code); bool extractConfigFromQr(const QByteArray &data); diff --git a/client/ui/controllers/settingsController.cpp b/client/ui/controllers/settingsController.cpp index 531d3c50..7c7402e0 100644 --- a/client/ui/controllers/settingsController.cpp +++ b/client/ui/controllers/settingsController.cpp @@ -68,9 +68,9 @@ void SettingsController::openLogsFolder() Logger::openLogsFolder(); } -void SettingsController::exportLogsFile() +void SettingsController::exportLogsFile(const QString &fileName) { - FileUtilites::saveFile(".log", tr("Save log"), "AmneziaVPN", Logger::getLogFile()); + FileUtilites::saveFile(fileName, Logger::getLogFile()); } void SettingsController::clearLogs() @@ -79,35 +79,17 @@ void SettingsController::clearLogs() Logger::clearServiceLogs(); } -void SettingsController::backupAppConfig() +void SettingsController::backupAppConfig(const QString &fileName) { - FileUtilites::saveFile(".backup", tr("Backup application config"), "AmneziaVPN", m_settings->backupAppConfig()); + FileUtilites::saveFile(fileName, m_settings->backupAppConfig()); } -void SettingsController::restoreAppConfig() +void SettingsController::restoreAppConfig(const QString &fileName) { - QString fileName = - FileUtilites::getFileName(Q_NULLPTR, tr("Open backup"), - QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.backup"); - - if (fileName.isEmpty()) { - return; - } - - QFile file(fileName); - -#ifdef Q_OS_IOS - CFURLRef url = CFURLCreateWithFileSystemPath( - kCFAllocatorDefault, - CFStringCreateWithCharacters(0, reinterpret_cast(fileName.unicode()), fileName.length()), - kCFURLPOSIXPathStyle, 0); - - if (!CFURLStartAccessingSecurityScopedResource(url)) { - qDebug() << "Could not access path " << QUrl::fromLocalFile(fileName).toString(); - } -#endif + QFile file(FileUtilites::getFileName(fileName)); file.open(QIODevice::ReadOnly); + QByteArray data = file.readAll(); bool ok = m_settings->restoreAppConfig(data); diff --git a/client/ui/controllers/settingsController.h b/client/ui/controllers/settingsController.h index 3ad602b7..af816d46 100644 --- a/client/ui/controllers/settingsController.h +++ b/client/ui/controllers/settingsController.h @@ -34,11 +34,11 @@ public slots: void toggleLogging(bool enable); void openLogsFolder(); - void exportLogsFile(); + void exportLogsFile(const QString &fileName); void clearLogs(); - void backupAppConfig(); - void restoreAppConfig(); + void backupAppConfig(const QString &fileName); + void restoreAppConfig(const QString &fileName); QString getAppVersion(); diff --git a/client/ui/controllers/sitesController.cpp b/client/ui/controllers/sitesController.cpp index 891ddb6f..9eafe6ba 100644 --- a/client/ui/controllers/sitesController.cpp +++ b/client/ui/controllers/sitesController.cpp @@ -79,28 +79,9 @@ void SitesController::removeSite(int index) emit finished(tr("Site removed: ") + hostname); } -void SitesController::importSites(bool replaceExisting) +void SitesController::importSites(const QString &fileName, bool replaceExisting) { - QString fileName = - FileUtilites::getFileName(Q_NULLPTR, tr("Open sites file"), - QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.json"); - - if (fileName.isEmpty()) { - return; - } - - QFile file(fileName); - -#ifdef Q_OS_IOS - CFURLRef url = CFURLCreateWithFileSystemPath( - kCFAllocatorDefault, - CFStringCreateWithCharacters(0, reinterpret_cast(fileName.unicode()), fileName.length()), - kCFURLPOSIXPathStyle, 0); - - if (!CFURLStartAccessingSecurityScopedResource(url)) { - qDebug() << "Could not access path " << QUrl::fromLocalFile(fileName).toString(); - } -#endif + QFile file(FileUtilites::getFileName(fileName)); if (!file.open(QIODevice::ReadOnly)) { emit errorOccurred(tr("Can't open file: ") + fileName); @@ -149,7 +130,7 @@ void SitesController::importSites(bool replaceExisting) emit finished(tr("Import completed")); } -void SitesController::exportSites() +void SitesController::exportSites(const QString &fileName) { auto sites = m_sitesModel->getCurrentSites(); @@ -163,7 +144,7 @@ void SitesController::exportSites() QJsonDocument jsonDocument(jsonArray); QByteArray jsonData = jsonDocument.toJson(); - FileUtilites::saveFile(".json", tr("Export sites file"), "sites", jsonData); + FileUtilites::saveFile(fileName, jsonData); emit finished(tr("Export completed")); } diff --git a/client/ui/controllers/sitesController.h b/client/ui/controllers/sitesController.h index ff78c3de..2171e7b4 100644 --- a/client/ui/controllers/sitesController.h +++ b/client/ui/controllers/sitesController.h @@ -19,8 +19,8 @@ public slots: void addSite(QString hostname); void removeSite(int index); - void importSites(bool replaceExisting); - void exportSites(); + void importSites(const QString &fileName, bool replaceExisting); + void exportSites(const QString &fileName); signals: void errorOccurred(const QString &errorMessage); diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index c369af42..41dd2ab2 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -3,6 +3,8 @@ import QtQuick.Controls import QtQuick.Layouts import QtQuick.Dialogs +import QtCore + import SortFilterProxyModel 0.2 import PageEnum 1.0 @@ -67,8 +69,19 @@ DrawerType { text: qsTr("Share") imageSource: "qrc:/images/controls/share-2.svg" - onClicked: { - ExportController.saveFile(configExtension, configCaption, configFileName) + onClicked: fileDialog.open() + + FileDialog { + id: fileDialog + acceptLabel: configCaption + nameFilters: [ "Config files (*" + configExtension + ")" ] + fileMode: FileDialog.SaveFile + + currentFile: StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/" + configFileName + defaultSuffix: configExtension + onAccepted: { + ExportController.saveFile(fileDialog.currentFile.toString()) + } } } diff --git a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml index 048a564d..3f80428e 100644 --- a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml +++ b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml @@ -146,4 +146,14 @@ Item { color: "#EB5757" } } + + MouseArea { + anchors.fill: root + cursorShape: Qt.PointingHandCursor + + onPressed: function(mouse) { + textField.forceActiveFocus() + mouse.accepted = false + } + } } diff --git a/client/ui/qml/Pages2/PageSettingsBackup.qml b/client/ui/qml/Pages2/PageSettingsBackup.qml index 39cad732..363bc66f 100644 --- a/client/ui/qml/Pages2/PageSettingsBackup.qml +++ b/client/ui/qml/Pages2/PageSettingsBackup.qml @@ -1,6 +1,9 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import QtQuick.Dialogs + +import QtCore import PageEnum 1.0 @@ -74,14 +77,36 @@ PageType { } BasicButtonType { + id: makeBackupButton Layout.fillWidth: true Layout.topMargin: 14 text: qsTr("Make a backup") onClicked: { + if (GC.isMobile()) { + backupAppConfig("AmneziaVPN.backup") + } else { + saveFileDialog.open() + } + } + + FileDialog { + id: saveFileDialog + acceptLabel: qsTr("Save backup file") + nameFilters: [ "Backup files (*.backup)" ] + fileMode: FileDialog.SaveFile + + currentFile: StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/AmneziaVPN" + defaultSuffix: ".backup" + onAccepted: { + makeBackupButton.backupAppConfig(saveFileDialog.currentFile.toString()) + } + } + + function backupAppConfig(fileName) { PageController.showBusyIndicator(true) - SettingsController.backupAppConfig() + SettingsController.backupAppConfig(fileName) PageController.showBusyIndicator(false) } } @@ -100,9 +125,18 @@ PageType { text: qsTr("Restore from backup") onClicked: { - PageController.showBusyIndicator(true) - SettingsController.restoreAppConfig() - PageController.showBusyIndicator(false) + openFileDialog.open() + } + + FileDialog { + id: openFileDialog + acceptLabel: qsTr("Open backup file") + nameFilters: [ "Backup files (*.backup)" ] + onAccepted: { + PageController.showBusyIndicator(true) + SettingsController.restoreAppConfig(openFileDialog.selectedFile.toString()) + PageController.showBusyIndicator(false) + } } } } diff --git a/client/ui/qml/Pages2/PageSettingsLogging.qml b/client/ui/qml/Pages2/PageSettingsLogging.qml index e14be439..cfe7d7c9 100644 --- a/client/ui/qml/Pages2/PageSettingsLogging.qml +++ b/client/ui/qml/Pages2/PageSettingsLogging.qml @@ -1,6 +1,9 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import QtQuick.Dialogs + +import QtCore import PageEnum 1.0 @@ -97,7 +100,20 @@ PageType { image: "qrc:/images/controls/save.svg" - onClicked: SettingsController.exportLogsFile() + onClicked: fileDialog.open() + + FileDialog { + id: fileDialog + acceptLabel: qsTr("Save logs") + nameFilters: [ "Logs files (*.log)" ] + fileMode: FileDialog.SaveFile + + currentFile: StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/AmneziaVPN" + defaultSuffix: ".log" + onAccepted: { + ExportController.saveFile(fileDialog.currentFile.toString()) + } + } } CaptionTextType { diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 71f2ba29..535ab18c 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -1,6 +1,9 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import QtQuick.Dialogs + +import QtCore import SortFilterProxyModel 0.2 @@ -41,6 +44,8 @@ PageType { allExceptSites ] + property bool replaceExistingSites + QtObject { id: onlyForwardSites property string name: qsTr("Only the addresses in the list must be opened via VPN") @@ -295,8 +300,21 @@ PageType { text: qsTr("Save site list") clickedFunction: function() { - SitesController.exportSites() - moreActionsDrawer.close() + saveFileDialog.open() + } + + FileDialog { + id: saveFileDialog + acceptLabel: qsTr("Save sites") + nameFilters: [ "Sites files (*.json)" ] + fileMode: FileDialog.SaveFile + + currentFile: StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/sites" + defaultSuffix: ".json" + onAccepted: { + SitesController.exportSites(saveFileDialog.currentFile.toString()) + moreActionsDrawer.close() + } } } @@ -331,6 +349,7 @@ PageType { anchors.bottom: parent.bottom contentHeight: importSitesDrawerContent.height + ColumnLayout { id: importSitesDrawerContent @@ -351,9 +370,8 @@ PageType { text: qsTr("Replace site list") clickedFunction: function() { - SitesController.importSites(true) - importSitesDrawer.close() - moreActionsDrawer.close() + root.replaceExistingSites = true + openFileDialog.open() } } @@ -364,13 +382,23 @@ PageType { text: qsTr("Add imported sites to existing ones") clickedFunction: function() { - SitesController.importSites(false) - importSitesDrawer.close() - moreActionsDrawer.close() + root.replaceExistingSites = false + openFileDialog.open() } } DividerType {} + + FileDialog { + id: openFileDialog + acceptLabel: qsTr("Open sites file") + nameFilters: [ "Sites files (*.json)" ] + onAccepted: { + SitesController.importSites(openFileDialog.selectedFile.toString(), replaceExistingSites) + importSitesDrawer.close() + moreActionsDrawer.close() + } + } } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml b/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml index 45aad9d0..6986509d 100644 --- a/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml +++ b/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml @@ -70,8 +70,17 @@ It's okay as long as it's from someone you trust.") leftImageSource: "qrc:/images/controls/folder-open.svg" clickedFunction: function() { - ImportController.extractConfigFromFile() - goToPage(PageEnum.PageSetupWizardViewConfig) + fileDialog.open() + } + + FileDialog { + id: fileDialog + acceptLabel: qsTr("Open config file") + nameFilters: [ "Config files (*.vpn *.ovpn *.conf)" ] + onAccepted: { + ImportController.extractConfigFromFile(fileDialog.selectedFile.toString()) + goToPage(PageEnum.PageSetupWizardViewConfig) + } } } diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index 546b18cb..e7d90f85 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -175,7 +174,8 @@ void UiLogic::showOnStartup() void UiLogic::onUpdateAllPages() { for (auto logic : m_logicMap) { - if (dynamic_cast(logic) || dynamic_cast(logic) || dynamic_cast(logic)) { + if (dynamic_cast(logic) || dynamic_cast(logic) + || dynamic_cast(logic)) { continue; } logic->onUpdatePage(); diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 1e8fd60a..1cff01e6 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -1,5 +1,5 @@ #include "qtimer.h" -#include + #include #include #include