Persistent auto-update across sync-in.

This commit is contained in:
Martin Rotter 2016-05-24 08:58:35 +02:00
parent ad8f96a37a
commit 1fcc1d8503
15 changed files with 136 additions and 21 deletions

View File

@ -5,6 +5,10 @@ Changed:
▪ Some minor tweaks for default icon theme loading.
Fixed:
▪ Auto-update interval/type is now persistent across sync-in for TT-RSS/ownCloud.
3.2.2
—————

View File

@ -112,4 +112,6 @@ class Feed : public RootItem {
int m_unreadCount;
};
Q_DECLARE_METATYPE(Feed::AutoUpdateType)
#endif // FEED_H

View File

@ -309,7 +309,7 @@ QHash<int,Category*> RootItem::getHashedSubTreeCategories() const {
while (!traversable_items.isEmpty()) {
RootItem *active_item = traversable_items.takeFirst();
if (active_item->kind() == RootItemKind::Category && !children.contains(active_item->id())) {
if (active_item->kind() == RootItemKind::Category && !children.contains(active_item->customId())) {
children.insert(active_item->customId(), active_item->toCategory());
}
@ -319,6 +319,26 @@ QHash<int,Category*> RootItem::getHashedSubTreeCategories() const {
return children;
}
QHash<int,Feed*> RootItem::getHashedSubTreeFeeds() const {
QHash<int,Feed*> children;
QList<RootItem*> traversable_items;
traversable_items.append(const_cast<RootItem* const>(this));
// Iterate all nested items.
while (!traversable_items.isEmpty()) {
RootItem *active_item = traversable_items.takeFirst();
if (active_item->kind() == RootItemKind::Feed && !children.contains(active_item->customId())) {
children.insert(active_item->customId(), active_item->toFeed());
}
traversable_items.append(active_item->childItems());
}
return children;
}
QList<Feed*> RootItem::getSubTreeFeeds() const {
QList<Feed*> children;
QList<RootItem*> traversable_items;

View File

@ -174,6 +174,7 @@ class RootItem : public QObject {
QList<RootItem*> getSubTree(RootItemKind::Kind kind_of_item) const;
QList<Category*> getSubTreeCategories() const;
QHash<int,Category*> getHashedSubTreeCategories() const;
QHash<int,Feed*> getHashedSubTreeFeeds() const;
QList<Feed*> getSubTreeFeeds() const;
// Returns the service root node which is direct or indirect parent of current item.

View File

@ -227,8 +227,12 @@ void ServiceRoot::syncIn() {
if (new_tree != NULL) {
// Purge old data from SQL and clean all model items.
requestItemExpandStateSave(this);
QMap<int,QVariant> feed_custom_data = storeCustomFeedsData();
removeOldFeedTree(false);
cleanAllItems();
restoreCustomFeedsData(feed_custom_data, new_tree->getHashedSubTreeFeeds());
// Model is clean, now store new tree into DB and
// set primary IDs of the items.

View File

@ -205,6 +205,9 @@ class ServiceRoot : public RootItem {
void itemRemovalRequested(RootItem *item);
private:
virtual QMap<int,QVariant> storeCustomFeedsData() = 0;
virtual void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds) = 0;
int m_accountId;
};

View File

@ -28,8 +28,8 @@
FormOwnCloudFeedDetails::FormOwnCloudFeedDetails(ServiceRoot *service_root, QWidget *parent)
: FormFeedDetails(service_root, parent) {
m_ui->m_cmbAutoUpdateType->setEnabled(false);
m_ui->m_spinAutoUpdateInterval->setEnabled(false);
m_ui->m_cmbAutoUpdateType->setEnabled(false);
m_ui->m_cmbType->setEnabled(false);
m_ui->m_cmbEncoding->setEnabled(false);
m_ui->m_btnFetchMetadata->setEnabled(false);
@ -89,8 +89,13 @@ void FormOwnCloudFeedDetails::apply() {
}
void FormOwnCloudFeedDetails::setEditableFeed(Feed *editable_feed) {
m_ui->m_cmbAutoUpdateType->setEnabled(true);
FormFeedDetails::setEditableFeed(editable_feed);
m_ui->m_txtTitle->setEnabled(true);
m_ui->m_gbAuthentication->setEnabled(false);
m_ui->m_txtUrl->setEnabled(false);
m_ui->m_lblParentCategory->setEnabled(false);
m_ui->m_cmbParentCategory->setEnabled(false);
}

View File

@ -217,6 +217,33 @@ void OwnCloudServiceRoot::addNewFeed(const QString &url) {
void OwnCloudServiceRoot::addNewCategory() {
}
QMap<int,QVariant> OwnCloudServiceRoot::storeCustomFeedsData() {
QMap<int,QVariant> custom_data;
foreach (const Feed *feed, getSubTreeFeeds()) {
QVariantMap feed_custom_data;
feed_custom_data.insert(QSL("auto_update_interval"), feed->autoUpdateInitialInterval());
feed_custom_data.insert(QSL("auto_update_type"), feed->autoUpdateType());
custom_data.insert(feed->customId(), feed_custom_data);
}
return custom_data;
}
void OwnCloudServiceRoot::restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds) {
foreach (int custom_id, data.keys()) {
if (feeds.contains(custom_id)) {
Feed *feed = feeds.value(custom_id);
QVariantMap feed_custom_data = data.value(custom_id).toMap();
feed->setAutoUpdateInitialInterval(feed_custom_data.value(QSL("auto_update_interval")).toInt());
feed->setAutoUpdateType(static_cast<Feed::AutoUpdateType>(feed_custom_data.value(QSL("auto_update_type")).toInt()));
}
}
}
RootItem *OwnCloudServiceRoot::obtainNewTreeForSyncIn() const {
OwnCloudGetFeedsCategoriesResponse feed_cats_response = m_network->feedsCategories();

View File

@ -56,6 +56,8 @@ class OwnCloudServiceRoot : public ServiceRoot {
void addNewCategory();
private:
QMap<int,QVariant> storeCustomFeedsData();
void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds);
RootItem *obtainNewTreeForSyncIn() const;
void loadFromDatabase();

View File

@ -190,6 +190,15 @@ void StandardServiceRoot::checkArgumentsForFeedAdding() {
}
}
QMap<int,QVariant> StandardServiceRoot::storeCustomFeedsData() {
return QMap<int,QVariant>();
}
void StandardServiceRoot::restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds) {
Q_UNUSED(feeds)
Q_UNUSED(data)
}
QString StandardServiceRoot::processFeedUrl(const QString &feed_url) {
if (feed_url.startsWith(QL1S(URI_SCHEME_FEED_SHORT))) {
QString without_feed_prefix = feed_url.mid(5);

View File

@ -88,6 +88,9 @@ class StandardServiceRoot : public ServiceRoot {
QList<QAction*> m_serviceMenu;
QList<QAction*> m_feedContextMenu;
QAction *m_actionFeedFetchMetadata;
QMap<int,QVariant> storeCustomFeedsData();
void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds);
};
#endif // STANDARDSERVICEROOT_H

View File

@ -20,6 +20,7 @@
#include "services/tt-rss/definitions.h"
#include "services/tt-rss/ttrssserviceroot.h"
#include "services/tt-rss/ttrsscategory.h"
#include "services/tt-rss/ttrssfeed.h"
#include "services/tt-rss/network/ttrssnetworkfactory.h"
#include "miscellaneous/application.h"
#include "gui/dialogs/formmain.h"
@ -29,8 +30,8 @@
FormTtRssFeedDetails::FormTtRssFeedDetails(ServiceRoot *service_root, QWidget *parent)
: FormFeedDetails(service_root, parent) {
m_ui->m_cmbAutoUpdateType->setEnabled(false);
m_ui->m_spinAutoUpdateInterval->setEnabled(false);
m_ui->m_cmbAutoUpdateType->setEnabled(false);
m_ui->m_cmbType->setEnabled(false);
m_ui->m_cmbEncoding->setEnabled(false);
m_ui->m_btnFetchMetadata->setEnabled(false);
@ -41,7 +42,15 @@ FormTtRssFeedDetails::FormTtRssFeedDetails(ServiceRoot *service_root, QWidget *p
void FormTtRssFeedDetails::apply() {
if (m_editableFeed != NULL) {
// No action to perform.
// User edited auto-update status. Save it.
TtRssFeed *new_feed_data = new TtRssFeed();
new_feed_data->setAutoUpdateType(static_cast<Feed::AutoUpdateType>(m_ui->m_cmbAutoUpdateType->itemData(m_ui->m_cmbAutoUpdateType->currentIndex()).toInt()));
new_feed_data->setAutoUpdateInitialInterval(m_ui->m_spinAutoUpdateInterval->value());
qobject_cast<TtRssFeed*>(m_editableFeed)->editItself(new_feed_data);
delete new_feed_data;
}
else {
RootItem *parent = static_cast<RootItem*>(m_ui->m_cmbParentCategory->itemData(m_ui->m_cmbParentCategory->currentIndex()).value<void*>());
@ -75,22 +84,14 @@ void FormTtRssFeedDetails::apply() {
}
void FormTtRssFeedDetails::setEditableFeed(Feed *editable_feed) {
m_ui->m_cmbAutoUpdateType->setEnabled(true);
FormFeedDetails::setEditableFeed(editable_feed);
if (editable_feed != NULL) {
// Tiny Tiny RSS does not support editing of these features.
// User can edit only individual auto-update statuses.
m_ui->m_gbAuthentication->setEnabled(false);
m_ui->m_txtUrl->setEnabled(false);
m_ui->m_lblParentCategory->setEnabled(false);
m_ui->m_cmbParentCategory->setEnabled(false);
}
else {
// Tiny Tiny RSS does not support editing of these features.
// User can edit only individual auto-update statuses.
m_ui->m_gbAuthentication->setEnabled(true);
m_ui->m_txtUrl->setEnabled(true);
m_ui->m_lblParentCategory->setEnabled(true);
m_ui->m_cmbParentCategory->setEnabled(true);
}
// Tiny Tiny RSS does not support editing of these features.
// User can edit only individual auto-update statuses.
m_ui->m_gbAuthentication->setEnabled(false);
m_ui->m_txtUrl->setEnabled(false);
m_ui->m_lblParentCategory->setEnabled(false);
m_ui->m_cmbParentCategory->setEnabled(false);
}

View File

@ -27,6 +27,7 @@
#include "services/tt-rss/ttrssserviceroot.h"
#include "services/tt-rss/ttrsscategory.h"
#include "services/tt-rss/network/ttrssnetworkfactory.h"
#include "services/tt-rss/gui/formttrssfeeddetails.h"
#include <QPointer>
@ -95,10 +96,14 @@ QVariant TtRssFeed::data(int column, int role) const {
}
bool TtRssFeed::canBeEdited() const {
return false;
return true;
}
bool TtRssFeed::editViaGui() {
QPointer<FormTtRssFeedDetails> form_pointer = new FormTtRssFeedDetails(serviceRoot(), qApp->mainForm());
form_pointer.data()->exec(this, NULL);
delete form_pointer.data();
return false;
}

View File

@ -280,3 +280,30 @@ RootItem *TtRssServiceRoot::obtainNewTreeForSyncIn() const {
return NULL;
}
}
QMap<int,QVariant> TtRssServiceRoot::storeCustomFeedsData() {
QMap<int,QVariant> custom_data;
foreach (const Feed *feed, getSubTreeFeeds()) {
QVariantMap feed_custom_data;
feed_custom_data.insert(QSL("auto_update_interval"), feed->autoUpdateInitialInterval());
feed_custom_data.insert(QSL("auto_update_type"), feed->autoUpdateType());
custom_data.insert(feed->customId(), feed_custom_data);
}
return custom_data;
}
void TtRssServiceRoot::restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds) {
foreach (int custom_id, data.keys()) {
if (feeds.contains(custom_id)) {
Feed *feed = feeds.value(custom_id);
QVariantMap feed_custom_data = data.value(custom_id).toMap();
feed->setAutoUpdateInitialInterval(feed_custom_data.value(QSL("auto_update_interval")).toInt());
feed->setAutoUpdateType(static_cast<Feed::AutoUpdateType>(feed_custom_data.value(QSL("auto_update_type")).toInt()));
}
}
}

View File

@ -64,6 +64,8 @@ class TtRssServiceRoot : public ServiceRoot {
private:
RootItem *obtainNewTreeForSyncIn() const;
QMap<int,QVariant> storeCustomFeedsData();
void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds);
void loadFromDatabase();