summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qt-ui/graphicsview-common.h7
-rw-r--r--qt-ui/profile/diveprofileitem.cpp79
-rw-r--r--qt-ui/profile/diveprofileitem.h8
-rw-r--r--qt-ui/profilegraphics.cpp21
-rw-r--r--qt-ui/profilegraphics.h2
5 files changed, 96 insertions, 21 deletions
diff --git a/qt-ui/graphicsview-common.h b/qt-ui/graphicsview-common.h
index 0c260a89e..c00b2d69c 100644
--- a/qt-ui/graphicsview-common.h
+++ b/qt-ui/graphicsview-common.h
@@ -36,4 +36,11 @@ extern QMap<color_indice_t, QVector<QColor> > profile_color;
void fill_profile_color();
QColor getColor(const color_indice_t i);
+struct text_render_options {
+ double size;
+ color_indice_t color;
+ double hpos, vpos;
+};
+
+typedef text_render_options text_render_options_t;
#endif
diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 3e6b05a09..32679b565 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -2,12 +2,17 @@
#include "diveplotdatamodel.h"
#include "divecartesianaxis.h"
#include "graphicsview-common.h"
+#include "divetextitem.h"
#include "profile.h"
+#include "dive.h"
+#include "profilegraphics.h"
#include <QPen>
#include <QPainter>
#include <QLinearGradient>
#include <QDebug>
+#include <QApplication>
+#include <QGraphicsItem>
AbstractProfilePolygonItem::AbstractProfilePolygonItem(): QObject(), QGraphicsPolygonItem(),
hAxis(NULL), vAxis(NULL), dataModel(NULL), hDataColumn(-1), vDataColumn(-1)
@@ -117,15 +122,46 @@ void DiveTemperatureItem::modelDataChanged()
// Ignore empty values. things do not look good with '0' as temperature in kelvin...
QPolygonF poly;
+ int last = -300, last_printed_temp = 0, sec = 0;
for (int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++) {
- qreal verticalValue = dataModel->index(i, vDataColumn).data().toReal();
- if(!verticalValue)
+ int mkelvin = dataModel->index(i, vDataColumn).data().toInt();
+ if(!mkelvin)
continue;
- qreal horizontalValue = dataModel->index(i, hDataColumn).data().toReal();
- QPointF point( hAxis->posAtValue(horizontalValue), vAxis->posAtValue(verticalValue));
+ int sec = dataModel->index(i, hDataColumn).data().toInt();
+ QPointF point( hAxis->posAtValue(sec), vAxis->posAtValue(mkelvin));
poly.append(point);
+
+ /* 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)
+ createTextItem(sec,mkelvin);
+ last_printed_temp = mkelvin;
}
setPolygon(poly);
+
+ /* 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 */
+ int last_temperature = dataModel->data(dataModel->index(dataModel->rowCount()-1, DivePlotDataModel::TEMPERATURE)).toInt();
+ if (last_temperature > 200000 && ((abs(last_temperature - last_printed_temp) > 500) || ((double)last / (double)sec < 0.75))){
+ createTextItem(sec, last_temperature);
+ }
+}
+
+void DiveTemperatureItem::createTextItem(int sec, int mkelvin)
+{
+ double deg;
+ const char *unit;
+ static text_render_options_t tro = {TEMP_TEXT_SIZE, TEMP_TEXT, LEFT, TOP};
+ deg = get_temp_units(mkelvin, &unit);
+ plotText(&tro, QPointF(hAxis->posAtValue(sec), vAxis->posAtValue(mkelvin)), QString("%1%2").arg(deg, 0, 'f', 1).arg(unit), this); //"%.2g%s"
}
void DiveTemperatureItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
@@ -146,7 +182,6 @@ void DiveGasPressureItem::modelDataChanged()
QPolygonF boundingPoly; // This is the "Whole Item", but a pressure can be divided in N Polygons.
polygons.clear();
-#define M_PRESSURE( ROW )
for (int i = 0; i < dataModel->rowCount(); i++) {
int sPressure = dataModel->index(i, DivePlotDataModel::SENSOR_PRESSURE).data().toInt();
int iPressure = dataModel->index(i, DivePlotDataModel::INTERPOLATED_PRESSURE).data().toInt();
@@ -181,4 +216,36 @@ void DiveGasPressureItem::paint(QPainter* painter, const QStyleOptionGraphicsIte
painter->drawLine(poly[i-1],poly[i]);
}
}
-} \ No newline at end of file
+}
+
+QGraphicsItemGroup *plotText(text_render_options_t* tro, const QPointF& pos, const QString& text, QGraphicsItem *parent)
+{
+ QFont fnt(qApp->font());
+ QFontMetrics fm(fnt);
+
+ /*
+ if (printMode)
+ fnt.setPixelSize(tro->size);
+ */
+
+ QGraphicsItemGroup *group = new QGraphicsItemGroup(parent);
+ QPainterPath textPath;
+ /* addText() uses bottom-left text baseline and the -3 offset is probably slightly off
+ * for different font sizes. */
+ textPath.addText(0, fm.height() - 3, fnt, text);
+ QPainterPathStroker stroker;
+ stroker.setWidth(3);
+ QGraphicsPathItem *strokedItem = new QGraphicsPathItem(stroker.createStroke(textPath), group);
+ strokedItem->setBrush(QBrush(getColor(TEXT_BACKGROUND)));
+ strokedItem->setPen(Qt::NoPen);
+
+ QGraphicsPathItem *textItem = new QGraphicsPathItem(textPath, group);
+ textItem->setBrush(QBrush(getColor(tro->color)));
+ textItem->setPen(Qt::NoPen);
+
+ group->setPos(pos);
+ //group->setPos(pos.x() + dx, pos.y() + dy);
+// if (!printMode)
+ group->setFlag(QGraphicsItem::ItemIgnoresTransformations);
+ return group;
+}
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index ddecef947..2002c904a 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -3,7 +3,7 @@
#include <QObject>
#include <QGraphicsPolygonItem>
-
+#include "graphicsview-common.h"
/* This is the Profile Item, it should be used for quite a lot of things
on the profile view. The usage should be pretty simple:
@@ -18,6 +18,7 @@
This is a generically item and should be used as a base for others, I think...
*/
+class DiveTextItem;
class DiveCartesianAxis;
class QAbstractTableModel;
@@ -57,6 +58,8 @@ public:
DiveTemperatureItem();
virtual void modelDataChanged();
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
+private:
+ void createTextItem(int seconds, int mkelvin);
};
class DiveGasPressureItem : public AbstractProfilePolygonItem{
@@ -67,4 +70,7 @@ public:
private:
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
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp
index c907d2529..454bca65a 100644
--- a/qt-ui/profilegraphics.cpp
+++ b/qt-ui/profilegraphics.cpp
@@ -38,12 +38,6 @@ static struct graphics_context last_gc;
static double plot_scale = SCALE_SCREEN;
#endif
-struct text_render_options {
- double size;
- color_indice_t color;
- double hpos, vpos;
-};
-
extern struct ev_select *ev_namelist;
extern int evn_allocated;
extern int evn_used;
@@ -436,24 +430,25 @@ void ProfileGraphicsView::plot(struct dive *d, bool forceRedraw)
scene()->addItem(rect);
/* Depth profile */
- plot_depth_profile();
- plot_events(dc);
+ plot_depth_profile(); // TODO: PARTIALLY PORTED.
+ plot_events(dc); // PORTED
- if (rulerEnabled && !printMode)
+ if (rulerEnabled && !printMode) // TODO: NOT PORTED.
create_ruler();
/* Temperature profile */
- plot_temperature_profile();
+ plot_temperature_profile(); // PORTED
/* Cylinder pressure plot */
- plot_cylinder_pressure();
+ plot_cylinder_pressure(); // PORTED
- /* Text on top of all graphs.. */
+ /* Text on top of all graphs.. */ // TODO: NOT PORTED, ANY TEXT.
plot_temperature_text();
plot_depth_text();
plot_cylinder_pressure_text();
plot_deco_text();
+ // NOT PORTED.
/* Put the dive computer name in the lower left corner */
gc.leftx = 0; gc.rightx = 1.0;
gc.topy = 0; gc.bottomy = 1.0;
@@ -463,11 +458,13 @@ void ProfileGraphicsView::plot(struct dive *d, bool forceRedraw)
// The Time ruler should be right after the DiveComputer:
timeMarkers->setPos(0, diveComputer->y());
+ // NOT PORTED.
if (PP_GRAPHS_ENABLED) {
plot_pp_gas_profile();
plot_pp_text();
}
+ // NOT PORTED.
plot_depth_scale();
#if 0
diff --git a/qt-ui/profilegraphics.h b/qt-ui/profilegraphics.h
index 1be02bcb1..8881d0321 100644
--- a/qt-ui/profilegraphics.h
+++ b/qt-ui/profilegraphics.h
@@ -10,10 +10,8 @@
#include <QPushButton>
#include <QGraphicsProxyWidget>
-struct text_render_options;
struct graphics_context;
struct plot_info;
-typedef struct text_render_options text_render_options_t;
/* To use a tooltip, simply ->setToolTip on the QGraphicsItem that you want
* or, if it's a "global" tooltip, set it on the mouseMoveEvent of the ProfileGraphicsView.