aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--profile.c2
-rw-r--r--profile.h1
-rw-r--r--qt-ui/profile/diveplotdatamodel.cpp33
-rw-r--r--qt-ui/profile/diveplotdatamodel.h10
-rw-r--r--qt-ui/profile/diveprofileitem.cpp73
-rw-r--r--qt-ui/profile/diveprofileitem.h26
6 files changed, 96 insertions, 49 deletions
diff --git a/profile.c b/profile.c
index 66e7a1357..6a20dce24 100644
--- a/profile.c
+++ b/profile.c
@@ -1151,7 +1151,7 @@ static void calculate_ndl_tts(double tissue_tolerance, struct plot_data *entry,
/* Let's try to do some deco calculations.
* Needs to be run before calculate_gas_information so we know that if we have a po2, where in ccr-mode.
*/
-static void calculate_deco_information(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode)
+void calculate_deco_information(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode)
{
int i;
double surface_pressure = (dc->surface_pressure.mbar ? dc->surface_pressure.mbar : get_surface_pressure_in_mbar(dive, true)) / 1000.0;
diff --git a/profile.h b/profile.h
index 94b32a34b..7270edad9 100644
--- a/profile.h
+++ b/profile.h
@@ -53,6 +53,7 @@ void compare_samples(struct plot_data *e1, struct plot_data *e2, char *buf, int
struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi);
struct plot_info *analyze_plot_info(struct plot_info *pi);
void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi);
+void calculate_deco_information(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode);
struct ev_select {
char *ev_name;
diff --git a/qt-ui/profile/diveplotdatamodel.cpp b/qt-ui/profile/diveplotdatamodel.cpp
index 362eb018b..31941fef7 100644
--- a/qt-ui/profile/diveplotdatamodel.cpp
+++ b/qt-ui/profile/diveplotdatamodel.cpp
@@ -5,11 +5,12 @@
#include "graphicsview-common.h"
#include "dive.h"
#include "display.h"
+#include "divelist.h"
#include <QDebug>
-DivePlotDataModel::DivePlotDataModel(QObject* parent): QAbstractTableModel(parent), sampleCount(0), plotData(NULL)
+DivePlotDataModel::DivePlotDataModel(QObject* parent): QAbstractTableModel(parent)
{
-
+ pInfo.nr = 0;
}
int DivePlotDataModel::columnCount(const QModelIndex& parent) const
@@ -22,7 +23,7 @@ QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
if (!index.isValid())
return QVariant();
- plot_data item = plotData[index.row()];
+ plot_data item = pInfo.entry[index.row()];
if (role == Qt::DisplayRole) {
switch (index.column()) {
case DEPTH: return item.depth;
@@ -54,14 +55,14 @@ QVariant DivePlotDataModel::data(const QModelIndex& index, int role) const
return QVariant();
}
-plot_data* DivePlotDataModel::data()
+const plot_info& DivePlotDataModel::data() const
{
- return plotData;
+ return pInfo;
}
int DivePlotDataModel::rowCount(const QModelIndex& parent) const
{
- return sampleCount;
+ return pInfo.nr;
}
QVariant DivePlotDataModel::headerData(int section, Qt::Orientation orientation, int role) const
@@ -102,7 +103,7 @@ void DivePlotDataModel::clear()
}
}
-void DivePlotDataModel::setDive(dive* d,const plot_info& pInfo)
+void DivePlotDataModel::setDive(dive* d, const plot_info& info)
{
// We need a way to find out if the dive setted is the same old dive, but pointers change,
// and there's no UUID, for now, just repopulate everything.
@@ -112,9 +113,8 @@ 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);
+ pInfo = info;
+ beginInsertRows(QModelIndex(), 0, pInfo.nr-1);
endInsertRows();
}
@@ -128,8 +128,8 @@ double DivePlotDataModel::GASFUNC() \
{ \
double ret = -1; \
for(int i = 0, count = rowCount(); i < count; i++){ \
- if (plotData[i].GAS > ret) \
- ret = plotData[i].GAS; \
+ if (pInfo.entry[i].GAS > ret) \
+ ret = pInfo.entry[i].GAS; \
} \
return ret; \
}
@@ -142,3 +142,12 @@ void DivePlotDataModel::emitDataChanged()
{
emit dataChanged(QModelIndex(), QModelIndex());
}
+
+void DivePlotDataModel::calculateDecompression()
+{
+ struct dive *d = getDiveById(id());
+ struct divecomputer *dc = select_dc(&d->dc);
+ init_decompression(d);
+ calculate_deco_information(d, dc, &pInfo, FALSE);
+ dataChanged(index(0, CEILING), index(pInfo.nr-1, TISSUE_16));
+}
diff --git a/qt-ui/profile/diveplotdatamodel.h b/qt-ui/profile/diveplotdatamodel.h
index 6f4929bb2..e84645b40 100644
--- a/qt-ui/profile/diveplotdatamodel.h
+++ b/qt-ui/profile/diveplotdatamodel.h
@@ -3,6 +3,8 @@
#include <QAbstractTableModel>
+#include "display.h"
+
struct dive;
struct plot_data;
struct plot_info;
@@ -19,16 +21,16 @@ public:
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
void clear();
- void setDive(struct dive *d, const plot_info& pInfo);
- plot_data* data();
+ void setDive(struct dive *d, const plot_info& pInfo);
+ const plot_info& data() const;
int id() const;
double pheMax();
double pn2Max();
double po2Max();
void emitDataChanged();
+ void calculateDecompression();
private:
- int sampleCount;
- plot_data *plotData;
+ plot_info pInfo;
int diveId;
};
diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp
index 335d5ecf6..05791eed5 100644
--- a/qt-ui/profile/diveprofileitem.cpp
+++ b/qt-ui/profile/diveprofileitem.cpp
@@ -43,7 +43,7 @@ void AbstractProfilePolygonItem::setHorizontalDataColumn(int column)
void AbstractProfilePolygonItem::setModel(DivePlotDataModel* model)
{
dataModel = model;
- connect(dataModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelDataChanged()));
+ connect(dataModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelDataChanged(QModelIndex, QModelIndex)));
modelDataChanged();
}
@@ -61,11 +61,26 @@ void AbstractProfilePolygonItem::setVerticalDataColumn(int column)
modelDataChanged();
}
-void AbstractProfilePolygonItem::modelDataChanged()
+bool AbstractProfilePolygonItem::shouldCalculateStuff(const QModelIndex& topLeft, const QModelIndex& bottomRight)
+{
+ if (!hAxis || !vAxis)
+ return false;
+ if (!dataModel || dataModel->rowCount() == 0)
+ return false;
+ if (hDataColumn == -1 || vDataColumn == -1)
+ return false;
+ if ( topLeft.isValid() && bottomRight.isValid()){
+ if ((topLeft.column() >= vDataColumn || topLeft.column() >= hDataColumn ) &&
+ (bottomRight.column() <= vDataColumn || topLeft.column() <= hDataColumn )){
+ return true;
+ }
+ }
+ return true;
+}
+
+void AbstractProfilePolygonItem::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
// We don't have enougth data to calculate things, quit.
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
- return;
// Calculate the polygon. This is the polygon that will be painted on screen
// on the ::paint method. Here we calculate the correct position of the points
@@ -107,12 +122,12 @@ void DiveProfileItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* o
}
}
-void DiveProfileItem::modelDataChanged()
+void DiveProfileItem::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1 || dataModel->rowCount() == 0)
+ if(!shouldCalculateStuff(topLeft, bottomRight))
return;
- AbstractProfilePolygonItem::modelDataChanged();
+ AbstractProfilePolygonItem::modelDataChanged(topLeft, bottomRight);
if (polygon().isEmpty())
return;
@@ -122,7 +137,7 @@ void DiveProfileItem::modelDataChanged()
/* Show any ceiling we may have encountered */
if (prefs.profile_dc_ceiling && !prefs.profile_red_ceiling) {
QPolygonF p = polygon();
- plot_data *entry = dataModel->data() + dataModel->rowCount()-1;
+ plot_data *entry = dataModel->data().entry + dataModel->rowCount()-1;
for (int i = dataModel->rowCount() - 1; i >= 0; i--, entry--) {
if (!entry->in_deco) {
/* not in deco implies this is a safety stop, no ceiling */
@@ -146,7 +161,7 @@ void DiveProfileItem::modelDataChanged()
int last = -1;
for (int i = 0, count = dataModel->rowCount(); i < count; i++) {
- struct plot_data *entry = dataModel->data()+i;
+ struct plot_data *entry = dataModel->data().entry+i;
if (entry->depth < 2000)
continue;
@@ -194,10 +209,10 @@ DiveTemperatureItem::DiveTemperatureItem()
setPen(pen);
}
-void DiveTemperatureItem::modelDataChanged()
+void DiveTemperatureItem::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
// We don't have enougth data to calculate things, quit.
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1 || dataModel->rowCount() == 0)
+ if (!shouldCalculateStuff(topLeft, bottomRight))
return;
qDeleteAll(texts);
@@ -260,10 +275,10 @@ void DiveTemperatureItem::paint(QPainter* painter, const QStyleOptionGraphicsIte
painter->drawPolyline(polygon());
}
-void DiveGasPressureItem::modelDataChanged()
+void DiveGasPressureItem::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
// We don't have enougth data to calculate things, quit.
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1 || dataModel->rowCount() == 0)
+ if (!shouldCalculateStuff(topLeft, bottomRight))
return;
int last_index = -1;
int lift_pen = false;
@@ -272,7 +287,7 @@ void DiveGasPressureItem::modelDataChanged()
polygons.clear();
for (int i = 0, count = dataModel->rowCount(); i < count; i++) {
- plot_data* entry = dataModel->data() + i;
+ plot_data* entry = dataModel->data().entry + i;
int mbar = GET_PRESSURE(entry);
if (entry->cylinderindex != last_index) {
@@ -300,7 +315,7 @@ void DiveGasPressureItem::modelDataChanged()
cyl = -1;
for (int i = 0, count = dataModel->rowCount(); i < count; i++) {
- entry = dataModel->data() + i;
+ entry = dataModel->data().entry + i;
mbar = GET_PRESSURE(entry);
if (!mbar)
@@ -357,7 +372,7 @@ void DiveGasPressureItem::paint(QPainter* painter, const QStyleOptionGraphicsIte
pen.setCosmetic(true);
pen.setWidth(2);
struct dive *d = getDiveById(dataModel->id());
- struct plot_data *entry = dataModel->data();
+ struct plot_data *entry = dataModel->data().entry;
Q_FOREACH(const QPolygonF& poly, polygons) {
for (int i = 1, count = poly.count(); i < count; i++, entry++) {
pen.setBrush(getSacColor(entry->sac, d->sac));
@@ -376,12 +391,12 @@ DiveCalculatedCeiling::DiveCalculatedCeiling()
preferencesChanged();
}
-void DiveCalculatedCeiling::modelDataChanged()
+void DiveCalculatedCeiling::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
// We don't have enougth data to calculate things, quit.
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
+ if (!shouldCalculateStuff(topLeft, bottomRight))
return;
- AbstractProfilePolygonItem::modelDataChanged();
+ AbstractProfilePolygonItem::modelDataChanged(topLeft, bottomRight);
// Add 2 points to close the polygon.
QPolygonF poly = polygon();
if (poly.isEmpty())
@@ -420,14 +435,14 @@ void DiveCalculatedTissue::preferencesChanged()
setVisible(s.value("calcalltissues").toBool());
}
-void DiveReportedCeiling::modelDataChanged()
+void DiveReportedCeiling::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1)
+ if(!shouldCalculateStuff(topLeft, bottomRight))
return;
QPolygonF p;
p.append(QPointF(hAxis->posAtValue(0), vAxis->posAtValue(0)));
- plot_data *entry = dataModel->data();
+ plot_data *entry = dataModel->data().entry;
for (int i = 0, count = dataModel->rowCount(); i < count; i++, entry++) {
if (entry->in_deco && entry->stopdepth) {
if (entry->stopdepth < entry->depth) {
@@ -451,6 +466,14 @@ void DiveCalculatedCeiling::preferencesChanged()
{
QSettings s;
s.beginGroup("TecDetails");
+
+ bool shouldShow3mIncrement = s.value("calcceiling3m").toBool();
+ if ( dataModel && is3mIncrement != shouldShow3mIncrement){
+ // recalculate that part.
+ dataModel->calculateDecompression();
+ is3mIncrement = shouldShow3mIncrement;
+ }
+
setVisible(s.value("calcceiling").toBool());
}
@@ -491,13 +514,13 @@ void MeanDepthLine::setMeanDepth(int value)
rightText->setText(get_depth_string(value, false, false));
}
-void PartialPressureGasItem::modelDataChanged()
+void PartialPressureGasItem::modelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
//AbstractProfilePolygonItem::modelDataChanged();
- if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1 || dataModel->rowCount() == 0)
+ if (!shouldCalculateStuff(topLeft, bottomRight))
return;
- plot_data *entry = dataModel->data();
+ plot_data *entry = dataModel->data().entry;
QPolygonF poly;
alertPoly.clear();
QSettings s;
diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h
index 980b99213..4dd32b9fa 100644
--- a/qt-ui/profile/diveprofileitem.h
+++ b/qt-ui/profile/diveprofileitem.h
@@ -3,6 +3,8 @@
#include <QObject>
#include <QGraphicsPolygonItem>
+#include <QModelIndex>
+
#include "graphicsview-common.h"
#include "divelineitem.h"
@@ -41,8 +43,17 @@ public:
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) = 0;
public slots:
virtual void preferencesChanged();
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
protected:
+ /* when the model emits a 'datachanged' signal, this method below should be used to check if the
+ * modified data affects this particular item ( for example, when setting the '3m increment'
+ * the data for Ceiling and tissues will be changed, and only those. so, the topLeft will be the CEILING
+ * column and the bottomRight will have the TISSUE_16 column. this method takes the vDataColumn and hDataColumn
+ * into consideration when returning 'true' for "yes, continue the calculation', and 'false' for
+ * 'do not recalculate, we already have the right data.
+ */
+ bool shouldCalculateStuff(const QModelIndex& topLeft, const QModelIndex& bottomRight);
+
DiveCartesianAxis *hAxis;
DiveCartesianAxis *vAxis;
DivePlotDataModel *dataModel;
@@ -56,7 +67,7 @@ class DiveProfileItem : public AbstractProfilePolygonItem{
public:
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
virtual void preferencesChanged();
void plot_depth_sample(struct plot_data *entry,QFlags<Qt::AlignmentFlag> flags,const QColor& color);
private:
@@ -68,7 +79,7 @@ class DiveTemperatureItem : public AbstractProfilePolygonItem{
Q_OBJECT
public:
DiveTemperatureItem();
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
private:
void createTextItem(int seconds, int mkelvin);
@@ -78,7 +89,7 @@ class DiveGasPressureItem : public AbstractProfilePolygonItem{
Q_OBJECT
public:
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
private:
void plot_pressure_value(int mbar, int sec, QFlags<Qt::AlignmentFlag> align);
@@ -91,10 +102,11 @@ class DiveCalculatedCeiling : public AbstractProfilePolygonItem{
public:
DiveCalculatedCeiling();
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
virtual void preferencesChanged();
private:
+ bool is3mIncrement;
DiveTextItem *gradientFactor;
};
@@ -102,7 +114,7 @@ class DiveReportedCeiling : public AbstractProfilePolygonItem{
Q_OBJECT
public:
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
virtual void preferencesChanged();
};
@@ -131,7 +143,7 @@ class PartialPressureGasItem : public AbstractProfilePolygonItem{
public:
PartialPressureGasItem();
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
- virtual void modelDataChanged();
+ virtual void modelDataChanged(const QModelIndex& topLeft = QModelIndex(), const QModelIndex& bottomRight = QModelIndex());
virtual void preferencesChanged();
void setThreshouldSettingsKey(const QString& threshouldSettingsKey);
void setVisibilitySettingsKey(const QString& setVisibilitySettingsKey);