diff options
Diffstat (limited to 'qt-ui/profile')
-rw-r--r-- | qt-ui/profile/diveprofileitem.cpp | 79 | ||||
-rw-r--r-- | qt-ui/profile/diveprofileitem.h | 8 |
2 files changed, 80 insertions, 7 deletions
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 |