diff --git a/src/librssguard/CMakeLists.txt b/src/librssguard/CMakeLists.txt index 6c4bf3852..198db9e42 100644 --- a/src/librssguard/CMakeLists.txt +++ b/src/librssguard/CMakeLists.txt @@ -280,6 +280,8 @@ set(SOURCES services/abstract/category.h services/abstract/feed.cpp services/abstract/feed.h + services/abstract/gui/accountdetails.cpp + services/abstract/gui/accountdetails.h services/abstract/gui/authenticationdetails.cpp services/abstract/gui/authenticationdetails.h services/abstract/gui/custommessagepreviewer.cpp @@ -471,6 +473,7 @@ set(UI_FILES network-web/adblock/adblockdialog.ui network-web/downloaditem.ui network-web/downloadmanager.ui + services/abstract/gui/accountdetails.ui services/abstract/gui/authenticationdetails.ui services/abstract/gui/formaccountdetails.ui services/abstract/gui/formaddeditlabel.ui diff --git a/src/librssguard/core/feedsproxymodel.cpp b/src/librssguard/core/feedsproxymodel.cpp index 6f8a7fe17..a60bf4193 100644 --- a/src/librssguard/core/feedsproxymodel.cpp +++ b/src/librssguard/core/feedsproxymodel.cpp @@ -322,34 +322,6 @@ bool FeedsProxyModel::lessThan(const QModelIndex& left, const QModelIndex& right bool FeedsProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { bool should_show = filterAcceptsRowInternal(source_row, source_parent); - - /* - qDebugNN << LOGSEC_CORE << "Filter accepts row" - << QUOTE_W_SPACE(m_sourceModel->itemForIndex(m_sourceModel->index(source_row, 0, source_parent))->title()) - << "and filter result is:" << QUOTE_W_SPACE_DOT(should_show); - */ - - /* - if (should_show && (!filterRegularExpression().pattern().isEmpty() || - m_showUnreadOnly)) { - emit expandAfterFilterIn(m_sourceModel->index(source_row, 0, source_parent)); - } - */ - - if (should_show && m_hiddenIndices.contains(QPair(source_row, source_parent))) { - qDebugNN << LOGSEC_CORE << "Item was previously hidden and now shows up, expand."; - - const_cast(this)->m_hiddenIndices.removeAll(QPair(source_row, source_parent)); - - // Now, item now should be displayed and previously it was not. - // Expand! - emit expandAfterFilterIn(m_sourceModel->index(source_row, 0, source_parent)); - } - - if (!should_show) { - const_cast(this)->m_hiddenIndices.append(QPair(source_row, source_parent)); - } - return should_show; } @@ -362,6 +334,22 @@ bool FeedsProxyModel::filterAcceptsRowInternal(int source_row, const QModelIndex const RootItem* item = m_sourceModel->itemForIndex(idx); + if (item->kind() == RootItem::Kind::Important && !item->getParentServiceRoot()->nodeShowImportant()) { + return false; + } + + if (item->kind() == RootItem::Kind::Unread && !item->getParentServiceRoot()->nodeShowUnread()) { + return false; + } + + if (item->kind() == RootItem::Kind::Probes && !item->getParentServiceRoot()->nodeShowProbes()) { + return false; + } + + if (item->kind() == RootItem::Kind::Labels && !item->getParentServiceRoot()->nodeShowLabels()) { + return false; + } + if (item->kind() != RootItem::Kind::Category && item->kind() != RootItem::Kind::Feed && item->kind() != RootItem::Kind::Label) { // Some items are always visible. diff --git a/src/librssguard/core/feedsproxymodel.h b/src/librssguard/core/feedsproxymodel.h index 8514834fd..e8b0ed876 100644 --- a/src/librssguard/core/feedsproxymodel.h +++ b/src/librssguard/core/feedsproxymodel.h @@ -78,7 +78,6 @@ class FeedsProxyModel : public QSortFilterProxyModel { bool m_showNodeProbes; bool m_showNodeLabels; bool m_showNodeImportant; - QList> m_hiddenIndices; QList m_priorities; }; diff --git a/src/librssguard/gui/notifications/basetoastnotification.cpp b/src/librssguard/gui/notifications/basetoastnotification.cpp index 29cc3a4df..c90ae1342 100644 --- a/src/librssguard/gui/notifications/basetoastnotification.cpp +++ b/src/librssguard/gui/notifications/basetoastnotification.cpp @@ -71,11 +71,11 @@ void BaseToastNotification::setupTimedClosing() { } bool BaseToastNotification::eventFilter(QObject* watched, QEvent* event) { - if (event->type() == QEvent::Type::Enter) { + if (watched == this && event->type() == QEvent::Type::Enter) { stopTimedClosing(); } - if (event->type() == QEvent::Type::Leave) { + if (watched == this && event->type() == QEvent::Type::Leave) { setupTimedClosing(); } diff --git a/src/librssguard/services/abstract/gui/accountdetails.cpp b/src/librssguard/services/abstract/gui/accountdetails.cpp new file mode 100644 index 000000000..891f084ba --- /dev/null +++ b/src/librssguard/services/abstract/gui/accountdetails.cpp @@ -0,0 +1,7 @@ +// For license of this file, see /LICENSE.md. + +#include "accountdetails.h" + +AccountDetails::AccountDetails(QWidget* parent) : QWidget(parent) { + m_ui.setupUi(this); +} diff --git a/src/librssguard/services/abstract/gui/accountdetails.h b/src/librssguard/services/abstract/gui/accountdetails.h new file mode 100644 index 000000000..eff13dd65 --- /dev/null +++ b/src/librssguard/services/abstract/gui/accountdetails.h @@ -0,0 +1,26 @@ +// For license of this file, see /LICENSE.md. + +#ifndef ACCOUNTDETAILS_H +#define ACCOUNTDETAILS_H + +#include + +#include "ui_accountdetails.h" + +namespace Ui { + class AccountDetails; +} + +class AccountDetails : public QWidget { + Q_OBJECT + + friend class FormAccountDetails; + + public: + explicit AccountDetails(QWidget* parent = nullptr); + + private: + Ui::AccountDetails m_ui; +}; + +#endif // ACCOUNTDETAILS_H diff --git a/src/librssguard/services/abstract/gui/accountdetails.ui b/src/librssguard/services/abstract/gui/accountdetails.ui new file mode 100644 index 000000000..db6b40293 --- /dev/null +++ b/src/librssguard/services/abstract/gui/accountdetails.ui @@ -0,0 +1,64 @@ + + + AccountDetails + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + Display additional nodes + + + + + + Important + + + + + + + Unread + + + + + + + Labels + + + + + + + Probes + + + + + + + + + + m_cbImportant + m_cbUnread + m_cbLabels + m_cbProbes + + + + diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.cpp b/src/librssguard/services/abstract/gui/formaccountdetails.cpp index 8afc3ddf7..e8bbe4a66 100644 --- a/src/librssguard/services/abstract/gui/formaccountdetails.cpp +++ b/src/librssguard/services/abstract/gui/formaccountdetails.cpp @@ -5,21 +5,38 @@ #include "gui/guiutilities.h" #include "miscellaneous/application.h" #include "miscellaneous/iconfactory.h" +#include "services/abstract/importantnode.h" +#include "services/abstract/labelsnode.h" +#include "services/abstract/searchsnode.h" #include "services/abstract/serviceroot.h" +#include "services/abstract/unreadnode.h" FormAccountDetails::FormAccountDetails(const QIcon& icon, QWidget* parent) - : QDialog(parent), m_proxyDetails(new NetworkProxyDetails(this)), m_account(nullptr), m_creatingNew(false) { + : QDialog(parent), m_proxyDetails(new NetworkProxyDetails(this)), m_accountDetails(new AccountDetails(this)), + m_account(nullptr), m_creatingNew(false) { m_ui.setupUi(this); - insertCustomTab(m_proxyDetails, tr("Network proxy"), 0); - GuiUtilities::applyDialogProperties(*this, icon.isNull() - ? qApp->icons()->fromTheme(QSL("emblem-system")) - : icon); + insertCustomTab(m_accountDetails, tr("Miscellaneous"), 0); + insertCustomTab(m_proxyDetails, tr("Network proxy"), 1); + + GuiUtilities::applyDialogProperties(*this, icon.isNull() ? qApp->icons()->fromTheme(QSL("emblem-system")) : icon); createConnections(); } void FormAccountDetails::apply() { + m_account->setNodeShowImportant(m_accountDetails->m_ui.m_cbImportant->isChecked()); + m_account->setNodeShowLabels(m_accountDetails->m_ui.m_cbLabels->isChecked()); + m_account->setNodeShowProbes(m_accountDetails->m_ui.m_cbProbes->isChecked()); + m_account->setNodeShowUnread(m_accountDetails->m_ui.m_cbUnread->isChecked()); + m_account->setNetworkProxy(m_proxyDetails->proxy()); + + if (!m_creatingNew) { + m_account->itemChanged({m_account->importantNode(), + m_account->labelsNode(), + m_account->unreadNode(), + m_account->probesNode()}); + } } void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { @@ -50,6 +67,11 @@ void FormAccountDetails::loadAccountData() { } } + m_accountDetails->m_ui.m_cbImportant->setChecked(m_account->nodeShowImportant()); + m_accountDetails->m_ui.m_cbLabels->setChecked(m_account->nodeShowLabels()); + m_accountDetails->m_ui.m_cbProbes->setChecked(m_account->nodeShowProbes()); + m_accountDetails->m_ui.m_cbUnread->setChecked(m_account->nodeShowUnread()); + m_proxyDetails->setProxy(m_account->networkProxy()); } diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.h b/src/librssguard/services/abstract/gui/formaccountdetails.h index 0e4d7dc70..74c8f5bc9 100644 --- a/src/librssguard/services/abstract/gui/formaccountdetails.h +++ b/src/librssguard/services/abstract/gui/formaccountdetails.h @@ -11,19 +11,20 @@ #include "database/databasequeries.h" #include "gui/reusable/networkproxydetails.h" #include "miscellaneous/application.h" +#include "services/abstract/gui/accountdetails.h" class ServiceRoot; class FormAccountDetails : public QDialog { - Q_OBJECT + Q_OBJECT public: explicit FormAccountDetails(const QIcon& icon, QWidget* parent = nullptr); - template + template T* addEditAccount(T* account_to_edit = nullptr); - template + template T* account() const; protected slots: @@ -34,7 +35,6 @@ class FormAccountDetails : public QDialog { virtual void apply(); protected: - void activateTab(int index); void clearTabs(); void insertCustomTab(QWidget* custom_tab, const QString& title, int index); @@ -50,11 +50,12 @@ class FormAccountDetails : public QDialog { protected: Ui::FormAccountDetails m_ui; NetworkProxyDetails* m_proxyDetails; + AccountDetails* m_accountDetails; ServiceRoot* m_account; bool m_creatingNew; }; -template +template inline T* FormAccountDetails::addEditAccount(T* account_to_edit) { m_creatingNew = account_to_edit == nullptr; @@ -76,7 +77,7 @@ inline T* FormAccountDetails::addEditAccount(T* account_to_edit) { } } -template +template inline T* FormAccountDetails::account() const { return qobject_cast(m_account); } diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 6aa58c82c..a48491d3d 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -407,11 +407,17 @@ void ServiceRoot::saveAccountDataToDatabase() { } QVariantHash ServiceRoot::customDatabaseData() const { - return {}; + return {{QSL("show_node_unread"), m_nodeShowUnread}, + {QSL("show_node_important"), m_nodeShowImportant}, + {QSL("show_node_labels"), m_nodeShowLabels}, + {QSL("show_node_probes"), m_nodeShowProbes}}; } void ServiceRoot::setCustomDatabaseData(const QVariantHash& data) { - Q_UNUSED(data) + m_nodeShowUnread = data.value(QSL("show_node_unread"), true).toBool(); + m_nodeShowImportant = data.value(QSL("show_node_important"), true).toBool(); + m_nodeShowLabels = data.value(QSL("show_node_labels"), true).toBool(); + m_nodeShowProbes = data.value(QSL("show_node_probes"), true).toBool(); } bool ServiceRoot::wantsBaggedIdsOfExistingMessages() const { @@ -553,6 +559,38 @@ void ServiceRoot::restoreCustomCategoriesData(const QMap& Q_UNUSED(cats) } +bool ServiceRoot::nodeShowProbes() const { + return m_nodeShowProbes; +} + +void ServiceRoot::setNodeShowProbes(bool enabled) { + m_nodeShowProbes = enabled; +} + +bool ServiceRoot::nodeShowLabels() const { + return m_nodeShowLabels; +} + +void ServiceRoot::setNodeShowLabels(bool enabled) { + m_nodeShowLabels = enabled; +} + +bool ServiceRoot::nodeShowImportant() const { + return m_nodeShowImportant; +} + +void ServiceRoot::setNodeShowImportant(bool enabled) { + m_nodeShowImportant = enabled; +} + +bool ServiceRoot::nodeShowUnread() const { + return m_nodeShowUnread; +} + +void ServiceRoot::setNodeShowUnread(bool enabled) { + m_nodeShowUnread = enabled; +} + QNetworkProxy ServiceRoot::networkProxy() const { return m_networkProxy; } diff --git a/src/librssguard/services/abstract/serviceroot.h b/src/librssguard/services/abstract/serviceroot.h index b4c55f443..5c8ae2abc 100644 --- a/src/librssguard/services/abstract/serviceroot.h +++ b/src/librssguard/services/abstract/serviceroot.h @@ -248,6 +248,18 @@ class ServiceRoot : public RootItem { const QList& labels, const QList& probes); + bool nodeShowUnread() const; + void setNodeShowUnread(bool enabled); + + bool nodeShowImportant() const; + void setNodeShowImportant(bool enabled); + + bool nodeShowLabels() const; + void setNodeShowLabels(bool enabled); + + bool nodeShowProbes() const; + void setNodeShowProbes(bool enabled); + public slots: virtual void addNewFeed(RootItem* selected_item, const QString& url = QString()); virtual void addNewCategory(RootItem* selected_item); @@ -315,6 +327,10 @@ class ServiceRoot : public RootItem { int m_accountId; QList m_serviceMenu; QNetworkProxy m_networkProxy; + bool m_nodeShowUnread; + bool m_nodeShowImportant; + bool m_nodeShowLabels; + bool m_nodeShowProbes; }; #if QT_VERSION_MAJOR == 6 diff --git a/src/librssguard/services/feedly/feedlyserviceroot.cpp b/src/librssguard/services/feedly/feedlyserviceroot.cpp index 67b357de9..3b725cbb2 100644 --- a/src/librssguard/services/feedly/feedlyserviceroot.cpp +++ b/src/librssguard/services/feedly/feedlyserviceroot.cpp @@ -48,7 +48,7 @@ void FeedlyServiceRoot::editItems(const QList& items) { } QVariantHash FeedlyServiceRoot::customDatabaseData() const { - QVariantHash data; + QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("username")] = m_network->username(); data[QSL("dat")] = m_network->developerAccessToken(); @@ -65,6 +65,8 @@ QVariantHash FeedlyServiceRoot::customDatabaseData() const { } void FeedlyServiceRoot::setCustomDatabaseData(const QVariantHash& data) { + ServiceRoot::setCustomDatabaseData(data); + m_network->setUsername(data[QSL("username")].toString()); m_network->setDeveloperAccessToken(data[QSL("dat")].toString()); diff --git a/src/librssguard/services/gmail/gmailserviceroot.cpp b/src/librssguard/services/gmail/gmailserviceroot.cpp index 9ce378d9b..26476a967 100644 --- a/src/librssguard/services/gmail/gmailserviceroot.cpp +++ b/src/librssguard/services/gmail/gmailserviceroot.cpp @@ -72,7 +72,7 @@ void GmailServiceRoot::writeNewEmail() { } QVariantHash GmailServiceRoot::customDatabaseData() const { - QVariantHash data; + QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("username")] = m_network->username(); data[QSL("batch_size")] = m_network->batchSize(); @@ -86,6 +86,8 @@ QVariantHash GmailServiceRoot::customDatabaseData() const { } void GmailServiceRoot::setCustomDatabaseData(const QVariantHash& data) { + ServiceRoot::setCustomDatabaseData(data); + m_network->setUsername(data[QSL("username")].toString()); m_network->setBatchSize(data[QSL("batch_size")].toInt()); m_network->setDownloadOnlyUnreadMessages(data[QSL("download_only_unread")].toBool()); diff --git a/src/librssguard/services/greader/greaderserviceroot.cpp b/src/librssguard/services/greader/greaderserviceroot.cpp index 4618fbe18..0d0e69f02 100644 --- a/src/librssguard/services/greader/greaderserviceroot.cpp +++ b/src/librssguard/services/greader/greaderserviceroot.cpp @@ -45,7 +45,7 @@ void GreaderServiceRoot::editItems(const QList& items) { } QVariantHash GreaderServiceRoot::customDatabaseData() const { - QVariantHash data; + QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("service")] = int(m_network->service()); data[QSL("username")] = m_network->username(); @@ -72,6 +72,8 @@ QVariantHash GreaderServiceRoot::customDatabaseData() const { } void GreaderServiceRoot::setCustomDatabaseData(const QVariantHash& data) { + ServiceRoot::setCustomDatabaseData(data); + m_network->setService(GreaderServiceRoot::Service(data[QSL("service")].toInt())); m_network->setUsername(data[QSL("username")].toString()); m_network->setPassword(TextFactory::decrypt(data[QSL("password")].toString())); diff --git a/src/librssguard/services/owncloud/owncloudserviceroot.cpp b/src/librssguard/services/owncloud/owncloudserviceroot.cpp index 9d95baa4a..d453dc8b4 100644 --- a/src/librssguard/services/owncloud/owncloudserviceroot.cpp +++ b/src/librssguard/services/owncloud/owncloudserviceroot.cpp @@ -135,7 +135,7 @@ RootItem* OwnCloudServiceRoot::obtainNewTreeForSyncIn() const { } QVariantHash OwnCloudServiceRoot::customDatabaseData() const { - QVariantHash data; + QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("auth_username")] = m_network->authUsername(); data[QSL("auth_password")] = TextFactory::encrypt(m_network->authPassword()); @@ -148,6 +148,8 @@ QVariantHash OwnCloudServiceRoot::customDatabaseData() const { } void OwnCloudServiceRoot::setCustomDatabaseData(const QVariantHash& data) { + ServiceRoot::setCustomDatabaseData(data); + m_network->setAuthUsername(data[QSL("auth_username")].toString()); m_network->setAuthPassword(TextFactory::decrypt(data[QSL("auth_password")].toString())); m_network->setUrl(data[QSL("url")].toString()); diff --git a/src/librssguard/services/reddit/redditserviceroot.cpp b/src/librssguard/services/reddit/redditserviceroot.cpp index 214058267..7e6752373 100644 --- a/src/librssguard/services/reddit/redditserviceroot.cpp +++ b/src/librssguard/services/reddit/redditserviceroot.cpp @@ -36,7 +36,7 @@ RootItem* RedditServiceRoot::obtainNewTreeForSyncIn() const { } QVariantHash RedditServiceRoot::customDatabaseData() const { - QVariantHash data; + QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("username")] = m_network->username(); data[QSL("batch_size")] = m_network->batchSize(); @@ -50,6 +50,8 @@ QVariantHash RedditServiceRoot::customDatabaseData() const { } void RedditServiceRoot::setCustomDatabaseData(const QVariantHash& data) { + ServiceRoot::setCustomDatabaseData(data); + m_network->setUsername(data[QSL("username")].toString()); m_network->setBatchSize(data[QSL("batch_size")].toInt()); m_network->setDownloadOnlyUnreadMessages(data[QSL("download_only_unread")].toBool()); diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp index d51064c9f..c24291039 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp @@ -227,7 +227,7 @@ void TtRssServiceRoot::saveAllCachedData(bool ignore_errors) { } QVariantHash TtRssServiceRoot::customDatabaseData() const { - QVariantHash data; + QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("username")] = m_network->username(); data[QSL("password")] = TextFactory::encrypt(m_network->password()); @@ -244,6 +244,8 @@ QVariantHash TtRssServiceRoot::customDatabaseData() const { } void TtRssServiceRoot::setCustomDatabaseData(const QVariantHash& data) { + ServiceRoot::setCustomDatabaseData(data); + m_network->setUsername(data[QSL("username")].toString()); m_network->setPassword(TextFactory::decrypt(data[QSL("password")].toString())); m_network->setAuthIsUsed(data[QSL("auth_protected")].toBool());