Added a Model that should handle the Dive Profile

This model encapsulates the plot_info struct and provides
a consistent way to show it using the Qt Model view system
in the C++ and QML way. For a QGraphicsItem that should show
a Profile, this is the start.

Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2014-01-14 16:43:58 -02:00 committed by Dirk Hohndel
parent 215e22481a
commit 7d5cf32501
6 changed files with 132 additions and 6 deletions

View file

@ -305,7 +305,7 @@ static velocity_t velocity(int speed)
return v;
}
static struct plot_info *analyze_plot_info(struct plot_info *pi)
struct plot_info *analyze_plot_info(struct plot_info *pi)
{
int i;
int nr = pi->nr;
@ -783,7 +783,7 @@ void calculate_max_limits(struct dive *dive, struct divecomputer *dc, struct gra
pi->maxtemp = maxtemp;
}
static struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi)
struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi)
{
int idx, maxtime, nr, i;
int lastdepth, lasttime, lasttemp = 0;

View file

@ -49,6 +49,8 @@ struct plot_info *create_plot_info(struct dive *dive, struct divecomputer *dc, s
int setup_temperature_limits(struct graphics_context *gc);
int get_cylinder_pressure_range(struct graphics_context *gc);
void compare_samples(struct plot_data *e1, struct plot_data *e2, char *buf, int bufsize, int sum);
struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi);
struct plot_info *analyze_plot_info(struct plot_info *pi);
struct ev_select {
char *ev_name;

View file

@ -34,7 +34,6 @@ typedef enum {
extern QMap<color_indice_t, QVector<QColor> > profile_color;
void fill_profile_color();
QColor getColor(const color_indice_t i);
#endif

View file

@ -0,0 +1,97 @@
#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), plotData(NULL), sampleCount(0)
{
}
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;
}
}
if (role == Qt::BackgroundRole){
switch(index.column()){
case COLOR: return getColor((color_indice_t)(VELOCITY_COLORS_START_IDX + item.velocity));
}
}
return QVariant();
}
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");
}
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);
/* Create the new plot data */
if (plotData)
free((void *)plotData);
plot_info info = pInfo;
plotData = populate_plot_entries(d, dc, &info); // Create the plot data.
analyze_plot_info(&info); // Get the Velocity Color information.
sampleCount = info.nr;
beginInsertRows(QModelIndex(), 0, sampleCount-1);
endInsertRows();
}

View file

@ -0,0 +1,26 @@
#ifndef DIVEPLOTDATAMODEL_H
#define DIVEPLOTDATAMODEL_H
#include <QAbstractTableModel>
struct dive;
struct plot_data;
struct plot_info;
class DivePlotDataModel : public QAbstractTableModel{
Q_OBJECT
public:
enum {DEPTH, TIME, PRESSURE, TEMPERATURE, USERENTERED, COLOR, COLUMNS};
explicit DivePlotDataModel(QObject* parent = 0);
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
void clear();
void setDive(struct dive *d, const plot_info& pInfo);
private:
int sampleCount;
plot_data *plotData;
};
#endif

View file

@ -69,7 +69,8 @@ HEADERS = \
qt-ui/profile/divelineitem.h \
qt-ui/profile/divetextitem.h \
qt-ui/profile/animationfunctions.h \
qt-ui/profile/divecartesianaxis.h
qt-ui/profile/divecartesianaxis.h \
qt-ui/profile/diveplotdatamodel.h
SOURCES = \
deco.c \
@ -126,7 +127,8 @@ SOURCES = \
qt-ui/profile/divelineitem.cpp \
qt-ui/profile/divetextitem.cpp \
qt-ui/profile/animationfunctions.cpp \
qt-ui/profile/divecartesianaxis.cpp
qt-ui/profile/divecartesianaxis.cpp \
qt-ui/profile/diveplotdatamodel.cpp
linux*: SOURCES += linux.c
mac: SOURCES += macos.c