From 76f71b4ca07dbef1069aec3db1138c199927b1bb Mon Sep 17 00:00:00 2001 From: Amit Chaudhuri Date: Fri, 12 Apr 2013 08:24:07 +0100 Subject: Add dive list view to main window Add files for dive list model/view implementation. Replace TableView with the custom list view. Amendments to makefile to match. Note: we don't yet handle trips and may want to add additional columns to describe the dive. A single, dummy dive is added to show how this works (get root; item is child of root). Purely to illustrate - needs proper integration etc. Amend member names for dive list view components Various naming changes to conform to coding style. Required changes to members (remove prefix) and methods (avoid clash with members). Clean up indentation (swap spaces for tabs). Code for model/view was written with a different editor which had different settings :-/ [Dirk Hohndel: minor whitespace cleanup] Signed-off-by: Amit Chaudhuri Signed-off-by: Dirk Hohndel --- qt-ui/divetripmodel.cpp | 136 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 qt-ui/divetripmodel.cpp (limited to 'qt-ui/divetripmodel.cpp') 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(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(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(index.internalPointer()); + return item; + } + return rootItem; +} -- cgit v1.2.3-70-g09d2