From 644968256ba1015bcf7c940ec7a287e0db37f6d6 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 9 Jan 2021 21:12:57 +0100 Subject: [PATCH] Save. --- src/librssguard/librssguard.pro | 7 +- .../abstract/gui/formaccountdetails.cpp | 40 +++ .../abstract/gui/formaccountdetails.h | 43 +++ .../abstract/gui/formaccountdetails.ui | 58 ++++ .../services/abstract/gui/formfeeddetails.cpp | 1 - .../services/abstract/gui/formfeeddetails.h | 11 +- .../tt-rss/gui/formeditttrssaccount.cpp | 263 +++--------------- .../tt-rss/gui/formeditttrssaccount.h | 42 +-- .../tt-rss/gui/formeditttrssaccount.ui | 246 ---------------- .../tt-rss/gui/ttrssaccountdetails.cpp | 181 ++++++++++++ .../services/tt-rss/gui/ttrssaccountdetails.h | 35 +++ .../tt-rss/gui/ttrssaccountdetails.ui | 224 +++++++++++++++ .../tt-rss/ttrssserviceentrypoint.cpp | 2 +- .../services/tt-rss/ttrssserviceroot.cpp | 2 +- 14 files changed, 650 insertions(+), 505 deletions(-) create mode 100644 src/librssguard/services/abstract/gui/formaccountdetails.cpp create mode 100644 src/librssguard/services/abstract/gui/formaccountdetails.h create mode 100644 src/librssguard/services/abstract/gui/formaccountdetails.ui delete mode 100644 src/librssguard/services/tt-rss/gui/formeditttrssaccount.ui create mode 100644 src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp create mode 100644 src/librssguard/services/tt-rss/gui/ttrssaccountdetails.h create mode 100644 src/librssguard/services/tt-rss/gui/ttrssaccountdetails.ui diff --git a/src/librssguard/librssguard.pro b/src/librssguard/librssguard.pro index 0ad5d4624..bf222c3ec 100644 --- a/src/librssguard/librssguard.pro +++ b/src/librssguard/librssguard.pro @@ -132,6 +132,7 @@ HEADERS += core/feeddownloader.h \ services/abstract/cacheforserviceroot.h \ services/abstract/category.h \ services/abstract/feed.h \ + services/abstract/gui/formaccountdetails.h \ services/abstract/gui/formfeeddetails.h \ services/abstract/importantnode.h \ services/abstract/label.h \ @@ -177,6 +178,7 @@ HEADERS += core/feeddownloader.h \ services/tt-rss/definitions.h \ services/tt-rss/gui/formeditttrssaccount.h \ services/tt-rss/gui/formttrssfeeddetails.h \ + services/tt-rss/gui/ttrssaccountdetails.h \ services/tt-rss/gui/ttrssfeeddetails.h \ services/tt-rss/network/ttrssnetworkfactory.h \ services/tt-rss/ttrssfeed.h \ @@ -287,6 +289,7 @@ SOURCES += core/feeddownloader.cpp \ services/abstract/cacheforserviceroot.cpp \ services/abstract/category.cpp \ services/abstract/feed.cpp \ + services/abstract/gui/formaccountdetails.cpp \ services/abstract/gui/formfeeddetails.cpp \ services/abstract/importantnode.cpp \ services/abstract/label.cpp \ @@ -327,6 +330,7 @@ SOURCES += core/feeddownloader.cpp \ services/standard/standardserviceroot.cpp \ services/tt-rss/gui/formeditttrssaccount.cpp \ services/tt-rss/gui/formttrssfeeddetails.cpp \ + services/tt-rss/gui/ttrssaccountdetails.cpp \ services/tt-rss/gui/ttrssfeeddetails.cpp \ services/tt-rss/network/ttrssnetworkfactory.cpp \ services/tt-rss/ttrssfeed.cpp \ @@ -365,6 +369,7 @@ FORMS += gui/dialogs/formabout.ui \ gui/toolbareditor.ui \ network-web/downloaditem.ui \ network-web/downloadmanager.ui \ + services/abstract/gui/formaccountdetails.ui \ services/abstract/gui/formfeeddetails.ui \ services/gmail/gui/formeditgmailaccount.ui \ services/inoreader/gui/formeditinoreaderaccount.ui \ @@ -373,11 +378,11 @@ FORMS += gui/dialogs/formabout.ui \ services/standard/gui/formstandardcategorydetails.ui \ services/standard/gui/formstandardimportexport.ui \ services/standard/gui/standardfeeddetails.ui \ - services/tt-rss/gui/formeditttrssaccount.ui \ services/gmail/gui/formdownloadattachment.ui \ services/gmail/gui/formaddeditemail.ui \ gui/searchtextwidget.ui \ gui/newspaperpreviewer.ui \ + services/tt-rss/gui/ttrssaccountdetails.ui \ services/tt-rss/gui/ttrssfeeddetails.ui equals(USE_WEBENGINE, true) { diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.cpp b/src/librssguard/services/abstract/gui/formaccountdetails.cpp new file mode 100644 index 000000000..8d494b794 --- /dev/null +++ b/src/librssguard/services/abstract/gui/formaccountdetails.cpp @@ -0,0 +1,40 @@ +// For license of this file, see /LICENSE.md. + +#include "services/abstract/gui/formaccountdetails.h" + +#include "gui/guiutilities.h" +#include "miscellaneous/application.h" +#include "miscellaneous/iconfactory.h" +#include "services/abstract/serviceroot.h" + +FormAccountDetails::FormAccountDetails(const QIcon& icon, QWidget* parent) : QDialog(parent), m_account(nullptr) { + m_ui.setupUi(this); + + GuiUtilities::applyDialogProperties(*this, icon.isNull() + ? qApp->icons()->fromTheme(QSL("emblem-system")) + : icon); + createConnections(); +} + +void FormAccountDetails::apply() {} + +void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { + m_ui.m_tabWidget->insertTab(index, custom_tab, title); +} + +void FormAccountDetails::activateTab(int index) { + m_ui.m_tabWidget->setCurrentIndex(index); +} + +void FormAccountDetails::clearTabs() { + m_ui.m_tabWidget->clear(); +} + +void FormAccountDetails::setEditableAccount(ServiceRoot* editable_account) { + setWindowTitle(tr("Edit account '%1'").arg(editable_account->title())); + m_account = editable_account; +} + +void FormAccountDetails::createConnections() { + connect(m_ui.m_buttonBox, &QDialogButtonBox::accepted, this, &FormAccountDetails::apply); +} diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.h b/src/librssguard/services/abstract/gui/formaccountdetails.h new file mode 100644 index 000000000..e0e766373 --- /dev/null +++ b/src/librssguard/services/abstract/gui/formaccountdetails.h @@ -0,0 +1,43 @@ +// For license of this file, see /LICENSE.md. + +#ifndef FORMACCOUNTDETAILS_H +#define FORMACCOUNTDETAILS_H + +#include + +#include "ui_formaccountdetails.h" + +class ServiceRoot; + +class FormAccountDetails : public QDialog { + Q_OBJECT + + public: + explicit FormAccountDetails(const QIcon& icon, QWidget* parent = nullptr); + + protected slots: + + // Applies changes. + // NOTE: This must be reimplemented in subclasses. Also this + // base implementation must be called first. + virtual void apply(); + + protected: + void activateTab(int index); + void clearTabs(); + void insertCustomTab(QWidget* custom_tab, const QString& title, int index); + + // Sets the account which will be edited. + // NOTE: This must be reimplemented in subclasses. Also this + // base implementation must be called first. + virtual void setEditableAccount(ServiceRoot* editable_account); + + private: + void createConnections(); + + protected: + Ui::FormAccountDetails m_ui; + ServiceRoot* m_account; +}; + +#endif // FORMACCOUNTDETAILS_H diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.ui b/src/librssguard/services/abstract/gui/formaccountdetails.ui new file mode 100644 index 000000000..0b6acab67 --- /dev/null +++ b/src/librssguard/services/abstract/gui/formaccountdetails.ui @@ -0,0 +1,58 @@ + + + FormAccountDetails + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + + -1 + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + + + + m_buttonBox + rejected() + FormAccountDetails + reject() + + + 199 + 279 + + + 199 + 149 + + + + + diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.cpp b/src/librssguard/services/abstract/gui/formfeeddetails.cpp index 231da2cc7..10891f9dd 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.cpp +++ b/src/librssguard/services/abstract/gui/formfeeddetails.cpp @@ -83,7 +83,6 @@ void FormFeedDetails::onAutoUpdateTypeChanged(int new_index) { } void FormFeedDetails::createConnections() { - // General connections. connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &FormFeedDetails::apply); connect(m_ui->m_cmbAutoUpdateType, static_cast(&QComboBox::currentIndexChanged), this, &FormFeedDetails::onAutoUpdateTypeChanged); diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.h b/src/librssguard/services/abstract/gui/formfeeddetails.h index 4259233ce..ce3438ee7 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.h +++ b/src/librssguard/services/abstract/gui/formfeeddetails.h @@ -29,26 +29,25 @@ class FormFeedDetails : public QDialog { protected slots: void activateTab(int index); void clearTabs(); - void insertCustomTab(QWidget* custom_tab, const QString& title, int index); // Applies changes. // NOTE: This must be reimplemented in subclasses. Also this // base implementation must be called first. virtual void apply(); - void onAutoUpdateTypeChanged(int new_index); - protected: + void insertCustomTab(QWidget* custom_tab, const QString& title, int index); // Sets the feed which will be edited. // NOTE: This must be reimplemented in subclasses. Also this // base implementation must be called first. void virtual setEditableFeed(Feed* editable_feed); - // Creates needed connections. - void createConnections(); + private slots: + void onAutoUpdateTypeChanged(int new_index); - // Initializes the dialog. + private: + void createConnections(); void initialize(); protected: diff --git a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp index b0e0b111b..473b7c135 100644 --- a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp +++ b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp @@ -2,254 +2,75 @@ #include "services/tt-rss/gui/formeditttrssaccount.h" -#include "gui/guiutilities.h" #include "miscellaneous/iconfactory.h" -#include "network-web/networkfactory.h" #include "services/tt-rss/definitions.h" +#include "services/tt-rss/gui/ttrssaccountdetails.h" #include "services/tt-rss/network/ttrssnetworkfactory.h" #include "services/tt-rss/ttrssserviceroot.h" FormEditTtRssAccount::FormEditTtRssAccount(QWidget* parent) - : QDialog(parent), m_ui(new Ui::FormEditTtRssAccount), m_editableRoot(nullptr) { - m_ui->setupUi(this); - m_btnOk = m_ui->m_buttonBox->button(QDialogButtonBox::Ok); - - GuiUtilities::applyDialogProperties(*this, qApp->icons()->miscIcon(QSL("tt-rss"))); - - 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_lblDescription->setText(tr("Note that at least API level %1 is required.").arg(TTRSS_MINIMAL_API_LEVEL)); - m_ui->m_txtHttpUsername->lineEdit()->setPlaceholderText(tr("HTTP authentication username")); - m_ui->m_txtHttpPassword->lineEdit()->setPlaceholderText(tr("HTTP authentication password")); - m_ui->m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your TT-RSS account")); - m_ui->m_txtUsername->lineEdit()->setPlaceholderText(tr("Username for your TT-RSS account")); - m_ui->m_txtUrl->lineEdit()->setPlaceholderText(tr("URL of your TT-RSS instance WITHOUT trailing \"/api/\" string")); - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, - tr("No test done yet."), - tr("Here, results of connection test are shown.")); - - 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_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); - setTabOrder(m_ui->m_checkShowPassword, m_ui->m_gbHttpAuthentication); - setTabOrder(m_ui->m_gbHttpAuthentication, m_ui->m_txtHttpUsername->lineEdit()); - setTabOrder(m_ui->m_txtHttpUsername->lineEdit(), m_ui->m_txtHttpPassword->lineEdit()); - setTabOrder(m_ui->m_txtHttpPassword->lineEdit(), m_ui->m_checkShowHttpPassword); - setTabOrder(m_ui->m_checkShowHttpPassword, m_ui->m_btnTestSetup); - setTabOrder(m_ui->m_btnTestSetup, m_ui->m_buttonBox); - - connect(m_ui->m_checkShowPassword, &QCheckBox::toggled, this, &FormEditTtRssAccount::displayPassword); - connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &FormEditTtRssAccount::onClickedOk); - connect(m_ui->m_buttonBox, &QDialogButtonBox::rejected, this, &FormEditTtRssAccount::onClickedCancel); - connect(m_ui->m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::onPasswordChanged); - connect(m_ui->m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::onUsernameChanged); - connect(m_ui->m_txtHttpPassword->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::onHttpPasswordChanged); - connect(m_ui->m_txtHttpUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::onHttpUsernameChanged); - connect(m_ui->m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::onUrlChanged); - connect(m_ui->m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::checkOkButton); - connect(m_ui->m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::checkOkButton); - connect(m_ui->m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditTtRssAccount::checkOkButton); - connect(m_ui->m_btnTestSetup, &QPushButton::clicked, this, &FormEditTtRssAccount::performTest); - connect(m_ui->m_gbHttpAuthentication, &QGroupBox::toggled, this, &FormEditTtRssAccount::onHttpPasswordChanged); - connect(m_ui->m_gbHttpAuthentication, &QGroupBox::toggled, this, &FormEditTtRssAccount::onHttpUsernameChanged); - connect(m_ui->m_checkShowHttpPassword, &QCheckBox::toggled, this, &FormEditTtRssAccount::displayHttpPassword); - - onPasswordChanged(); - onUsernameChanged(); - onUrlChanged(); - onHttpPasswordChanged(); - onHttpUsernameChanged(); - checkOkButton(); - displayPassword(false); - displayHttpPassword(false); + : FormAccountDetails(qApp->icons()->miscIcon(QSL("tt-rss")), parent), m_details(new TtRssAccountDetails(this)) { + insertCustomTab(m_details, tr("Server setup"), 0); + activateTab(0); } -FormEditTtRssAccount::~FormEditTtRssAccount() = default; - -TtRssServiceRoot* FormEditTtRssAccount::execForCreate() { - setWindowTitle(tr("Add new Tiny Tiny RSS account")); - exec(); - return m_editableRoot; -} - -void FormEditTtRssAccount::execForEdit(TtRssServiceRoot* existing_root) { - setWindowTitle(tr("Edit existing Tiny Tiny RSS account")); - m_editableRoot = existing_root; - m_ui->m_gbHttpAuthentication->setChecked(existing_root->network()->authIsUsed()); - m_ui->m_txtHttpPassword->lineEdit()->setText(existing_root->network()->authPassword()); - m_ui->m_txtHttpUsername->lineEdit()->setText(existing_root->network()->authUsername()); - m_ui->m_txtUsername->lineEdit()->setText(existing_root->network()->username()); - m_ui->m_txtPassword->lineEdit()->setText(existing_root->network()->password()); - m_ui->m_txtUrl->lineEdit()->setText(existing_root->network()->url()); - m_ui->m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate()); - m_ui->m_checkDownloadOnlyUnreadMessages->setChecked(existing_root->network()->downloadOnlyUnreadMessages()); - exec(); -} - -void FormEditTtRssAccount::displayPassword(bool display) { - m_ui->m_txtPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password); -} - -void FormEditTtRssAccount::displayHttpPassword(bool display) { - m_ui->m_txtHttpPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password); -} - -void FormEditTtRssAccount::performTest() { - TtRssNetworkFactory factory; - - factory.setUsername(m_ui->m_txtUsername->lineEdit()->text()); - factory.setPassword(m_ui->m_txtPassword->lineEdit()->text()); - factory.setUrl(m_ui->m_txtUrl->lineEdit()->text()); - factory.setAuthIsUsed(m_ui->m_gbHttpAuthentication->isChecked()); - factory.setAuthUsername(m_ui->m_txtHttpUsername->lineEdit()->text()); - factory.setAuthPassword(m_ui->m_txtHttpPassword->lineEdit()->text()); - factory.setForceServerSideUpdate(m_ui->m_checkServerSideUpdate->isChecked()); - - TtRssLoginResponse result = factory.login(); - - if (result.isLoaded()) { - if (result.hasError()) { - QString error = result.error(); - - if (error == TTRSS_API_DISABLED) { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("API access on selected server is not enabled."), - tr("API access on selected server is not enabled.")); - } - else if (error == TTRSS_LOGIN_ERROR) { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Entered credentials are incorrect."), - tr("Entered credentials are incorrect.")); - } - else { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Other error occurred, contact developers."), - tr("Other error occurred, contact developers.")); - } - } - else if (result.apiLevel() < TTRSS_MINIMAL_API_LEVEL) { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Installed version: %1, required at least: %2.").arg(QString::number(result.apiLevel()), - QString::number(TTRSS_MINIMAL_API_LEVEL)), - tr("Selected Tiny Tiny RSS server is running unsupported version of API.")); - } - else { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("Installed version: %1, required at least: %2.").arg(QString::number(result.apiLevel()), - QString::number(TTRSS_MINIMAL_API_LEVEL)), - tr("Tiny Tiny RSS server is okay.")); - } - } - else if (factory.lastError() != QNetworkReply::NoError) { - m_ui->m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Network error: '%1'.").arg(NetworkFactory::networkErrorText(factory.lastError())), - tr("Network error, have you entered correct Tiny Tiny RSS API endpoint and password?")); +TtRssServiceRoot* FormEditTtRssAccount::addEditAccount(TtRssServiceRoot* account_to_edit) { + if (account_to_edit == nullptr) { + // User is adding new TT-RSS account. + setWindowTitle(tr("Add new TT-RSS 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 ttRssAccount(); } -void FormEditTtRssAccount::onClickedOk() { +void FormEditTtRssAccount::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 TtRssServiceRoot(); + m_account = new TtRssServiceRoot(); editing_account = false; } - m_editableRoot->network()->setUrl(m_ui->m_txtUrl->lineEdit()->text()); - m_editableRoot->network()->setUsername(m_ui->m_txtUsername->lineEdit()->text()); - m_editableRoot->network()->setPassword(m_ui->m_txtPassword->lineEdit()->text()); - m_editableRoot->network()->setAuthIsUsed(m_ui->m_gbHttpAuthentication->isChecked()); - m_editableRoot->network()->setAuthUsername(m_ui->m_txtHttpUsername->lineEdit()->text()); - m_editableRoot->network()->setAuthPassword(m_ui->m_txtHttpPassword->lineEdit()->text()); - m_editableRoot->network()->setForceServerSideUpdate(m_ui->m_checkServerSideUpdate->isChecked()); - m_editableRoot->network()->setDownloadOnlyUnreadMessages(m_ui->m_checkDownloadOnlyUnreadMessages->isChecked()); + ttRssAccount()->network()->setUrl(m_details->m_ui.m_txtUrl->lineEdit()->text()); + ttRssAccount()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); + ttRssAccount()->network()->setPassword(m_details->m_ui.m_txtPassword->lineEdit()->text()); + ttRssAccount()->network()->setAuthIsUsed(m_details->m_ui.m_gbHttpAuthentication->isChecked()); + ttRssAccount()->network()->setAuthUsername(m_details->m_ui.m_txtHttpUsername->lineEdit()->text()); + ttRssAccount()->network()->setAuthPassword(m_details->m_ui.m_txtHttpPassword->lineEdit()->text()); + ttRssAccount()->network()->setForceServerSideUpdate(m_details->m_ui.m_checkServerSideUpdate->isChecked()); + ttRssAccount()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked()); - m_editableRoot->saveAccountDataToDatabase(); + ttRssAccount()->saveAccountDataToDatabase(); accept(); if (editing_account) { - m_editableRoot->network()->logout(); - m_editableRoot->completelyRemoveAllData(); - m_editableRoot->syncIn(); + ttRssAccount()->network()->logout(); + ttRssAccount()->completelyRemoveAllData(); + ttRssAccount()->syncIn(); } } -void FormEditTtRssAccount::onClickedCancel() { - reject(); +void FormEditTtRssAccount::setEditableAccount(ServiceRoot* editable_account) { + FormAccountDetails::setEditableAccount(editable_account); + + TtRssServiceRoot* existing_root = qobject_cast(editable_account); + + m_details->m_ui.m_gbHttpAuthentication->setChecked(existing_root->network()->authIsUsed()); + m_details->m_ui.m_txtHttpPassword->lineEdit()->setText(existing_root->network()->authPassword()); + m_details->m_ui.m_txtHttpUsername->lineEdit()->setText(existing_root->network()->authUsername()); + m_details->m_ui.m_txtUsername->lineEdit()->setText(existing_root->network()->username()); + m_details->m_ui.m_txtPassword->lineEdit()->setText(existing_root->network()->password()); + m_details->m_ui.m_txtUrl->lineEdit()->setText(existing_root->network()->url()); + m_details->m_ui.m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate()); + m_details->m_ui.m_checkDownloadOnlyUnreadMessages->setChecked(existing_root->network()->downloadOnlyUnreadMessages()); } -void FormEditTtRssAccount::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 FormEditTtRssAccount::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 FormEditTtRssAccount::onHttpUsernameChanged() { - const bool is_username_ok = !m_ui->m_gbHttpAuthentication->isChecked() || !m_ui->m_txtHttpUsername->lineEdit()->text().isEmpty(); - - m_ui->m_txtHttpUsername->setStatus(is_username_ok ? - LineEditWithStatus::StatusType::Ok : - LineEditWithStatus::StatusType::Warning, - is_username_ok ? - tr("Username is ok or it is not needed.") : - tr("Username is empty.")); -} - -void FormEditTtRssAccount::onHttpPasswordChanged() { - const bool is_username_ok = !m_ui->m_gbHttpAuthentication->isChecked() || !m_ui->m_txtHttpPassword->lineEdit()->text().isEmpty(); - - m_ui->m_txtHttpPassword->setStatus(is_username_ok ? - LineEditWithStatus::StatusType::Ok : - LineEditWithStatus::StatusType::Warning, - is_username_ok ? - tr("Password is ok or it is not needed.") : - tr("Password is empty.")); -} - -void FormEditTtRssAccount::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 if (url.endsWith(QL1S("/api/")) || url.endsWith(QL1S("/api"))) { - m_ui->m_txtUrl->setStatus(WidgetWithStatus::StatusType::Warning, tr("URL should NOT end with \"/api/\".")); - } - else { - m_ui->m_txtUrl->setStatus(WidgetWithStatus::StatusType::Ok, tr("URL is okay.")); - } -} - -void FormEditTtRssAccount::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()); +TtRssServiceRoot* FormEditTtRssAccount::ttRssAccount() const { + return qobject_cast(m_account); } diff --git a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h index 8cf13fb47..1eb138baf 100644 --- a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h +++ b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h @@ -3,45 +3,31 @@ #ifndef FORMEDITACCOUNT_H #define FORMEDITACCOUNT_H -#include - -#include "ui_formeditttrssaccount.h" - -namespace Ui { - class FormEditTtRssAccount; -} +#include "services/abstract/gui/formaccountdetails.h" +class RootItem; class TtRssServiceRoot; +class TtRssAccountDetails; -class FormEditTtRssAccount : public QDialog { +class FormEditTtRssAccount : public FormAccountDetails { Q_OBJECT public: - explicit FormEditTtRssAccount(QWidget* parent = 0); - virtual ~FormEditTtRssAccount(); + explicit FormEditTtRssAccount(QWidget* parent = nullptr); - TtRssServiceRoot* execForCreate(); + TtRssServiceRoot* addEditAccount(TtRssServiceRoot* account_to_edit = nullptr); - void execForEdit(TtRssServiceRoot* existing_root); + protected slots: + virtual void apply(); - private slots: - void displayPassword(bool display); - void displayHttpPassword(bool display); - void performTest(); - void onClickedOk(); - void onClickedCancel(); - - void onUsernameChanged(); - void onPasswordChanged(); - void onHttpUsernameChanged(); - void onHttpPasswordChanged(); - void onUrlChanged(); - void checkOkButton(); + protected: + virtual void setEditableAccount(ServiceRoot* editable_account); private: - QScopedPointer m_ui; - TtRssServiceRoot* m_editableRoot; - QPushButton* m_btnOk; + TtRssServiceRoot* ttRssAccount() const; + + private: + TtRssAccountDetails* m_details; }; #endif // FORMEDITACCOUNT_H diff --git a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.ui b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.ui deleted file mode 100644 index ca3809555..000000000 --- a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.ui +++ /dev/null @@ -1,246 +0,0 @@ - - - FormEditTtRssAccount - - - - 0 - 0 - 604 - 517 - - - - Dialog - - - - - - - - &Test setup - - - - - - - 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 - - - - - - - - - - Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported. - - - Requires HTTP authentication - - - false - - - true - - - false - - - - - - Username - - - m_txtHttpUsername - - - - - - - - - - Password - - - m_txtHttpPassword - - - - - - - - - - Show password - - - - - - - - - - - - URL - - - m_txtUrl - - - - - - - - - - - - - - - true - - - - - - - - - - true - - - - - - - Force execution of server-side update when updating feeds from RSS Guard - - - - - - - Download only unread messages - - - - - - - - 0 - 0 - - - - Qt::RightToLeft - - - - - - - Qt::Vertical - - - - 20 - 68 - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - LineEditWithStatus - QWidget -
lineeditwithstatus.h
- 1 -
- - LabelWithStatus - QWidget -
labelwithstatus.h
- 1 -
-
- - m_checkDownloadOnlyUnreadMessages - m_checkServerSideUpdate - m_checkShowPassword - m_gbHttpAuthentication - m_checkShowHttpPassword - m_btnTestSetup - - - -
diff --git a/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp new file mode 100644 index 000000000..3ec0fbab9 --- /dev/null +++ b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.cpp @@ -0,0 +1,181 @@ +// For license of this file, see /LICENSE.md. + +#include "services/tt-rss/gui/ttrssaccountdetails.h" + +#include "gui/guiutilities.h" +#include "network-web/networkfactory.h" +#include "services/tt-rss/definitions.h" +#include "services/tt-rss/network/ttrssnetworkfactory.h" + +TtRssAccountDetails::TtRssAccountDetails(QWidget* parent) : QWidget(parent) { + m_ui.setupUi(this); + + 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_lblDescription->setText(tr("Note that at least API level %1 is required.").arg(TTRSS_MINIMAL_API_LEVEL)); + m_ui.m_txtHttpUsername->lineEdit()->setPlaceholderText(tr("HTTP authentication username")); + m_ui.m_txtHttpPassword->lineEdit()->setPlaceholderText(tr("HTTP authentication password")); + m_ui.m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your TT-RSS account")); + m_ui.m_txtUsername->lineEdit()->setPlaceholderText(tr("Username for your TT-RSS account")); + m_ui.m_txtUrl->lineEdit()->setPlaceholderText(tr("URL of your TT-RSS instance WITHOUT trailing \"/api/\" string")); + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, + tr("No test done yet."), + tr("Here, results of connection test are shown.")); + + 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_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); + setTabOrder(m_ui.m_checkShowPassword, m_ui.m_gbHttpAuthentication); + setTabOrder(m_ui.m_gbHttpAuthentication, m_ui.m_txtHttpUsername->lineEdit()); + setTabOrder(m_ui.m_txtHttpUsername->lineEdit(), m_ui.m_txtHttpPassword->lineEdit()); + setTabOrder(m_ui.m_txtHttpPassword->lineEdit(), m_ui.m_checkShowHttpPassword); + setTabOrder(m_ui.m_checkShowHttpPassword, m_ui.m_btnTestSetup); + + connect(m_ui.m_checkShowPassword, &QCheckBox::toggled, this, &TtRssAccountDetails::displayPassword); + connect(m_ui.m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onPasswordChanged); + connect(m_ui.m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onUsernameChanged); + connect(m_ui.m_txtHttpPassword->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onHttpPasswordChanged); + connect(m_ui.m_txtHttpUsername->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onHttpUsernameChanged); + connect(m_ui.m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onUrlChanged); + connect(m_ui.m_btnTestSetup, &QPushButton::clicked, this, &TtRssAccountDetails::performTest); + connect(m_ui.m_gbHttpAuthentication, &QGroupBox::toggled, this, &TtRssAccountDetails::onHttpPasswordChanged); + connect(m_ui.m_gbHttpAuthentication, &QGroupBox::toggled, this, &TtRssAccountDetails::onHttpUsernameChanged); + connect(m_ui.m_checkShowHttpPassword, &QCheckBox::toggled, this, &TtRssAccountDetails::displayHttpPassword); + + onPasswordChanged(); + onUsernameChanged(); + onUrlChanged(); + onHttpPasswordChanged(); + onHttpUsernameChanged(); + displayPassword(false); + displayHttpPassword(false); +} + +void TtRssAccountDetails::displayPassword(bool display) { + m_ui.m_txtPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password); +} + +void TtRssAccountDetails::displayHttpPassword(bool display) { + m_ui.m_txtHttpPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password); +} + +void TtRssAccountDetails::performTest() { + TtRssNetworkFactory factory; + + factory.setUsername(m_ui.m_txtUsername->lineEdit()->text()); + factory.setPassword(m_ui.m_txtPassword->lineEdit()->text()); + factory.setUrl(m_ui.m_txtUrl->lineEdit()->text()); + factory.setAuthIsUsed(m_ui.m_gbHttpAuthentication->isChecked()); + factory.setAuthUsername(m_ui.m_txtHttpUsername->lineEdit()->text()); + factory.setAuthPassword(m_ui.m_txtHttpPassword->lineEdit()->text()); + factory.setForceServerSideUpdate(m_ui.m_checkServerSideUpdate->isChecked()); + + TtRssLoginResponse result = factory.login(); + + if (result.isLoaded()) { + if (result.hasError()) { + QString error = result.error(); + + if (error == TTRSS_API_DISABLED) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("API access on selected server is not enabled."), + tr("API access on selected server is not enabled.")); + } + else if (error == TTRSS_LOGIN_ERROR) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("Entered credentials are incorrect."), + tr("Entered credentials are incorrect.")); + } + else { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("Other error occurred, contact developers."), + tr("Other error occurred, contact developers.")); + } + } + else if (result.apiLevel() < TTRSS_MINIMAL_API_LEVEL) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("Installed version: %1, required at least: %2.").arg(QString::number(result.apiLevel()), + QString::number(TTRSS_MINIMAL_API_LEVEL)), + tr("Selected Tiny Tiny RSS server is running unsupported version of API.")); + } + else { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("Installed version: %1, required at least: %2.").arg(QString::number(result.apiLevel()), + QString::number(TTRSS_MINIMAL_API_LEVEL)), + tr("Tiny Tiny RSS server is okay.")); + } + } + else if (factory.lastError() != QNetworkReply::NoError) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("Network error: '%1'.").arg(NetworkFactory::networkErrorText(factory.lastError())), + tr("Network error, have you entered correct Tiny Tiny RSS API endpoint and password?")); + } + 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?")); + } +} + +void TtRssAccountDetails::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 TtRssAccountDetails::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 TtRssAccountDetails::onHttpUsernameChanged() { + const bool is_username_ok = !m_ui.m_gbHttpAuthentication->isChecked() || !m_ui.m_txtHttpUsername->lineEdit()->text().isEmpty(); + + m_ui.m_txtHttpUsername->setStatus(is_username_ok ? + LineEditWithStatus::StatusType::Ok : + LineEditWithStatus::StatusType::Warning, + is_username_ok ? + tr("Username is ok or it is not needed.") : + tr("Username is empty.")); +} + +void TtRssAccountDetails::onHttpPasswordChanged() { + const bool is_username_ok = !m_ui.m_gbHttpAuthentication->isChecked() || !m_ui.m_txtHttpPassword->lineEdit()->text().isEmpty(); + + m_ui.m_txtHttpPassword->setStatus(is_username_ok ? + LineEditWithStatus::StatusType::Ok : + LineEditWithStatus::StatusType::Warning, + is_username_ok ? + tr("Password is ok or it is not needed.") : + tr("Password is empty.")); +} + +void TtRssAccountDetails::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 if (url.endsWith(QL1S("/api/")) || url.endsWith(QL1S("/api"))) { + m_ui.m_txtUrl->setStatus(WidgetWithStatus::StatusType::Warning, tr("URL should NOT end with \"/api/\".")); + } + else { + m_ui.m_txtUrl->setStatus(WidgetWithStatus::StatusType::Ok, tr("URL is okay.")); + } +} diff --git a/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.h b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.h new file mode 100644 index 000000000..44b7f342d --- /dev/null +++ b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.h @@ -0,0 +1,35 @@ +// For license of this file, see /LICENSE.md. + +#ifndef TTRSSACCOUNTDETAILS_H +#define TTRSSACCOUNTDETAILS_H + +#include + +#include "ui_ttrssaccountdetails.h" + +class TtRssServiceRoot; + +class TtRssAccountDetails : public QWidget { + Q_OBJECT + + friend class FormEditTtRssAccount; + + public: + explicit TtRssAccountDetails(QWidget* parent = nullptr); + + private slots: + void displayPassword(bool display); + void displayHttpPassword(bool display); + void performTest(); + + void onUsernameChanged(); + void onPasswordChanged(); + void onHttpUsernameChanged(); + void onHttpPasswordChanged(); + void onUrlChanged(); + + private: + Ui::TtRssAccountDetails m_ui; +}; + +#endif // TTRSSACCOUNTDETAILS_H diff --git a/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.ui b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.ui new file mode 100644 index 000000000..b94cbfb5b --- /dev/null +++ b/src/librssguard/services/tt-rss/gui/ttrssaccountdetails.ui @@ -0,0 +1,224 @@ + + + TtRssAccountDetails + + + + 0 + 0 + 429 + 373 + + + + Form + + + + + + Download only unread messages + + + + + + + Force execution of server-side update when updating feeds from RSS Guard + + + + + + + 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 + + + + + + + + + + Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported. + + + Requires HTTP authentication + + + false + + + true + + + false + + + + + + Username + + + m_txtHttpUsername + + + + + + + + + + Password + + + m_txtHttpPassword + + + + + + + + + + Show password + + + + + + + + + + &Test setup + + + + + + + + 0 + 0 + + + + Qt::RightToLeft + + + + + + + Qt::Vertical + + + + 408 + 30 + + + + + + + + + + URL + + + m_txtUrl + + + + + + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + LineEditWithStatus + QWidget +
lineeditwithstatus.h
+ 1 +
+ + LabelWithStatus + QWidget +
labelwithstatus.h
+ 1 +
+
+ + +
diff --git a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp index 3c512be3f..2ab73b94d 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp @@ -39,7 +39,7 @@ QString TtRssServiceEntryPoint::code() const { ServiceRoot* TtRssServiceEntryPoint::createNewRoot() const { FormEditTtRssAccount form_acc(qApp->mainFormWidget()); - return form_acc.execForCreate(); + return form_acc.addEditAccount(); } QList TtRssServiceEntryPoint::initializeSubtree() const { diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp index 3b48e8d20..8797fb654 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp @@ -64,7 +64,7 @@ bool TtRssServiceRoot::isSyncable() const { bool TtRssServiceRoot::editViaGui() { QScopedPointer form_pointer(new FormEditTtRssAccount(qApp->mainFormWidget())); - form_pointer->execForEdit(this); + form_pointer->addEditAccount(this); return true; }