FeedsModel work.
This commit is contained in:
parent
2233dffb85
commit
0cdfdd686d
@ -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
|
||||
|
@ -1,10 +0,0 @@
|
||||
#include "core/basefeedsmodelcategory.h"
|
||||
|
||||
|
||||
BaseFeedsModelCategory::BaseFeedsModelCategory(BaseFeedsModelItem *parent_item)
|
||||
: FeedsModelNonRootItem(parent_item) {
|
||||
}
|
||||
|
||||
BaseFeedsModelCategory::~BaseFeedsModelCategory() {
|
||||
qDebug("Destroying BaseFeedsModelCategory instance.");
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
#include <QDebug>
|
||||
|
||||
#include "core/basefeedsmodelitem.h"
|
||||
|
||||
|
||||
BaseFeedsModelItem::BaseFeedsModelItem() {
|
||||
}
|
||||
|
||||
BaseFeedsModelItem::~BaseFeedsModelItem() {
|
||||
qDebug("Destroying BaseFeedsModelItem instance.");
|
||||
}
|
@ -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<FeedsModelItem*>(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<FeedsModelItem*>(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<FeedsModelItem*>(parent.internalPointer());
|
||||
}
|
||||
|
||||
return parent_item->childCount();
|
||||
}
|
||||
|
||||
int FeedsModel::columnCount(const QModelIndex &parent) const {
|
||||
if (parent.isValid()) {
|
||||
return static_cast<FeedsModelItem*>(parent.internalPointer())->columnCount();
|
||||
}
|
||||
else {
|
||||
return m_rootItem->columnCount();
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
|
10
src/core/feedsmodelcategory.cpp
Normal file
10
src/core/feedsmodelcategory.cpp
Normal file
@ -0,0 +1,10 @@
|
||||
#include "core/feedsmodelcategory.h"
|
||||
|
||||
|
||||
FeedsModelCategory::FeedsModelCategory(FeedsModelItem *parent_item)
|
||||
: FeedsModelNonRootItem(parent_item) {
|
||||
}
|
||||
|
||||
FeedsModelCategory::~FeedsModelCategory() {
|
||||
qDebug("Destroying BaseFeedsModelCategory instance.");
|
||||
}
|
@ -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();
|
||||
|
||||
};
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include "core/feedsmodelfeed.h"
|
||||
|
||||
|
||||
FeedsModelFeed::FeedsModelFeed(BaseFeedsModelItem *parent_item)
|
||||
FeedsModelFeed::FeedsModelFeed(FeedsModelItem *parent_item)
|
||||
:FeedsModelNonRootItem(parent_item) {
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
11
src/core/feedsmodelitem.cpp
Normal file
11
src/core/feedsmodelitem.cpp
Normal file
@ -0,0 +1,11 @@
|
||||
#include <QDebug>
|
||||
|
||||
#include "core/feedsmodelitem.h"
|
||||
|
||||
|
||||
FeedsModelItem::FeedsModelItem() {
|
||||
}
|
||||
|
||||
FeedsModelItem::~FeedsModelItem() {
|
||||
qDebug("Destroying BaseFeedsModelItem instance.");
|
||||
}
|
@ -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;
|
@ -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<FeedsModelRootItem*>(m_parentItem)->m_childItems.indexOf((FeedsModelItem*) this);
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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<BaseFeedsModelItem*> m_childItems;
|
||||
QList<FeedsModelItem*> m_childItems;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -4,17 +4,25 @@
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
|
||||
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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -4,6 +4,9 @@
|
||||
#include <QTreeView>
|
||||
|
||||
|
||||
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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user