diff options
Diffstat (limited to 'src/backend/bookshelfmodel/btbookshelftreemodel.h')
-rw-r--r-- | src/backend/bookshelfmodel/btbookshelftreemodel.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/backend/bookshelfmodel/btbookshelftreemodel.h b/src/backend/bookshelfmodel/btbookshelftreemodel.h new file mode 100644 index 0000000..0a84ac3 --- /dev/null +++ b/src/backend/bookshelfmodel/btbookshelftreemodel.h @@ -0,0 +1,114 @@ +/********* +* +* In the name of the Father, and of the Son, and of the Holy Spirit. +* +* This file is part of BibleTime's source code, http://www.bibletime.info/. +* +* Copyright 1999-2009 by the BibleTime developers. +* The BibleTime source code is licensed under the GNU General Public License +* version 2.0. +* +**********/ + +#ifndef BTBOOKSHELFTREEMODEL_H +#define BTBOOKSHELFTREEMODEL_H + +#include <QAbstractItemModel> + +#include <QMap> +#include "backend/bookshelfmodel/btbookshelfmodel.h" +#include "backend/bookshelfmodel/item.h" + +namespace BookshelfModel { + class ModuleItem; +} +class CSwordModuleInfo; + +class BtBookshelfTreeModel: public QAbstractItemModel { + Q_OBJECT + + typedef QMap<CSwordModuleInfo*, BookshelfModel::ModuleItem*> ModuleItemMap; + + public: + enum ModuleRole { + CheckStateRole = BtBookshelfModel::UserRole, + UserRole = BtBookshelfModel::UserRole + 100 + }; + enum Group { GROUP_CATEGORY, GROUP_LANGUAGE, GROUP_DISTRIBUTION }; + typedef QList<Group> Grouping; + + BtBookshelfTreeModel(QObject *parent = 0); + virtual ~BtBookshelfTreeModel(); + + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + virtual int columnCount(const QModelIndex &parent = QModelIndex()) + const; + virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) + const; + virtual QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) + const; + virtual QModelIndex parent(const QModelIndex &index) const; + virtual QVariant data(const QModelIndex &index, int role) const; + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, + int role); + + void setSourceModel(QAbstractListModel *sourceModel); + inline QAbstractListModel *sourceModel() const { return m_sourceModel; } + void setGroupingOrder(const Grouping &groupingOrder); + inline Grouping groupingOrder() const { return m_groupingOrder; } + void setCheckable(bool checkable); + inline bool checkable() const { return m_checkable; } + inline void setDefaultChecked(bool defaultChecked) { + m_defaultChecked = defaultChecked; + } + inline bool defaultChecked() const { return m_defaultChecked; } + + QList<CSwordModuleInfo*> checkedModules() const; + + protected: + void addModule(CSwordModuleInfo *module, bool checked); + void addModule(CSwordModuleInfo *module, QModelIndex parentIndex, + Grouping &intermediateGrouping, bool checked); + void removeModule(CSwordModuleInfo *module); + + BookshelfModel::Item *getItem(const QModelIndex &index) const; + void resetParentCheckStates(QModelIndex parentIndex); + + template <class T> + QModelIndex getGroup(CSwordModuleInfo *module, + QModelIndex parentIndex) + { + BookshelfModel::Item *parentItem(getItem(parentIndex)); + int groupIndex; + T *groupItem(parentItem->getGroupItem<T>(module, &groupIndex)); + + if (groupItem == 0) { + groupItem = new T(module); + groupIndex = parentItem->indexFor(groupItem); + beginInsertRows(parentIndex, groupIndex, groupIndex); + parentItem->insertChild(groupIndex, groupItem); + endInsertRows(); + } + return index(groupIndex, 0, parentIndex); + } + + protected slots: + void moduleDataChanged(const QModelIndex &topLeft, + const QModelIndex &bottomRight); + void moduleInserted(const QModelIndex &parent, int start, int end); + void moduleRemoved(const QModelIndex &parent, int start, int end); + + protected: + QAbstractListModel *m_sourceModel; + BookshelfModel::Item *m_rootItem; + ModuleItemMap m_modules; + Grouping m_groupingOrder; + bool m_checkable; + bool m_defaultChecked; +}; + +#endif // BTBOOKSHELFTREEMODEL_H |