From ffd220e4f2cab85192e1427b736fb505d66b3c05 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sun, 13 Dec 2015 09:36:37 +0100 Subject: [PATCH] Much work, cleaning, marking... --- src/services/abstract/recyclebin.cpp | 2 +- src/services/abstract/rootitem.cpp | 13 ++++- src/services/standard/standardserviceroot.cpp | 4 +- src/services/tt-rss/ttrsscategory.cpp | 4 ++ src/services/tt-rss/ttrsscategory.h | 1 + src/services/tt-rss/ttrssfeed.cpp | 4 ++ src/services/tt-rss/ttrssfeed.h | 1 + src/services/tt-rss/ttrssrecyclebin.cpp | 25 ++++++++ src/services/tt-rss/ttrssrecyclebin.h | 6 ++ src/services/tt-rss/ttrssserviceroot.cpp | 57 ++++++++++++++++--- src/services/tt-rss/ttrssserviceroot.h | 1 + 11 files changed, 105 insertions(+), 13 deletions(-) diff --git a/src/services/abstract/recyclebin.cpp b/src/services/abstract/recyclebin.cpp index 5cc27df93..7f0ad4fc1 100755 --- a/src/services/abstract/recyclebin.cpp +++ b/src/services/abstract/recyclebin.cpp @@ -147,7 +147,7 @@ bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) { // Commit changes. if (db_handle.commit()) { - updateCounts(true); + updateCounts(false); parent_root->itemChanged(QList() << this); parent_root->requestReloadMessageList(status == RootItem::Read); diff --git a/src/services/abstract/rootitem.cpp b/src/services/abstract/rootitem.cpp index db3f6d039..f7745907b 100755 --- a/src/services/abstract/rootitem.cpp +++ b/src/services/abstract/rootitem.cpp @@ -20,6 +20,7 @@ #include "services/abstract/serviceroot.h" #include "services/abstract/feed.h" #include "services/abstract/category.h" +#include "services/abstract/recyclebin.h" #include "miscellaneous/application.h" #include @@ -84,9 +85,19 @@ QList RootItem::undeletedMessages() const { bool RootItem::cleanMessages(bool clear_only_read) { bool result = true; + RecycleBin *bin = NULL; foreach (RootItem *child, m_childItems) { - result &= child->cleanMessages(clear_only_read); + if (child->kind() == RootItemKind::Bin) { + bin = qobject_cast(child); + } + else { + result &= child->cleanMessages(clear_only_read); + } + } + + if (bin != NULL) { + result &= bin->cleanMessages(clear_only_read); } return result; diff --git a/src/services/standard/standardserviceroot.cpp b/src/services/standard/standardserviceroot.cpp index 97a974fb1..8fa26db42 100755 --- a/src/services/standard/standardserviceroot.cpp +++ b/src/services/standard/standardserviceroot.cpp @@ -196,14 +196,14 @@ bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { if (clean_read_only) { if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " - "WHERE feed IN (%1) AND is_deleted = 0 AND is_read = 1;").arg(textualFeedIds(items).join(QSL(", "))))) { + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 1;").arg(textualFeedIds(items).join(QSL(", "))))) { qWarning("Query preparation failed for feeds clearing."); return false; } } else { if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " - "WHERE feed IN (%1) AND is_deleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { qWarning("Query preparation failed for feeds clearing."); return false; } diff --git a/src/services/tt-rss/ttrsscategory.cpp b/src/services/tt-rss/ttrsscategory.cpp index ac5e11641..5ad6de9f4 100755 --- a/src/services/tt-rss/ttrsscategory.cpp +++ b/src/services/tt-rss/ttrsscategory.cpp @@ -62,6 +62,10 @@ bool TtRssCategory::markAsReadUnread(RootItem::ReadStatus status) { } } +bool TtRssCategory::cleanMessages(bool clear_only_read) { + return serviceRoot()->cleanFeeds(getSubTreeFeeds(), clear_only_read); +} + int TtRssCategory::customId() const { return m_customId; } diff --git a/src/services/tt-rss/ttrsscategory.h b/src/services/tt-rss/ttrsscategory.h index 599b8751e..1fcd9ccf5 100755 --- a/src/services/tt-rss/ttrsscategory.h +++ b/src/services/tt-rss/ttrsscategory.h @@ -36,6 +36,7 @@ class TtRssCategory : public Category { TtRssServiceRoot *serviceRoot(); bool markAsReadUnread(ReadStatus status); + bool cleanMessages(bool clear_only_read); int customId() const; void setCustomId(int custom_id); diff --git a/src/services/tt-rss/ttrssfeed.cpp b/src/services/tt-rss/ttrssfeed.cpp index a1e9ce144..6a724c639 100755 --- a/src/services/tt-rss/ttrssfeed.cpp +++ b/src/services/tt-rss/ttrssfeed.cpp @@ -161,6 +161,10 @@ bool TtRssFeed::markAsReadUnread(RootItem::ReadStatus status) { } } +bool TtRssFeed::cleanMessages(bool clear_only_read) { + return serviceRoot()->cleanFeeds(QList() << this, clear_only_read); +} + int TtRssFeed::customId() const { return m_customId; } diff --git a/src/services/tt-rss/ttrssfeed.h b/src/services/tt-rss/ttrssfeed.h index c49501049..66c6838a6 100755 --- a/src/services/tt-rss/ttrssfeed.h +++ b/src/services/tt-rss/ttrssfeed.h @@ -44,6 +44,7 @@ class TtRssFeed : public Feed { QList undeletedMessages() const; bool markAsReadUnread(ReadStatus status); + bool cleanMessages(bool clear_only_read); int customId() const; void setCustomId(int custom_id); diff --git a/src/services/tt-rss/ttrssrecyclebin.cpp b/src/services/tt-rss/ttrssrecyclebin.cpp index 80b477a7d..9cc7c96cd 100755 --- a/src/services/tt-rss/ttrssrecyclebin.cpp +++ b/src/services/tt-rss/ttrssrecyclebin.cpp @@ -17,6 +17,10 @@ #include "services/tt-rss/ttrssrecyclebin.h" +#include "services/tt-rss/definitions.h" +#include "services/tt-rss/network/ttrssnetworkfactory.h" +#include "services/tt-rss/ttrssserviceroot.h" + TtRssRecycleBin::TtRssRecycleBin(RootItem *parent) : RecycleBin(parent) { @@ -24,3 +28,24 @@ TtRssRecycleBin::TtRssRecycleBin(RootItem *parent) : RecycleBin(parent) { TtRssRecycleBin::~TtRssRecycleBin() { } + +TtRssServiceRoot *TtRssRecycleBin::serviceRoot() { + return qobject_cast(getParentServiceRoot()); +} + +bool TtRssRecycleBin::markAsReadUnread(RootItem::ReadStatus status) { + QNetworkReply::NetworkError error; + QStringList ids = serviceRoot()->customIDSOfMessagesForItem(this); + TtRssUpdateArticleResponse response = serviceRoot()->network()->updateArticles(ids, UpdateArticle::Unread, + status == RootItem::Unread ? + UpdateArticle::SetToTrue : + UpdateArticle::SetToFalse, + error); + + if (error != QNetworkReply::NoError || response.updateStatus() != STATUS_OK) { + return false; + } + else { + return RecycleBin::markAsReadUnread(status); + } +} diff --git a/src/services/tt-rss/ttrssrecyclebin.h b/src/services/tt-rss/ttrssrecyclebin.h index b235863aa..a013aae74 100755 --- a/src/services/tt-rss/ttrssrecyclebin.h +++ b/src/services/tt-rss/ttrssrecyclebin.h @@ -21,12 +21,18 @@ #include "services/abstract/recyclebin.h" +class TtRssServiceRoot; + class TtRssRecycleBin : public RecycleBin { Q_OBJECT public: explicit TtRssRecycleBin(RootItem *parent = 0); virtual ~TtRssRecycleBin(); + + TtRssServiceRoot *serviceRoot(); + + bool markAsReadUnread(ReadStatus status); }; #endif // TTRSSRECYCLEBIN_H diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index 8b5f54c68..885c3b3a4 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -43,15 +43,13 @@ TtRssServiceRoot::TtRssServiceRoot(RootItem *parent) } TtRssServiceRoot::~TtRssServiceRoot() { - if (m_network != NULL) { - delete m_network; - } + delete m_network; } void TtRssServiceRoot::start() { loadFromDatabase(); - if (childCount() == 0) { + if (childCount() == 1 && child(0)->kind() == RootItemKind::Bin) { syncIn(); } } @@ -158,7 +156,6 @@ QList TtRssServiceRoot::serviceMenu() { m_actionSyncIn = new QAction(qApp->icons()->fromTheme(QSL("item-sync")), tr("Sync in"), this); connect(m_actionSyncIn, SIGNAL(triggered()), this, SLOT(syncIn())); - m_serviceMenu.append(m_actionSyncIn); } @@ -178,7 +175,7 @@ bool TtRssServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QL read == RootItem::Unread ? UpdateArticle::SetToTrue : UpdateArticle::SetToFalse, error); - if (error == QNetworkReply::NoError && response.updateStatus() == STATUS_OK && response.articlesUpdated() == messages.size()) { + if (error == QNetworkReply::NoError && response.updateStatus() == STATUS_OK) { return true; } else { @@ -191,7 +188,6 @@ bool TtRssServiceRoot::onAfterSetMessagesRead(RootItem *selected_item, const QLi Q_UNUSED(read) selected_item->updateCounts(false); - itemChanged(QList() << selected_item); requestFeedReadFilterReload(); return true; @@ -210,7 +206,7 @@ bool TtRssServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item, UpdateArticle::Togggle, error); - if (error == QNetworkReply::NoError && response.updateStatus() == STATUS_OK && response.articlesUpdated() == changes.size()) { + if (error == QNetworkReply::NoError && response.updateStatus() == STATUS_OK) { return true; } else { @@ -246,7 +242,6 @@ bool TtRssServiceRoot::onAfterMessagesDelete(RootItem *selected_item, const QLis itemChanged(QList() << selected_item << m_recycleBin); } - requestFeedReadFilterReload(); return true; } @@ -378,6 +373,50 @@ bool TtRssServiceRoot::markFeedsReadUnread(QList items, RootItem::ReadSta } } +bool TtRssServiceRoot::cleanFeeds(QList items, bool clean_read_only) { + QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + QSqlQuery query_delete_msg(db_handle); + query_delete_msg.setForwardOnly(true); + + if (clean_read_only) { + if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 1;").arg(textualFeedIds(items).join(QSL(", "))))) { + qWarning("Query preparation failed for feeds clearing."); + return false; + } + } + else { + if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { + qWarning("Query preparation failed for feeds clearing."); + return false; + } + } + + query_delete_msg.bindValue(QSL(":deleted"), 1); + + if (!query_delete_msg.exec()) { + qDebug("Query execution for feeds clearing failed."); + return false; + } + else { + // Messages are cleared, now inform model about need to reload data. + QList itemss; + + foreach (Feed *feed, items) { + feed->updateCounts(true); + itemss.append(feed); + } + + m_recycleBin->updateCounts(true); + itemss.append(m_recycleBin); + + itemChanged(itemss); + requestReloadMessageList(true); + return true; + } +} + void TtRssServiceRoot::saveAccountDataToDatabase() { if (accountId() != NO_PARENT_CATEGORY) { // We are overwritting previously saved data. diff --git a/src/services/tt-rss/ttrssserviceroot.h b/src/services/tt-rss/ttrssserviceroot.h index 968d27cb0..af2277e3f 100755 --- a/src/services/tt-rss/ttrssserviceroot.h +++ b/src/services/tt-rss/ttrssserviceroot.h @@ -75,6 +75,7 @@ class TtRssServiceRoot : public ServiceRoot { QStringList customIDSOfMessagesForItem(RootItem *item); bool markFeedsReadUnread(QList items, ReadStatus read); + bool cleanFeeds(QList items, bool clean_read_only); void saveAccountDataToDatabase(); void updateTitle();