From f85de2c819e4807910827cd51154cf2dedd13a1e Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 12 Dec 2013 15:07:17 +0100 Subject: [PATCH] Work on feeds model/view. --- resources/misc/db_init.sql | 11 +++++ src/core/defs.h.in | 10 ++--- src/core/feedsmodel.cpp | 64 +++++++++++++++++---------- src/core/feedsmodel.h | 3 ++ src/core/feedsmodelcategory.cpp | 1 - src/core/feedsmodelcategory.h | 2 +- src/core/feedsmodelfeed.cpp | 1 - src/core/feedsmodelfeed.h | 10 ++++- src/core/feedsmodelrootitem.cpp | 5 +++ src/core/feedsmodelrootitem.h | 3 +- src/core/feedsmodelstandardcategory.h | 2 +- src/core/feedsmodelstandardfeed.cpp | 33 +++++++++++--- src/core/feedsmodelstandardfeed.h | 16 ++++++- src/gui/feedsview.cpp | 21 +++++++++ 14 files changed, 138 insertions(+), 44 deletions(-) diff --git a/resources/misc/db_init.sql b/resources/misc/db_init.sql index 01d518148..61824cc1c 100644 --- a/resources/misc/db_init.sql +++ b/resources/misc/db_init.sql @@ -36,6 +36,17 @@ CREATE TABLE IF NOT EXISTS Feeds ( type INTEGER NOT NULL ); -- ! +DROP TABLE IF EXISTS FeedsData; +-- ! +CREATE TABLE IF NOT EXISTS FeedsData ( + id INTEGER NOT NULL, + key TEXT NOT NULL, + value TEXT, + + PRIMARY KEY (id, key), + FOREIGN KEY (id) REFERENCES Feeds (id) +); +-- ! DROP TABLE IF EXISTS Messages; -- ! CREATE TABLE IF NOT EXISTS Messages ( diff --git a/src/core/defs.h.in b/src/core/defs.h.in index 5819a065b..c4fc1d505 100755 --- a/src/core/defs.h.in +++ b/src/core/defs.h.in @@ -64,13 +64,9 @@ #define MSG_DB_DUPDATED_INDEX 9 #define MSG_DB_CONTENTS_INDEX 10 -// Indexes of columns as they are USED IN THE MODEL for MESSAGES. -#define MSG_MODEL_READ_INDEX 0 -#define MSG_MODEL_IMPORTANT_INDEX 1 -#define MSG_MODEL_TITLE_INDEX 2 -#define MSG_MODEL_AUTHOR_INDEX 3 -#define MSG_MODEL_DCREATED_INDEX 4 -#define MSG_MODEL_DUPDATED_INDEX 5 +// Indexes of columns for feed models. +#define FDS_TITLE_INDEX 0 +#define FDS_COUNTS_INDEX 1 #if defined(Q_OS_LINUX) #define APP_DESKTOP_ENTRY_PATH "@DESKTOP_ENTRY_PATH@" diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 8ade74f36..78b950ee9 100644 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -1,18 +1,23 @@ #include "core/feedsmodel.h" #include "core/feedsmodelstandardcategory.h" #include "core/feedsmodelstandardfeed.h" +#include "core/defs.h" +#include "gui/iconthemefactory.h" FeedsModel::FeedsModel(QObject *parent) : QAbstractItemModel(parent) { - m_rootItem = new FeedsModelRootItem(NULL); + m_rootItem = new FeedsModelRootItem(); + m_countsIcon = IconThemeFactory::getInstance()->fromTheme("mail-mark-unread"); - FeedsModelStandardCategory *cat1 = new FeedsModelStandardCategory(m_rootItem); - FeedsModelStandardCategory *cat2 = new FeedsModelStandardCategory(cat1); - FeedsModelStandardFeed *feed1 = new FeedsModelStandardFeed(cat1); - FeedsModelStandardFeed *feed2 = new FeedsModelStandardFeed(cat1); - FeedsModelStandardFeed *feed3 = new FeedsModelStandardFeed(m_rootItem); - FeedsModelStandardFeed *feed4 = new FeedsModelStandardFeed(cat2); - FeedsModelStandardFeed *feed5 = new FeedsModelStandardFeed(cat2); + m_headerData << tr("Title"); + + FeedsModelStandardCategory *cat1 = new FeedsModelStandardCategory(); + FeedsModelStandardCategory *cat2 = new FeedsModelStandardCategory(); + FeedsModelStandardFeed *feed1 = new FeedsModelStandardFeed(); + FeedsModelStandardFeed *feed2 = new FeedsModelStandardFeed(); + FeedsModelStandardFeed *feed3 = new FeedsModelStandardFeed(); + FeedsModelStandardFeed *feed4 = new FeedsModelStandardFeed(); + FeedsModelStandardFeed *feed5 = new FeedsModelStandardFeed(); cat1->appendChild(feed1); cat1->appendChild(feed2); @@ -35,30 +40,41 @@ QVariant FeedsModel::data(const QModelIndex &index, int role) const { return QVariant(); } - if (role != Qt::DisplayRole) { - return QVariant(); - } - FeedsModelRootItem *item = static_cast(index.internalPointer()); - - return item->data(index.column(), Qt::DisplayRole); + return item->data(index.column(), role); } QVariant FeedsModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal) { - switch (role) { - case Qt::DisplayRole: - return "aaa"; - - default: - return QVariant(); - } - } - else { + if (orientation != Qt::Horizontal) { return QVariant(); } + + switch (role) { + case Qt::DisplayRole: + if (section == FDS_TITLE_INDEX) { + return m_headerData.at(FDS_TITLE_INDEX); + } + else { + return QVariant(); + } + + case Qt::ToolTipRole: + break; + + case Qt::DecorationRole: + if (section == FDS_COUNTS_INDEX) { + return m_countsIcon; + } + else { + return QVariant(); + } + + default: + return QVariant(); + } + } QModelIndex FeedsModel::index(int row, int column, const QModelIndex &parent) const { diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index 3d7a2bc02..940ed7c87 100644 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -2,6 +2,7 @@ #define FEEDSMODEL_H #include +#include class FeedsModelRootItem; @@ -25,6 +26,8 @@ class FeedsModel : public QAbstractItemModel { private: FeedsModelRootItem *m_rootItem; + QList m_headerData; + QIcon m_countsIcon; }; diff --git a/src/core/feedsmodelcategory.cpp b/src/core/feedsmodelcategory.cpp index 0d5680318..6d781f49c 100644 --- a/src/core/feedsmodelcategory.cpp +++ b/src/core/feedsmodelcategory.cpp @@ -6,5 +6,4 @@ FeedsModelCategory::FeedsModelCategory(FeedsModelRootItem *parent_item) } FeedsModelCategory::~FeedsModelCategory() { - qDebug("Destroying BaseFeedsModelCategory instance."); } diff --git a/src/core/feedsmodelcategory.h b/src/core/feedsmodelcategory.h index 6ca36cab3..e6f3ce4df 100644 --- a/src/core/feedsmodelcategory.h +++ b/src/core/feedsmodelcategory.h @@ -9,7 +9,7 @@ class FeedsModelCategory : public FeedsModelRootItem { public: // Constructors and destructors - explicit FeedsModelCategory(FeedsModelRootItem *parent_item); + explicit FeedsModelCategory(FeedsModelRootItem *parent_item = NULL); virtual ~FeedsModelCategory(); }; diff --git a/src/core/feedsmodelfeed.cpp b/src/core/feedsmodelfeed.cpp index e74126bdc..0fedffa29 100644 --- a/src/core/feedsmodelfeed.cpp +++ b/src/core/feedsmodelfeed.cpp @@ -6,7 +6,6 @@ FeedsModelFeed::FeedsModelFeed(FeedsModelRootItem *parent_item) } FeedsModelFeed::~FeedsModelFeed() { - qDebug("Destroying FeedsModelFeed instance."); } int FeedsModelFeed::childCount() const { diff --git a/src/core/feedsmodelfeed.h b/src/core/feedsmodelfeed.h index 8125610c2..9b66f8032 100644 --- a/src/core/feedsmodelfeed.h +++ b/src/core/feedsmodelfeed.h @@ -9,8 +9,16 @@ class FeedsModelFeed : public FeedsModelRootItem { public: + // Describes possible types of feeds. + // NOTE: This is equivalent to attribute Feeds(type). + enum Type { + StandardRss = 0, + StandardRdf = 1, + StandardAtom = 2 + }; + // Constructors and destructors. - explicit FeedsModelFeed(FeedsModelRootItem *parent_item); + explicit FeedsModelFeed(FeedsModelRootItem *parent_item = NULL); virtual ~FeedsModelFeed(); int childCount() const; diff --git a/src/core/feedsmodelrootitem.cpp b/src/core/feedsmodelrootitem.cpp index 33fc2d0dc..073c0992c 100644 --- a/src/core/feedsmodelrootitem.cpp +++ b/src/core/feedsmodelrootitem.cpp @@ -16,12 +16,17 @@ FeedsModelRootItem *FeedsModelRootItem::parent() { return m_parentItem; } +void FeedsModelRootItem::setParent(FeedsModelRootItem *parent_item) { + m_parentItem = parent_item; +} + FeedsModelRootItem *FeedsModelRootItem::child(int row) { return m_childItems.value(row); } void FeedsModelRootItem::appendChild(FeedsModelRootItem *child) { m_childItems.append(child); + child->setParent(this); } int FeedsModelRootItem::columnCount() const { diff --git a/src/core/feedsmodelrootitem.h b/src/core/feedsmodelrootitem.h index b40b24ba7..86b49b0bd 100644 --- a/src/core/feedsmodelrootitem.h +++ b/src/core/feedsmodelrootitem.h @@ -13,9 +13,10 @@ class FeedsModelRootItem { public: // Constructors and destructors. - explicit FeedsModelRootItem(FeedsModelRootItem *parent_item); + explicit FeedsModelRootItem(FeedsModelRootItem *parent_item = NULL); virtual ~FeedsModelRootItem(); + virtual void setParent(FeedsModelRootItem *parent_item); virtual FeedsModelRootItem *parent(); virtual FeedsModelRootItem *child(int row); virtual void appendChild(FeedsModelRootItem *child); diff --git a/src/core/feedsmodelstandardcategory.h b/src/core/feedsmodelstandardcategory.h index cf89ddb36..850afb227 100644 --- a/src/core/feedsmodelstandardcategory.h +++ b/src/core/feedsmodelstandardcategory.h @@ -12,7 +12,7 @@ class FeedsModelStandardCategory : public FeedsModelCategory { public: // Constructors and destructors. - explicit FeedsModelStandardCategory(FeedsModelRootItem *parent_item); + explicit FeedsModelStandardCategory(FeedsModelRootItem *parent_item = NULL); virtual ~FeedsModelStandardCategory(); QVariant data(int column, int role) const; diff --git a/src/core/feedsmodelstandardfeed.cpp b/src/core/feedsmodelstandardfeed.cpp index b2ca9cd82..8f6d31728 100644 --- a/src/core/feedsmodelstandardfeed.cpp +++ b/src/core/feedsmodelstandardfeed.cpp @@ -1,6 +1,8 @@ #include -#include "feedsmodelstandardfeed.h" +#include "core/defs.h" +#include "gui/iconthemefactory.h" +#include "core/feedsmodelstandardfeed.h" FeedsModelStandardFeed::FeedsModelStandardFeed(FeedsModelRootItem *parent_item) @@ -12,10 +14,29 @@ FeedsModelStandardFeed::~FeedsModelStandardFeed() { } QVariant FeedsModelStandardFeed::data(int column, int role) const { - if (role == Qt::DisplayRole) { - return "bbb"; - } - else { - return QVariant(); + switch (role) { + case Qt::DisplayRole: + if (column == FDS_TITLE_INDEX) { + return m_title; + } + else if (column == FDS_COUNTS_INDEX) { + return QString("(%1)").arg(QString::number(m_unreadCount)); + } + + case Qt::DecorationRole: + return column == FDS_TITLE_INDEX ? + m_icon : + QVariant(); + + case Qt::TextAlignmentRole: + if (column == FDS_COUNTS_INDEX) { + return Qt::AlignRight; + } + else { + return QVariant(); + } + + default: + return QVariant(); } } diff --git a/src/core/feedsmodelstandardfeed.h b/src/core/feedsmodelstandardfeed.h index e946ecc0b..90eee5274 100644 --- a/src/core/feedsmodelstandardfeed.h +++ b/src/core/feedsmodelstandardfeed.h @@ -1,19 +1,33 @@ #ifndef FEEDSMODELSTANDARDFEED_H #define FEEDSMODELSTANDARDFEED_H +#include + #include "core/feedsmodelfeed.h" // Represents STANDARD RSS/RDF/ATOM feed with no // online synchronization services (NO TT-RSS, NO FEEDLY). +// So, parent item is either root item or category. class FeedsModelStandardFeed : public FeedsModelFeed { public: // Constructors and destructors. - explicit FeedsModelStandardFeed(FeedsModelRootItem *parent_item); + explicit FeedsModelStandardFeed(FeedsModelRootItem *parent_item = NULL); virtual ~FeedsModelStandardFeed(); QVariant data(int column, int role) const; + + private: + QString m_title; + QDateTime m_creationDate; + QString m_encoding; + QString m_url; + QString m_description; + QString m_language; + + int m_totalCount; + int m_unreadCount; }; #endif // FEEDSMODELSTANDARDFEED_H diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index 82c6e794e..fb723b49c 100644 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -1,6 +1,9 @@ +#include + #include "gui/feedsview.h" #include "core/feedsmodel.h" #include "core/feedsproxymodel.h" +#include "core/defs.h" FeedsView::FeedsView(QWidget *parent) : QTreeView(parent) { @@ -8,6 +11,24 @@ FeedsView::FeedsView(QWidget *parent) : QTreeView(parent) { m_sourceModel = m_proxyModel->sourceModel(); setModel(m_proxyModel); + +#if QT_VERSION >= 0x050000 + // Setup column resize strategies. + header()->setSectionResizeMode(FDS_TITLE_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(FDS_COUNTS_INDEX, QHeaderView::ResizeToContents); +#else + // Setup column resize strategies. + header()->setResizeMode(FDS_TITLE_INDEX, QHeaderView::Interactive); + header()->setResizeMode(FDS_COUNTS_INDEX, QHeaderView::ResizeToContents); +#endif + + header()->setStretchLastSection(false); + setUniformRowHeights(true); + setAcceptDrops(false); + setDragEnabled(false); + setDragDropMode(QAbstractItemView::NoDragDrop); + setAllColumnsShowFocus(true); + setSelectionMode(QAbstractItemView::ExtendedSelection); } FeedsView::~FeedsView() {