summaryrefslogtreecommitdiff
path: root/src/backend/bookshelfmodel/item.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/bookshelfmodel/item.h')
-rw-r--r--src/backend/bookshelfmodel/item.h170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/backend/bookshelfmodel/item.h b/src/backend/bookshelfmodel/item.h
new file mode 100644
index 0000000..cb2e6d9
--- /dev/null
+++ b/src/backend/bookshelfmodel/item.h
@@ -0,0 +1,170 @@
+/*********
+*
+* 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 ITEM_H
+#define ITEM_H
+
+#include <QIcon>
+#include <QList>
+#include <QString>
+#include <QtGlobal>
+
+class CSwordModuleInfo;
+
+namespace BookshelfModel {
+
+class Item {
+ public:
+ enum Type {
+ ITEM_ROOT = 0,
+ ITEM_CATEGORY = 1,
+ ITEM_LANGUAGE = 2,
+ ITEM_MODULE = 3,
+ ITEM_DISTRIBUTION = 4
+ };
+
+ Item(Type type);
+ virtual ~Item();
+
+ /**
+ \brief Returns the type of this item.
+ */
+ inline Type type() const { return m_type; }
+
+ /**
+ \brief Returns a pointer to the parent item of this item.
+ \retval 0 if this item has no parent.
+ */
+ inline Item *parent() const { return m_parent; }
+
+ /**
+ \brief Returns the list of child items of this node.
+ */
+ inline const QList<Item*> &children() const { return m_children; }
+
+ /**
+ \brief Returns a pointer to the child item at the given index.
+ \pre The given index is valid
+ \param[in] index Index of child item to return.
+ */
+ Item *childAt(int index) const {
+ Q_ASSERT(index >= 0 && index < m_children.size());
+ return m_children.at(index);
+ }
+
+ /**
+ \brief Returns the index of this item under its parent.
+ \retval -1 if this item has no parent.
+ */
+ inline int childIndex() {
+ if (m_parent == 0) return -1;
+ return m_parent->m_children.indexOf(this);
+ }
+
+ /**
+ \brief Returns the position for where the given child item would be
+ inserted.
+ \param[in] newItem Pointer to the item that would be inserted.
+ */
+ int indexFor(Item *newItem);
+
+ /**
+ \brief Inserts the given item as a child at the given index.
+ \pre The given index is a valid position for the item.
+ \param[in] index The child index to insert the item at.
+ \param[in] newItem The item to insert.
+ */
+ inline void insertChild(int index, Item *newItem) {
+ Q_ASSERT(newItem != 0);
+ Q_ASSERT(index >= 0 && index <= m_children.size());
+ m_children.insert(index, newItem);
+ newItem->setParent(this);
+ }
+
+ inline void deleteChildAt(int index) {
+ Q_ASSERT(index >= 0 && index <= m_children.size());
+ delete m_children.takeAt(index);
+ }
+
+ template <class T>
+ T *getGroupItem(CSwordModuleInfo *module, int *index) {
+ for (int i(0); i < m_children.size(); i++) {
+ Q_ASSERT(m_children.at(i)->type() == T::GROUP_TYPE);
+ T *item(static_cast<T*>(m_children.at(i)));
+ if (item->fitFor(module)) {
+ if (index != 0) *index = i;
+ return item;
+ }
+ }
+ return 0;
+ }
+
+ /**
+ \brief Returns the visible name of the item.
+ */
+ inline virtual QString name() const { return QString::null; }
+
+ /**
+ \brief Returns the visible icon of the item.
+ */
+ inline virtual QIcon icon() const { return QIcon(); }
+
+ /**
+ \brief Returns the check state of this item.
+ */
+ inline const Qt::CheckState checkState() const { return m_checkState; }
+
+ /**
+ \brief Sets the check state of this item.
+ \param[in] state new check state.
+ */
+ inline void setCheckState(const Qt::CheckState state) {
+ m_checkState = state;
+ }
+
+ /**
+ \brief Returns whether this item is fit to contain the given module.
+ \param[in] module The module to check with.
+ \retval true If this item is a group and can contain the given module.
+ \retval false This item is not a group or a wrong group.
+ */
+ inline virtual bool fitFor(CSwordModuleInfo *module) {
+ Q_UNUSED(module);
+ return false;
+ }
+
+ /**
+ \brief Comparsion operator used sorting child items.
+ */
+ bool operator<(const Item &other) const;
+
+ protected:
+ inline void setParent(Item *parent) {
+ Q_ASSERT(parent != 0);
+ m_parent = parent;
+ }
+
+ protected:
+ Type m_type;
+ Item *m_parent;
+ QList<Item*> m_children;
+ Qt::CheckState m_checkState;
+};
+
+class RootItem: public Item {
+ public:
+ inline RootItem() : Item(Item::ITEM_ROOT) {}
+};
+
+} // Namespace BookshelfModel
+
+#endif // ITEM_H