From 0cdfdd686d35dcf100760c074d4dfd0ef41acbd1 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 11 Dec 2013 18:54:09 +0100 Subject: [PATCH] FeedsModel work. --- CMakeLists.txt | 4 +- src/core/basefeedsmodelcategory.cpp | 10 -- src/core/basefeedsmodelitem.cpp | 11 --- src/core/feedsmodel.cpp | 91 +++++++++++++++++++ src/core/feedsmodel.h | 9 +- src/core/feedsmodelcategory.cpp | 10 ++ ...dsmodelcategory.h => feedsmodelcategory.h} | 7 +- src/core/feedsmodelfeed.cpp | 2 +- src/core/feedsmodelfeed.h | 2 +- src/core/feedsmodelitem.cpp | 11 +++ ...{basefeedsmodelitem.h => feedsmodelitem.h} | 10 +- src/core/feedsmodelnonrootitem.cpp | 13 ++- src/core/feedsmodelnonrootitem.h | 7 +- src/core/feedsmodelrootitem.cpp | 12 ++- src/core/feedsmodelrootitem.h | 13 ++- src/core/feedsproxymodel.cpp | 16 ++++ src/core/feedsproxymodel.h | 12 ++- src/core/messagesproxymodel.cpp | 14 +-- src/gui/feedsview.cpp | 6 ++ src/gui/feedsview.h | 7 ++ src/gui/tabbar.cpp | 17 ++-- 21 files changed, 222 insertions(+), 62 deletions(-) delete mode 100644 src/core/basefeedsmodelcategory.cpp delete mode 100644 src/core/basefeedsmodelitem.cpp create mode 100644 src/core/feedsmodelcategory.cpp rename src/core/{basefeedsmodelcategory.h => feedsmodelcategory.h} (63%) create mode 100644 src/core/feedsmodelitem.cpp rename src/core/{basefeedsmodelitem.h => feedsmodelitem.h} (64%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04d65c724..9d725febf 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,8 +269,8 @@ set(APP_SOURCES src/core/messagesproxymodel.cpp src/core/feedsmodel.cpp src/core/feedsproxymodel.cpp - src/core/basefeedsmodelitem.cpp - src/core/basefeedsmodelcategory.cpp + src/core/feedsmodelitem.cpp + src/core/feedsmodelcategory.cpp src/core/feedsmodelrootitem.cpp src/core/feedsmodelnonrootitem.cpp src/core/feedsmodelfeed.cpp diff --git a/src/core/basefeedsmodelcategory.cpp b/src/core/basefeedsmodelcategory.cpp deleted file mode 100644 index f31482e58..000000000 --- a/src/core/basefeedsmodelcategory.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "core/basefeedsmodelcategory.h" - - -BaseFeedsModelCategory::BaseFeedsModelCategory(BaseFeedsModelItem *parent_item) - : FeedsModelNonRootItem(parent_item) { -} - -BaseFeedsModelCategory::~BaseFeedsModelCategory() { - qDebug("Destroying BaseFeedsModelCategory instance."); -} diff --git a/src/core/basefeedsmodelitem.cpp b/src/core/basefeedsmodelitem.cpp deleted file mode 100644 index f88aca0cf..000000000 --- a/src/core/basefeedsmodelitem.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#include "core/basefeedsmodelitem.h" - - -BaseFeedsModelItem::BaseFeedsModelItem() { -} - -BaseFeedsModelItem::~BaseFeedsModelItem() { - qDebug("Destroying BaseFeedsModelItem instance."); -} diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 9a150c19d..f7d81b836 100644 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -1,12 +1,103 @@ #include "core/feedsmodel.h" #include "core/feedsmodelrootitem.h" +#include "core/feedsmodelnonrootitem.h" FeedsModel::FeedsModel(QObject *parent) : QAbstractItemModel(parent) { m_rootItem = new FeedsModelRootItem(); + + m_rootItem->m_childItems.append(new FeedsModelNonRootItem(m_rootItem)); + } FeedsModel::~FeedsModel() { qDebug("Destroying FeedsModel instance."); delete m_rootItem; } + +QVariant FeedsModel::data(const QModelIndex &index, int role) const { + return QVariant(); +} + +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 { + return QVariant(); + } +} + +QModelIndex FeedsModel::index(int row, int column, const QModelIndex &parent) const { + if (!hasIndex(row, column, parent)) { + return QModelIndex(); + } + + FeedsModelItem *parent_item; + + if (!parent.isValid()) { + parent_item = m_rootItem; + } + else { + parent_item = static_cast(parent.internalPointer()); + } + + FeedsModelItem *child_item = parent_item->child(row); + + if (child_item) { + return createIndex(row, column, child_item); + } + else { + return QModelIndex(); + } +} + +QModelIndex FeedsModel::parent(const QModelIndex &child) const { + if (!child.isValid()) { + return QModelIndex(); + } + + FeedsModelItem *child_item = static_cast(child.internalPointer()); + FeedsModelItem *parent_item = child_item->parent(); + + if (parent_item == m_rootItem) { + return QModelIndex(); + } + else { + return createIndex(parent_item->row(), 0, parent_item); + } +} + +int FeedsModel::rowCount(const QModelIndex &parent) const { + FeedsModelItem *parent_item; + + if (parent.column() > 0) { + return 0; + } + + if (!parent.isValid()) { + parent_item = m_rootItem; + } + else { + parent_item = static_cast(parent.internalPointer()); + } + + return parent_item->childCount(); +} + +int FeedsModel::columnCount(const QModelIndex &parent) const { + if (parent.isValid()) { + return static_cast(parent.internalPointer())->columnCount(); + } + else { + return m_rootItem->columnCount(); + } +} diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index 2e6b0243f..3d7a2bc02 100644 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -10,12 +10,17 @@ class FeedsModel : public QAbstractItemModel { Q_OBJECT public: + // Constructors and destructors. explicit FeedsModel(QObject *parent = 0); virtual ~FeedsModel(); - signals: + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + int columnCount(const QModelIndex &parent) const; + int rowCount(const QModelIndex &parent) const; - public slots: private: diff --git a/src/core/feedsmodelcategory.cpp b/src/core/feedsmodelcategory.cpp new file mode 100644 index 000000000..129e70b7c --- /dev/null +++ b/src/core/feedsmodelcategory.cpp @@ -0,0 +1,10 @@ +#include "core/feedsmodelcategory.h" + + +FeedsModelCategory::FeedsModelCategory(FeedsModelItem *parent_item) + : FeedsModelNonRootItem(parent_item) { +} + +FeedsModelCategory::~FeedsModelCategory() { + qDebug("Destroying BaseFeedsModelCategory instance."); +} diff --git a/src/core/basefeedsmodelcategory.h b/src/core/feedsmodelcategory.h similarity index 63% rename from src/core/basefeedsmodelcategory.h rename to src/core/feedsmodelcategory.h index c046275c1..9f0365925 100644 --- a/src/core/basefeedsmodelcategory.h +++ b/src/core/feedsmodelcategory.h @@ -6,12 +6,11 @@ // Base class for all categories contained in FeedsModel. // NOTE: This class is derived to create PARTICULAR category types. -class BaseFeedsModelCategory : public FeedsModelNonRootItem -{ +class FeedsModelCategory : public FeedsModelNonRootItem { public: // Constructors and destructors - explicit BaseFeedsModelCategory(BaseFeedsModelItem *parent_item); - virtual ~BaseFeedsModelCategory(); + explicit FeedsModelCategory(FeedsModelItem *parent_item); + virtual ~FeedsModelCategory(); }; diff --git a/src/core/feedsmodelfeed.cpp b/src/core/feedsmodelfeed.cpp index 0dd303a6b..19df4a768 100644 --- a/src/core/feedsmodelfeed.cpp +++ b/src/core/feedsmodelfeed.cpp @@ -1,7 +1,7 @@ #include "core/feedsmodelfeed.h" -FeedsModelFeed::FeedsModelFeed(BaseFeedsModelItem *parent_item) +FeedsModelFeed::FeedsModelFeed(FeedsModelItem *parent_item) :FeedsModelNonRootItem(parent_item) { } diff --git a/src/core/feedsmodelfeed.h b/src/core/feedsmodelfeed.h index b90381726..cc3839e63 100644 --- a/src/core/feedsmodelfeed.h +++ b/src/core/feedsmodelfeed.h @@ -10,7 +10,7 @@ class FeedsModelFeed : public FeedsModelNonRootItem { public: // Constructors and destructors. - explicit FeedsModelFeed(BaseFeedsModelItem *parent_item); + explicit FeedsModelFeed(FeedsModelItem *parent_item); virtual ~FeedsModelFeed(); int childCount() const; diff --git a/src/core/feedsmodelitem.cpp b/src/core/feedsmodelitem.cpp new file mode 100644 index 000000000..cdd0a3441 --- /dev/null +++ b/src/core/feedsmodelitem.cpp @@ -0,0 +1,11 @@ +#include + +#include "core/feedsmodelitem.h" + + +FeedsModelItem::FeedsModelItem() { +} + +FeedsModelItem::~FeedsModelItem() { + qDebug("Destroying BaseFeedsModelItem instance."); +} diff --git a/src/core/basefeedsmodelitem.h b/src/core/feedsmodelitem.h similarity index 64% rename from src/core/basefeedsmodelitem.h rename to src/core/feedsmodelitem.h index bd3345d3e..7aca9d88c 100644 --- a/src/core/basefeedsmodelitem.h +++ b/src/core/feedsmodelitem.h @@ -6,17 +6,19 @@ // Base class for all items contained in FeedsModel. -class BaseFeedsModelItem { +class FeedsModelItem { public: // Constructors and destructors. - explicit BaseFeedsModelItem(); - virtual ~BaseFeedsModelItem(); + explicit FeedsModelItem(); + virtual ~FeedsModelItem(); // Returns parent item of this item. // NOTE: Model ROOT item has NULL parent. - virtual BaseFeedsModelItem *parent() = 0; + virtual FeedsModelItem *parent() = 0; virtual int childCount() const = 0; virtual int columnCount() const = 0; + virtual FeedsModelItem *child(int row) = 0; + virtual int row() const = 0; protected: QIcon m_icon; diff --git a/src/core/feedsmodelnonrootitem.cpp b/src/core/feedsmodelnonrootitem.cpp index aa320a763..8a75c343c 100644 --- a/src/core/feedsmodelnonrootitem.cpp +++ b/src/core/feedsmodelnonrootitem.cpp @@ -1,7 +1,7 @@ #include "core/feedsmodelnonrootitem.h" -FeedsModelNonRootItem::FeedsModelNonRootItem(BaseFeedsModelItem *parent_item) +FeedsModelNonRootItem::FeedsModelNonRootItem(FeedsModelItem *parent_item) : FeedsModelRootItem(), m_parentItem(parent_item) { } @@ -9,6 +9,15 @@ FeedsModelNonRootItem::~FeedsModelNonRootItem() { qDebug("Destroying FeedsModelNonRootItem instance."); } -BaseFeedsModelItem *FeedsModelNonRootItem::parent() { +FeedsModelItem *FeedsModelNonRootItem::parent() { return m_parentItem; } + +int FeedsModelNonRootItem::row() const { + if (m_parentItem) { + return static_cast(m_parentItem)->m_childItems.indexOf((FeedsModelItem*) this); + } + else { + return 0; + } +} diff --git a/src/core/feedsmodelnonrootitem.h b/src/core/feedsmodelnonrootitem.h index ac73572e8..52e0f2299 100644 --- a/src/core/feedsmodelnonrootitem.h +++ b/src/core/feedsmodelnonrootitem.h @@ -10,13 +10,14 @@ class FeedsModelNonRootItem : public FeedsModelRootItem { public: // Constructors and destructors. - explicit FeedsModelNonRootItem(BaseFeedsModelItem *parent_item); + explicit FeedsModelNonRootItem(FeedsModelItem *parent_item); virtual ~FeedsModelNonRootItem(); - BaseFeedsModelItem *parent(); + FeedsModelItem *parent(); + int row() const; protected: - BaseFeedsModelItem *m_parentItem; + FeedsModelItem *m_parentItem; }; #endif // FEEDSMODELNONROOTITEM_H diff --git a/src/core/feedsmodelrootitem.cpp b/src/core/feedsmodelrootitem.cpp index a30e6dd39..14b9a2c51 100644 --- a/src/core/feedsmodelrootitem.cpp +++ b/src/core/feedsmodelrootitem.cpp @@ -2,7 +2,7 @@ FeedsModelRootItem::FeedsModelRootItem() - : BaseFeedsModelItem() { + : FeedsModelItem() { } FeedsModelRootItem::~FeedsModelRootItem() { @@ -10,14 +10,22 @@ FeedsModelRootItem::~FeedsModelRootItem() { qDeleteAll(m_childItems); } -BaseFeedsModelItem *FeedsModelRootItem::parent() { +FeedsModelItem *FeedsModelRootItem::parent() { return NULL; } +FeedsModelItem *FeedsModelRootItem::child(int row) { + return m_childItems.at(0); +} + int FeedsModelRootItem::columnCount() const { return 2; } +int FeedsModelRootItem::row() const { + return 0; +} + int FeedsModelRootItem::childCount() const { return m_childItems.count(); } diff --git a/src/core/feedsmodelrootitem.h b/src/core/feedsmodelrootitem.h index d2b53b579..6db9a785d 100644 --- a/src/core/feedsmodelrootitem.h +++ b/src/core/feedsmodelrootitem.h @@ -1,24 +1,29 @@ #ifndef FEEDMODELROOTITEM_H #define FEEDMODELROOTITEM_H -#include "core/basefeedsmodelitem.h" +#include "core/feedsmodelitem.h" // Represents ROOT item of FeedsModel. // NOTE: This class is derived to add functionality for // all non-root items of FeedsModel. -class FeedsModelRootItem : public BaseFeedsModelItem { +class FeedsModelRootItem : public FeedsModelItem { + friend class FeedsModelNonRootItem; + friend class FeedsModel; + public: // Constructors and destructors. explicit FeedsModelRootItem(); virtual ~FeedsModelRootItem(); - BaseFeedsModelItem *parent(); + FeedsModelItem *parent(); + FeedsModelItem *child(int row); int childCount() const; int columnCount() const; + int row() const; protected: - QList m_childItems; + QList m_childItems; }; diff --git a/src/core/feedsproxymodel.cpp b/src/core/feedsproxymodel.cpp index 05f2a5b31..6a3a27408 100644 --- a/src/core/feedsproxymodel.cpp +++ b/src/core/feedsproxymodel.cpp @@ -1,10 +1,26 @@ #include "core/feedsproxymodel.h" +#include "core/feedsmodel.h" FeedsProxyModel::FeedsProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { + m_sourceModel = new FeedsModel(this); + + + + + setSourceModel(m_sourceModel); } FeedsProxyModel::~FeedsProxyModel() { qDebug("Destroying FeedsProxyModel instance"); } + +FeedsModel *FeedsProxyModel::sourceModel() { + return m_sourceModel; +} + +bool FeedsProxyModel::lessThan(const QModelIndex &left, + const QModelIndex &right) const { + return QSortFilterProxyModel::lessThan(left, right); +} diff --git a/src/core/feedsproxymodel.h b/src/core/feedsproxymodel.h index 2c34cd81b..9a08ba1b7 100644 --- a/src/core/feedsproxymodel.h +++ b/src/core/feedsproxymodel.h @@ -4,17 +4,25 @@ #include +class FeedsModel; + class FeedsProxyModel : public QSortFilterProxyModel { Q_OBJECT public: + // Constructors and destructors. explicit FeedsProxyModel(QObject *parent = 0); virtual ~FeedsProxyModel(); - signals: + FeedsModel *sourceModel(); - public slots: + protected: + // Compares two rows of data. + bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + private: + // Source model pointer. + FeedsModel *m_sourceModel; }; #endif // FEEDSPROXYMODEL_H diff --git a/src/core/messagesproxymodel.cpp b/src/core/messagesproxymodel.cpp index 1ce916314..6e129ce19 100644 --- a/src/core/messagesproxymodel.cpp +++ b/src/core/messagesproxymodel.cpp @@ -29,27 +29,27 @@ bool MessagesProxyModel::lessThan(const QModelIndex &left, const QModelIndex &ri } QModelIndexList MessagesProxyModel::mapListFromSource(const QModelIndexList &indexes, bool deep) { - QModelIndexList mapped_idxs; + QModelIndexList mapped_indexes; foreach (const QModelIndex &index, indexes) { if (deep) { - mapped_idxs << mapFromSource(m_sourceModel->index(index.row(), index.column())); + mapped_indexes << mapFromSource(m_sourceModel->index(index.row(), index.column())); } else { - mapped_idxs << mapFromSource(index); + mapped_indexes << mapFromSource(index); } } - return mapped_idxs; + return mapped_indexes; } QModelIndexList MessagesProxyModel::mapListToSource(const QModelIndexList &indexes) { - QModelIndexList source_idxs; + QModelIndexList source_indexes; foreach (const QModelIndex &index, indexes) { - source_idxs << mapToSource(index); + source_indexes << mapToSource(index); } - return source_idxs; + return source_indexes; } diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index bdcd42129..82c6e794e 100644 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -1,7 +1,13 @@ #include "gui/feedsview.h" +#include "core/feedsmodel.h" +#include "core/feedsproxymodel.h" FeedsView::FeedsView(QWidget *parent) : QTreeView(parent) { + m_proxyModel = new FeedsProxyModel(this); + m_sourceModel = m_proxyModel->sourceModel(); + + setModel(m_proxyModel); } FeedsView::~FeedsView() { diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index 536ddd677..fb40897d7 100644 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -4,6 +4,9 @@ #include +class FeedsModel; +class FeedsProxyModel; + class FeedsView : public QTreeView { Q_OBJECT @@ -14,6 +17,10 @@ class FeedsView : public QTreeView { signals: public slots: + + private: + FeedsModel *m_sourceModel; + FeedsProxyModel *m_proxyModel; }; diff --git a/src/gui/tabbar.cpp b/src/gui/tabbar.cpp index 0107db690..daf47185f 100644 --- a/src/gui/tabbar.cpp +++ b/src/gui/tabbar.cpp @@ -29,16 +29,19 @@ void TabBar::wheelEvent(QWheelEvent *event) { // Make sure rotating works. if (number_of_tabs > 1) { - if (event->delta() > 0 && current_index == 0) { - setCurrentIndex(number_of_tabs - 1); + if (event->delta() > 0) { + // Scroll to the LEFT tab. + setCurrentIndex(current_index == 0 ? + number_of_tabs - 1 : + current_index - 1); } - else if (event->delta() < 0 && current_index == number_of_tabs - 1) { - setCurrentIndex(0); + else if (event->delta() < 0) { + // Scroll to the RIGHT tab. + setCurrentIndex(current_index == number_of_tabs - 1 ? + 0 : + current_index + 1); } } - else { - QTabBar::wheelEvent(event); - } } void TabBar::mousePressEvent(QMouseEvent *event) {