diff options
Diffstat (limited to 'qt-ui/divetripmodel.cpp')
-rw-r--r-- | qt-ui/divetripmodel.cpp | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/qt-ui/divetripmodel.cpp b/qt-ui/divetripmodel.cpp new file mode 100644 index 000000000..a03603bcf --- /dev/null +++ b/qt-ui/divetripmodel.cpp @@ -0,0 +1,136 @@ +#include "divetripmodel.h" + + +DiveItem::DiveItem(int num, QString dt, float dur, float dep, QString loc, DiveItem *p): + number(num), dateTime(dt), duration(dur), depth(dep), location(loc), parentItem(p) +{ + if (parentItem) + parentItem->addChild(this); +} + + +DiveTripModel::DiveTripModel(const QString &filename, QObject *parent) : QAbstractItemModel(parent), filename(filename) +{ + rootItem = new DiveItem; +} + + +Qt::ItemFlags DiveTripModel::flags(const QModelIndex &index) const +{ + Qt::ItemFlags diveFlags = QAbstractItemModel::flags(index); + if (index.isValid()) { + diveFlags |= Qt::ItemIsSelectable|Qt::ItemIsEnabled; + } + return diveFlags; +} + + +QVariant DiveTripModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role != Qt::DisplayRole) + return QVariant(); + + DiveItem *item = static_cast<DiveItem*>(index.internalPointer()); + + QVariant retVal; + switch (index.column()) { + case DIVE_NUMBER: + retVal = QVariant(item->diveNumber()); + break; + case DIVE_DATE_TIME: + retVal = QVariant(item->diveDateTime()); + break; + case DIVE_DURATION: + retVal = QVariant(item->diveDuration()); + break; + case DIVE_DEPTH: + retVal = QVariant(item->diveDepth()); + break; + case DIVE_LOCATION: + retVal = QVariant(item->diveLocation()); + break; + default: + return QVariant(); + }; + return retVal; +} + + +QVariant DiveTripModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + if (section == DIVE_NUMBER) { + return tr("Dive number"); + } else if (section == DIVE_DATE_TIME) { + return tr("Date"); + } else if (section == DIVE_DURATION) { + return tr("Duration"); + } else if (section == DIVE_DEPTH) { + return tr("Depth"); + } else if (section == DIVE_LOCATION) { + return tr("Location"); + } + } + return QVariant(); +} + +int DiveTripModel::rowCount(const QModelIndex &parent) const +{ + /* only allow kids in column 0 */ + if (parent.isValid() && parent.column() > 0){ + return 0; + } + DiveItem *item = itemForIndex(parent); + return item ? item->childCount() : 0; +} + + + +int DiveTripModel::columnCount(const QModelIndex &parent) const +{ + return parent.isValid() && parent.column() != 0 ? 0 : COLUMNS; +} + + +QModelIndex DiveTripModel::index(int row, int column, const QModelIndex &parent) const +{ + + if (!rootItem || row < 0 || column < 0 || column >= COLUMNS || + (parent.isValid() && parent.column() != 0)) + return QModelIndex(); + + DiveItem *parentItem = itemForIndex(parent); + Q_ASSERT(parentItem); + if (DiveItem *item = parentItem->childAt(row)){ + return createIndex(row, column, item); + } + return QModelIndex(); +} + + +QModelIndex DiveTripModel::parent(const QModelIndex &childIndex) const +{ + if (!childIndex.isValid()) + return QModelIndex(); + + DiveItem *child = static_cast<DiveItem*>(childIndex.internalPointer()); + DiveItem *parent = child->parent(); + + if (parent == rootItem) + return QModelIndex(); + + return createIndex(parent->rowOfChild(child), 0, parent); +} + + +DiveItem* DiveTripModel::itemForIndex(const QModelIndex &index) const +{ + if (index.isValid()) { + DiveItem *item = static_cast<DiveItem*>(index.internalPointer()); + return item; + } + return rootItem; +} |