mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 13:10:19 +00:00
e71119b40b
Which actually makes the code much clearer as now the object is at the correct spot on the canvas and the positions inside are relative to that. No more magic gradiants starting at "92" Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
103 lines
2.9 KiB
C++
103 lines
2.9 KiB
C++
#include "tankitem.h"
|
|
#include "diveplotdatamodel.h"
|
|
#include "divetextitem.h"
|
|
#include "profile.h"
|
|
#include <QGradient>
|
|
#include <QDebug>
|
|
|
|
TankItem::TankItem(QObject *parent) :
|
|
QGraphicsRectItem(),
|
|
dataModel(0),
|
|
dive(0),
|
|
pInfo(0)
|
|
{
|
|
height = 3;
|
|
QColor red(PERSIANRED1);
|
|
QColor blue(AIR_BLUE);
|
|
QColor yellow(NITROX_YELLOW);
|
|
QColor green(NITROX_GREEN);
|
|
QLinearGradient nitroxGradient(QPointF(0, 0), QPointF(0, height));
|
|
nitroxGradient.setColorAt(0.0, green);
|
|
nitroxGradient.setColorAt(0.49, green);
|
|
nitroxGradient.setColorAt(0.5, yellow);
|
|
nitroxGradient.setColorAt(1.0, yellow);
|
|
nitrox = nitroxGradient;
|
|
QLinearGradient trimixGradient(QPointF(0, 0), QPointF(0, height));
|
|
trimixGradient.setColorAt(0.0, green);
|
|
trimixGradient.setColorAt(0.49, green);
|
|
trimixGradient.setColorAt(0.5, red);
|
|
trimixGradient.setColorAt(1.0, red);
|
|
trimix = trimixGradient;
|
|
air = blue;
|
|
}
|
|
|
|
void TankItem::setData(DivePlotDataModel *model, struct plot_info *plotInfo, struct dive *d)
|
|
{
|
|
pInfo = plotInfo;
|
|
dive = d;
|
|
dataModel = model;
|
|
connect(dataModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(modelDataChanged(QModelIndex, QModelIndex)));
|
|
modelDataChanged();
|
|
}
|
|
|
|
void TankItem::createBar(qreal x, qreal w, struct gasmix *gas)
|
|
{
|
|
// pick the right gradient, size, position and text
|
|
QGraphicsRectItem *rect = new QGraphicsRectItem(x, 0, w, height, this);
|
|
if (gasmix_is_air(gas))
|
|
rect->setBrush(air);
|
|
else if (gas->he.permille)
|
|
rect->setBrush(trimix);
|
|
else
|
|
rect->setBrush(nitrox);
|
|
rects.push_back(rect);
|
|
DiveTextItem *label = new DiveTextItem(rect);
|
|
label->setText(gasname(gas));
|
|
label->setBrush(Qt::black);
|
|
label->setPos(x + 1, 0);
|
|
label->setAlignment(Qt::AlignBottom | Qt::AlignRight);
|
|
label->setZValue(101);
|
|
}
|
|
|
|
void TankItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
|
|
{
|
|
// We don't have enougth data to calculate things, quit.
|
|
|
|
if (!dive || !dataModel || !pInfo || !pInfo->nr)
|
|
return;
|
|
|
|
// remove the old rectangles
|
|
foreach (QGraphicsRectItem *r, rects) {
|
|
delete(r);
|
|
}
|
|
rects.clear();
|
|
|
|
// walk the list and figure out which tanks go where
|
|
struct plot_data *entry = pInfo->entry;
|
|
int cylIdx = entry->cylinderindex;
|
|
int i = -1;
|
|
int startTime = 0;
|
|
struct gasmix *gas = &dive->cylinder[cylIdx].gasmix;
|
|
qreal width, left;
|
|
while (++i < pInfo->nr) {
|
|
entry = &pInfo->entry[i];
|
|
if (entry->cylinderindex == cylIdx)
|
|
continue;
|
|
width = hAxis->posAtValue(entry->sec) - hAxis->posAtValue(startTime);
|
|
left = hAxis->posAtValue(startTime);
|
|
createBar(left, width, gas);
|
|
cylIdx = entry->cylinderindex;
|
|
gas = &dive->cylinder[cylIdx].gasmix;
|
|
startTime = entry->sec;
|
|
}
|
|
width = hAxis->posAtValue(entry->sec) - hAxis->posAtValue(startTime);
|
|
left = hAxis->posAtValue(startTime);
|
|
createBar(left, width, gas);
|
|
}
|
|
|
|
void TankItem::setHorizontalAxis(DiveCartesianAxis *horizontal)
|
|
{
|
|
hAxis = horizontal;
|
|
connect(hAxis, SIGNAL(sizeChanged()), this, SLOT(modelDataChanged()));
|
|
modelDataChanged();
|
|
}
|