Move some common code to superclasses.

This commit is contained in:
Martin Rotter 2016-02-11 07:28:49 +01:00
parent c625ba2301
commit 6fcdd5351c
13 changed files with 62 additions and 85 deletions

View File

@ -23,13 +23,21 @@
Feed::Feed(RootItem *parent) Feed::Feed(RootItem *parent)
: RootItem(parent), m_url(QString()), m_status(Normal), m_autoUpdateType(DefaultAutoUpdate), : RootItem(parent), m_url(QString()), m_status(Normal), m_autoUpdateType(DefaultAutoUpdate),
m_autoUpdateInitialInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_autoUpdateRemainingInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_autoUpdateInitialInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_autoUpdateRemainingInterval(DEFAULT_AUTO_UPDATE_INTERVAL),
m_totalCount(0), m_unreadCount(0) { m_totalCount(0), m_unreadCount(0), m_customId(NO_PARENT_CATEGORY) {
setKind(RootItemKind::Feed); setKind(RootItemKind::Feed);
} }
Feed::~Feed() { Feed::~Feed() {
} }
int Feed::customId() const {
return m_customId;
}
void Feed::setCustomId(int custom_id) {
m_customId = custom_id;
}
QVariant Feed::data(int column, int role) const { QVariant Feed::data(int column, int role) const {
switch (role) { switch (role) {
case Qt::ForegroundRole: case Qt::ForegroundRole:

View File

@ -100,6 +100,11 @@ class Feed : public RootItem {
m_url = url; m_url = url;
} }
int customId() const;
void setCustomId(int custom_id);
virtual int messageForeignKeyId() const = 0;
private: private:
QString m_url; QString m_url;
Status m_status; Status m_status;
@ -108,6 +113,7 @@ class Feed : public RootItem {
int m_autoUpdateRemainingInterval; int m_autoUpdateRemainingInterval;
int m_totalCount; int m_totalCount;
int m_unreadCount; int m_unreadCount;
int m_customId;
}; };
#endif // FEED_H #endif // FEED_H

View File

@ -204,7 +204,8 @@ class RootItem : public QObject {
m_icon = icon; m_icon = icon;
} }
// Each item has some kind of id. Usually taken from primary key attribute from DB. // This ALWAYS represents primary column number/ID under which
// the item is stored in DB.
inline int id() const { inline int id() const {
return m_id; return m_id;
} }

View File

@ -21,8 +21,10 @@
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/textfactory.h" #include "miscellaneous/textfactory.h"
#include "services/abstract/category.h" #include "services/abstract/category.h"
#include "services/abstract/feed.h"
#include "services/abstract/recyclebin.h" #include "services/abstract/recyclebin.h"
#include <QSqlTableModel>
#include <QSqlQuery> #include <QSqlQuery>
#include <QSqlError> #include <QSqlError>
@ -135,6 +137,17 @@ void ServiceRoot::requestItemRemoval(RootItem *item) {
emit itemRemovalRequested(item); emit itemRemovalRequested(item);
} }
QStringList ServiceRoot::textualFeedIds(const QList<Feed*> &feeds) const {
QStringList stringy_ids;
stringy_ids.reserve(feeds.size());
foreach (const Feed *feed, feeds) {
stringy_ids.append(QString("'%1'").arg(QString::number(feed->messageForeignKeyId())));
}
return stringy_ids;
}
int ServiceRoot::accountId() const { int ServiceRoot::accountId() const {
return m_accountId; return m_accountId;
} }
@ -143,6 +156,22 @@ void ServiceRoot::setAccountId(int account_id) {
m_accountId = account_id; m_accountId = account_id;
} }
bool ServiceRoot::loadMessagesForItem(RootItem *item, QSqlTableModel *model) {
if (item->kind() == RootItemKind::Bin) {
model->setFilter(QString("is_deleted = 1 AND is_pdeleted = 0 AND account_id = %1").arg(QString::number(accountId())));
}
else {
QList<Feed*> children = item->getSubTreeFeeds();
QString filter_clause = textualFeedIds(children).join(QSL(", "));
model->setFilter(QString("feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = %2").arg(filter_clause,
QString::number(accountId())));
qDebug("Loading messages from feeds: %s.", qPrintable(filter_clause));
}
return true;
}
bool ServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, RootItem::ReadStatus read) { bool ServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, RootItem::ReadStatus read) {
Q_UNUSED(messages) Q_UNUSED(messages)
Q_UNUSED(read) Q_UNUSED(read)

View File

@ -95,7 +95,7 @@ class ServiceRoot : public RootItem {
// and then use method QSqlTableModel::setFilter(....). // and then use method QSqlTableModel::setFilter(....).
// NOTE: It would be more preferable if all messages are downloaded // NOTE: It would be more preferable if all messages are downloaded
// right when feeds are updated. // right when feeds are updated.
virtual bool loadMessagesForItem(RootItem *item, QSqlTableModel *model) = 0; virtual bool loadMessagesForItem(RootItem *item, QSqlTableModel *model);
// Called BEFORE this read status update (triggered by user in message list) is stored in DB, // Called BEFORE this read status update (triggered by user in message list) is stored in DB,
// when false is returned, change is aborted. // when false is returned, change is aborted.
@ -164,6 +164,8 @@ class ServiceRoot : public RootItem {
virtual void addNewCategory() = 0; virtual void addNewCategory() = 0;
protected: protected:
QStringList textualFeedIds(const QList<Feed*> &feeds) const;
// Takes lists of feeds/categories and assembles them into the tree structure. // Takes lists of feeds/categories and assembles them into the tree structure.
void assembleCategories(Assignment categories); void assembleCategories(Assignment categories);
void assembleFeeds(Assignment feeds); void assembleFeeds(Assignment feeds);

View File

@ -605,6 +605,10 @@ bool StandardFeed::editItself(StandardFeed *new_feed_data) {
return true; return true;
} }
int StandardFeed::messageForeignKeyId() const {
return id();
}
int StandardFeed::updateMessages(const QList<Message> &messages) { int StandardFeed::updateMessages(const QList<Message> &messages) {
int feed_id = id(); int feed_id = id();
int updated_messages = 0; int updated_messages = 0;

View File

@ -90,6 +90,8 @@ class StandardFeed : public Feed {
bool addItself(RootItem *parent); bool addItself(RootItem *parent);
bool editItself(StandardFeed *new_feed_data); bool editItself(StandardFeed *new_feed_data);
int messageForeignKeyId() const;
// Other getters/setters. // Other getters/setters.
inline Type type() const { inline Type type() const {
return m_type; return m_type;

View File

@ -445,17 +445,6 @@ void StandardServiceRoot::exportFeeds() {
form.data()->exec(); form.data()->exec();
} }
QStringList StandardServiceRoot::textualFeedIds(const QList<Feed*> &feeds) {
QStringList stringy_ids;
stringy_ids.reserve(feeds.size());
foreach (Feed *feed, feeds) {
stringy_ids.append(QString("'%1'").arg(QString::number(feed->id())));
}
return stringy_ids;
}
QList<QAction*> StandardServiceRoot::addItemMenu() { QList<QAction*> StandardServiceRoot::addItemMenu() {
return QList<QAction*>(); return QList<QAction*>();
} }
@ -478,19 +467,3 @@ QList<QAction*> StandardServiceRoot::serviceMenu() {
QList<QAction*> StandardServiceRoot::contextMenu() { QList<QAction*> StandardServiceRoot::contextMenu() {
return serviceMenu(); return serviceMenu();
} }
bool StandardServiceRoot::loadMessagesForItem(RootItem *item, QSqlTableModel *model) {
if (item->kind() == RootItemKind::Bin) {
model->setFilter(QString("is_deleted = 1 AND is_pdeleted = 0 AND account_id = %1").arg(QString::number(accountId())));
}
else {
QList<Feed*> children = item->getSubTreeFeeds();
QString filter_clause = textualFeedIds(children).join(QSL(", "));
model->setFilter(QString(QSL("feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = %2")).arg(filter_clause,
QString::number(accountId())));
qDebug("Loading messages from feeds: %s.", qPrintable(filter_clause));
}
return true;
}

View File

@ -67,9 +67,6 @@ class StandardServiceRoot : public ServiceRoot {
// Returns context menu. // Returns context menu.
QList<QAction*> contextMenu(); QList<QAction*> contextMenu();
// Message stuff.
bool loadMessagesForItem(RootItem *item, QSqlTableModel *model);
// Returns context specific menu actions for given feed. // Returns context specific menu actions for given feed.
QList<QAction*> getContextMenuForFeed(StandardFeed *feed); QList<QAction*> getContextMenuForFeed(StandardFeed *feed);
@ -93,10 +90,6 @@ class StandardServiceRoot : public ServiceRoot {
private: private:
void checkArgumentsForFeedAdding(); void checkArgumentsForFeedAdding();
// Returns converted ids of given feeds
// which are suitable as IN clause for SQL queries.
QStringList textualFeedIds(const QList<Feed *> &feeds);
RecycleBin *m_recycleBin; RecycleBin *m_recycleBin;
QAction *m_actionExportFeeds; QAction *m_actionExportFeeds;
QAction *m_actionImportFeeds; QAction *m_actionImportFeeds;

View File

@ -35,7 +35,7 @@
TtRssFeed::TtRssFeed(RootItem *parent) TtRssFeed::TtRssFeed(RootItem *parent)
: Feed(parent), m_customId(NO_PARENT_CATEGORY) { : Feed(parent) {
} }
TtRssFeed::TtRssFeed(const QSqlRecord &record) : Feed(NULL) { TtRssFeed::TtRssFeed(const QSqlRecord &record) : Feed(NULL) {
@ -57,6 +57,10 @@ QString TtRssFeed::hashCode() const {
QString::number(customId()); QString::number(customId());
} }
int TtRssFeed::messageForeignKeyId() const {
return customId();
}
TtRssServiceRoot *TtRssFeed::serviceRoot() const { TtRssServiceRoot *TtRssFeed::serviceRoot() const {
return qobject_cast<TtRssServiceRoot*>(getParentServiceRoot()); return qobject_cast<TtRssServiceRoot*>(getParentServiceRoot());
} }
@ -241,14 +245,6 @@ bool TtRssFeed::cleanMessages(bool clear_only_read) {
return serviceRoot()->cleanFeeds(QList<Feed*>() << this, clear_only_read); return serviceRoot()->cleanFeeds(QList<Feed*>() << this, clear_only_read);
} }
int TtRssFeed::customId() const {
return m_customId;
}
void TtRssFeed::setCustomId(int custom_id) {
m_customId = custom_id;
}
bool TtRssFeed::editItself(TtRssFeed *new_feed_data) { bool TtRssFeed::editItself(TtRssFeed *new_feed_data) {
QSqlDatabase database = qApp->database()->connection("aa", DatabaseFactory::FromSettings); QSqlDatabase database = qApp->database()->connection("aa", DatabaseFactory::FromSettings);
QSqlQuery query_update(database); QSqlQuery query_update(database);

View File

@ -35,6 +35,8 @@ class TtRssFeed : public Feed {
QString hashCode() const; QString hashCode() const;
int messageForeignKeyId() const;
TtRssServiceRoot *serviceRoot() const; TtRssServiceRoot *serviceRoot() const;
QVariant data(int column, int role) const; QVariant data(int column, int role) const;
@ -52,18 +54,11 @@ class TtRssFeed : public Feed {
bool markAsReadUnread(ReadStatus status); bool markAsReadUnread(ReadStatus status);
bool cleanMessages(bool clear_only_read); bool cleanMessages(bool clear_only_read);
int customId() const;
void setCustomId(int custom_id);
bool editItself(TtRssFeed *new_feed_data); bool editItself(TtRssFeed *new_feed_data);
private: private:
bool removeItself(); bool removeItself();
int updateMessages(const QList<Message> &messages); int updateMessages(const QList<Message> &messages);
int m_customId;
}; };
#endif // TTRSSFEED_H #endif // TTRSSFEED_H

View File

@ -177,22 +177,6 @@ RecycleBin *TtRssServiceRoot::recycleBin() const {
return m_recycleBin; return m_recycleBin;
} }
bool TtRssServiceRoot::loadMessagesForItem(RootItem *item, QSqlTableModel *model) {
if (item->kind() == RootItemKind::Bin) {
model->setFilter(QString("is_deleted = 1 AND is_pdeleted = 0 AND account_id = %1").arg(QString::number(accountId())));
}
else {
QList<Feed*> children = item->getSubTreeFeeds();
QString filter_clause = textualFeedIds(children).join(QSL(", "));
model->setFilter(QString(QSL("feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = '%2'")).arg(filter_clause,
QString::number(accountId())));
qDebug("Loading messages from feeds: %s.", qPrintable(filter_clause));
}
return true;
}
QList<QAction*> TtRssServiceRoot::serviceMenu() { QList<QAction*> TtRssServiceRoot::serviceMenu() {
if (m_serviceMenu.isEmpty()) { if (m_serviceMenu.isEmpty()) {
m_actionSyncIn = new QAction(qApp->icons()->fromTheme(QSL("item-sync")), tr("Sync in"), this); m_actionSyncIn = new QAction(qApp->icons()->fromTheme(QSL("item-sync")), tr("Sync in"), this);
@ -603,17 +587,6 @@ QStringList TtRssServiceRoot::customIDsOfMessages(const QList<Message> &messages
return list; return list;
} }
QStringList TtRssServiceRoot::textualFeedIds(const QList<Feed*> &feeds) {
QStringList stringy_ids;
stringy_ids.reserve(feeds.size());
foreach (const Feed *feed, feeds) {
stringy_ids.append(QString("'%1'").arg(QString::number(qobject_cast<const TtRssFeed*>(feed)->customId())));
}
return stringy_ids;
}
void TtRssServiceRoot::removeOldFeedTree(bool including_messages) { void TtRssServiceRoot::removeOldFeedTree(bool including_messages) {
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlQuery query(database); QSqlQuery query(database);

View File

@ -58,7 +58,6 @@ class TtRssServiceRoot : public ServiceRoot {
RecycleBin *recycleBin() const; RecycleBin *recycleBin() const;
bool loadMessagesForItem(RootItem *item, QSqlTableModel *model);
bool onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, ReadStatus read); bool onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, ReadStatus read);
bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList<QPair<Message,RootItem::Importance> > &changes); bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList<QPair<Message,RootItem::Importance> > &changes);
@ -84,10 +83,6 @@ class TtRssServiceRoot : public ServiceRoot {
QStringList customIDsOfMessages(const QList<QPair<Message,Importance> > &changes); QStringList customIDsOfMessages(const QList<QPair<Message,Importance> > &changes);
QStringList customIDsOfMessages(const QList<Message> &messages); QStringList customIDsOfMessages(const QList<Message> &messages);
// Returns converted ids of given feeds
// which are suitable as IN clause for SQL queries.
QStringList textualFeedIds(const QList<Feed*> &feeds);
void removeOldFeedTree(bool including_messages); void removeOldFeedTree(bool including_messages);
void removeLeftOverMessages(); void removeLeftOverMessages();
void cleanAllItems(); void cleanAllItems();