diff --git a/CMakeLists.txt b/CMakeLists.txt index dfa6eead9..1dc46c928 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -256,6 +256,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS qt-models/weigthsysteminfomodel.cpp qt-models/weightmodel.cpp qt-models/divecomputermodel.cpp + qt-models/treemodel.cpp qt-models/divecomputerextradatamodel.cpp qt-models/completionmodels.cpp ) diff --git a/qt-models/models.cpp b/qt-models/models.cpp index bbd5d7a0c..15e66f5b5 100644 --- a/qt-models/models.cpp +++ b/qt-models/models.cpp @@ -50,107 +50,6 @@ const QPixmap &trashIcon() * */ -TreeItem::TreeItem() -{ - parent = NULL; -} - -TreeItem::~TreeItem() -{ - qDeleteAll(children); -} - -Qt::ItemFlags TreeItem::flags(const QModelIndex &index) const -{ - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; -} - -int TreeItem::row() const -{ - if (parent) - return parent->children.indexOf(const_cast(this)); - return 0; -} - -QVariant TreeItem::data(int column, int role) const -{ - return QVariant(); -} - -TreeModel::TreeModel(QObject *parent) : QAbstractItemModel(parent) -{ - columns = 0; // I'm not sure about this one - I can't see where it gets initialized - rootItem = new TreeItem(); -} - -TreeModel::~TreeModel() -{ - delete rootItem; -} - -QVariant TreeModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid()) - return QVariant(); - - TreeItem *item = static_cast(index.internalPointer()); - QVariant val = item->data(index.column(), role); - - if (role == Qt::FontRole && !val.isValid()) - return defaultModelFont(); - else - return val; -} - -bool TreeItem::setData(const QModelIndex &index, const QVariant &value, int role) -{ - return false; -} - -QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const -{ - if (!hasIndex(row, column, parent)) - return QModelIndex(); - - TreeItem *parentItem = (!parent.isValid()) ? rootItem : static_cast(parent.internalPointer()); - - TreeItem *childItem = parentItem->children[row]; - - return (childItem) ? createIndex(row, column, childItem) : QModelIndex(); -} - -QModelIndex TreeModel::parent(const QModelIndex &index) const -{ - if (!index.isValid()) - return QModelIndex(); - - TreeItem *childItem = static_cast(index.internalPointer()); - TreeItem *parentItem = childItem->parent; - - if (parentItem == rootItem || !parentItem) - return QModelIndex(); - - return createIndex(parentItem->row(), 0, parentItem); -} - -int TreeModel::rowCount(const QModelIndex &parent) const -{ - TreeItem *parentItem; - - if (!parent.isValid()) - parentItem = rootItem; - else - parentItem = static_cast(parent.internalPointer()); - - int amount = parentItem->children.count(); - return amount; -} - -int TreeModel::columnCount(const QModelIndex &parent) const -{ - return columns; -} - /*################################################################ * * Implementation of the Dive List. diff --git a/qt-models/models.h b/qt-models/models.h index ec025af9d..e2a474e41 100644 --- a/qt-models/models.h +++ b/qt-models/models.h @@ -20,25 +20,11 @@ #include "../divelist.h" #include "../divecomputer.h" #include "cleanertablemodel.h" - +#include "treemodel.h" /*! An AbstractItemModel for recording dive trip information such as a list of dives. * */ -struct TreeItem { - Q_DECLARE_TR_FUNCTIONS(TreeItemDT); - -public: - virtual ~TreeItem(); - TreeItem(); - virtual QVariant data(int column, int role) const; - virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); - virtual Qt::ItemFlags flags(const QModelIndex &index) const; - - int row() const; - QList children; - TreeItem *parent; -}; struct DiveItem : public TreeItem { enum Column { @@ -75,21 +61,6 @@ struct DiveItem : public TreeItem { struct TripItem; -class TreeModel : public QAbstractItemModel { - Q_OBJECT -public: - TreeModel(QObject *parent = 0); - virtual ~TreeModel(); - virtual QVariant data(const QModelIndex &index, int role) const; - /*reimp*/ int rowCount(const QModelIndex &parent = QModelIndex()) const; - /*reimp*/ int columnCount(const QModelIndex &parent = QModelIndex()) const; - /*reimp*/ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; - /*reimp*/ QModelIndex parent(const QModelIndex &child) const; - -protected: - int columns; - TreeItem *rootItem; -}; class DiveTripModel : public TreeModel { Q_OBJECT diff --git a/qt-models/treemodel.cpp b/qt-models/treemodel.cpp new file mode 100644 index 000000000..558f690b2 --- /dev/null +++ b/qt-models/treemodel.cpp @@ -0,0 +1,103 @@ +#include "treemodel.h" +#include "metrics.h" + +TreeItem::TreeItem() +{ + parent = NULL; +} + +TreeItem::~TreeItem() +{ + qDeleteAll(children); +} + +Qt::ItemFlags TreeItem::flags(const QModelIndex &index) const +{ + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +int TreeItem::row() const +{ + if (parent) + return parent->children.indexOf(const_cast(this)); + return 0; +} + +QVariant TreeItem::data(int column, int role) const +{ + return QVariant(); +} + +TreeModel::TreeModel(QObject *parent) : QAbstractItemModel(parent) +{ + columns = 0; // I'm not sure about this one - I can't see where it gets initialized + rootItem = new TreeItem(); +} + +TreeModel::~TreeModel() +{ + delete rootItem; +} + +QVariant TreeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + TreeItem *item = static_cast(index.internalPointer()); + QVariant val = item->data(index.column(), role); + + if (role == Qt::FontRole && !val.isValid()) + return defaultModelFont(); + else + return val; +} + +bool TreeItem::setData(const QModelIndex &index, const QVariant &value, int role) +{ + return false; +} + +QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + TreeItem *parentItem = (!parent.isValid()) ? rootItem : static_cast(parent.internalPointer()); + + TreeItem *childItem = parentItem->children[row]; + + return (childItem) ? createIndex(row, column, childItem) : QModelIndex(); +} + +QModelIndex TreeModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + TreeItem *childItem = static_cast(index.internalPointer()); + TreeItem *parentItem = childItem->parent; + + if (parentItem == rootItem || !parentItem) + return QModelIndex(); + + return createIndex(parentItem->row(), 0, parentItem); +} + +int TreeModel::rowCount(const QModelIndex &parent) const +{ + TreeItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + int amount = parentItem->children.count(); + return amount; +} + +int TreeModel::columnCount(const QModelIndex &parent) const +{ + return columns; +} diff --git a/qt-models/treemodel.h b/qt-models/treemodel.h new file mode 100644 index 000000000..e95e53a91 --- /dev/null +++ b/qt-models/treemodel.h @@ -0,0 +1,39 @@ +#ifndef TREEMODEL_H +#define TREEMODEL_H + +#include +#include + +struct TreeItem { + Q_DECLARE_TR_FUNCTIONS(TreeItemDT) + +public: + virtual ~TreeItem(); + TreeItem(); + virtual QVariant data(int column, int role) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + + int row() const; + QList children; + TreeItem *parent; +}; + + +class TreeModel : public QAbstractItemModel { + Q_OBJECT +public: + TreeModel(QObject *parent = 0); + virtual ~TreeModel(); + virtual QVariant data(const QModelIndex &index, int role) const; + /*reimp*/ int rowCount(const QModelIndex &parent = QModelIndex()) const; + /*reimp*/ int columnCount(const QModelIndex &parent = QModelIndex()) const; + /*reimp*/ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + /*reimp*/ QModelIndex parent(const QModelIndex &child) const; + +protected: + int columns; + TreeItem *rootItem; +}; + +#endif