| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | #include "diveprofileitem.h"
 | 
					
						
							|  |  |  | #include "diveplotdatamodel.h"
 | 
					
						
							|  |  |  | #include "divecartesianaxis.h"
 | 
					
						
							|  |  |  | #include "graphicsview-common.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | #include "divetextitem.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | #include "profilewidget2.h"
 | 
					
						
							| 
									
										
										
										
											2014-07-11 19:13:01 -03:00
										 |  |  | #include "animationfunctions.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | #include "profile.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | #include "dive.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | #include "preferences.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-22 15:08:19 -02:00
										 |  |  | #include "helpers.h"
 | 
					
						
							| 
									
										
										
										
											2014-06-10 09:24:10 -07:00
										 |  |  | #include "diveplanner.h"
 | 
					
						
							| 
									
										
										
										
											2014-07-11 10:26:22 -07:00
										 |  |  | #include "libdivecomputer/parser.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <QPen>
 | 
					
						
							|  |  |  | #include <QPainter>
 | 
					
						
							|  |  |  | #include <QLinearGradient>
 | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | #include <QApplication>
 | 
					
						
							|  |  |  | #include <QGraphicsItem>
 | 
					
						
							| 
									
										
										
										
											2014-01-22 17:54:24 -02:00
										 |  |  | #include <QSettings>
 | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | AbstractProfilePolygonItem::AbstractProfilePolygonItem() : QObject(), QGraphicsPolygonItem(), hAxis(NULL), vAxis(NULL), dataModel(NULL), hDataColumn(-1), vDataColumn(-1) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | 	connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), this, SLOT(settingsChanged())); | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void AbstractProfilePolygonItem::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void AbstractProfilePolygonItem::setHorizontalAxis(DiveCartesianAxis *horizontal) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	hAxis = horizontal; | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | 	connect(hAxis, SIGNAL(sizeChanged()), this, SLOT(modelDataChanged())); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	modelDataChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 16:21:23 -02:00
										 |  |  | void AbstractProfilePolygonItem::setHorizontalDataColumn(int column) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	hDataColumn = column; | 
					
						
							|  |  |  | 	modelDataChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void AbstractProfilePolygonItem::setModel(DivePlotDataModel *model) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	dataModel = model; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	connect(dataModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(modelDataChanged(QModelIndex, QModelIndex))); | 
					
						
							|  |  |  | 	connect(dataModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex, int, int))); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	modelDataChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void AbstractProfilePolygonItem::modelDataRemoved(const QModelIndex &parent, int from, int to) | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	setPolygon(QPolygonF()); | 
					
						
							|  |  |  | 	qDeleteAll(texts); | 
					
						
							|  |  |  | 	texts.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void AbstractProfilePolygonItem::setVerticalAxis(DiveCartesianAxis *vertical) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	vAxis = vertical; | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | 	connect(vAxis, SIGNAL(sizeChanged()), this, SLOT(modelDataChanged())); | 
					
						
							|  |  |  | 	connect(vAxis, SIGNAL(maxChanged()), this, SLOT(modelDataChanged())); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	modelDataChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 16:21:23 -02:00
										 |  |  | void AbstractProfilePolygonItem::setVerticalDataColumn(int column) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	vDataColumn = column; | 
					
						
							|  |  |  | 	modelDataChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | bool AbstractProfilePolygonItem::shouldCalculateStuff(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (!hAxis || !vAxis) | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	if (!dataModel || dataModel->rowCount() == 0) | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	if (hDataColumn == -1 || vDataColumn == -1) | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (topLeft.isValid() && bottomRight.isValid()) { | 
					
						
							|  |  |  | 		if ((topLeft.column() >= vDataColumn || topLeft.column() >= hDataColumn) && | 
					
						
							|  |  |  | 		    (bottomRight.column() <= vDataColumn || topLeft.column() <= hDataColumn)) { | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void AbstractProfilePolygonItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	// We don't have enougth data to calculate things, quit.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 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 11:50:56 +07:00
										 |  |  | 	for (int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++) { | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 		qreal horizontalValue = dataModel->index(i, hDataColumn).data().toReal(); | 
					
						
							|  |  |  | 		qreal verticalValue = dataModel->index(i, vDataColumn).data().toReal(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		QPointF point(hAxis->posAtValue(horizontalValue), vAxis->posAtValue(verticalValue)); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 		poly.append(point); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	setPolygon(poly); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	qDeleteAll(texts); | 
					
						
							|  |  |  | 	texts.clear(); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 18:54:25 +01:00
										 |  |  | DiveProfileItem::DiveProfileItem() : show_reported_ceiling(0), reported_ceiling_in_red(0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveProfileItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	Q_UNUSED(widget); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->save(); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	// 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.
 | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | 	setPen(Qt::NoPen); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	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); | 
					
						
							| 
									
										
										
										
											2014-02-05 15:45:23 -02:00
										 |  |  | 	QPolygonF poly = polygon(); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	// This paints the colors of the velocities.
 | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	for (int i = 1, count = dataModel->rowCount(); i < count; i++) { | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 		QModelIndex colorIndex = dataModel->index(i, DivePlotDataModel::COLOR); | 
					
						
							|  |  |  | 		pen.setBrush(QBrush(colorIndex.data(Qt::BackgroundRole).value<QColor>())); | 
					
						
							|  |  |  | 		painter->setPen(pen); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		painter->drawLine(poly[i - 1], poly[i]); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							| 
									
										
										
										
											2014-01-14 17:17:17 -02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-16 16:21:23 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | int DiveProfileItem::maxCeiling(int row) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int max = -1; | 
					
						
							|  |  |  | 	plot_data *entry = dataModel->data().entry + row; | 
					
						
							|  |  |  | 	for (int tissue = 0; tissue < 16; tissue++) { | 
					
						
							|  |  |  | 		if (max < entry->ceilings[tissue]) | 
					
						
							|  |  |  | 			max = entry->ceilings[tissue]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return max; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveProfileItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-21 14:27:44 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-07-11 10:26:22 -07:00
										 |  |  | 	bool eventAdded = false; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							| 
									
										
										
										
											2014-01-23 16:03:19 -02:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	AbstractProfilePolygonItem::modelDataChanged(topLeft, bottomRight); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:27:44 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-01-16 16:21:23 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	show_reported_ceiling = prefs.dcceiling; | 
					
						
							|  |  |  | 	reported_ceiling_in_red = prefs.redceiling; | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | 	profileColor = getColor(DEPTH_BOTTOM); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int currState = qobject_cast<ProfileWidget2 *>(scene()->views().first())->currentState; | 
					
						
							|  |  |  | 	if (currState == ProfileWidget2::PLAN) { | 
					
						
							| 
									
										
										
										
											2014-07-11 10:26:22 -07:00
										 |  |  | 		plot_data *entry = dataModel->data().entry; | 
					
						
							|  |  |  | 		for (int i = 0; i < dataModel->rowCount(); i++, entry++) { | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | 			int max = maxCeiling(i); | 
					
						
							| 
									
										
										
										
											2014-07-11 10:10:15 -07:00
										 |  |  | 			// Don't scream if we violate the ceiling by a few cm
 | 
					
						
							| 
									
										
										
										
											2014-07-11 10:26:22 -07:00
										 |  |  | 			if (entry->depth < max - 100) { | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | 				profileColor = QColor(Qt::red); | 
					
						
							| 
									
										
										
										
											2014-07-11 10:26:22 -07:00
										 |  |  | 				if (!eventAdded) { | 
					
						
							|  |  |  | 					add_event(&displayed_dive.dc, entry->sec, SAMPLE_EVENT_CEILING, -1, max / 1000, "planned waypoint above ceiling"); | 
					
						
							|  |  |  | 					eventAdded = true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | 	/* Show any ceiling we may have encountered */ | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	if (prefs.dcceiling && !prefs.redceiling) { | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | 		QPolygonF p = polygon(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		plot_data *entry = dataModel->data().entry + dataModel->rowCount() - 1; | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | 		for (int i = dataModel->rowCount() - 1; i >= 0; i--, entry--) { | 
					
						
							|  |  |  | 			if (!entry->in_deco) { | 
					
						
							|  |  |  | 				/* not in deco implies this is a safety stop, no ceiling */ | 
					
						
							|  |  |  | 				p.append(QPointF(hAxis->posAtValue(entry->sec), vAxis->posAtValue(0))); | 
					
						
							| 
									
										
										
										
											2014-05-22 11:40:22 -07:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2014-05-14 22:27:26 -03:00
										 |  |  | 				p.append(QPointF(hAxis->posAtValue(entry->sec), vAxis->posAtValue(qMin(entry->stopdepth, entry->depth)))); | 
					
						
							| 
									
										
										
										
											2014-01-21 17:07:22 -02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		setPolygon(p); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	// This is the blueish gradient that the Depth Profile should have.
 | 
					
						
							| 
									
										
										
										
											2014-01-16 16:21:23 -02:00
										 |  |  | 	// It's a simple QLinearGradient with 2 stops, starting from top to bottom.
 | 
					
						
							|  |  |  | 	QLinearGradient pat(0, polygon().boundingRect().top(), 0, polygon().boundingRect().bottom()); | 
					
						
							| 
									
										
										
										
											2014-05-26 19:29:25 -03:00
										 |  |  | 	pat.setColorAt(1, profileColor); | 
					
						
							| 
									
										
										
										
											2014-01-16 16:21:23 -02:00
										 |  |  | 	pat.setColorAt(0, getColor(DEPTH_TOP)); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:27:44 -08:00
										 |  |  | 	setBrush(QBrush(pat)); | 
					
						
							| 
									
										
										
										
											2014-01-21 13:27:08 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	int last = -1; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	for (int i = 0, count = dataModel->rowCount(); i < count; i++) { | 
					
						
							| 
									
										
										
										
											2014-01-21 13:27:08 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		struct plot_data *entry = dataModel->data().entry + i; | 
					
						
							| 
									
										
										
										
											2014-01-21 13:27:08 -02:00
										 |  |  | 		if (entry->depth < 2000) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ((entry == entry->max[2]) && entry->depth / 100 != last) { | 
					
						
							| 
									
										
										
										
											2014-01-29 13:48:06 -02:00
										 |  |  | 			plot_depth_sample(entry, Qt::AlignHCenter | Qt::AlignBottom, getColor(SAMPLE_DEEP)); | 
					
						
							| 
									
										
										
										
											2014-01-21 13:27:08 -02:00
										 |  |  | 			last = entry->depth / 100; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ((entry == entry->min[2]) && entry->depth / 100 != last) { | 
					
						
							| 
									
										
										
										
											2014-01-29 13:48:06 -02:00
										 |  |  | 			plot_depth_sample(entry, Qt::AlignHCenter | Qt::AlignTop, getColor(SAMPLE_SHALLOW)); | 
					
						
							| 
									
										
										
										
											2014-01-21 13:27:08 -02:00
										 |  |  | 			last = entry->depth / 100; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (entry->depth != last) | 
					
						
							|  |  |  | 			last = -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void DiveProfileItem::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	//TODO: Only modelDataChanged() here if we need to rebuild the graph ( for instance,
 | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	// if the prefs.dcceiling are enabled, but prefs.redceiling is disabled
 | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | 	// and only if it changed something. let's not waste cpu cycles repoloting something we don't need to.
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	modelDataChanged(); | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveProfileItem::plot_depth_sample(struct plot_data *entry, QFlags<Qt::AlignmentFlag> flags, const QColor &color) | 
					
						
							| 
									
										
										
										
											2014-01-21 13:27:08 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	int decimals; | 
					
						
							|  |  |  | 	double d = get_depth_units(entry->depth, &decimals, NULL); | 
					
						
							|  |  |  | 	DiveTextItem *item = new DiveTextItem(this); | 
					
						
							|  |  |  | 	item->setPos(hAxis->posAtValue(entry->sec), vAxis->posAtValue(entry->depth)); | 
					
						
							|  |  |  | 	item->setText(QString("%1").arg(d, 0, 'f', 1)); | 
					
						
							|  |  |  | 	item->setAlignment(flags); | 
					
						
							|  |  |  | 	item->setBrush(color); | 
					
						
							|  |  |  | 	texts.append(item); | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | DiveHeartrateItem::DiveHeartrateItem() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QPen pen; | 
					
						
							|  |  |  | 	pen.setBrush(QBrush(getColor(::HR_PLOT))); | 
					
						
							|  |  |  | 	pen.setCosmetic(true); | 
					
						
							|  |  |  | 	pen.setWidth(1); | 
					
						
							|  |  |  | 	setPen(pen); | 
					
						
							| 
									
										
										
										
											2014-07-21 19:32:46 -03:00
										 |  |  | 	settingsChanged(); | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DiveHeartrateItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-25 13:30:00 -08:00
										 |  |  | 	int last = -300, last_printed_hr = 0, sec = 0; | 
					
						
							| 
									
										
										
										
											2014-02-25 14:24:09 -08:00
										 |  |  | 	struct { | 
					
						
							|  |  |  | 		int sec; | 
					
						
							|  |  |  | 		int hr; | 
					
						
							| 
									
										
										
										
											2014-03-10 13:43:44 +02:00
										 |  |  | 	} hist[3] = {}; | 
					
						
							| 
									
										
										
										
											2014-02-25 14:24:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 	// We don't have enougth data to calculate things, quit.
 | 
					
						
							|  |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	qDeleteAll(texts); | 
					
						
							|  |  |  | 	texts.clear(); | 
					
						
							| 
									
										
										
										
											2014-02-25 13:30:00 -08:00
										 |  |  | 	// Ignore empty values. a heartrate of 0 would be a bad sign.
 | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 	QPolygonF poly; | 
					
						
							|  |  |  | 	for (int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++) { | 
					
						
							|  |  |  | 		int hr = dataModel->index(i, vDataColumn).data().toInt(); | 
					
						
							|  |  |  | 		if (!hr) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		sec = dataModel->index(i, hDataColumn).data().toInt(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		QPointF point(hAxis->posAtValue(sec), vAxis->posAtValue(hr)); | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 		poly.append(point); | 
					
						
							| 
									
										
										
										
											2014-02-25 14:24:09 -08:00
										 |  |  | 		if (hr == hist[2].hr) | 
					
						
							|  |  |  | 			// same as last one, no point in looking at printing
 | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		hist[0] = hist[1]; | 
					
						
							|  |  |  | 		hist[1] = hist[2]; | 
					
						
							|  |  |  | 		hist[2].sec = sec; | 
					
						
							|  |  |  | 		hist[2].hr = hr; | 
					
						
							|  |  |  | 		// don't print a HR
 | 
					
						
							|  |  |  | 		// if it's not a local min / max
 | 
					
						
							|  |  |  | 		// if it's been less than 5min and less than a 20 beats change OR
 | 
					
						
							|  |  |  | 		// if it's been less than 2min OR if the change from the
 | 
					
						
							|  |  |  | 		// last print is less than 10 beats
 | 
					
						
							|  |  |  | 		// to test min / max requires three points, so we now look at the
 | 
					
						
							|  |  |  | 		// previous one
 | 
					
						
							|  |  |  | 		sec = hist[1].sec; | 
					
						
							|  |  |  | 		hr = hist[1].hr; | 
					
						
							|  |  |  | 		if ((hist[0].hr < hr && hr < hist[2].hr) || | 
					
						
							|  |  |  | 		    (hist[0].hr > hr && hr > hist[2].hr) || | 
					
						
							|  |  |  | 		    ((sec < last + 300) && (abs(hr - last_printed_hr) < 20)) || | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 		    (sec < last + 120) || | 
					
						
							|  |  |  | 		    (abs(hr - last_printed_hr) < 10)) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		last = sec; | 
					
						
							| 
									
										
										
										
											2014-02-25 14:24:09 -08:00
										 |  |  | 		createTextItem(sec, hr); | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 		last_printed_hr = hr; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	setPolygon(poly); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (texts.count()) | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 		texts.last()->setAlignment(Qt::AlignLeft | Qt::AlignBottom); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DiveHeartrateItem::createTextItem(int sec, int hr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	DiveTextItem *text = new DiveTextItem(this); | 
					
						
							|  |  |  | 	text->setAlignment(Qt::AlignRight | Qt::AlignBottom); | 
					
						
							|  |  |  | 	text->setBrush(getColor(HR_TEXT)); | 
					
						
							|  |  |  | 	text->setPos(QPointF(hAxis->posAtValue(sec), vAxis->posAtValue(hr))); | 
					
						
							|  |  |  | 	text->setScale(0.7); // need to call this BEFORE setText()
 | 
					
						
							|  |  |  | 	text->setText(QString("%1").arg(hr)); | 
					
						
							|  |  |  | 	texts.append(text); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveHeartrateItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->save(); | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 	painter->setPen(pen()); | 
					
						
							|  |  |  | 	painter->drawPolyline(polygon()); | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void DiveHeartrateItem::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-04-08 00:00:50 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-07-21 19:32:46 -03:00
										 |  |  | 	setVisible(prefs.hrgraph); | 
					
						
							| 
									
										
										
										
											2014-04-08 00:00:50 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | DiveTemperatureItem::DiveTemperatureItem() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QPen pen; | 
					
						
							|  |  |  | 	pen.setBrush(QBrush(getColor(::TEMP_PLOT))); | 
					
						
							|  |  |  | 	pen.setCosmetic(true); | 
					
						
							|  |  |  | 	pen.setWidth(2); | 
					
						
							|  |  |  | 	setPen(pen); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveTemperatureItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-14 21:17:31 -02:00
										 |  |  | 	int last = -300, last_printed_temp = 0, sec = 0, last_valid_temp = 0; | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 	// We don't have enougth data to calculate things, quit.
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-19 17:38:22 -02:00
										 |  |  | 	qDeleteAll(texts); | 
					
						
							|  |  |  | 	texts.clear(); | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 	// 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++) { | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | 		int mkelvin = dataModel->index(i, vDataColumn).data().toInt(); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:27:44 -08:00
										 |  |  | 		if (!mkelvin) | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2014-02-14 21:17:31 -02:00
										 |  |  | 		last_valid_temp = mkelvin; | 
					
						
							| 
									
										
										
										
											2014-02-11 14:01:53 -08:00
										 |  |  | 		sec = dataModel->index(i, hDataColumn).data().toInt(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		QPointF point(hAxis->posAtValue(sec), vAxis->posAtValue(mkelvin)); | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 		poly.append(point); | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* don't print a temperature
 | 
					
						
							|  |  |  | 		 * if it's been less than 5min and less than a 2K change OR | 
					
						
							|  |  |  | 		 * if it's been less than 2min OR if the change from the | 
					
						
							|  |  |  | 		 * last print is less than .4K (and therefore less than 1F) */ | 
					
						
							|  |  |  | 		if (((sec < last + 300) && (abs(mkelvin - last_printed_temp) < 2000)) || | 
					
						
							|  |  |  | 		    (sec < last + 120) || | 
					
						
							|  |  |  | 		    (abs(mkelvin - last_printed_temp) < 400)) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		last = sec; | 
					
						
							|  |  |  | 		if (mkelvin > 200000) | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 			createTextItem(sec, mkelvin); | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | 		last_printed_temp = mkelvin; | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	setPolygon(poly); | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* it would be nice to print the end temperature, if it's
 | 
					
						
							|  |  |  | 	* different or if the last temperature print has been more | 
					
						
							|  |  |  | 	* than a quarter of the dive back */ | 
					
						
							| 
									
										
										
										
											2014-02-14 21:17:31 -02:00
										 |  |  | 	if (last_valid_temp > 200000 && | 
					
						
							|  |  |  | 	    ((abs(last_valid_temp - last_printed_temp) > 500) || ((double)last / (double)sec < 0.75))) { | 
					
						
							|  |  |  | 		createTextItem(sec, last_valid_temp); | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (texts.count()) | 
					
						
							| 
									
										
										
										
											2014-02-15 20:44:49 -02:00
										 |  |  | 		texts.last()->setAlignment(Qt::AlignLeft | Qt::AlignBottom); | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DiveTemperatureItem::createTextItem(int sec, int mkelvin) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double deg; | 
					
						
							|  |  |  | 	const char *unit; | 
					
						
							|  |  |  | 	deg = get_temp_units(mkelvin, &unit); | 
					
						
							| 
									
										
										
										
											2014-01-19 17:38:22 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	DiveTextItem *text = new DiveTextItem(this); | 
					
						
							| 
									
										
										
										
											2014-02-07 21:38:06 -02:00
										 |  |  | 	text->setAlignment(Qt::AlignRight | Qt::AlignBottom); | 
					
						
							| 
									
										
										
										
											2014-01-19 17:38:22 -02:00
										 |  |  | 	text->setBrush(getColor(TEMP_TEXT)); | 
					
						
							|  |  |  | 	text->setPos(QPointF(hAxis->posAtValue(sec), vAxis->posAtValue(mkelvin))); | 
					
						
							| 
									
										
										
										
											2014-02-23 15:28:31 -08:00
										 |  |  | 	text->setScale(0.8); // need to call this BEFORE setText()
 | 
					
						
							| 
									
										
										
										
											2014-01-19 17:38:22 -02:00
										 |  |  | 	text->setText(QString("%1%2").arg(deg, 0, 'f', 1).arg(unit)); | 
					
						
							| 
									
										
										
										
											2014-01-23 16:07:22 -02:00
										 |  |  | 	texts.append(text); | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveTemperatureItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->save(); | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | 	painter->setPen(pen()); | 
					
						
							|  |  |  | 	painter->drawPolyline(polygon()); | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							| 
									
										
										
										
											2014-01-16 18:39:13 -02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveGasPressureItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	// We don't have enougth data to calculate things, quit.
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 	int last_index = -1; | 
					
						
							|  |  |  | 	QPolygonF boundingPoly; // This is the "Whole Item", but a pressure can be divided in N Polygons.
 | 
					
						
							|  |  |  | 	polygons.clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 13:35:40 -02:00
										 |  |  | 	for (int i = 0, count = dataModel->rowCount(); i < count; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		plot_data *entry = dataModel->data().entry + i; | 
					
						
							| 
									
										
										
										
											2014-01-21 13:35:40 -02:00
										 |  |  | 		int mbar = GET_PRESSURE(entry); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (entry->cylinderindex != last_index) { | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 			polygons.append(QPolygonF()); // this is the polygon that will be actually drawned on screen.
 | 
					
						
							| 
									
										
										
										
											2014-01-21 13:35:40 -02:00
										 |  |  | 			last_index = entry->cylinderindex; | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (!mbar) { | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 13:35:40 -02:00
										 |  |  | 		QPointF point(hAxis->posAtValue(entry->sec), vAxis->posAtValue(mbar)); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		boundingPoly.push_back(point);    // The BoundingRect
 | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 		polygons.last().push_back(point); // The polygon thta will be plotted.
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	setPolygon(boundingPoly); | 
					
						
							| 
									
										
										
										
											2014-01-23 15:37:50 -02:00
										 |  |  | 	qDeleteAll(texts); | 
					
						
							|  |  |  | 	texts.clear(); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 	int mbar, cyl; | 
					
						
							|  |  |  | 	int seen_cyl[MAX_CYLINDERS] = { false, }; | 
					
						
							|  |  |  | 	int last_pressure[MAX_CYLINDERS] = { 0, }; | 
					
						
							|  |  |  | 	int last_time[MAX_CYLINDERS] = { 0, }; | 
					
						
							|  |  |  | 	struct plot_data *entry; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cyl = -1; | 
					
						
							|  |  |  | 	for (int i = 0, count = dataModel->rowCount(); i < count; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 		entry = dataModel->data().entry + i; | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 		mbar = GET_PRESSURE(entry); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!mbar) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		if (cyl != entry->cylinderindex) { | 
					
						
							|  |  |  | 			cyl = entry->cylinderindex; | 
					
						
							|  |  |  | 			if (!seen_cyl[cyl]) { | 
					
						
							| 
									
										
										
										
											2014-06-01 21:02:42 -07:00
										 |  |  | 				plotPressureValue(mbar, entry->sec, Qt::AlignRight | Qt::AlignTop); | 
					
						
							|  |  |  | 				plotGasValue(mbar, entry->sec, Qt::AlignRight | Qt::AlignBottom, | 
					
						
							| 
									
										
										
										
											2014-07-03 14:34:24 -07:00
										 |  |  | 					       displayed_dive.cylinder[cyl].gasmix); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 				seen_cyl[cyl] = true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		last_pressure[cyl] = mbar; | 
					
						
							|  |  |  | 		last_time[cyl] = entry->sec; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { | 
					
						
							|  |  |  | 		if (last_time[cyl]) { | 
					
						
							| 
									
										
										
										
											2014-06-01 21:02:42 -07:00
										 |  |  | 			plotPressureValue(last_pressure[cyl], last_time[cyl], Qt::AlignLeft | Qt::AlignTop); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-01 21:02:42 -07:00
										 |  |  | void DiveGasPressureItem::plotPressureValue(int mbar, int sec, QFlags<Qt::AlignmentFlag> flags) | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	const char *unit; | 
					
						
							|  |  |  | 	int pressure = get_pressure_units(mbar, &unit); | 
					
						
							|  |  |  | 	DiveTextItem *text = new DiveTextItem(this); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	text->setPos(hAxis->posAtValue(sec), vAxis->posAtValue(mbar) - 0.5); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 	text->setText(QString("%1 %2").arg(pressure).arg(unit)); | 
					
						
							|  |  |  | 	text->setAlignment(flags); | 
					
						
							|  |  |  | 	text->setBrush(getColor(PRESSURE_TEXT)); | 
					
						
							|  |  |  | 	texts.push_back(text); | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-01 21:02:42 -07:00
										 |  |  | void DiveGasPressureItem::plotGasValue(int mbar, int sec, QFlags<Qt::AlignmentFlag> flags, struct gasmix gasmix) | 
					
						
							| 
									
										
										
										
											2014-01-21 14:14:52 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-06-01 20:59:41 -07:00
										 |  |  | 	QString gas = gasToStr(gasmix); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:14:52 -02:00
										 |  |  | 	DiveTextItem *text = new DiveTextItem(this); | 
					
						
							|  |  |  | 	text->setPos(hAxis->posAtValue(sec), vAxis->posAtValue(mbar)); | 
					
						
							|  |  |  | 	text->setText(gas); | 
					
						
							|  |  |  | 	text->setAlignment(flags); | 
					
						
							|  |  |  | 	text->setBrush(getColor(PRESSURE_TEXT)); | 
					
						
							|  |  |  | 	texts.push_back(text); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveGasPressureItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 	QPen pen; | 
					
						
							|  |  |  | 	pen.setCosmetic(true); | 
					
						
							|  |  |  | 	pen.setWidth(2); | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->save(); | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	struct plot_data *entry = dataModel->data().entry; | 
					
						
							| 
									
										
										
										
											2014-05-22 11:40:22 -07:00
										 |  |  | 	Q_FOREACH (const QPolygonF &poly, polygons) { | 
					
						
							| 
									
										
										
										
											2014-01-27 16:17:08 -02:00
										 |  |  | 		for (int i = 1, count = poly.count(); i < count; i++, entry++) { | 
					
						
							| 
									
										
										
										
											2014-07-03 14:34:24 -07:00
										 |  |  | 			pen.setBrush(getSacColor(entry->sac, displayed_dive.sac)); | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 			painter->setPen(pen); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 			painter->drawLine(poly[i - 1], poly[i]); | 
					
						
							| 
									
										
										
										
											2014-01-17 15:34:15 -02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							| 
									
										
										
										
											2014-01-17 17:54:47 -02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 18:54:25 +01:00
										 |  |  | DiveCalculatedCeiling::DiveCalculatedCeiling() : is3mIncrement(false), gradientFactor(new DiveTextItem(this)) | 
					
						
							| 
									
										
										
										
											2014-01-29 10:53:40 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	gradientFactor->setY(0); | 
					
						
							|  |  |  | 	gradientFactor->setBrush(getColor(PRESSURE_TEXT)); | 
					
						
							|  |  |  | 	gradientFactor->setAlignment(Qt::AlignHCenter | Qt::AlignBottom); | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | 	settingsChanged(); | 
					
						
							| 
									
										
										
										
											2014-01-29 10:53:40 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveCalculatedCeiling::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	// We don't have enougth data to calculate things, quit.
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	AbstractProfilePolygonItem::modelDataChanged(topLeft, bottomRight); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | 	// Add 2 points to close the polygon.
 | 
					
						
							|  |  |  | 	QPolygonF poly = polygon(); | 
					
						
							| 
									
										
										
										
											2014-01-22 18:25:35 -02:00
										 |  |  | 	if (poly.isEmpty()) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | 	QPointF p1 = poly.first(); | 
					
						
							|  |  |  | 	QPointF p2 = poly.last(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	poly.prepend(QPointF(p1.x(), vAxis->posAtValue(0))); | 
					
						
							|  |  |  | 	poly.append(QPointF(p2.x(), vAxis->posAtValue(0))); | 
					
						
							|  |  |  | 	setPolygon(poly); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	QLinearGradient pat(0, polygon().boundingRect().top(), 0, polygon().boundingRect().bottom()); | 
					
						
							|  |  |  | 	pat.setColorAt(0, getColor(CALC_CEILING_SHALLOW)); | 
					
						
							|  |  |  | 	pat.setColorAt(1, getColor(CALC_CEILING_DEEP)); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	setPen(QPen(QBrush(Qt::NoBrush), 0)); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | 	setBrush(pat); | 
					
						
							| 
									
										
										
										
											2014-01-29 10:53:40 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	gradientFactor->setX(poly.boundingRect().width() / 2 + poly.boundingRect().x()); | 
					
						
							| 
									
										
										
										
											2014-06-10 09:24:10 -07:00
										 |  |  | 	DivePlannerPointsModel *plannerModel = DivePlannerPointsModel::instance(); | 
					
						
							|  |  |  | 	if (plannerModel->isPlanner()) { | 
					
						
							|  |  |  | 		struct diveplan &diveplan = plannerModel->getDiveplan(); | 
					
						
							|  |  |  | 		gradientFactor->setText(QString("GF %1/%2").arg(diveplan.gflow).arg(diveplan.gfhigh)); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		gradientFactor->setText(QString("GF %1/%2").arg(prefs.gflow).arg(prefs.gfhigh)); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveCalculatedCeiling::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-01-21 14:59:19 -02:00
										 |  |  | 	QGraphicsPolygonItem::paint(painter, option, widget); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-22 19:22:07 -02:00
										 |  |  | DiveCalculatedTissue::DiveCalculatedTissue() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | 	settingsChanged(); | 
					
						
							| 
									
										
										
										
											2014-01-22 19:22:07 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void DiveCalculatedTissue::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-01-22 19:22:07 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	setVisible(prefs.calcalltissues && prefs.calcceiling); | 
					
						
							| 
									
										
										
										
											2014-01-22 19:22:07 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveReportedCeiling::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	QPolygonF p; | 
					
						
							|  |  |  | 	p.append(QPointF(hAxis->posAtValue(0), vAxis->posAtValue(0))); | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	plot_data *entry = dataModel->data().entry; | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | 	for (int i = 0, count = dataModel->rowCount(); i < count; i++, entry++) { | 
					
						
							|  |  |  | 		if (entry->in_deco && entry->stopdepth) { | 
					
						
							| 
									
										
										
										
											2014-05-14 22:27:26 -03:00
										 |  |  | 			p.append(QPointF(hAxis->posAtValue(entry->sec), vAxis->posAtValue(qMin(entry->stopdepth, entry->depth)))); | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			p.append(QPointF(hAxis->posAtValue(entry->sec), vAxis->posAtValue(0))); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	setPolygon(p); | 
					
						
							|  |  |  | 	QLinearGradient pat(0, p.boundingRect().top(), 0, p.boundingRect().bottom()); | 
					
						
							| 
									
										
										
										
											2014-04-14 22:52:22 -07:00
										 |  |  | 	// does the user want the ceiling in "surface color" or in red?
 | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	if (prefs.redceiling) { | 
					
						
							| 
									
										
										
										
											2014-04-14 22:52:22 -07:00
										 |  |  | 		pat.setColorAt(0, getColor(CEILING_SHALLOW)); | 
					
						
							|  |  |  | 		pat.setColorAt(1, getColor(CEILING_DEEP)); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		pat.setColorAt(0, getColor(BACKGROUND_TRANS)); | 
					
						
							|  |  |  | 		pat.setColorAt(1, getColor(BACKGROUND_TRANS)); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	setPen(QPen(QBrush(Qt::NoBrush), 0)); | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | 	setBrush(pat); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void DiveCalculatedCeiling::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-01-28 20:48:41 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	if (dataModel && is3mIncrement != prefs.calcceiling3m) { | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 		// recalculate that part.
 | 
					
						
							|  |  |  | 		dataModel->calculateDecompression(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	is3mIncrement = prefs.calcceiling3m; | 
					
						
							|  |  |  | 	setVisible(prefs.calcceiling); | 
					
						
							| 
									
										
										
										
											2014-01-28 20:48:41 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void DiveReportedCeiling::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-04-16 22:03:44 +02:00
										 |  |  | 	setVisible(prefs.dcceiling); | 
					
						
							| 
									
										
										
										
											2014-01-21 18:16:19 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void DiveReportedCeiling::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if (polygon().isEmpty()) | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-01-21 17:34:36 -02:00
										 |  |  | 	QGraphicsPolygonItem::paint(painter, option, widget); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-22 15:08:19 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 18:54:25 +01:00
										 |  |  | MeanDepthLine::MeanDepthLine() : meanDepth(0), leftText(new DiveTextItem(this)), rightText(new DiveTextItem(this)) | 
					
						
							| 
									
										
										
										
											2014-01-22 15:08:19 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	leftText->setAlignment(Qt::AlignRight | Qt::AlignBottom); | 
					
						
							|  |  |  | 	leftText->setBrush(getColor(MEAN_DEPTH)); | 
					
						
							|  |  |  | 	rightText->setAlignment(Qt::AlignLeft | Qt::AlignBottom); | 
					
						
							|  |  |  | 	rightText->setBrush(getColor(MEAN_DEPTH)); | 
					
						
							|  |  |  | 	leftText->setPos(0, 0); | 
					
						
							|  |  |  | 	rightText->setPos(line().length(), 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MeanDepthLine::setLine(qreal x1, qreal y1, qreal x2, qreal y2) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QGraphicsLineItem::setLine(x1, y1, x2, y2); | 
					
						
							|  |  |  | 	leftText->setPos(x1, 0); | 
					
						
							|  |  |  | 	rightText->setPos(x2, 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MeanDepthLine::setMeanDepth(int value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-02 16:01:27 +05:30
										 |  |  | 	leftText->setText(get_depth_string(value, true, true)); | 
					
						
							|  |  |  | 	rightText->setText(get_depth_string(value, true, true)); | 
					
						
							| 
									
										
										
										
											2014-02-12 14:41:59 -02:00
										 |  |  | 	meanDepth = value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void MeanDepthLine::setAxis(DiveCartesianAxis *a) | 
					
						
							| 
									
										
										
										
											2014-02-12 14:41:59 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	connect(a, SIGNAL(sizeChanged()), this, SLOT(axisLineChanged())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MeanDepthLine::axisLineChanged() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	DiveCartesianAxis *axis = qobject_cast<DiveCartesianAxis *>(sender()); | 
					
						
							| 
									
										
										
										
											2014-07-11 19:13:01 -03:00
										 |  |  | 	Animations::moveTo(this, x(), axis->posAtValue(meanDepth)); | 
					
						
							| 
									
										
										
										
											2014-01-22 15:08:19 -02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void PartialPressureGasItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	//AbstractProfilePolygonItem::modelDataChanged();
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	if (!shouldCalculateStuff(topLeft, bottomRight)) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	plot_data *entry = dataModel->data().entry; | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 	QPolygonF poly; | 
					
						
							| 
									
										
										
										
											2014-03-15 19:00:58 +01:00
										 |  |  | 	QPolygonF alertpoly; | 
					
						
							|  |  |  | 	alertPolygons.clear(); | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 	QSettings s; | 
					
						
							|  |  |  | 	s.beginGroup("TecDetails"); | 
					
						
							|  |  |  | 	double threshould = s.value(threshouldKey).toDouble(); | 
					
						
							| 
									
										
										
										
											2014-03-15 19:00:58 +01:00
										 |  |  | 	bool inAlertFragment = false; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	for (int i = 0; i < dataModel->rowCount(); i++, entry++) { | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 		double value = dataModel->index(i, vDataColumn).data().toDouble(); | 
					
						
							|  |  |  | 		int time = dataModel->index(i, hDataColumn).data().toInt(); | 
					
						
							|  |  |  | 		QPointF point(hAxis->posAtValue(time), vAxis->posAtValue(value)); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		poly.push_back(point); | 
					
						
							| 
									
										
										
										
											2014-03-15 19:00:58 +01:00
										 |  |  | 		if (value >= threshould) { | 
					
						
							|  |  |  | 			if (inAlertFragment) { | 
					
						
							|  |  |  | 				alertPolygons.back().push_back(point); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				alertpoly.clear(); | 
					
						
							|  |  |  | 				alertpoly.push_back(point); | 
					
						
							|  |  |  | 				alertPolygons.append(alertpoly); | 
					
						
							|  |  |  | 				inAlertFragment = true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			inAlertFragment = false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	setPolygon(poly); | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	createPPLegend(trUtf8("pN" UTF8_SUBSCRIPT_2),getColor(PN2), legendPos); | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void PartialPressureGasItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-19 18:24:42 +02:00
										 |  |  | 	const qreal pWidth = 0.0; | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->save(); | 
					
						
							| 
									
										
										
										
											2014-03-19 18:24:42 +02:00
										 |  |  | 	painter->setPen(QPen(normalColor, pWidth)); | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | 	painter->drawPolyline(polygon()); | 
					
						
							| 
									
										
										
										
											2014-03-15 19:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	QPolygonF poly; | 
					
						
							| 
									
										
										
										
											2014-03-19 18:24:42 +02:00
										 |  |  | 	painter->setPen(QPen(alertColor, pWidth)); | 
					
						
							| 
									
										
										
										
											2014-05-22 11:40:22 -07:00
										 |  |  | 	Q_FOREACH (const QPolygonF &poly, alertPolygons) | 
					
						
							| 
									
										
										
										
											2014-03-15 19:00:58 +01:00
										 |  |  | 		painter->drawPolyline(poly); | 
					
						
							| 
									
										
										
										
											2014-07-17 20:18:14 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void PartialPressureGasItem::setThreshouldSettingsKey(const QString &threshouldSettingsKey) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	threshouldKey = threshouldSettingsKey; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PartialPressureGasItem::PartialPressureGasItem() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 13:50:26 -03:00
										 |  |  | void PartialPressureGasItem::settingsChanged() | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | 	QSettings s; | 
					
						
							|  |  |  | 	s.beginGroup("TecDetails"); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	setVisible(s.value(visibilityKey).toBool()); | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void PartialPressureGasItem::setVisibilitySettingsKey(const QString &key) | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	visibilityKey = key; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void PartialPressureGasItem::setColors(const QColor &normal, const QColor &alert) | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	normalColor = normal; | 
					
						
							|  |  |  | 	alertColor = alert; | 
					
						
							| 
									
										
										
										
											2014-01-23 17:54:34 -02:00
										 |  |  | } |