From abaadbafda22c103a5155442c8c56794c36b4964 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 12 Jan 2021 09:04:03 +0100 Subject: [PATCH] Unified account dialog for nextcloud. --- src/librssguard/librssguard.pro | 4 +- .../owncloud/gui/formeditowncloudaccount.cpp | 200 +++------------ .../owncloud/gui/formeditowncloudaccount.h | 35 +-- .../owncloud/gui/formeditowncloudaccount.ui | 227 ------------------ .../owncloud/owncloudserviceentrypoint.cpp | 2 +- .../services/owncloud/owncloudserviceroot.cpp | 2 +- .../tt-rss/gui/formeditttrssaccount.cpp | 2 + .../tt-rss/gui/ttrssaccountdetails.cpp | 3 +- 8 files changed, 57 insertions(+), 418 deletions(-) delete mode 100644 src/librssguard/services/owncloud/gui/formeditowncloudaccount.ui diff --git a/src/librssguard/librssguard.pro b/src/librssguard/librssguard.pro index bf222c3ec..a673f13ff 100644 --- a/src/librssguard/librssguard.pro +++ b/src/librssguard/librssguard.pro @@ -156,6 +156,7 @@ HEADERS += core/feeddownloader.h \ services/inoreader/network/inoreadernetworkfactory.h \ services/owncloud/definitions.h \ services/owncloud/gui/formeditowncloudaccount.h \ + services/owncloud/gui/owncloudaccountdetails.h \ services/owncloud/network/owncloudnetworkfactory.h \ services/owncloud/owncloudfeed.h \ services/owncloud/owncloudserviceentrypoint.h \ @@ -309,6 +310,7 @@ SOURCES += core/feeddownloader.cpp \ services/inoreader/inoreaderserviceroot.cpp \ services/inoreader/network/inoreadernetworkfactory.cpp \ services/owncloud/gui/formeditowncloudaccount.cpp \ + services/owncloud/gui/owncloudaccountdetails.cpp \ services/owncloud/network/owncloudnetworkfactory.cpp \ services/owncloud/owncloudfeed.cpp \ services/owncloud/owncloudserviceentrypoint.cpp \ @@ -373,8 +375,8 @@ FORMS += gui/dialogs/formabout.ui \ services/abstract/gui/formfeeddetails.ui \ services/gmail/gui/formeditgmailaccount.ui \ services/inoreader/gui/formeditinoreaderaccount.ui \ - services/owncloud/gui/formeditowncloudaccount.ui \ services/abstract/gui/authenticationdetails.ui \ + services/owncloud/gui/owncloudaccountdetails.ui \ services/standard/gui/formstandardcategorydetails.ui \ services/standard/gui/formstandardimportexport.ui \ services/standard/gui/standardfeeddetails.ui \ diff --git a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp index 001200230..1e88523bc 100644 --- a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp +++ b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp @@ -6,192 +6,68 @@ #include "miscellaneous/iconfactory.h" #include "network-web/networkfactory.h" #include "services/owncloud/definitions.h" +#include "services/owncloud/gui/owncloudaccountdetails.h" #include "services/owncloud/network/owncloudnetworkfactory.h" #include "services/owncloud/owncloudserviceroot.h" FormEditOwnCloudAccount::FormEditOwnCloudAccount(QWidget* parent) - : QDialog(parent), m_ui(new Ui::FormEditOwnCloudAccount), m_editableRoot(nullptr) { - m_ui->setupUi(this); - m_btnOk = m_ui->m_buttonBox->button(QDialogButtonBox::Ok); + : FormAccountDetails(qApp->icons()->miscIcon(QSL("nextcloud")), parent), m_details(new OwnCloudAccountDetails(this)) { + insertCustomTab(m_details, tr("Server setup"), 0); + activateTab(0); - GuiUtilities::applyDialogProperties(*this, qApp->icons()->miscIcon(QSL("nextcloud"))); - - m_ui->m_lblTestResult->label()->setWordWrap(true); - m_ui->m_lblServerSideUpdateInformation->setText(tr("Leaving this option on causes that updates " - "of feeds will be probably much slower and may time-out often.")); - m_ui->m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your Nextcloud account")); - m_ui->m_txtUsername->lineEdit()->setPlaceholderText(tr("Username for your Nextcloud account")); - m_ui->m_txtUrl->lineEdit()->setPlaceholderText(tr("URL of your Nextcloud server, without any API path")); - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, - tr("No test done yet."), - tr("Here, results of connection test are shown.")); - m_ui->m_lblLimitMessages->setText( - tr("Limiting number of downloaded messages per feed makes updating of feeds faster but if your feed contains " - "bigger number of messages than specified limit, then some messages might not be downloaded during feed update.")); - - connect(m_ui->m_spinLimitMessages, static_cast(&QSpinBox::valueChanged), this, [=](int value) { - if (value <= 0) { - m_ui->m_spinLimitMessages->setSuffix(QSL(" ") + tr("= unlimited")); - } - else { - m_ui->m_spinLimitMessages->setSuffix(QSL(" ") + tr("messages")); - } - }); - - GuiUtilities::setLabelAsNotice(*m_ui->m_lblLimitMessages, false); - GuiUtilities::setLabelAsNotice(*m_ui->m_lblServerSideUpdateInformation, false); - - setTabOrder(m_ui->m_txtUrl->lineEdit(), m_ui->m_checkServerSideUpdate); - setTabOrder(m_ui->m_checkServerSideUpdate, m_ui->m_spinLimitMessages); - setTabOrder(m_ui->m_spinLimitMessages, m_ui->m_txtUsername->lineEdit()); - setTabOrder(m_ui->m_txtUsername->lineEdit(), m_ui->m_txtPassword->lineEdit()); - setTabOrder(m_ui->m_txtPassword->lineEdit(), m_ui->m_checkShowPassword); - setTabOrder(m_ui->m_checkShowPassword, m_ui->m_btnTestSetup); - setTabOrder(m_ui->m_btnTestSetup, m_ui->m_buttonBox); - - connect(m_ui->m_checkShowPassword, &QCheckBox::toggled, this, &FormEditOwnCloudAccount::displayPassword); - connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &FormEditOwnCloudAccount::onClickedOk); - connect(m_ui->m_buttonBox, &QDialogButtonBox::rejected, this, &FormEditOwnCloudAccount::onClickedCancel); - connect(m_ui->m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditOwnCloudAccount::onPasswordChanged); - connect(m_ui->m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditOwnCloudAccount::onUsernameChanged); - connect(m_ui->m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditOwnCloudAccount::onUrlChanged); - connect(m_ui->m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditOwnCloudAccount::checkOkButton); - connect(m_ui->m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditOwnCloudAccount::checkOkButton); - connect(m_ui->m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditOwnCloudAccount::checkOkButton); - connect(m_ui->m_btnTestSetup, &QPushButton::clicked, this, &FormEditOwnCloudAccount::performTest); - - onPasswordChanged(); - onUsernameChanged(); - onUrlChanged(); - checkOkButton(); - displayPassword(false); + m_details->m_ui.m_txtUrl->setFocus(); } -FormEditOwnCloudAccount::~FormEditOwnCloudAccount() = default; - -OwnCloudServiceRoot* FormEditOwnCloudAccount::execForCreate() { - setWindowTitle(tr("Add new Nextcloud News account")); - exec(); - return m_editableRoot; -} - -void FormEditOwnCloudAccount::execForEdit(OwnCloudServiceRoot* existing_root) { - setWindowTitle(tr("Edit existing Nextcloud News account")); - - m_editableRoot = existing_root; - m_ui->m_txtUsername->lineEdit()->setText(existing_root->network()->authUsername()); - m_ui->m_txtPassword->lineEdit()->setText(existing_root->network()->authPassword()); - m_ui->m_txtUrl->lineEdit()->setText(existing_root->network()->url()); - m_ui->m_checkDownloadOnlyUnreadMessages->setChecked(existing_root->network()->downloadOnlyUnreadMessages()); - m_ui->m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate()); - m_ui->m_spinLimitMessages->setValue(existing_root->network()->batchSize()); - - exec(); -} - -void FormEditOwnCloudAccount::displayPassword(bool display) { - m_ui->m_txtPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password); -} - -void FormEditOwnCloudAccount::performTest() { - OwnCloudNetworkFactory factory; - - factory.setAuthUsername(m_ui->m_txtUsername->lineEdit()->text()); - factory.setAuthPassword(m_ui->m_txtPassword->lineEdit()->text()); - factory.setUrl(m_ui->m_txtUrl->lineEdit()->text()); - factory.setForceServerSideUpdate(m_ui->m_checkServerSideUpdate->isChecked()); - - OwnCloudStatusResponse result = factory.status(); - - if (result.networkError() != QNetworkReply::NetworkError::NoError) { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Network error: '%1'.").arg(NetworkFactory::networkErrorText(result.networkError())), - tr("Network error, have you entered correct Nextcloud endpoint and password?")); - } - else if (result.isLoaded()) { - if (!SystemFactory::isVersionEqualOrNewer(result.version(), OWNCLOUD_MIN_VERSION)) { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Installed version: %1, required at least: %2.").arg(result.version(), OWNCLOUD_MIN_VERSION), - tr("Selected Nextcloud News server is running unsupported version.")); - } - else { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("Installed version: %1, required at least: %2.").arg(result.version(), OWNCLOUD_MIN_VERSION), - tr("Nextcloud News server is okay.")); - } +OwnCloudServiceRoot* FormEditOwnCloudAccount::addEditAccount(OwnCloudServiceRoot* account_to_edit) { + if (account_to_edit == nullptr) { + // User is adding new TT-RSS account. + setWindowTitle(tr("Add new Nextcloud News account")); } else { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Unspecified error, did you enter correct URL?"), - tr("Unspecified error, did you enter correct URL?")); + setEditableAccount(account_to_edit); } + + exec(); + return account(); } -void FormEditOwnCloudAccount::onClickedOk() { +void FormEditOwnCloudAccount::apply() { + FormAccountDetails::apply(); + bool editing_account = true; - if (m_editableRoot == nullptr) { + if (m_account == nullptr) { // We want to confirm newly created account. // So save new account into DB, setup its properties. - m_editableRoot = new OwnCloudServiceRoot(); + m_account = new OwnCloudServiceRoot(); editing_account = false; } - m_editableRoot->network()->setUrl(m_ui->m_txtUrl->lineEdit()->text()); - m_editableRoot->network()->setAuthUsername(m_ui->m_txtUsername->lineEdit()->text()); - m_editableRoot->network()->setAuthPassword(m_ui->m_txtPassword->lineEdit()->text()); - m_editableRoot->network()->setForceServerSideUpdate(m_ui->m_checkServerSideUpdate->isChecked()); - m_editableRoot->network()->setBatchSize(m_ui->m_spinLimitMessages->value()); - m_editableRoot->network()->setDownloadOnlyUnreadMessages(m_ui->m_checkDownloadOnlyUnreadMessages->isChecked()); + account()->network()->setUrl(m_details->m_ui.m_txtUrl->lineEdit()->text()); + account()->network()->setAuthUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); + account()->network()->setAuthPassword(m_details->m_ui.m_txtPassword->lineEdit()->text()); + account()->network()->setForceServerSideUpdate(m_details->m_ui.m_checkServerSideUpdate->isChecked()); + account()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value()); + account()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked()); - m_editableRoot->saveAccountDataToDatabase(); + account()->saveAccountDataToDatabase(); accept(); if (editing_account) { - m_editableRoot->completelyRemoveAllData(); - m_editableRoot->syncIn(); + account()->completelyRemoveAllData(); + account()->syncIn(); } } -void FormEditOwnCloudAccount::onClickedCancel() { - reject(); -} - -void FormEditOwnCloudAccount::onUsernameChanged() { - const QString username = m_ui->m_txtUsername->lineEdit()->text(); - - if (username.isEmpty()) { - m_ui->m_txtUsername->setStatus(WidgetWithStatus::StatusType::Error, tr("Username cannot be empty.")); - } - else { - m_ui->m_txtUsername->setStatus(WidgetWithStatus::StatusType::Ok, tr("Username is okay.")); - } -} - -void FormEditOwnCloudAccount::onPasswordChanged() { - const QString password = m_ui->m_txtPassword->lineEdit()->text(); - - if (password.isEmpty()) { - m_ui->m_txtPassword->setStatus(WidgetWithStatus::StatusType::Error, tr("Password cannot be empty.")); - } - else { - m_ui->m_txtPassword->setStatus(WidgetWithStatus::StatusType::Ok, tr("Password is okay.")); - } -} - -void FormEditOwnCloudAccount::onUrlChanged() { - const QString url = m_ui->m_txtUrl->lineEdit()->text(); - - if (url.isEmpty()) { - m_ui->m_txtUrl->setStatus(WidgetWithStatus::StatusType::Error, tr("URL cannot be empty.")); - } - else { - m_ui->m_txtUrl->setStatus(WidgetWithStatus::StatusType::Ok, tr("URL is okay.")); - } -} - -void FormEditOwnCloudAccount::checkOkButton() { - m_btnOk->setEnabled(!m_ui->m_txtUsername->lineEdit()->text().isEmpty() && - !m_ui->m_txtPassword->lineEdit()->text().isEmpty() && - !m_ui->m_txtUrl->lineEdit()->text().isEmpty()); +void FormEditOwnCloudAccount::setEditableAccount(ServiceRoot* editable_account) { + FormAccountDetails::setEditableAccount(editable_account); + + OwnCloudServiceRoot* existing_root = account(); + + m_details->m_ui.m_txtUsername->lineEdit()->setText(existing_root->network()->authUsername()); + m_details->m_ui.m_txtPassword->lineEdit()->setText(existing_root->network()->authPassword()); + m_details->m_ui.m_txtUrl->lineEdit()->setText(existing_root->network()->url()); + m_details->m_ui.m_checkDownloadOnlyUnreadMessages->setChecked(existing_root->network()->downloadOnlyUnreadMessages()); + m_details->m_ui.m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate()); + m_details->m_ui.m_spinLimitMessages->setValue(existing_root->network()->batchSize()); } diff --git a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h index 275df4c66..1772bb308 100644 --- a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h +++ b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h @@ -3,42 +3,27 @@ #ifndef FORMEDITOWNCLOUDACCOUNT_H #define FORMEDITOWNCLOUDACCOUNT_H -#include - -#include "ui_formeditowncloudaccount.h" - -namespace Ui { - class FormEditAccount; -} +#include "services/abstract/gui/formaccountdetails.h" +class OwnCloudAccountDetails; class OwnCloudServiceRoot; -class FormEditOwnCloudAccount : public QDialog { +class FormEditOwnCloudAccount : public FormAccountDetails { Q_OBJECT public: - explicit FormEditOwnCloudAccount(QWidget* parent = 0); - virtual ~FormEditOwnCloudAccount(); + explicit FormEditOwnCloudAccount(QWidget* parent = nullptr); - OwnCloudServiceRoot* execForCreate(); + OwnCloudServiceRoot* addEditAccount(OwnCloudServiceRoot* account_to_edit = nullptr); - void execForEdit(OwnCloudServiceRoot* existing_root); + protected slots: + virtual void apply(); - private slots: - void displayPassword(bool display); - void performTest(); - void onClickedOk(); - void onClickedCancel(); - - void onUsernameChanged(); - void onPasswordChanged(); - void onUrlChanged(); - void checkOkButton(); + protected: + virtual void setEditableAccount(ServiceRoot* editable_account); private: - QScopedPointer m_ui; - OwnCloudServiceRoot* m_editableRoot; - QPushButton* m_btnOk; + OwnCloudAccountDetails* m_details; }; #endif // FORMEDITOWNCLOUDACCOUNT_H diff --git a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.ui b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.ui deleted file mode 100644 index 9bb84d0d0..000000000 --- a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.ui +++ /dev/null @@ -1,227 +0,0 @@ - - - FormEditOwnCloudAccount - - - - 0 - 0 - 552 - 453 - - - - Dialog - - - - - - - - - - URL - - - m_txtUrl - - - - - - - - - - - - Force execution of server-side update when updating feeds from RSS Guard - - - - - - - - - - true - - - - - - - Limit number of downloaded messages per feed - - - m_spinLimitMessages - - - - - - - - 140 - 16777215 - - - - = unlimited - - - -1 - - - 1000 - - - -1 - - - - - - - - - - true - - - - - - - Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported. - - - Authentication - - - false - - - false - - - - - - Username - - - m_txtUsername - - - - - - - Password - - - m_txtPassword - - - - - - - - - - - - - Show password - - - - - - - - - - - - &Test setup - - - - - - - - 0 - 0 - - - - Qt::RightToLeft - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Download only unread messages - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - LineEditWithStatus - QWidget -
lineeditwithstatus.h
- 1 -
- - LabelWithStatus - QWidget -
labelwithstatus.h
- 1 -
-
- - m_checkDownloadOnlyUnreadMessages - m_checkServerSideUpdate - m_spinLimitMessages - m_checkShowPassword - m_btnTestSetup - - - -
diff --git a/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp b/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp index 09012cda2..d579dacae 100644 --- a/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp +++ b/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp @@ -13,7 +13,7 @@ ServiceRoot* OwnCloudServiceEntryPoint::createNewRoot() const { FormEditOwnCloudAccount form_acc(qApp->mainFormWidget()); - return form_acc.execForCreate(); + return form_acc.addEditAccount(); } QList OwnCloudServiceEntryPoint::initializeSubtree() const { diff --git a/src/librssguard/services/owncloud/owncloudserviceroot.cpp b/src/librssguard/services/owncloud/owncloudserviceroot.cpp index 9225a2904..0a41514f6 100644 --- a/src/librssguard/services/owncloud/owncloudserviceroot.cpp +++ b/src/librssguard/services/owncloud/owncloudserviceroot.cpp @@ -39,7 +39,7 @@ bool OwnCloudServiceRoot::canBeDeleted() const { bool OwnCloudServiceRoot::editViaGui() { QScopedPointer form_pointer(new FormEditOwnCloudAccount(qApp->mainFormWidget())); - form_pointer->execForEdit(this); + form_pointer->addEditAccount(this); return true; } diff --git a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp index 60178f4cb..2a9bb8edf 100644 --- a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp +++ b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp @@ -12,6 +12,8 @@ FormEditTtRssAccount::FormEditTtRssAccount(QWidget* parent) : FormAccountDetails(qApp->icons()->miscIcon(QSL("tt-rss")), parent), m_details(new TtRssAccountDetails(this)) { insertCustomTab(m_details, tr("Server setup"), 0); activateTab(0); + + m_details->m_ui.m_txtUrl->setFocus(); } TtRssServiceRoot* FormEditTtRssAccount::addEditAccount(TtRssServiceRoot* account_to_edit) { diff --git a/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp index 3ec0fbab9..c3c2c5864 100644 --- a/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp +++ b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp @@ -26,7 +26,8 @@ TtRssAccountDetails::TtRssAccountDetails(QWidget* parent) : QWidget(parent) { GuiUtilities::setLabelAsNotice(*m_ui.m_lblDescription, false); GuiUtilities::setLabelAsNotice(*m_ui.m_lblServerSideUpdateInformation, false); - setTabOrder(m_ui.m_txtUrl->lineEdit(), m_ui.m_checkServerSideUpdate); + setTabOrder(m_ui.m_txtUrl->lineEdit(), m_ui.m_checkDownloadOnlyUnreadMessages); + setTabOrder(m_ui.m_checkDownloadOnlyUnreadMessages, m_ui.m_checkServerSideUpdate); setTabOrder(m_ui.m_checkServerSideUpdate, m_ui.m_txtUsername->lineEdit()); setTabOrder(m_ui.m_txtUsername->lineEdit(), m_ui.m_txtPassword->lineEdit()); setTabOrder(m_ui.m_txtPassword->lineEdit(), m_ui.m_checkShowPassword);