subsurface/qt-ui/profile/diveplotdatamodel.cpp
Tomaz Canabrava c99089e1fa Add settings awareness for the PP graph
This commit is rather big, and I forgot to cut it in pieces.
The first part creates a new 'calculate_gas_information' that will not
fill the profile_info->maxpp member ( that should be removed from it as
soon as the new dialog is finished ). The reason for that is that all of
the profile data will be calculated and the graph needs to update
dynamically, so whenever the settings changes, I ask for the model which
is the biggest graph and replot only the ones we need.

The second part adds a new animation function 'animdelete' to fade-out and
delete the item when it's done. the old function 'hide' did just that but
a hide shouldn't delete anything.

The third part is preferenes awareness for the PP graphs. I created two
new functions that receive the settings key for visibility and use the
QSettings to show / hide them. This also works quite well for the axis;
if no graph is visible, the axis will also hide itself.

The fourth part is colors. The pp graphs now have the correct colors.

And a bit of code cleanup too.

Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-01-27 09:15:28 -08:00

144 lines
3.6 KiB
C++

#include "diveplotdatamodel.h"
#include "dive.h"
#include "display.h"
#include "profile.h"
#include "graphicsview-common.h"
#include "dive.h"
#include "display.h"
#include <QDebug>
DivePlotDataModel::DivePlotDataModel(QObject* parent): QAbstractTableModel(parent), sampleCount(0), plotData(NULL)
{
}
int DivePlotDataModel::columnCount(const QModelIndex& parent) const
{
return COLUMNS;
}
QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid())
return QVariant();
plot_data item = plotData[index.row()];
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;
case CYLINDERINDEX: return item.cylinderindex;
case SENSOR_PRESSURE: return item.pressure[0];
case INTERPOLATED_PRESSURE: return item.pressure[1];
case CEILING: return item.ceiling;
case SAC: return item.sac;
case PN2: return item.pn2;
case PHE: return item.phe;
case PO2: return item.po2;
}
}
if (role == Qt::DisplayRole && index.column() >= TISSUE_1 && index.column() <= TISSUE_16){
return item.ceilings[ index.column() - TISSUE_1];
}
if (role == Qt::BackgroundRole) {
switch (index.column()) {
case COLOR: return getColor((color_indice_t)(VELOCITY_COLORS_START_IDX + item.velocity));
}
}
return QVariant();
}
plot_data* DivePlotDataModel::data()
{
return plotData;
}
int DivePlotDataModel::rowCount(const QModelIndex& parent) const
{
return sampleCount;
}
QVariant DivePlotDataModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation != Qt::Horizontal)
return QVariant();
if (role != Qt::DisplayRole)
return QVariant();
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");
case CYLINDERINDEX: return tr("Cylinder Index");
case SENSOR_PRESSURE: return tr("Pressure S");
case INTERPOLATED_PRESSURE: return tr("Pressure I");
case CEILING: return tr("Ceiling");
case SAC: return tr("SAC");
case PN2: return tr("PN2");
case PHE: return tr("PHE");
case PO2: return tr("PO2");
}
if (role == Qt::DisplayRole && section >= TISSUE_1 && section <= TISSUE_16){
return QString("Ceiling: %1").arg(section - TISSUE_1);
}
return QVariant();
}
void DivePlotDataModel::clear()
{
if (rowCount() != 0) {
beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
endRemoveRows();
}
}
void DivePlotDataModel::setDive(dive* d,const plot_info& pInfo)
{
// 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);
diveId = d->id;
plotData = pInfo.entry;
sampleCount = pInfo.nr;
beginInsertRows(QModelIndex(), 0, sampleCount-1);
endInsertRows();
}
int DivePlotDataModel::id() const
{
return diveId;
}
#define MAX_PPGAS_FUNC( GAS, GASFUNC ) \
double DivePlotDataModel::GASFUNC() \
{ \
double ret = -1; \
for(int i = 0, count = rowCount(); i < count; i++){ \
if (plotData[i].GAS > ret) \
ret = plotData[i].GAS; \
} \
return ret; \
}
MAX_PPGAS_FUNC(phe, pheMax);
MAX_PPGAS_FUNC(pn2, pn2Max);
MAX_PPGAS_FUNC(po2, po2Max);
void DivePlotDataModel::emitDataChanged()
{
emit dataChanged(QModelIndex(), QModelIndex());
}