From d222bdb41b4a9b3cb358b3d75fdfbebd635157a1 Mon Sep 17 00:00:00 2001 From: Bionus Date: Tue, 10 Nov 2020 02:20:11 +0100 Subject: [PATCH] Add import/export of settings.ini file for QML --- .../src/components/settings/Setting.qml | 8 +++ .../components/settings/SettingsScreen.qml | 8 +++ .../settings/pages/AdvancedSettingsPage.qml | 52 +++++++++++++++++++ src/gui-qml/src/main-screen.cpp | 25 +++++++++ src/gui-qml/src/main-screen.h | 3 ++ src/gui-qml/src/qml.qrc | 1 + 6 files changed, 97 insertions(+) create mode 100644 src/gui-qml/src/components/settings/pages/AdvancedSettingsPage.qml diff --git a/src/gui-qml/src/components/settings/Setting.qml b/src/gui-qml/src/components/settings/Setting.qml index d133bf95f..53b938f86 100644 --- a/src/gui-qml/src/components/settings/Setting.qml +++ b/src/gui-qml/src/components/settings/Setting.qml @@ -21,4 +21,12 @@ Item { root.changed(val) } + + Connections { + target: backend + function onSettingsChanged() { + root.rawValue = root.obj.value(root.key, root.def); + root.value = root.parser !== null ? parser(root.rawValue) : root.rawValue + } + } } diff --git a/src/gui-qml/src/components/settings/SettingsScreen.qml b/src/gui-qml/src/components/settings/SettingsScreen.qml index df2d3d54e..2400db678 100644 --- a/src/gui-qml/src/components/settings/SettingsScreen.qml +++ b/src/gui-qml/src/components/settings/SettingsScreen.qml @@ -65,6 +65,10 @@ Page { name: qsTr("Network") icon: "/images/icons/network.png" } + ListElement { + name: qsTr("Advanced") + icon: "/images/icons/settings.png" + } ListElement { name: qsTr("About") icon: "/images/icons/info.png" @@ -104,6 +108,10 @@ Page { width: parent.width visible: false } + AdvancedSettingsPage { + width: parent.width + visible: false + } AboutSettingsPage { width: parent.width visible: false diff --git a/src/gui-qml/src/components/settings/pages/AdvancedSettingsPage.qml b/src/gui-qml/src/components/settings/pages/AdvancedSettingsPage.qml new file mode 100644 index 000000000..e6a6f17e4 --- /dev/null +++ b/src/gui-qml/src/components/settings/pages/AdvancedSettingsPage.qml @@ -0,0 +1,52 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Dialogs 1.3 +import Qt.labs.platform 1.1 as Labs + +import "../items" + +ColumnLayout { + spacing: 0 + + SettingTitle { + Layout.fillWidth: true + text: qsTr("Backup") + } + SettingItem { + name: qsTr("Export settings") + subtitle: qsTr("Backup the app settings.ini file on your device.") + Layout.fillWidth: true + + onClicked: exportDialog.open() + + FileDialog { + id: exportDialog + + title: qsTr("Please choose a directory") + folder: Labs.StandardPaths.standardLocations(Labs.StandardPaths.DownloadLocation)[0] + selectFolder: true + + onAccepted: backend.exportSettings(backend.toLocalFile(exportDialog.fileUrl.toString() + "/settings.ini")) + } + } + SettingItem { + name: qsTr("Import settings") + subtitle: qsTr("Import the app settings.ini from an existing file.") + Layout.fillWidth: true + + onClicked: importDialog.open() + + FileDialog { + id: importDialog + + title: qsTr("Please choose a file") + folder: Labs.StandardPaths.standardLocations(Labs.StandardPaths.DownloadLocation)[0] + + onAccepted: backend.importSettings(backend.toLocalFile(importDialog.fileUrl.toString())) + } + } + + Item { + Layout.fillHeight: true + } +} diff --git a/src/gui-qml/src/main-screen.cpp b/src/gui-qml/src/main-screen.cpp index 5e7284a40..0db62f90f 100644 --- a/src/gui-qml/src/main-screen.cpp +++ b/src/gui-qml/src/main-screen.cpp @@ -191,6 +191,31 @@ void MainScreen::loadSuggestions(const QString &prefix, int limit) emit autoCompleteChanged(); } +bool MainScreen::exportSettings(const QString &dest) +{ + return QFile::copy(m_profile->getSettings()->fileName(), dest); +} + +bool MainScreen::importSettings(const QString &source) +{ + QSettings sourceSettings(source, QSettings::IniFormat); + if (sourceSettings.status() != QSettings::NoError) { + return false; + } + + QSettings *settings = m_profile->getSettings(); + settings->clear(); + + for (const QString &key : sourceSettings.allKeys()) { + settings->setValue(key, sourceSettings.value(key)); + } + + settings->sync(); + emit settingsChanged(); + + return true; +} + QString MainScreen::toLocalFile(const QString &url) { if (url.startsWith("file:")) { diff --git a/src/gui-qml/src/main-screen.h b/src/gui-qml/src/main-screen.h index 49ff5345c..ceff44894 100644 --- a/src/gui-qml/src/main-screen.h +++ b/src/gui-qml/src/main-screen.h @@ -50,6 +50,8 @@ class MainScreen : public QObject void addFavorite(const QString &query, const QString &siteUrl); void removeFavorite(const QString &query); void loadSuggestions(const QString &prefix, int limit); + bool exportSettings(const QString &dest); + bool importSettings(const QString &source); protected slots: void refreshSites(); @@ -65,6 +67,7 @@ class MainScreen : public QObject void sourcesChanged(); void favoritesChanged(); void autoCompleteChanged(); + void settingsChanged(); private: Profile *m_profile; diff --git a/src/gui-qml/src/qml.qrc b/src/gui-qml/src/qml.qrc index 6654bd1c0..d0cfb9926 100644 --- a/src/gui-qml/src/qml.qrc +++ b/src/gui-qml/src/qml.qrc @@ -38,5 +38,6 @@ components/SearchEdit.qml components/FavoritesScreen.qml components/AutoCompleteSearchEdit.qml + components/settings/pages/AdvancedSettingsPage.qml