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
