2014-01-14 19:17:17 +00:00
|
|
|
#include "diveprofileitem.h"
|
|
|
|
#include "diveplotdatamodel.h"
|
|
|
|
#include "divecartesianaxis.h"
|
|
|
|
#include "graphicsview-common.h"
|
2014-01-17 17:34:15 +00:00
|
|
|
#include "profile.h"
|
2014-01-14 19:17:17 +00:00
|
|
|
|
|
|
|
#include <QPen>
|
|
|
|
#include <QPainter>
|
|
|
|
#include <QLinearGradient>
|
2014-01-16 20:39:13 +00:00
|
|
|
#include <QDebug>
|
2014-01-14 19:17:17 +00:00
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
AbstractProfilePolygonItem::AbstractProfilePolygonItem(): QObject(), QGraphicsPolygonItem(),
|
2014-01-16 05:44:18 +00:00
|
|
|
hAxis(NULL), vAxis(NULL), dataModel(NULL), hDataColumn(-1), vDataColumn(-1)
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
2014-01-16 04:50:56 +00:00
|
|
|
|
2014-01-14 19:17:17 +00:00
|
|
|
}
|
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
void AbstractProfilePolygonItem::setHorizontalAxis(DiveCartesianAxis* horizontal)
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
|
|
|
hAxis = horizontal;
|
|
|
|
modelDataChanged();
|
|
|
|
}
|
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
void AbstractProfilePolygonItem::setHorizontalDataColumn(int column)
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
|
|
|
hDataColumn = column;
|
|
|
|
modelDataChanged();
|
|
|
|
}
|
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
void AbstractProfilePolygonItem::setModel(QAbstractTableModel* model)
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
|
|
|
dataModel = model;
|
|
|
|
modelDataChanged();
|
|
|
|
}
|
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
void AbstractProfilePolygonItem::setVerticalAxis(DiveCartesianAxis* vertical)
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
|
|
|
vAxis = vertical;
|
|
|
|
modelDataChanged();
|
|
|
|
}
|
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
void AbstractProfilePolygonItem::setVerticalDataColumn(int column)
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
|
|
|
vDataColumn = column;
|
|
|
|
modelDataChanged();
|
|
|
|
}
|
|
|
|
|
2014-01-16 18:21:23 +00:00
|
|
|
void AbstractProfilePolygonItem::modelDataChanged()
|
2014-01-14 19:17:17 +00:00
|
|
|
{
|
|
|
|
// We don't have enougth data to calculate things, quit.
|
|
|
|
if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Calculate the polygon. This is the polygon that will be painted on screen
|
|
|
|
// on the ::paint method. Here we calculate the correct position of the points
|
|
|
|
// regarting our cartesian plane ( made by the hAxis and vAxis ), the QPolygonF
|
|
|
|
// is an array of QPointF's, so we basically get the point from the model, convert
|
|
|
|
// to our coordinates, store. no painting is done here.
|
|
|
|
QPolygonF poly;
|
2014-01-16 04:50:56 +00:00
|
|
|
for (int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++) {
|
2014-01-14 19:17:17 +00:00
|
|
|
qreal horizontalValue = dataModel->index(i, hDataColumn).data().toReal();
|
|
|
|
qreal verticalValue = dataModel->index(i, vDataColumn).data().toReal();
|
|
|
|
QPointF point( hAxis->posAtValue(horizontalValue), vAxis->posAtValue(verticalValue));
|
|
|
|
poly.append(point);
|
|
|
|
}
|
|
|
|
setPolygon(poly);
|
|
|
|
}
|
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
void DiveProfileItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
|
2014-01-14 19:17:17 +00:00
|
|
|
Q_UNUSED(widget);
|
|
|
|
|
|
|
|
// This paints the Polygon + Background. I'm setting the pen to QPen() so we don't get a black line here,
|
|
|
|
// after all we need to plot the correct velocities colors later.
|
|
|
|
setPen(QPen());
|
|
|
|
QGraphicsPolygonItem::paint(painter, option, widget);
|
|
|
|
|
|
|
|
// Here we actually paint the boundaries of the Polygon using the colors that the model provides.
|
|
|
|
// Those are the speed colors of the dives.
|
|
|
|
QPen pen;
|
|
|
|
pen.setCosmetic(true);
|
|
|
|
pen.setWidth(2);
|
|
|
|
// This paints the colors of the velocities.
|
2014-01-16 04:50:56 +00:00
|
|
|
for (int i = 1, count = dataModel->rowCount(); i < count; i++) {
|
2014-01-14 19:17:17 +00:00
|
|
|
QModelIndex colorIndex = dataModel->index(i, DivePlotDataModel::COLOR);
|
|
|
|
pen.setBrush(QBrush(colorIndex.data(Qt::BackgroundRole).value<QColor>()));
|
|
|
|
painter->setPen(pen);
|
|
|
|
painter->drawLine(polygon()[i-1],polygon()[i]);
|
|
|
|
}
|
|
|
|
}
|
2014-01-16 18:21:23 +00:00
|
|
|
|
|
|
|
void DiveProfileItem::modelDataChanged(){
|
|
|
|
AbstractProfilePolygonItem::modelDataChanged();
|
|
|
|
if(polygon().isEmpty())
|
|
|
|
return;
|
|
|
|
// This is the blueish gradient that the Depth Profile should have.
|
|
|
|
// It's a simple QLinearGradient with 2 stops, starting from top to bottom.
|
|
|
|
QLinearGradient pat(0, polygon().boundingRect().top(), 0, polygon().boundingRect().bottom());
|
|
|
|
pat.setColorAt(1, getColor(DEPTH_BOTTOM));
|
|
|
|
pat.setColorAt(0, getColor(DEPTH_TOP));
|
|
|
|
setBrush(QBrush(pat));
|
2014-01-16 20:39:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DiveTemperatureItem::DiveTemperatureItem()
|
|
|
|
{
|
|
|
|
QPen pen;
|
|
|
|
pen.setBrush(QBrush(getColor(::TEMP_PLOT)));
|
|
|
|
pen.setCosmetic(true);
|
|
|
|
pen.setWidth(2);
|
|
|
|
setPen(pen);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DiveTemperatureItem::modelDataChanged()
|
|
|
|
{
|
|
|
|
// We don't have enougth data to calculate things, quit.
|
|
|
|
if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Ignore empty values. things do not look good with '0' as temperature in kelvin...
|
|
|
|
QPolygonF poly;
|
|
|
|
for (int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++) {
|
|
|
|
qreal verticalValue = dataModel->index(i, vDataColumn).data().toReal();
|
|
|
|
if(!verticalValue)
|
|
|
|
continue;
|
|
|
|
qreal horizontalValue = dataModel->index(i, hDataColumn).data().toReal();
|
|
|
|
QPointF point( hAxis->posAtValue(horizontalValue), vAxis->posAtValue(verticalValue));
|
|
|
|
poly.append(point);
|
|
|
|
}
|
|
|
|
setPolygon(poly);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DiveTemperatureItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
|
|
|
|
{
|
|
|
|
painter->setPen(pen());
|
|
|
|
painter->drawPolyline(polygon());
|
|
|
|
}
|
2014-01-17 17:34:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
void DiveGasPressureItem::modelDataChanged()
|
|
|
|
{
|
|
|
|
// We don't have enougth data to calculate things, quit.
|
|
|
|
if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
|
|
|
|
return;
|
|
|
|
int last_index = -1;
|
|
|
|
int lift_pen = false;
|
|
|
|
int first_plot = true;
|
|
|
|
QPolygonF boundingPoly; // This is the "Whole Item", but a pressure can be divided in N Polygons.
|
|
|
|
polygons.clear();
|
|
|
|
|
|
|
|
#define M_PRESSURE( ROW )
|
|
|
|
for (int i = 0; i < dataModel->rowCount(); i++) {
|
|
|
|
int sPressure = dataModel->index(i, DivePlotDataModel::SENSOR_PRESSURE).data().toInt();
|
|
|
|
int iPressure = dataModel->index(i, DivePlotDataModel::INTERPOLATED_PRESSURE).data().toInt();
|
|
|
|
int cylIndex = dataModel->index(i, DivePlotDataModel::CYLINDERINDEX).data().toInt();
|
|
|
|
int sec = dataModel->index(i, DivePlotDataModel::TIME).data().toInt();
|
|
|
|
int mbar = sPressure ? sPressure : iPressure;
|
|
|
|
|
|
|
|
if (cylIndex != last_index) {
|
|
|
|
polygons.append(QPolygonF()); // this is the polygon that will be actually drawned on screen.
|
|
|
|
last_index = cylIndex;
|
|
|
|
}
|
|
|
|
if (!mbar) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPointF point(hAxis->posAtValue(sec), vAxis->posAtValue(mbar));
|
|
|
|
boundingPoly.push_back(point); // The BoundingRect
|
|
|
|
polygons.last().push_back(point); // The polygon thta will be plotted.
|
|
|
|
}
|
|
|
|
setPolygon(boundingPoly);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DiveGasPressureItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
|
|
|
|
{
|
|
|
|
QPen pen;
|
|
|
|
pen.setCosmetic(true);
|
|
|
|
pen.setWidth(2);
|
|
|
|
Q_FOREACH(const QPolygonF& poly, polygons){
|
|
|
|
for (int i = 1, count = poly.count(); i < count; i++) {
|
|
|
|
pen.setBrush(QBrush(Qt::red)); // TODO: Fix the color.
|
|
|
|
painter->setPen(pen);
|
|
|
|
painter->drawLine(poly[i-1],poly[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|