From 7bfbdca4e9597ff00ccbc087c91c2442ada086d7 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 10 Dec 2015 12:57:01 +0100 Subject: [PATCH] Added initial starred status switching. --- src/core/messagesmodel.cpp | 18 ++++---- src/services/abstract/serviceroot.h | 4 +- src/services/standard/standardserviceroot.cpp | 4 +- src/services/standard/standardserviceroot.h | 4 +- .../tt-rss/network/ttrssnetworkfactory.cpp | 14 +----- .../tt-rss/network/ttrssnetworkfactory.h | 4 +- src/services/tt-rss/ttrssserviceroot.cpp | 44 ++++++++++++++++--- src/services/tt-rss/ttrssserviceroot.h | 9 ++-- 8 files changed, 60 insertions(+), 41 deletions(-) diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index 05a22d9eb..874324a86 100755 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -301,11 +301,11 @@ bool MessagesModel::switchMessageImportance(int row_index) { RootItem::Importance current_importance = (RootItem::Importance) data(target_index, Qt::EditRole).toInt(); RootItem::Importance next_importance = current_importance == RootItem::Important ? RootItem::NotImportant : RootItem::Important; - int message_id = messageId(row_index); - QPair pair(message_id, next_importance); + Message message = messageAt(row_index); + QPair pair(message, next_importance); if (!m_selectedItem->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_selectedItem, - QList >() << pair)) { + QList >() << pair)) { return false; } @@ -326,14 +326,14 @@ bool MessagesModel::switchMessageImportance(int row_index) { return false; } - query_importance_msg.bindValue(QSL(":id"), message_id); + query_importance_msg.bindValue(QSL(":id"), message.m_id); query_importance_msg.bindValue(QSL(":important"), (int) next_importance); // Commit changes. if (query_importance_msg.exec()) { return m_selectedItem->getParentServiceRoot()->onAfterSwitchMessageImportance(m_selectedItem, - QList >() << pair); + QList >() << pair); } else { return false; @@ -343,17 +343,17 @@ bool MessagesModel::switchMessageImportance(int row_index) { bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages) { QSqlQuery query_read_msg(database()); QStringList message_ids; - QList > message_states; + QList > message_states; query_read_msg.setForwardOnly(true); // Obtain IDs of all desired messages. foreach (const QModelIndex &message, messages) { - int message_id = messageId(message.row()); + Message msg = messageAt(message.row()); RootItem::Importance message_importance = messageImportance((message.row())); - message_states.append(QPair(message_id, message_importance)); - message_ids.append(QString::number(message_id)); + message_states.append(QPair(msg, message_importance)); + message_ids.append(QString::number(msg.m_id)); } if (!m_selectedItem->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_selectedItem, message_states)) { diff --git a/src/services/abstract/serviceroot.h b/src/services/abstract/serviceroot.h index 5c3212c04..e67dacf7d 100755 --- a/src/services/abstract/serviceroot.h +++ b/src/services/abstract/serviceroot.h @@ -109,7 +109,7 @@ class ServiceRoot : public RootItem { // some ONLINE service or something. // // "changes" - list of pairs - - virtual bool onBeforeSwitchMessageImportance(RootItem *selected_item, QList > changes) = 0; + virtual bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList > &changes) = 0; // Called AFTER this importance switch update is stored in DB, // when false is returned, change is aborted. @@ -117,7 +117,7 @@ class ServiceRoot : public RootItem { // which items are actually changed. // // "changes" - list of pairs - - virtual bool onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes) = 0; + virtual bool onAfterSwitchMessageImportance(RootItem *selected_item, const QList > &changes) = 0; // Called BEFORE the list of messages is about to be deleted // by the user from message list. diff --git a/src/services/standard/standardserviceroot.cpp b/src/services/standard/standardserviceroot.cpp index 985f93c62..d706f3551 100755 --- a/src/services/standard/standardserviceroot.cpp +++ b/src/services/standard/standardserviceroot.cpp @@ -524,7 +524,7 @@ bool StandardServiceRoot::onAfterSetMessagesRead(RootItem *selected_item, const } bool StandardServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item, - QList > changes) { + const QList > &changes) { Q_UNUSED(selected_item) Q_UNUSED(changes) @@ -532,7 +532,7 @@ bool StandardServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_ite } bool StandardServiceRoot::onAfterSwitchMessageImportance(RootItem *selected_item, - QList > changes) { + const QList > &changes) { Q_UNUSED(selected_item) Q_UNUSED(changes) diff --git a/src/services/standard/standardserviceroot.h b/src/services/standard/standardserviceroot.h index ca782b283..4f2b5efdb 100755 --- a/src/services/standard/standardserviceroot.h +++ b/src/services/standard/standardserviceroot.h @@ -66,8 +66,8 @@ class StandardServiceRoot : public ServiceRoot { bool onBeforeSetMessagesRead(RootItem *selected_item, const QList &messages, ReadStatus read); bool onAfterSetMessagesRead(RootItem *selected_item, const QList &messages, ReadStatus read); - bool onBeforeSwitchMessageImportance(RootItem *selected_item, QList > changes); - bool onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes); + bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList > &changes); + bool onAfterSwitchMessageImportance(RootItem *selected_item, const QList > &changes); bool onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids); bool onAfterMessagesDelete(RootItem *selected_item, QList message_db_ids); diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.cpp b/src/services/tt-rss/network/ttrssnetworkfactory.cpp index f6cb1159d..a41073a0d 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.cpp +++ b/src/services/tt-rss/network/ttrssnetworkfactory.cpp @@ -171,14 +171,14 @@ TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, bool fo return result; } -TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QList &ids, +TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList &ids, UpdateArticle::OperatingField field, UpdateArticle::Mode mode, QNetworkReply::NetworkError &error) { QtJson::JsonObject json; json["op"] = "updateArticle"; json["sid"] = m_sessionId; - json["article_ids"] = encodeArticleIds(ids); + json["article_ids"] = ids.join(QL1C(',')); json["mode"] = (int) mode; json["field"] = (int) field; @@ -199,16 +199,6 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QList return result; } -QString TtRssNetworkFactory::encodeArticleIds(const QList &ids) { - QStringList strings; - - foreach (int id, ids) { - strings.append(QString::number(id)); - } - - return strings.join(QL1C(',')); -} - TtRssResponse::TtRssResponse(const QString &raw_content) { m_rawContent = QtJson::parse(raw_content).toMap(); } diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.h b/src/services/tt-rss/network/ttrssnetworkfactory.h index b7bf159fa..8c80f5eb6 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.h +++ b/src/services/tt-rss/network/ttrssnetworkfactory.h @@ -130,12 +130,10 @@ class TtRssNetworkFactory { bool show_content, bool include_attachments, bool sanitize, QNetworkReply::NetworkError &error); - TtRssUpdateArticleResponse updateArticles(const QList &ids, UpdateArticle::OperatingField field, + TtRssUpdateArticleResponse updateArticles(const QStringList &ids, UpdateArticle::OperatingField field, UpdateArticle::Mode mode, QNetworkReply::NetworkError &error); private: - QString encodeArticleIds(const QList &ids); - QString m_url; QString m_username; QString m_password; diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index 02a842b0c..8dbceeb0f 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -174,12 +174,32 @@ bool TtRssServiceRoot::onAfterSetMessagesRead(RootItem *selected_item, const QLi return true; } -bool TtRssServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item, QList > changes) { - return false; +bool TtRssServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item, const QList > &changes) { + Q_UNUSED(selected_item) + + QNetworkReply::NetworkError error; + + // NOTE: We just toggle it here, because we know, that there is only + // toggling of starred status supported by RSS Guard right now and + // Tiny Tiny RSS API allows it, which is greate. + TtRssUpdateArticleResponse response = m_network->updateArticles(customIDsOfMessages(changes), + UpdateArticle::Starred, + UpdateArticle::Togggle, + error); + + if (error == QNetworkReply::NoError && response.updateStatus() == STATUS_OK && response.articlesUpdated() == changes.size()) { + return true; + } + else { + return false; + } } -bool TtRssServiceRoot::onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes) { - return false; +bool TtRssServiceRoot::onAfterSwitchMessageImportance(RootItem *selected_item, const QList > &changes) { + Q_UNUSED(selected_item) + Q_UNUSED(changes) + + return true; } bool TtRssServiceRoot::onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids) { @@ -345,11 +365,21 @@ void TtRssServiceRoot::syncIn() { } } -QList TtRssServiceRoot::customIDsOfMessages(const QList &messages) { - QList list; +QStringList TtRssServiceRoot::customIDsOfMessages(const QList > &changes) { + QStringList list; + + for (int i = 0; i < changes.size(); i++) { + list.append(changes.at(i).first.m_customId); + } + + return list; +} + +QStringList TtRssServiceRoot::customIDsOfMessages(const QList &messages) { + QStringList list; foreach (const Message &message, messages) { - list.append(message.m_customId.toInt()); + list.append(message.m_customId); } return list; diff --git a/src/services/tt-rss/ttrssserviceroot.h b/src/services/tt-rss/ttrssserviceroot.h index 4d4b896e3..eacd42e34 100755 --- a/src/services/tt-rss/ttrssserviceroot.h +++ b/src/services/tt-rss/ttrssserviceroot.h @@ -57,8 +57,8 @@ class TtRssServiceRoot : public ServiceRoot { bool onBeforeSetMessagesRead(RootItem *selected_item, const QList &messages, ReadStatus read); bool onAfterSetMessagesRead(RootItem *selected_item, const QList &messages, ReadStatus read); - bool onBeforeSwitchMessageImportance(RootItem *selected_item, QList > changes); - bool onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes); + bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList > &changes); + bool onAfterSwitchMessageImportance(RootItem *selected_item, const QList > &changes); bool onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids); bool onAfterMessagesDelete(RootItem *selected_item, QList message_db_ids); @@ -76,8 +76,9 @@ class TtRssServiceRoot : public ServiceRoot { public slots: void syncIn(); - private: - QList customIDsOfMessages(const QList &messages); + private: + QStringList customIDsOfMessages(const QList > &changes); + QStringList customIDsOfMessages(const QList &messages); // Returns converted ids of given feeds // which are suitable as IN clause for SQL queries.