From b526b764bb309c700b96f728f3e0f6aca051f974 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 10:48:26 -0200
Subject: [PATCH 1/7] Added the Dive Computer Text.

Added the Dive Computer Text, on the bottom left side of the
new Profile.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/divetextitem.cpp   | 15 ++++++++++-----
 qt-ui/profile/divetextitem.h     |  3 ++-
 qt-ui/profile/profilewidget2.cpp | 13 ++++++++++---
 qt-ui/profile/profilewidget2.h   |  2 ++
 4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/qt-ui/profile/divetextitem.cpp b/qt-ui/profile/divetextitem.cpp
index 5ace46b..0bf0710 100644
--- a/qt-ui/profile/divetextitem.cpp
+++ b/qt-ui/profile/divetextitem.cpp
@@ -12,7 +12,7 @@
 DiveTextItem::DiveTextItem(QGraphicsItem* parent): QGraphicsItemGroup(parent),
 	textBackgroundItem(NULL),
 	textItem(NULL),
-	internalAlignFlags(0)
+	internalAlignFlags(Qt::AlignHCenter | Qt::AlignVCenter)
 {
 	setFlag(ItemIgnoresTransformations);
 }
@@ -31,13 +31,18 @@ void DiveTextItem::setBrush(const QBrush& b)
 
 void DiveTextItem::setText(const QString& t)
 {
-	text = t;
+	internalText = t;
 	updateText();
 }
 
+const QString& DiveTextItem::text()
+{
+	return internalText;
+}
+
 void DiveTextItem::updateText()
 {
-	if(!internalAlignFlags || text.isEmpty())
+	if(internalText.isEmpty())
 		return;
 
 	delete textItem;
@@ -49,7 +54,7 @@ void DiveTextItem::updateText()
 	QPainterPath textPath;
 	qreal xPos = 0, yPos = 0;
 
-	QRectF rect = fm.boundingRect(text);
+	QRectF rect = fm.boundingRect(internalText);
 	yPos = (internalAlignFlags & Qt::AlignTop) ? -rect.height() :
 			(internalAlignFlags & Qt::AlignBottom) ? +rect.height() :
 	/*(internalAlignFlags & Qt::AlignVCenter  ? */ +rect.height() / 4;
@@ -58,7 +63,7 @@ void DiveTextItem::updateText()
 		(internalAlignFlags & Qt::AlignHCenter) ?  -rect.width()/2 :
 	 /* (internalAlignFlags & Qt::AlignRight) */ -rect.width();
 
-	textPath.addText( xPos, yPos, fnt, text);
+	textPath.addText( xPos, yPos, fnt, internalText);
 	QPainterPathStroker stroker;
 	stroker.setWidth(3);
 	textBackgroundItem = new QGraphicsPathItem(stroker.createStroke(textPath), this);
diff --git a/qt-ui/profile/divetextitem.h b/qt-ui/profile/divetextitem.h
index 6771d91..774693c 100644
--- a/qt-ui/profile/divetextitem.h
+++ b/qt-ui/profile/divetextitem.h
@@ -18,12 +18,13 @@ public:
 	void setBrush(const QBrush& brush);
 	void animatedHide();
 	void animateMoveTo(qreal x, qreal y);
+	const QString& text();
 private:
 	void updateText();
 	int internalAlignFlags;
 	QGraphicsPathItem *textBackgroundItem;
 	QGraphicsPathItem *textItem;
-	QString text;
+	QString internalText;
 	color_indice_t colorIndex;
 	QBrush brush;
 };
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index 6fc5dd5..34b87ad 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -7,7 +7,7 @@
 #include "helpers.h"
 #include "profile.h"
 #include "diveeventitem.h"
-
+#include "divetextitem.h"
 #include <QStateMachine>
 #include <QSignalTransition>
 #include <QPropertyAnimation>
@@ -37,7 +37,8 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) :
 	temperatureItem(NULL),
 	gasPressureItem(NULL),
 	cartesianPlane(new DiveCartesianPlane()),
-	meanDepth(new DiveLineItem())
+	meanDepth(new DiveLineItem()),
+	diveComputerText(new DiveTextItem())
 {
 	setScene(new QGraphicsScene());
 	scene()->setSceneRect(0, 0, 100, 100);
@@ -92,10 +93,13 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) :
 	cartesianPlane->setLeftAxis(profileYAxis);
 	scene()->addItem(cartesianPlane);
 
+	diveComputerText->setAlignment(Qt::AlignLeft | Qt::AlignTop);
+	diveComputerText->setBrush(getColor(TIME_TEXT));
+
 	// insert in the same way it's declared on the Enum. This is needed so we don't use an map.
 	QList<QGraphicsItem*> stateItems; stateItems << background << profileYAxis << gasYAxis <<
 							timeAxis << depthController << timeController <<
-							temperatureAxis << cylinderPressureAxis <<
+							temperatureAxis << cylinderPressureAxis << diveComputerText <<
 							meanDepth;
 	Q_FOREACH(QGraphicsItem *item, stateItems) {
 		scene()->addItem(item);
@@ -354,6 +358,9 @@ void ProfileWidget2::plotDives(QList<dive*> dives)
 	gasPressureItem->setHorizontalDataColumn(DivePlotDataModel::TIME);
 	scene()->addItem(gasPressureItem);
 
+	diveComputerText->setText(currentdc->model);
+	diveComputerText->setPos(1 , sceneRect().height());
+
 	emit startProfileState();
 }
 
diff --git a/qt-ui/profile/profilewidget2.h b/qt-ui/profile/profilewidget2.h
index 7f6d773..7a24008 100644
--- a/qt-ui/profile/profilewidget2.h
+++ b/qt-ui/profile/profilewidget2.h
@@ -16,6 +16,7 @@
 #include "graphicsview-common.h"
 #include "divelineitem.h"
 
+class DiveTextItem;
 class TemperatureAxis;
 class DiveEventItem;
 struct DivePlotDataModel;
@@ -81,6 +82,7 @@ private:
 	DiveGasPressureItem *gasPressureItem;
 	DiveLineItem *meanDepth;
 	QList<DiveEventItem*> eventItems;
+	DiveTextItem *diveComputerText;
 };
 
 #endif
-- 
1.8.5.3

From 13596d63f0ddd2c4337147b02aa8d22e5c9db032 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 13:27:08 -0200
Subject: [PATCH 2/7] Added the Depth Text.

Depth text got added to the new profile.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/diveplotdatamodel.cpp |  5 +++++
 qt-ui/profile/diveplotdatamodel.h   |  1 +
 qt-ui/profile/diveprofileitem.cpp   | 36 ++++++++++++++++++++++++++++++++++++
 qt-ui/profile/diveprofileitem.h     |  4 ++++
 qt-ui/profile/profilewidget2.cpp    |  2 +-
 qt-ui/profilegraphics.h             |  2 +-
 6 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/qt-ui/profile/diveplotdatamodel.cpp b/qt-ui/profile/diveplotdatamodel.cpp
index 32067d3..b0532f6 100644
--- a/qt-ui/profile/diveplotdatamodel.cpp
+++ b/qt-ui/profile/diveplotdatamodel.cpp
@@ -45,6 +45,11 @@ QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
 	return QVariant();
 }
 
+plot_data* DivePlotDataModel::data()
+{
+	return plotData;
+}
+
 int DivePlotDataModel::rowCount(const QModelIndex& parent) const
 {
 	return sampleCount;
diff --git a/qt-ui/profile/diveplotdatamodel.h b/qt-ui/profile/diveplotdatamodel.h
index dc03273..3d4d495 100644
--- a/qt-ui/profile/diveplotdatamodel.h
+++ b/qt-ui/profile/diveplotdatamodel.h
@@ -18,6 +18,7 @@ public:
 	virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
 	void clear();
 	void setDive(struct dive *d, const plot_info& pInfo);
+	plot_data* data();
 private:
 	int sampleCount;
 	plot_data *plotData;
diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 03ad9c1..0715bc5 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -103,6 +103,42 @@ void DiveProfileItem::modelDataChanged(){
 	pat.setColorAt(1, getColor(DEPTH_BOTTOM));
 	pat.setColorAt(0, getColor(DEPTH_TOP));
 	setBrush(QBrush(pat));
+
+	qDeleteAll(texts);
+	texts.clear();
+
+	int last = -1;
+	for (int i = 0, count  = dataModel->rowCount(); i < count; i++) {
+
+		struct plot_data *entry = static_cast<DivePlotDataModel*>(dataModel)->data()+i;
+		if (entry->depth < 2000)
+			continue;
+
+		if ((entry == entry->max[2]) && entry->depth / 100 != last) {
+			plot_depth_sample(entry, Qt::AlignHCenter | Qt::AlignTop, getColor(SAMPLE_DEEP));
+			last = entry->depth / 100;
+		}
+
+		if ((entry == entry->min[2]) && entry->depth / 100 != last) {
+			plot_depth_sample(entry, Qt::AlignHCenter | Qt::AlignBottom, getColor(SAMPLE_SHALLOW));
+			last = entry->depth / 100;
+		}
+
+		if (entry->depth != last)
+			last = -1;
+	}
+}
+
+void DiveProfileItem::plot_depth_sample(struct plot_data *entry,QFlags<Qt::AlignmentFlag> flags,const QColor& color)
+{
+	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);
 }
 
 DiveTemperatureItem::DiveTemperatureItem()
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index 89c18ff..b9be3ed 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -21,6 +21,7 @@
 class DiveTextItem;
 class DiveCartesianAxis;
 class QAbstractTableModel;
+struct plot_data;
 
 class AbstractProfilePolygonItem : public QObject, public QGraphicsPolygonItem{
 	Q_OBJECT
@@ -43,13 +44,16 @@ protected:
 	QAbstractTableModel *dataModel;
 	int hDataColumn;
 	int vDataColumn;
+	QList<DiveTextItem*> texts;
 };
 
 class DiveProfileItem : public AbstractProfilePolygonItem{
 	Q_OBJECT
+
 public:
 	virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 	virtual void modelDataChanged();
+	void plot_depth_sample(struct plot_data *entry,QFlags<Qt::AlignmentFlag> flags,const QColor& color);
 };
 
 class DiveTemperatureItem : public AbstractProfilePolygonItem{
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index 34b87ad..b76b4d3 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -359,7 +359,7 @@ void ProfileWidget2::plotDives(QList<dive*> dives)
 	scene()->addItem(gasPressureItem);
 
 	diveComputerText->setText(currentdc->model);
-	diveComputerText->setPos(1 , sceneRect().height());
+	diveComputerText->animateMoveTo(1 , sceneRect().height());
 
 	emit startProfileState();
 }
diff --git a/qt-ui/profilegraphics.h b/qt-ui/profilegraphics.h
index 8881d03..e2b8581 100644
--- a/qt-ui/profilegraphics.h
+++ b/qt-ui/profilegraphics.h
@@ -162,7 +162,7 @@ private:
 	void plot_single_temp_text(int sec, int mkelvin);
 	void plot_depth_text();
 	void plot_text_samples();
-	void plot_depth_sample(struct plot_data *entry, text_render_options_t *tro);
+	void plot_depth_sample(plot_data* entry, text_render_options_t* tro);
 	void plot_cylinder_pressure_text();
 	void plot_pressure_value(int mbar, int sec, double xalign, double yalign);
 	void plot_gas_value(int mbar, int sec, double xalign, double yalign, int o2, int he);
-- 
1.8.5.3

From 4830d3901258e1730397dd6ef7bb018fe66505d3 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 13:35:40 -0200
Subject: [PATCH 3/7] Simplyfi the code for the Cylinder Pressure.

Instead of asking the data as we do on the generic models,
use the internal knowledge of the class.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/diveprofileitem.cpp | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 0715bc5..f33ebee 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -226,22 +226,19 @@ void DiveGasPressureItem::modelDataChanged()
 	QPolygonF boundingPoly; // This is the "Whole Item", but a pressure can be divided in N Polygons.
 	polygons.clear();
 
-	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) {
+	for (int i = 0, count = dataModel->rowCount(); i < count; i++) {
+		plot_data* entry = dataModel->data() + i;
+		int mbar = GET_PRESSURE(entry);
+
+		if (entry->cylinderindex != last_index) {
 			polygons.append(QPolygonF()); // this is the polygon that will be actually drawned on screen.
-			last_index = cylIndex;
+			last_index = entry->cylinderindex;
 		}
 		if (!mbar) {
 			continue;
 		}
 
-		QPointF point(hAxis->posAtValue(sec), vAxis->posAtValue(mbar));
+		QPointF point(hAxis->posAtValue(entry->sec), vAxis->posAtValue(mbar));
 		boundingPoly.push_back(point); // The BoundingRect
 		polygons.last().push_back(point); // The polygon thta will be plotted.
 	}
-- 
1.8.5.3

From 04be1bcd1e8293a59ef831a41e86eb13d51604c1 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 14:05:29 -0200
Subject: [PATCH 4/7] Added the Gas Presssure Profile texts.

This just addds the Texts for the gas profile. I'v also added
a method on the dataModel() to return the diveId of the last
used dive in a way that the other methods can use it.

This code is almost 1-to-1 with the old one, a bit of thinkering
can be used to merge this loop with the upper one.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/diveplotdatamodel.cpp |  6 ++++
 qt-ui/profile/diveplotdatamodel.h   |  2 ++
 qt-ui/profile/diveprofileitem.cpp   | 58 +++++++++++++++++++++++++++++++++----
 qt-ui/profile/diveprofileitem.h     |  9 +++---
 4 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/qt-ui/profile/diveplotdatamodel.cpp b/qt-ui/profile/diveplotdatamodel.cpp
index b0532f6..e393696 100644
--- a/qt-ui/profile/diveplotdatamodel.cpp
+++ b/qt-ui/profile/diveplotdatamodel.cpp
@@ -95,8 +95,14 @@ void DivePlotDataModel::setDive(dive* d,const plot_info& pInfo)
 
 	if (d)
 		dc = select_dc(&d->dc);
+	diveId = d->id;
 	plotData = pInfo.entry;
 	sampleCount = pInfo.nr;
 	beginInsertRows(QModelIndex(), 0, sampleCount-1);
 	endInsertRows();
 }
+
+int DivePlotDataModel::id() const
+{
+	return diveId;
+}
diff --git a/qt-ui/profile/diveplotdatamodel.h b/qt-ui/profile/diveplotdatamodel.h
index 3d4d495..3afc580 100644
--- a/qt-ui/profile/diveplotdatamodel.h
+++ b/qt-ui/profile/diveplotdatamodel.h
@@ -19,9 +19,11 @@ public:
 	void clear();
 	void setDive(struct dive *d, const plot_info& pInfo);
 	plot_data* data();
+	int id() const;
 private:
 	int sampleCount;
 	plot_data *plotData;
+	int diveId;
 };
 
 #endif
\ No newline at end of file
diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index f33ebee..031acf8 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -32,7 +32,7 @@ void AbstractProfilePolygonItem::setHorizontalDataColumn(int column)
 	modelDataChanged();
 }
 
-void AbstractProfilePolygonItem::setModel(QAbstractTableModel* model)
+void AbstractProfilePolygonItem::setModel(DivePlotDataModel* model)
 {
 	dataModel = model;
 	modelDataChanged();
@@ -69,6 +69,9 @@ void AbstractProfilePolygonItem::modelDataChanged()
 		poly.append(point);
 	}
 	setPolygon(poly);
+
+	qDeleteAll(texts);
+	texts.clear();
 }
 
 void DiveProfileItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
@@ -104,13 +107,10 @@ void DiveProfileItem::modelDataChanged(){
 	pat.setColorAt(0, getColor(DEPTH_TOP));
 	setBrush(QBrush(pat));
 
-	qDeleteAll(texts);
-	texts.clear();
-
 	int last = -1;
 	for (int i = 0, count  = dataModel->rowCount(); i < count; i++) {
 
-		struct plot_data *entry = static_cast<DivePlotDataModel*>(dataModel)->data()+i;
+		struct plot_data *entry = dataModel->data()+i;
 		if (entry->depth < 2000)
 			continue;
 
@@ -243,6 +243,54 @@ void DiveGasPressureItem::modelDataChanged()
 		polygons.last().push_back(point); // The polygon thta will be plotted.
 	}
 	setPolygon(boundingPoly);
+
+	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;
+	struct dive *dive = getDiveById(dataModel->id());
+	Q_ASSERT(dive != NULL);
+
+	cyl = -1;
+	for (int i = 0, count = dataModel->rowCount(); i < count; i++) {
+		entry = dataModel->data() + i;
+		mbar = GET_PRESSURE(entry);
+
+		if (!mbar)
+			continue;
+		if (cyl != entry->cylinderindex) {
+			cyl = entry->cylinderindex;
+			if (!seen_cyl[cyl]) {
+				plot_pressure_value(mbar, entry->sec, Qt::AlignLeft | Qt::AlignBottom);
+// 				plot_gas_value(mbar, entry->sec, LEFT, TOP,
+// 						get_o2(&dive->cylinder[cyl].gasmix),
+// 						get_he(&dive->cylinder[cyl].gasmix));
+				seen_cyl[cyl] = true;
+			}
+		}
+		last_pressure[cyl] = mbar;
+		last_time[cyl] = entry->sec;
+	}
+
+	for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) {
+		if (last_time[cyl]) {
+			plot_pressure_value(last_pressure[cyl], last_time[cyl], Qt::AlignHCenter | Qt::AlignTop);
+		}
+	}
+}
+
+void DiveGasPressureItem::plot_pressure_value(int mbar, int sec, QFlags<Qt::AlignmentFlag> flags)
+{
+	const char *unit;
+	int pressure = get_pressure_units(mbar, &unit);
+	//static text_render_options_t tro = {PRESSURE_TEXT_SIZE, PRESSURE_TEXT, xalign, yalign};
+	DiveTextItem *text = new DiveTextItem(this);
+	text->setPos(hAxis->posAtValue(sec), vAxis->posAtValue(mbar));
+	text->setText(QString("%1 %2").arg(pressure).arg(unit));
+	text->setAlignment(flags);
+	text->setBrush(getColor(PRESSURE_TEXT));
+	texts.push_back(text);
 }
 
 void DiveGasPressureItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index b9be3ed..bd1170f 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -18,6 +18,7 @@
  This is a generically item and should be used as a base for others, I think...
 */
 
+class DivePlotDataModel;
 class DiveTextItem;
 class DiveCartesianAxis;
 class QAbstractTableModel;
@@ -32,7 +33,7 @@ public:
 	AbstractProfilePolygonItem();
 	void setVerticalAxis(DiveCartesianAxis *vertical);
 	void setHorizontalAxis(DiveCartesianAxis *horizontal);
-	void setModel(QAbstractTableModel *model);
+	void setModel(DivePlotDataModel *model);
 	void setHorizontalDataColumn(int column);
 	void setVerticalDataColumn(int column);
 	virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) = 0;
@@ -41,7 +42,7 @@ public slots:
 protected:
 	DiveCartesianAxis *hAxis;
 	DiveCartesianAxis *vAxis;
-	QAbstractTableModel *dataModel;
+	DivePlotDataModel *dataModel;
 	int hDataColumn;
 	int vDataColumn;
 	QList<DiveTextItem*> texts;
@@ -69,13 +70,13 @@ private:
 
 class DiveGasPressureItem : public AbstractProfilePolygonItem{
 	Q_OBJECT
+
 public:
 	virtual void modelDataChanged();
 	virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 private:
+	void plot_pressure_value(int mbar, int sec, QFlags<Qt::AlignmentFlag> align);
 	QVector<QPolygonF> polygons;
 };
 
-QGraphicsItemGroup *plotText(text_render_options_t *tro,const QPointF& pos, const QString& text, QGraphicsItem *parent);
-
 #endif
\ No newline at end of file
-- 
1.8.5.3

From 57949dd82e78f0adb13bee4ffe8e86c69d3e5bcb Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 14:14:52 -0200
Subject: [PATCH 5/7] Plot gas value function ported to the new canvas.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/diveprofileitem.cpp | 20 ++++++++++++++++----
 qt-ui/profile/diveprofileitem.h   |  1 +
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 031acf8..1c3bfb7 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -263,9 +263,9 @@ void DiveGasPressureItem::modelDataChanged()
 			cyl = entry->cylinderindex;
 			if (!seen_cyl[cyl]) {
 				plot_pressure_value(mbar, entry->sec, Qt::AlignLeft | Qt::AlignBottom);
-// 				plot_gas_value(mbar, entry->sec, LEFT, TOP,
-// 						get_o2(&dive->cylinder[cyl].gasmix),
-// 						get_he(&dive->cylinder[cyl].gasmix));
+				plot_gas_value(mbar, entry->sec, Qt::AlignLeft | Qt::AlignTop,
+						get_o2(&dive->cylinder[cyl].gasmix),
+						get_he(&dive->cylinder[cyl].gasmix));
 				seen_cyl[cyl] = true;
 			}
 		}
@@ -284,7 +284,6 @@ void DiveGasPressureItem::plot_pressure_value(int mbar, int sec, QFlags<Qt::Alig
 {
 	const char *unit;
 	int pressure = get_pressure_units(mbar, &unit);
-	//static text_render_options_t tro = {PRESSURE_TEXT_SIZE, PRESSURE_TEXT, xalign, yalign};
 	DiveTextItem *text = new DiveTextItem(this);
 	text->setPos(hAxis->posAtValue(sec), vAxis->posAtValue(mbar));
 	text->setText(QString("%1 %2").arg(pressure).arg(unit));
@@ -293,6 +292,19 @@ void DiveGasPressureItem::plot_pressure_value(int mbar, int sec, QFlags<Qt::Alig
 	texts.push_back(text);
 }
 
+void DiveGasPressureItem::plot_gas_value(int mbar, int sec, QFlags<Qt::AlignmentFlag> flags, int o2, int he)
+{
+	QString gas  = (is_air(o2, he)) ? tr("air")
+			:  (he == 0) ? QString(tr("EAN%1")).arg((o2 + 5) / 10)
+			: QString("%1/%2").arg((o2 + 5) / 10).arg((he + 5) / 10);
+	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);
+}
+
 void DiveGasPressureItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
 {
 	QPen pen;
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index bd1170f..1aa1af9 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -76,6 +76,7 @@ public:
 	virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 private:
 	void plot_pressure_value(int mbar, int sec, QFlags<Qt::AlignmentFlag> align);
+	void plot_gas_value(int mbar, int sec, QFlags<Qt::AlignmentFlag> align, int o2, int he);
 	QVector<QPolygonF> polygons;
 };
 
-- 
1.8.5.3

From a387412bdbecddcf0f91e8910a4fd9019669e20a Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 14:59:19 -0200
Subject: [PATCH 6/7] Added the DiveCalculatedCeiling item.

This item plots the DiveCalculatedCeiling over the
Profile. I still need to add the Calc All Tissues
version.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/diveplotdatamodel.cpp |  2 ++
 qt-ui/profile/diveplotdatamodel.h   |  3 ++-
 qt-ui/profile/diveprofileitem.cpp   | 27 +++++++++++++++++++++++++++
 qt-ui/profile/diveprofileitem.h     |  9 ++++++++-
 qt-ui/profile/profilewidget2.cpp    | 15 ++++++++++++++-
 qt-ui/profile/profilewidget2.h      |  2 ++
 qt-ui/profilegraphics.cpp           |  1 +
 7 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/qt-ui/profile/diveplotdatamodel.cpp b/qt-ui/profile/diveplotdatamodel.cpp
index e393696..b32918b 100644
--- a/qt-ui/profile/diveplotdatamodel.cpp
+++ b/qt-ui/profile/diveplotdatamodel.cpp
@@ -34,6 +34,7 @@ QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
 			case CYLINDERINDEX: return item.cylinderindex;
 			case SENSOR_PRESSURE: return item.pressure[0];
 			case INTERPOLATED_PRESSURE: return item.pressure[1];
+			case CEILING: return item.ceiling;
 			case SAC: return item.sac;
 		}
 	}
@@ -73,6 +74,7 @@ QVariant DivePlotDataModel::headerData(int section, Qt::Orientation orientation,
 		case CYLINDERINDEX: return tr("Cylinder Index");
 		case SENSOR_PRESSURE: return tr("Pressure  S");
 		case INTERPOLATED_PRESSURE: return tr("Pressure I");
+		case CEILING: return tr("Ceiling");
 		case SAC: return tr("SAC");
 	}
 	return QVariant();
diff --git a/qt-ui/profile/diveplotdatamodel.h b/qt-ui/profile/diveplotdatamodel.h
index 3afc580..cc39109 100644
--- a/qt-ui/profile/diveplotdatamodel.h
+++ b/qt-ui/profile/diveplotdatamodel.h
@@ -10,7 +10,8 @@ struct plot_info;
 class DivePlotDataModel : public QAbstractTableModel{
 Q_OBJECT
 public:
-	enum {DEPTH, TIME, PRESSURE, TEMPERATURE, USERENTERED, COLOR, CYLINDERINDEX, SENSOR_PRESSURE, INTERPOLATED_PRESSURE, SAC, COLUMNS};
+	enum {DEPTH, TIME, PRESSURE, TEMPERATURE, USERENTERED, COLOR, CYLINDERINDEX, SENSOR_PRESSURE, INTERPOLATED_PRESSURE,
+		SAC, CEILING, COLUMNS};
 	explicit DivePlotDataModel(QObject* parent = 0);
 	virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
 	virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 1c3bfb7..9ea1023 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -318,3 +318,30 @@ void DiveGasPressureItem::paint(QPainter* painter, const QStyleOptionGraphicsIte
 		}
 	}
 }
+
+void DiveCalculatedCeiling::modelDataChanged()
+{
+	// We don't have enougth data to calculate things, quit.
+	if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
+		return;
+	AbstractProfilePolygonItem::modelDataChanged();
+	// Add 2 points to close the polygon.
+	QPolygonF poly = polygon();
+	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));
+	setPen(QPen(QBrush(Qt::NoBrush),0));
+	setBrush(pat);
+}
+
+void DiveCalculatedCeiling::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
+{
+	QGraphicsPolygonItem::paint(painter, option, widget);
+}
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index 1aa1af9..9e71eac 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -65,7 +65,6 @@ public:
 	virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 private:
 	void createTextItem(int seconds, int mkelvin);
-	QList<DiveTextItem*> texts;
 };
 
 class DiveGasPressureItem : public AbstractProfilePolygonItem{
@@ -80,4 +79,12 @@ private:
 	QVector<QPolygonF> polygons;
 };
 
+class DiveCalculatedCeiling : public AbstractProfilePolygonItem{
+	Q_OBJECT
+
+public:
+	virtual void modelDataChanged();
+	virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
+};
+
 #endif
\ No newline at end of file
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index b76b4d3..46856ba 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -38,7 +38,8 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) :
 	gasPressureItem(NULL),
 	cartesianPlane(new DiveCartesianPlane()),
 	meanDepth(new DiveLineItem()),
-	diveComputerText(new DiveTextItem())
+	diveComputerText(new DiveTextItem()),
+	diveCeiling(NULL)
 {
 	setScene(new QGraphicsScene());
 	scene()->setSceneRect(0, 0, 100, 100);
@@ -358,6 +359,18 @@ void ProfileWidget2::plotDives(QList<dive*> dives)
 	gasPressureItem->setHorizontalDataColumn(DivePlotDataModel::TIME);
 	scene()->addItem(gasPressureItem);
 
+	if(diveCeiling){
+		scene()->removeItem(diveCeiling);
+		delete diveCeiling;
+	}
+	diveCeiling = new DiveCalculatedCeiling();
+	diveCeiling->setHorizontalAxis(timeAxis);
+	diveCeiling->setVerticalAxis(profileYAxis);
+	diveCeiling->setModel(dataModel);
+	diveCeiling->setVerticalDataColumn(DivePlotDataModel::CEILING);
+	diveCeiling->setHorizontalDataColumn(DivePlotDataModel::TIME);
+	scene()->addItem(diveCeiling);
+
 	diveComputerText->setText(currentdc->model);
 	diveComputerText->animateMoveTo(1 , sceneRect().height());
 
diff --git a/qt-ui/profile/profilewidget2.h b/qt-ui/profile/profilewidget2.h
index 7a24008..d5d657d 100644
--- a/qt-ui/profile/profilewidget2.h
+++ b/qt-ui/profile/profilewidget2.h
@@ -32,6 +32,7 @@ struct DiveCartesianPlane;
 struct DiveTemperatureItem;
 struct plot_info;
 struct DiveGasPressureItem;
+struct DiveCalculatedCeiling;
 
 class ProfileWidget2 : public QGraphicsView {
 	Q_OBJECT
@@ -83,6 +84,7 @@ private:
 	DiveLineItem *meanDepth;
 	QList<DiveEventItem*> eventItems;
 	DiveTextItem *diveComputerText;
+	DiveCalculatedCeiling *diveCeiling;
 };
 
 #endif
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp
index 454bca6..0bb78d7 100644
--- a/qt-ui/profilegraphics.cpp
+++ b/qt-ui/profilegraphics.cpp
@@ -1312,6 +1312,7 @@ void ProfileGraphicsView::plot_depth_profile()
 			scene()->addItem(neatFill);
 		}
 	}
+
 	/* next show where we have been bad and crossed the dc's ceiling */
 	if (prefs.profile_dc_ceiling) {
 		pat.setColorAt(0, getColor(CEILING_SHALLOW));
-- 
1.8.5.3

From e5475fefb7cfd59c52ac08017ba45b354d9ace52 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 21 Jan 2014 15:31:56 -0200
Subject: [PATCH 7/7] Added the Tissues to the Profile Graph

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/profile/diveplotdatamodel.cpp |  8 ++++++++
 qt-ui/profile/diveplotdatamodel.h   |  3 ++-
 qt-ui/profile/profilewidget2.cpp    | 10 ++++++++++
 qt-ui/profile/profilewidget2.h      |  1 +
 4 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/qt-ui/profile/diveplotdatamodel.cpp b/qt-ui/profile/diveplotdatamodel.cpp
index b32918b..6635ff1 100644
--- a/qt-ui/profile/diveplotdatamodel.cpp
+++ b/qt-ui/profile/diveplotdatamodel.cpp
@@ -38,6 +38,11 @@ QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
 			case SAC: return item.sac;
 		}
 	}
+
+	if (role == Qt::DisplayRole && index.column() >= TISSUE_1 && index.column() <= TISSUE_16){
+		return item.ceilings[ index.column() - TISSUE_1];
+	}
+
 	if (role == Qt::BackgroundRole) {
 		switch (index.column()) {
 			case COLOR:	return getColor((color_indice_t)(VELOCITY_COLORS_START_IDX + item.velocity));
@@ -77,6 +82,9 @@ QVariant DivePlotDataModel::headerData(int section, Qt::Orientation orientation,
 		case CEILING: return tr("Ceiling");
 		case SAC: return tr("SAC");
 	}
+	if (role == Qt::DisplayRole && section >= TISSUE_1 && section <= TISSUE_16){
+		return QString("Ceiling: %1").arg(section - TISSUE_1);
+	}
 	return QVariant();
 }
 
diff --git a/qt-ui/profile/diveplotdatamodel.h b/qt-ui/profile/diveplotdatamodel.h
index cc39109..b188396 100644
--- a/qt-ui/profile/diveplotdatamodel.h
+++ b/qt-ui/profile/diveplotdatamodel.h
@@ -11,7 +11,8 @@ class DivePlotDataModel : public QAbstractTableModel{
 Q_OBJECT
 public:
 	enum {DEPTH, TIME, PRESSURE, TEMPERATURE, USERENTERED, COLOR, CYLINDERINDEX, SENSOR_PRESSURE, INTERPOLATED_PRESSURE,
-		SAC, CEILING, COLUMNS};
+		SAC, CEILING, TISSUE_1,TISSUE_2,TISSUE_3,TISSUE_4,TISSUE_5,TISSUE_6,TISSUE_7,TISSUE_8,TISSUE_9,TISSUE_10,
+		TISSUE_11,TISSUE_12,TISSUE_13,TISSUE_14,TISSUE_15,TISSUE_16,COLUMNS};
 	explicit DivePlotDataModel(QObject* parent = 0);
 	virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
 	virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index 46856ba..045e7ee 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -374,6 +374,16 @@ void ProfileWidget2::plotDives(QList<dive*> dives)
 	diveComputerText->setText(currentdc->model);
 	diveComputerText->animateMoveTo(1 , sceneRect().height());
 
+	qDeleteAll(allTissues);
+	for(int i = 0; i < 16; i++){
+		DiveCalculatedCeiling *tissueItem = new DiveCalculatedCeiling();
+		tissueItem->setHorizontalAxis(timeAxis);
+		tissueItem->setVerticalAxis(profileYAxis);
+		tissueItem->setModel(dataModel);
+		tissueItem->setVerticalDataColumn(DivePlotDataModel::TISSUE_1 + i);
+		tissueItem->setHorizontalDataColumn(DivePlotDataModel::TIME);
+		scene()->addItem(tissueItem);
+	}
 	emit startProfileState();
 }
 
diff --git a/qt-ui/profile/profilewidget2.h b/qt-ui/profile/profilewidget2.h
index d5d657d..37508ce 100644
--- a/qt-ui/profile/profilewidget2.h
+++ b/qt-ui/profile/profilewidget2.h
@@ -85,6 +85,7 @@ private:
 	QList<DiveEventItem*> eventItems;
 	DiveTextItem *diveComputerText;
 	DiveCalculatedCeiling *diveCeiling;
+	QList<DiveCalculatedCeiling*> allTissues;
 };
 
 #endif
-- 
1.8.5.3

_______________________________________________
subsurface mailing list
[email protected]
http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to