[PATCH] Plot mean depth data

Krzysztof Arentowicz karent.bug at gmail.com
Thu Jan 1 15:28:38 PST 2015


As we already have running depth sum values for each sample
why don't just plot running average depth graph.

Signed-off-by: Krzysztof Arentowicz <k.arentowicz at gmail.com>
---
 qt-ui/profile/diveprofileitem.cpp | 47 +++++++++++++++++++++++++++++++++++++++
 qt-ui/profile/diveprofileitem.h   | 12 ++++++++++
 qt-ui/profile/profilewidget2.cpp  |  9 +++++++-
 qt-ui/profile/profilewidget2.h    |  2 ++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 03a2451..e0f3ac8 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -568,6 +568,53 @@ void DiveTemperatureItem::paint(QPainter *painter, const QStyleOptionGraphicsIte
 	painter->restore();
 }

+DiveMeanDepthItem::DiveMeanDepthItem()
+{
+	QPen pen;
+	pen.setBrush(QBrush(getColor(::MEAN_DEPTH)));
+	pen.setCosmetic(true);
+	pen.setWidth(2);
+	setPen(pen);
+        settingsChanged();
+}
+
+void DiveMeanDepthItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+	double meandepthvalue;
+	// We don't have enougth data to calculate things, quit.
+	if (!shouldCalculateStuff(topLeft, bottomRight))
+            return;
+        	
+	QPolygonF poly;
+        plot_data *entry = dataModel->data().entry;
+	for (int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++, entry++) {
+            // Ignore empty values
+            if (entry->running_sum == 0 || entry->sec == 0)
+                    continue;
+
+            meandepthvalue = entry->running_sum / entry->sec ;
+            QPointF point(hAxis->posAtValue(entry->sec), vAxis->posAtValue(meandepthvalue));
+            poly.append(point);
+	}
+
+	setPolygon(poly);
+}
+		
+
+void DiveMeanDepthItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+	if (polygon().isEmpty())
+		return;
+	painter->save();
+	painter->setPen(pen());
+	painter->drawPolyline(polygon());
+	painter->restore();
+}
+
+void DiveMeanDepthItem::settingsChanged()
+{
+	setVisible(prefs.show_average_depth);
+}
 void DiveGasPressureItem::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
 {
 	// We don't have enougth data to calculate things, quit.
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index 4963103..0ff22cd 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -84,6 +84,18 @@ private:
 	QColor profileColor;
 };

+class DiveMeanDepthItem : public AbstractProfilePolygonItem {
+	Q_OBJECT
+public:
+	DiveMeanDepthItem();
+	virtual void modelDataChanged(const QModelIndex &topLeft = QModelIndex(), const QModelIndex &bottomRight = QModelIndex());
+	virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
+	virtual void settingsChanged();
+private:
+	QString visibilityKey;
+	
+};
+
 class DiveTemperatureItem : public AbstractProfilePolygonItem {
 	Q_OBJECT
 public:
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index b241325..5a82ae8 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -86,7 +86,8 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) : QGraphicsView(parent),
 	temperatureItem(new DiveTemperatureItem()),
 	cylinderPressureAxis(new DiveCartesianAxis()),
 	gasPressureItem(new DiveGasPressureItem()),
-	meanDepth(new MeanDepthLine()),
+        meanDepth(new MeanDepthLine()),
+        meanDepthItem(new DiveMeanDepthItem()),
 	diveComputerText(new DiveTextItem()),
 	diveCeiling(new DiveCalculatedCeiling()),
 	reportedCeiling(new DiveReportedCeiling()),
@@ -153,6 +154,7 @@ ProfileWidget2::~ProfileWidget2()
 	delete timeAxis;
 	delete diveProfileItem;
 	delete temperatureItem;
+        delete meanDepthItem;
 	delete cylinderPressureAxis;
 	delete gasPressureItem;
 	delete meanDepth;
@@ -188,6 +190,7 @@ void ProfileWidget2::addItemsToScene()
 	scene()->addItem(diveProfileItem);
 	scene()->addItem(cylinderPressureAxis);
 	scene()->addItem(temperatureItem);
+        scene()->addItem(meanDepthItem);
 	scene()->addItem(gasPressureItem);
 	scene()->addItem(meanDepth);
 	// I cannot seem to figure out if an object that I find with itemAt() on the scene
@@ -304,6 +307,9 @@ void ProfileWidget2::setupItemOnScene()
 	setupItem(ambPressureItem, timeAxis, percentageAxis, dataModel, DivePlotDataModel::AMBPRESSURE, DivePlotDataModel::TIME, 1);
 	setupItem(gflineItem, timeAxis, percentageAxis, dataModel, DivePlotDataModel::GFLINE, DivePlotDataModel::TIME, 1);
 	setupItem(diveProfileItem, timeAxis, profileYAxis, dataModel, DivePlotDataModel::DEPTH, DivePlotDataModel::TIME, 0);
+        setupItem(meanDepthItem, timeAxis, profileYAxis, dataModel, DivePlotDataModel::INSTANT_MEANDEPTH, DivePlotDataModel::TIME, 1);
+
+

 #define CREATE_PP_GAS(ITEM, VERTICAL_COLUMN, COLOR, COLOR_ALERT, THRESHOULD_SETTINGS, VISIBILITY_SETTINGS)              \
 	setupItem(ITEM, timeAxis, gasYAxis, dataModel, DivePlotDataModel::VERTICAL_COLUMN, DivePlotDataModel::TIME, 0); \
@@ -1002,6 +1008,7 @@ void ProfileWidget2::setProfileState()
 	cylinderPressureAxis->setPos(itemPos.cylinder.pos.on);
 	heartBeatItem->setVisible(prefs.hrgraph);
 	meanDepth->setVisible(true);
+        meanDepthItem->setVisible(prefs.show_average_depth);

 	diveComputerText->setVisible(true);
 	diveComputerText->setPos(itemPos.dcLabel.on);
diff --git a/qt-ui/profile/profilewidget2.h b/qt-ui/profile/profilewidget2.h
index 51acef9..2d49206 100644
--- a/qt-ui/profile/profilewidget2.h
+++ b/qt-ui/profile/profilewidget2.h
@@ -23,6 +23,7 @@ struct dive;
 struct plot_info;
 class ToolTipItem;
 class MeanDepthLine;
+class DiveMeanDepth;
 class DiveReportedCeiling;
 class DiveTextItem;
 class TemperatureAxis;
@@ -161,6 +162,7 @@ private:
 	TimeAxis *timeAxis;
 	DiveProfileItem *diveProfileItem;
 	DiveTemperatureItem *temperatureItem;
+        DiveMeanDepthItem   *meanDepthItem;
 	DiveCartesianAxis *cylinderPressureAxis;
 	DiveGasPressureItem *gasPressureItem;
 	MeanDepthLine *meanDepth;
-- 
1.9.1


More information about the subsurface mailing list