From c121afc96c0135ada550de4504153434fa83feb4 Mon Sep 17 00:00:00 2001 From: willemferguson Date: Fri, 6 Dec 2019 15:53:14 +0200 Subject: Preferences UI: split network preferences Split the Network Preferences page into two screens: 1) Network preferences 2) Cloud storage preferences Enable storing these preferences locally. Signed-off-by: willemferguson Signed-off-by: Dirk Hohndel --- desktop-widgets/preferences/CMakeLists.txt | 3 + desktop-widgets/preferences/preferences_cloud.cpp | 127 ++++++++++++++++ desktop-widgets/preferences/preferences_cloud.h | 28 ++++ desktop-widgets/preferences/preferences_cloud.ui | 165 +++++++++++++++++++++ .../preferences/preferences_network.cpp | 97 ------------ desktop-widgets/preferences/preferences_network.h | 2 - desktop-widgets/preferences/preferences_network.ui | 89 +---------- desktop-widgets/preferences/preferencesdialog.cpp | 2 + icons/pref_cloud.png | Bin 0 -> 449 bytes icons/pref_tech.png | Bin 0 -> 712 bytes subsurface.qrc | 3 +- 11 files changed, 328 insertions(+), 188 deletions(-) create mode 100644 desktop-widgets/preferences/preferences_cloud.cpp create mode 100644 desktop-widgets/preferences/preferences_cloud.h create mode 100644 desktop-widgets/preferences/preferences_cloud.ui create mode 100644 icons/pref_cloud.png create mode 100644 icons/pref_tech.png diff --git a/desktop-widgets/preferences/CMakeLists.txt b/desktop-widgets/preferences/CMakeLists.txt index 145567dbf..6f7f657cb 100644 --- a/desktop-widgets/preferences/CMakeLists.txt +++ b/desktop-widgets/preferences/CMakeLists.txt @@ -8,6 +8,7 @@ set(SUBSURFACE_PREFERENCES_UI preferences_defaults.ui preferences_graph.ui preferences_network.ui + preferences_cloud.ui preferences_units.ui preferences_georeference.ui preferences_language.ui @@ -30,6 +31,8 @@ set(SUBSURFACE_PREFERENCES_LIB_SRCS preferences_language.h preferences_network.cpp preferences_network.h + preferences_cloud.cpp + preferences_cloud.h preferences_units.cpp preferences_units.h preferencesdialog.cpp diff --git a/desktop-widgets/preferences/preferences_cloud.cpp b/desktop-widgets/preferences/preferences_cloud.cpp new file mode 100644 index 000000000..d192c3e75 --- /dev/null +++ b/desktop-widgets/preferences/preferences_cloud.cpp @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "preferences_cloud.h" +#include "ui_preferences_cloud.h" +#include "subsurfacewebservices.h" +#include "core/cloudstorage.h" +#include "core/errorhelper.h" +#include "core/settings/qPrefCloudStorage.h" +#include + +PreferencesCloud::PreferencesCloud() : AbstractPreferencesWidget(tr("Cloud"),QIcon(":preferences-cloud-icon"), 9), ui(new Ui::PreferencesCloud()) +{ + ui->setupUi(this); + + ui->label_help2->setWordWrap(true); + ui->label_help3->setWordWrap(true); + ui->label_help4->setWordWrap(true); +} + +PreferencesCloud::~PreferencesCloud() +{ + delete ui; +} + +void PreferencesCloud::refreshSettings() +{ + ui->cloud_storage_email->setText(prefs.cloud_storage_email); + ui->cloud_storage_password->setText(prefs.cloud_storage_password); + ui->save_password_local->setChecked(prefs.save_password_local); + updateCloudAuthenticationState(); +} + +void PreferencesCloud::syncSettings() +{ + auto cloud = qPrefCloudStorage::instance(); + + QString email = ui->cloud_storage_email->text().toLower(); + QString password = ui->cloud_storage_password->text(); + QString newpassword = ui->cloud_storage_new_passwd->text(); + + //TODO: Change this to the Cloud Storage Stuff, not preferences. + if (prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED && !newpassword.isEmpty()) { + // deal with password change + if (!email.isEmpty() && !password.isEmpty()) { + // connect to backend server to check / create credentials + QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$"); + if (!reg.match(email).hasMatch() || (!password.isEmpty() && !reg.match(password).hasMatch())) { + report_error(qPrintable(tr("Change ignored. Cloud storage email and password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); + return; + } + if (!reg.match(email).hasMatch() || (!newpassword.isEmpty() && !reg.match(newpassword).hasMatch())) { + report_error(qPrintable(tr("Change ignored. Cloud storage email and new password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); + ui->cloud_storage_new_passwd->setText(""); + return; + } + CloudStorageAuthenticate *cloudAuth = new CloudStorageAuthenticate(this); + connect(cloudAuth, &CloudStorageAuthenticate::finishedAuthenticate, this, &PreferencesCloud::updateCloudAuthenticationState); + connect(cloudAuth, &CloudStorageAuthenticate::passwordChangeSuccessful, this, &PreferencesCloud::passwordUpdateSuccessful); + cloudAuth->backend(email, password, "", newpassword); + ui->cloud_storage_new_passwd->setText(""); + } + } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_UNKNOWN || + prefs.cloud_verification_status == qPrefCloudStorage::CS_INCORRECT_USER_PASSWD || + email != prefs.cloud_storage_email || + password != prefs.cloud_storage_password) { + + // different credentials - reset verification status + int oldVerificationStatus = cloud->cloud_verification_status(); + cloud->set_cloud_verification_status(qPrefCloudStorage::CS_UNKNOWN); + if (!email.isEmpty() && !password.isEmpty()) { + // connect to backend server to check / create credentials + QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$"); + if (!reg.match(email).hasMatch() || (!password.isEmpty() && !reg.match(password).hasMatch())) { + report_error(qPrintable(tr("Cloud storage email and password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); + cloud->set_cloud_verification_status(oldVerificationStatus); + return; + } + CloudStorageAuthenticate *cloudAuth = new CloudStorageAuthenticate(this); + connect(cloudAuth, &CloudStorageAuthenticate::finishedAuthenticate, this, &PreferencesCloud::updateCloudAuthenticationState); + cloudAuth->backend(email, password); + } + } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY) { + QString pin = ui->cloud_storage_pin->text(); + if (!pin.isEmpty()) { + // connect to backend server to check / create credentials + QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$"); + if (!reg.match(email).hasMatch() || !reg.match(password).hasMatch()) { + report_error(qPrintable(tr("Cloud storage email and password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); + return; + } + CloudStorageAuthenticate *cloudAuth = new CloudStorageAuthenticate(this); + connect(cloudAuth, SIGNAL(finishedAuthenticate()), this, SLOT(updateCloudAuthenticationState())); + cloudAuth->backend(email, password, pin); + } + } + cloud->set_cloud_storage_email(email); + cloud->set_save_password_local(ui->save_password_local->isChecked()); + cloud->set_cloud_storage_password(password); + cloud->set_cloud_verification_status(prefs.cloud_verification_status); + cloud->set_cloud_base_url(prefs.cloud_base_url); +} + +void PreferencesCloud::updateCloudAuthenticationState() +{ + ui->cloud_storage_pin->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); + ui->cloud_storage_pin->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); + ui->cloud_storage_pin_label->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); + ui->cloud_storage_pin_label->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); + ui->cloud_storage_new_passwd->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); + ui->cloud_storage_new_passwd->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); + ui->cloud_storage_new_passwd_label->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); + ui->cloud_storage_new_passwd_label->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); + if (prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED) { + ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage (credentials verified)")); + } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_INCORRECT_USER_PASSWD) { + ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage (incorrect password)")); + } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY) { + ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage (PIN required)")); + } else { + ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage")); + } + emit settingsChanged(); +} + +void PreferencesCloud::passwordUpdateSuccessful() +{ + ui->cloud_storage_password->setText(prefs.cloud_storage_password); +} diff --git a/desktop-widgets/preferences/preferences_cloud.h b/desktop-widgets/preferences/preferences_cloud.h new file mode 100644 index 000000000..d2a7f9d62 --- /dev/null +++ b/desktop-widgets/preferences/preferences_cloud.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef PREFERENCES_CLOUD_H +#define PREFERENCES_CLOUD_H + +#include "abstractpreferenceswidget.h" + +namespace Ui { + class PreferencesCloud; +} + +class PreferencesCloud : public AbstractPreferencesWidget { + Q_OBJECT + +public: + PreferencesCloud(); + ~PreferencesCloud(); + void refreshSettings() override; + void syncSettings() override; + +public slots: + void updateCloudAuthenticationState(); + void passwordUpdateSuccessful(); + +private: + Ui::PreferencesCloud *ui; +}; + +#endif diff --git a/desktop-widgets/preferences/preferences_cloud.ui b/desktop-widgets/preferences/preferences_cloud.ui new file mode 100644 index 000000000..5aea92bac --- /dev/null +++ b/desktop-widgets/preferences/preferences_cloud.ui @@ -0,0 +1,165 @@ + + + PreferencesCloud + + + + 0 + 0 + 713 + 558 + + + + Form + + + + + + + 0 + 0 + + + + + 0 + 129 + + + + Subsurface cloud storage + + + + + + + + + Email address + + + + + + + Password + + + + + + + Verification PIN + + + + + + + New password + + + + + + + + + + + + + + QLineEdit::Password + + + + + + + + + + + + + + QLineEdit::Password + + + + + + + Save Password locally? + + + + + + + + + + + + + To create a new cloud account: + + + + + + + + + + 1) Enter an email address and a novel password that Subsurface will use to initialise the dive log in the cloud. Click Apply to send the above email address and password to the (remote) cloud server. + + + + + + + + + + 2) The server responds by sending a verification PIN to the above email address (This is the only occasion that Subsurface uses the email address provided above). The above dialog now has a new PIN text box, not visible previously. + + + + + + + + + + 3) Enter the PIN in the corresponding text box in the above dialog (this field is only visible while the server is waiting for email address confirmation). Click Apply again. The Subsurface cloud storage account will be marked as verified and the Subsurface cloud storage service is initialised for use. + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + diff --git a/desktop-widgets/preferences/preferences_network.cpp b/desktop-widgets/preferences/preferences_network.cpp index a1f264b73..8a48b5a25 100644 --- a/desktop-widgets/preferences/preferences_network.cpp +++ b/desktop-widgets/preferences/preferences_network.cpp @@ -2,9 +2,7 @@ #include "preferences_network.h" #include "ui_preferences_network.h" #include "subsurfacewebservices.h" -#include "core/cloudstorage.h" #include "core/errorhelper.h" -#include "core/settings/qPrefCloudStorage.h" #include "core/settings/qPrefProxy.h" #include @@ -35,15 +33,10 @@ void PreferencesNetwork::refreshSettings() ui->proxyUsername->setText(prefs.proxy_user); ui->proxyPassword->setText(prefs.proxy_pass); ui->proxyType->setCurrentIndex(ui->proxyType->findData(prefs.proxy_type)); - ui->cloud_storage_email->setText(prefs.cloud_storage_email); - ui->cloud_storage_password->setText(prefs.cloud_storage_password); - ui->save_password_local->setChecked(prefs.save_password_local); - updateCloudAuthenticationState(); } void PreferencesNetwork::syncSettings() { - auto cloud = qPrefCloudStorage::instance(); auto proxy = qPrefProxy::instance(); proxy->set_proxy_type(ui->proxyType->itemData(ui->proxyType->currentIndex()).toInt()); @@ -52,94 +45,8 @@ void PreferencesNetwork::syncSettings() proxy->set_proxy_auth(ui->proxyAuthRequired->isChecked()); proxy->set_proxy_user(ui->proxyUsername->text()); proxy->set_proxy_pass(ui->proxyPassword->text()); - - QString email = ui->cloud_storage_email->text().toLower(); - QString password = ui->cloud_storage_password->text(); - QString newpassword = ui->cloud_storage_new_passwd->text(); - - //TODO: Change this to the Cloud Storage Stuff, not preferences. - if (prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED && !newpassword.isEmpty()) { - // deal with password change - if (!email.isEmpty() && !password.isEmpty()) { - // connect to backend server to check / create credentials - QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$"); - if (!reg.match(email).hasMatch() || (!password.isEmpty() && !reg.match(password).hasMatch())) { - report_error(qPrintable(tr("Change ignored. Cloud storage email and password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); - return; - } - if (!reg.match(email).hasMatch() || (!newpassword.isEmpty() && !reg.match(newpassword).hasMatch())) { - report_error(qPrintable(tr("Change ignored. Cloud storage email and new password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); - ui->cloud_storage_new_passwd->setText(""); - return; - } - CloudStorageAuthenticate *cloudAuth = new CloudStorageAuthenticate(this); - connect(cloudAuth, &CloudStorageAuthenticate::finishedAuthenticate, this, &PreferencesNetwork::updateCloudAuthenticationState); - connect(cloudAuth, &CloudStorageAuthenticate::passwordChangeSuccessful, this, &PreferencesNetwork::passwordUpdateSuccessful); - cloudAuth->backend(email, password, "", newpassword); - ui->cloud_storage_new_passwd->setText(""); - } - } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_UNKNOWN || - prefs.cloud_verification_status == qPrefCloudStorage::CS_INCORRECT_USER_PASSWD || - email != prefs.cloud_storage_email || - password != prefs.cloud_storage_password) { - - // different credentials - reset verification status - int oldVerificationStatus = cloud->cloud_verification_status(); - cloud->set_cloud_verification_status(qPrefCloudStorage::CS_UNKNOWN); - if (!email.isEmpty() && !password.isEmpty()) { - // connect to backend server to check / create credentials - QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$"); - if (!reg.match(email).hasMatch() || (!password.isEmpty() && !reg.match(password).hasMatch())) { - report_error(qPrintable(tr("Cloud storage email and password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); - cloud->set_cloud_verification_status(oldVerificationStatus); - return; - } - CloudStorageAuthenticate *cloudAuth = new CloudStorageAuthenticate(this); - connect(cloudAuth, &CloudStorageAuthenticate::finishedAuthenticate, this, &PreferencesNetwork::updateCloudAuthenticationState); - cloudAuth->backend(email, password); - } - } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY) { - QString pin = ui->cloud_storage_pin->text(); - if (!pin.isEmpty()) { - // connect to backend server to check / create credentials - QRegularExpression reg("^[a-zA-Z0-9@.+_-]+$"); - if (!reg.match(email).hasMatch() || !reg.match(password).hasMatch()) { - report_error(qPrintable(tr("Cloud storage email and password can only consist of letters, numbers, and '.', '-', '_', and '+'."))); - return; - } - CloudStorageAuthenticate *cloudAuth = new CloudStorageAuthenticate(this); - connect(cloudAuth, SIGNAL(finishedAuthenticate()), this, SLOT(updateCloudAuthenticationState())); - cloudAuth->backend(email, password, pin); - } - } - cloud->set_cloud_storage_email(email); - cloud->set_save_password_local(ui->save_password_local->isChecked()); - cloud->set_cloud_storage_password(password); - cloud->set_cloud_verification_status(prefs.cloud_verification_status); - cloud->set_cloud_base_url(prefs.cloud_base_url); } -void PreferencesNetwork::updateCloudAuthenticationState() -{ - ui->cloud_storage_pin->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); - ui->cloud_storage_pin->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); - ui->cloud_storage_pin_label->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); - ui->cloud_storage_pin_label->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY); - ui->cloud_storage_new_passwd->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); - ui->cloud_storage_new_passwd->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); - ui->cloud_storage_new_passwd_label->setEnabled(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); - ui->cloud_storage_new_passwd_label->setVisible(prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED); - if (prefs.cloud_verification_status == qPrefCloudStorage::CS_VERIFIED) { - ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage (credentials verified)")); - } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_INCORRECT_USER_PASSWD) { - ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage (incorrect password)")); - } else if (prefs.cloud_verification_status == qPrefCloudStorage::CS_NEED_TO_VERIFY) { - ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage (PIN required)")); - } else { - ui->cloudStorageGroupBox->setTitle(tr("Subsurface cloud storage")); - } - emit settingsChanged(); -} void PreferencesNetwork::proxyType_changed(int idx) { @@ -157,7 +64,3 @@ void PreferencesNetwork::proxyType_changed(int idx) ui->proxyAuthRequired->setChecked(ui->proxyAuthRequired->isChecked()); } -void PreferencesNetwork::passwordUpdateSuccessful() -{ - ui->cloud_storage_password->setText(prefs.cloud_storage_password); -} diff --git a/desktop-widgets/preferences/preferences_network.h b/desktop-widgets/preferences/preferences_network.h index f4b2125aa..7ea56cf59 100644 --- a/desktop-widgets/preferences/preferences_network.h +++ b/desktop-widgets/preferences/preferences_network.h @@ -19,8 +19,6 @@ public: public slots: void proxyType_changed(int i); - void updateCloudAuthenticationState(); - void passwordUpdateSuccessful(); private: Ui::PreferencesNetwork *ui; diff --git a/desktop-widgets/preferences/preferences_network.ui b/desktop-widgets/preferences/preferences_network.ui index 7be1d3f4f..ed484248a 100644 --- a/desktop-widgets/preferences/preferences_network.ui +++ b/desktop-widgets/preferences/preferences_network.ui @@ -17,7 +17,7 @@ - Proxy + If your Internet access is through a proxy server, provide details for using that proxy @@ -138,93 +138,6 @@ - - - - - 0 - 0 - - - - - 0 - 129 - - - - Subsurface cloud storage - - - - - - - - - Email address - - - - - - - Password - - - - - - - Verification PIN - - - - - - - New password - - - - - - - - - - - - - - QLineEdit::Password - - - - - - - - - - - - - - QLineEdit::Password - - - - - - - Save Password locally? - - - - - - diff --git a/desktop-widgets/preferences/preferencesdialog.cpp b/desktop-widgets/preferences/preferencesdialog.cpp index fbf387cfa..9e1e6a7bf 100644 --- a/desktop-widgets/preferences/preferencesdialog.cpp +++ b/desktop-widgets/preferences/preferencesdialog.cpp @@ -8,6 +8,7 @@ #include "preferences_units.h" #include "preferences_graph.h" #include "preferences_network.h" +#include "preferences_cloud.h" #include "core/qthelper.h" @@ -65,6 +66,7 @@ PreferencesDialog::PreferencesDialog() addPreferencePage(new PreferencesUnits()); addPreferencePage(new PreferencesGraph()); addPreferencePage(new PreferencesNetwork()); + addPreferencePage(new PreferencesCloud()); refreshPages(); connect(pagesList, &QListWidget::currentRowChanged, diff --git a/icons/pref_cloud.png b/icons/pref_cloud.png new file mode 100644 index 000000000..c038fdc9c Binary files /dev/null and b/icons/pref_cloud.png differ diff --git a/icons/pref_tech.png b/icons/pref_tech.png new file mode 100644 index 000000000..0d3d88098 Binary files /dev/null and b/icons/pref_tech.png differ diff --git a/subsurface.qrc b/subsurface.qrc index 5c2a6fb6f..da108a8df 100644 --- a/subsurface.qrc +++ b/subsurface.qrc @@ -1,7 +1,7 @@ icons/satellite.svg - icons/graph.png + icons/pref_tech.png icons/go-top.svg icons/star.svg icons/subsurface-icon.png @@ -12,6 +12,7 @@ icons/units.png icons/advanced.png icons/network.png + icons/pref_cloud.png icons/graph.png icons/minimum.png icons/maximum.png -- cgit v1.2.3-70-g09d2