2014-01-14 18:43:58 +00:00
|
|
|
#include "diveplotdatamodel.h"
|
|
|
|
#include "dive.h"
|
|
|
|
#include "display.h"
|
|
|
|
#include "profile.h"
|
|
|
|
#include "graphicsview-common.h"
|
|
|
|
#include "dive.h"
|
|
|
|
#include "display.h"
|
2014-02-04 19:34:16 +00:00
|
|
|
#include "divelist.h"
|
2014-01-14 18:43:58 +00:00
|
|
|
#include <QDebug>
|
|
|
|
|
2014-02-09 17:47:56 +00:00
|
|
|
DivePlotDataModel::DivePlotDataModel(QObject* parent) : QAbstractTableModel(parent) , diveId(0)
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
2014-02-09 17:47:56 +00:00
|
|
|
memset(&pInfo, 0, sizeof(pInfo));
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int DivePlotDataModel::columnCount(const QModelIndex& parent) const
|
|
|
|
{
|
|
|
|
return COLUMNS;
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
|
|
|
|
{
|
2014-02-10 14:59:28 +00:00
|
|
|
if ((!index.isValid())||(index.row() >= pInfo.nr))
|
2014-01-14 18:43:58 +00:00
|
|
|
return QVariant();
|
|
|
|
|
2014-02-04 19:34:16 +00:00
|
|
|
plot_data item = pInfo.entry[index.row()];
|
2014-01-16 04:50:56 +00:00
|
|
|
if (role == Qt::DisplayRole) {
|
|
|
|
switch (index.column()) {
|
|
|
|
case DEPTH: return item.depth;
|
|
|
|
case TIME: return item.sec;
|
|
|
|
case PRESSURE: return item.pressure[0];
|
|
|
|
case TEMPERATURE: return item.temperature;
|
|
|
|
case COLOR: return item.velocity;
|
|
|
|
case USERENTERED: return false;
|
2014-01-17 13:07:52 +00:00
|
|
|
case CYLINDERINDEX: return item.cylinderindex;
|
|
|
|
case SENSOR_PRESSURE: return item.pressure[0];
|
|
|
|
case INTERPOLATED_PRESSURE: return item.pressure[1];
|
2014-01-21 16:59:19 +00:00
|
|
|
case CEILING: return item.ceiling;
|
2014-01-17 17:34:15 +00:00
|
|
|
case SAC: return item.sac;
|
2014-01-23 19:54:34 +00:00
|
|
|
case PN2: return item.pn2;
|
2014-01-23 19:59:14 +00:00
|
|
|
case PHE: return item.phe;
|
2014-01-23 20:03:28 +00:00
|
|
|
case PO2: return item.po2;
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
}
|
2014-01-21 17:31:56 +00:00
|
|
|
|
|
|
|
if (role == Qt::DisplayRole && index.column() >= TISSUE_1 && index.column() <= TISSUE_16){
|
|
|
|
return item.ceilings[ index.column() - TISSUE_1];
|
|
|
|
}
|
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
if (role == Qt::BackgroundRole) {
|
|
|
|
switch (index.column()) {
|
|
|
|
case COLOR: return getColor((color_indice_t)(VELOCITY_COLORS_START_IDX + item.velocity));
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
2014-02-04 19:34:16 +00:00
|
|
|
const plot_info& DivePlotDataModel::data() const
|
2014-01-21 15:27:08 +00:00
|
|
|
{
|
2014-02-04 19:34:16 +00:00
|
|
|
return pInfo;
|
2014-01-21 15:27:08 +00:00
|
|
|
}
|
|
|
|
|
2014-01-14 18:43:58 +00:00
|
|
|
int DivePlotDataModel::rowCount(const QModelIndex& parent) const
|
|
|
|
{
|
2014-02-04 19:34:16 +00:00
|
|
|
return pInfo.nr;
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QVariant DivePlotDataModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
|
|
{
|
|
|
|
if (orientation != Qt::Horizontal)
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
if (role != Qt::DisplayRole)
|
|
|
|
return QVariant();
|
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
switch (section) {
|
|
|
|
case DEPTH: return tr("Depth");
|
|
|
|
case TIME: return tr("Time");
|
|
|
|
case PRESSURE: return tr("Pressure");
|
|
|
|
case TEMPERATURE: return tr("Temperature");
|
|
|
|
case COLOR: return tr("Color");
|
|
|
|
case USERENTERED: return tr("User Entered");
|
2014-01-17 13:07:52 +00:00
|
|
|
case CYLINDERINDEX: return tr("Cylinder Index");
|
2014-01-17 17:34:15 +00:00
|
|
|
case SENSOR_PRESSURE: return tr("Pressure S");
|
|
|
|
case INTERPOLATED_PRESSURE: return tr("Pressure I");
|
2014-01-21 16:59:19 +00:00
|
|
|
case CEILING: return tr("Ceiling");
|
2014-01-17 17:34:15 +00:00
|
|
|
case SAC: return tr("SAC");
|
2014-01-23 19:54:34 +00:00
|
|
|
case PN2: return tr("PN2");
|
2014-01-23 19:59:14 +00:00
|
|
|
case PHE: return tr("PHE");
|
2014-01-23 20:03:28 +00:00
|
|
|
case PO2: return tr("PO2");
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
2014-01-21 17:31:56 +00:00
|
|
|
if (role == Qt::DisplayRole && section >= TISSUE_1 && section <= TISSUE_16){
|
|
|
|
return QString("Ceiling: %1").arg(section - TISSUE_1);
|
|
|
|
}
|
2014-01-14 18:43:58 +00:00
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DivePlotDataModel::clear()
|
|
|
|
{
|
2014-01-16 04:50:56 +00:00
|
|
|
if (rowCount() != 0) {
|
2014-01-14 18:43:58 +00:00
|
|
|
beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
|
2014-02-10 16:41:59 +00:00
|
|
|
pInfo.nr = 0;
|
2014-01-14 18:43:58 +00:00
|
|
|
endRemoveRows();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-04 19:34:16 +00:00
|
|
|
void DivePlotDataModel::setDive(dive* d, const plot_info& info)
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
|
|
|
// We need a way to find out if the dive setted is the same old dive, but pointers change,
|
|
|
|
// and there's no UUID, for now, just repopulate everything.
|
|
|
|
clear();
|
|
|
|
struct divecomputer *dc = NULL;
|
|
|
|
|
|
|
|
if (d)
|
|
|
|
dc = select_dc(&d->dc);
|
2014-01-21 16:05:29 +00:00
|
|
|
diveId = d->id;
|
2014-02-04 19:34:16 +00:00
|
|
|
pInfo = info;
|
|
|
|
beginInsertRows(QModelIndex(), 0, pInfo.nr-1);
|
2014-01-14 18:43:58 +00:00
|
|
|
endInsertRows();
|
|
|
|
}
|
2014-01-21 16:05:29 +00:00
|
|
|
|
|
|
|
int DivePlotDataModel::id() const
|
|
|
|
{
|
|
|
|
return diveId;
|
|
|
|
}
|
2014-01-27 17:14:42 +00:00
|
|
|
|
|
|
|
#define MAX_PPGAS_FUNC( GAS, GASFUNC ) \
|
|
|
|
double DivePlotDataModel::GASFUNC() \
|
|
|
|
{ \
|
|
|
|
double ret = -1; \
|
|
|
|
for(int i = 0, count = rowCount(); i < count; i++){ \
|
2014-02-04 19:34:16 +00:00
|
|
|
if (pInfo.entry[i].GAS > ret) \
|
|
|
|
ret = pInfo.entry[i].GAS; \
|
2014-01-27 17:14:42 +00:00
|
|
|
} \
|
|
|
|
return ret; \
|
|
|
|
}
|
|
|
|
|
|
|
|
MAX_PPGAS_FUNC(phe, pheMax);
|
|
|
|
MAX_PPGAS_FUNC(pn2, pn2Max);
|
|
|
|
MAX_PPGAS_FUNC(po2, po2Max);
|
|
|
|
|
|
|
|
void DivePlotDataModel::emitDataChanged()
|
|
|
|
{
|
|
|
|
emit dataChanged(QModelIndex(), QModelIndex());
|
|
|
|
}
|
2014-02-04 19:34:16 +00:00
|
|
|
|
|
|
|
void DivePlotDataModel::calculateDecompression()
|
|
|
|
{
|
|
|
|
struct dive *d = getDiveById(id());
|
2014-02-10 22:17:27 +00:00
|
|
|
if (!d)
|
|
|
|
return;
|
2014-02-04 19:34:16 +00:00
|
|
|
struct divecomputer *dc = select_dc(&d->dc);
|
|
|
|
init_decompression(d);
|
|
|
|
calculate_deco_information(d, dc, &pInfo, FALSE);
|
|
|
|
dataChanged(index(0, CEILING), index(pInfo.nr-1, TISSUE_16));
|
|
|
|
}
|