aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--profile-widget/profilewidget2.cpp18
-rw-r--r--qt-models/diveplannermodel.cpp16
-rw-r--r--qt-models/diveplannermodel.h4
3 files changed, 24 insertions, 14 deletions
diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp
index 9df668002..ea09ad040 100644
--- a/profile-widget/profilewidget2.cpp
+++ b/profile-widget/profilewidget2.cpp
@@ -542,13 +542,7 @@ void ProfileWidget2::plotDive(const struct dive *dIn, int dcIn, bool force, bool
decoModelParameters->setText(QString("GF %1/%2").arg(prefs.gflow).arg(prefs.gfhigh));
#ifndef SUBSURFACE_MOBILE
} else {
- plannerModel->createTemporaryPlan();
- plannerModel->recalcTemporaryPlan();
struct diveplan &diveplan = plannerModel->getDiveplan();
- if (!diveplan.dp) {
- plannerModel->deleteTemporaryPlan();
- return;
- }
if (decoMode(currentState == PLAN) == VPMB)
decoModelParameters->setText(QString("VPM-B +%1").arg(diveplan.vpmb_conservatism));
else
@@ -558,7 +552,7 @@ void ProfileWidget2::plotDive(const struct dive *dIn, int dcIn, bool force, bool
const struct divecomputer *currentdc = get_dive_dc_const(d, dc);
if (!currentdc || !currentdc->samples)
- return setEmptyState();
+ return;
// special handling when switching from empty state
animSpeed = instant || currentState == EMPTY ? 0 : qPrefDisplay::animation_speed();
@@ -1742,8 +1736,9 @@ void ProfileWidget2::pointInserted(const QModelIndex &, int from, int to)
gases.emplace(gases.begin() + i, createGas());
}
- if (plannerModel->recalcQ())
- replot();
+ // Note: we don't replot the dive here, because when removing multiple
+ // points, these might trickle in one-by-one. Instead, the model will
+ // emit a data-changed signal.
}
void ProfileWidget2::pointsRemoved(const QModelIndex &, int start, int end)
@@ -1752,7 +1747,10 @@ void ProfileWidget2::pointsRemoved(const QModelIndex &, int start, int end)
handles.erase(handles.begin() + start, handles.begin() + end + 1);
gases.erase(gases.begin() + start, gases.begin() + end + 1);
scene()->clearSelection();
- replot();
+
+ // Note: we don't replot the dive here, because when removing multiple
+ // points, these might trickle in one-by-one. Instead, the model will
+ // emit a data-changed signal.
}
void ProfileWidget2::pointsMoved(const QModelIndex &, int start, int end, const QModelIndex &, int row)
diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp
index 56d22bd15..3cdf3f70b 100644
--- a/qt-models/diveplannermodel.cpp
+++ b/qt-models/diveplannermodel.cpp
@@ -40,6 +40,8 @@ void DivePlannerPointsModel::removeSelectedPoints(const QVector<int> &rows)
divepoints.erase(divepoints.begin() + v2[i]);
endRemoveRows();
}
+ updateDiveProfile();
+ emitDataChanged();
cylinders.updateTrashIcon();
}
@@ -73,7 +75,7 @@ void DivePlannerPointsModel::createSimpleDive(struct dive *dIn)
addStop(M_OR_FT(5, 15), 42 * 60, 0, cylinderid, true, UNDEF_COMP_TYPE);
addStop(M_OR_FT(5, 15), 45 * 60, 0, cylinderid, true, UNDEF_COMP_TYPE);
}
- updateMaxDepth();
+ updateDiveProfile();
GasSelectionModel::instance()->repopulate();
DiveTypeSelectionModel::instance()->repopulate();
}
@@ -170,6 +172,8 @@ void DivePlannerPointsModel::loadFromDive(dive *dIn)
recalc = oldRec;
DiveTypeSelectionModel::instance()->repopulate();
preserved_until = d->duration;
+
+ updateDiveProfile();
emitDataChanged();
}
@@ -753,6 +757,7 @@ void DivePlannerPointsModel::addDefaultStop()
void DivePlannerPointsModel::addStop(int milimeters, int seconds)
{
addStop(milimeters, seconds, -1, 0, true, UNDEF_COMP_TYPE);
+ updateDiveProfile();
}
// cylinderid_in == -1 means same gas as before.
@@ -887,6 +892,7 @@ void DivePlannerPointsModel::editStop(int row, divedatapoint newData)
if (divepoints[0].cylinderid != old_first_cylid)
cylinders.moveAtFirst(divepoints[0].cylinderid);
+ updateDiveProfile();
emit dataChanged(createIndex(row, 0), createIndex(row, COLUMNS - 1));
}
@@ -932,10 +938,14 @@ void DivePlannerPointsModel::remove(const QModelIndex &index)
beginRemoveRows(QModelIndex(), index.row(), index.row());
divepoints.remove(index.row());
}
+
endRemoveRows();
cylinders.updateTrashIcon();
if (divepoints[0].cylinderid != old_first_cylid)
cylinders.moveAtFirst(divepoints[0].cylinderid);
+
+ updateDiveProfile();
+ emitDataChanged();
}
struct diveplan &DivePlannerPointsModel::getDiveplan()
@@ -1035,8 +1045,9 @@ void DivePlannerPointsModel::createTemporaryPlan()
#endif
}
-void DivePlannerPointsModel::recalcTemporaryPlan()
+void DivePlannerPointsModel::updateDiveProfile()
{
+ createTemporaryPlan();
if (diveplan_empty(&diveplan))
return;
@@ -1047,6 +1058,7 @@ void DivePlannerPointsModel::recalcTemporaryPlan()
memset(&plan_deco_state, 0, sizeof(struct deco_state));
plan(&plan_deco_state, &diveplan, d, DECOTIMESTEP, stoptable, &cache, isPlanner(), false);
+ updateMaxDepth();
plan_copy = (struct diveplan *)malloc(sizeof(struct diveplan));
lock_planner();
cloneDiveplan(&diveplan, plan_copy);
diff --git a/qt-models/diveplannermodel.h b/qt-models/diveplannermodel.h
index 0b13f7247..178eaed94 100644
--- a/qt-models/diveplannermodel.h
+++ b/qt-models/diveplannermodel.h
@@ -89,8 +89,6 @@ slots:
void remove(const QModelIndex &index);
void cancelPlan();
void removeDeco();
- void createTemporaryPlan();
- void recalcTemporaryPlan(); // Writes the plan into the dive.
void deleteTemporaryPlan();
void emitDataChanged();
void setRebreatherMode(int mode);
@@ -123,6 +121,8 @@ private:
int lastEnteredPoint() const;
bool updateMaxDepth();
void createPlan(bool replanCopy);
+ void updateDiveProfile(); // Creates a temporary plan and updates the dive profile with it.
+ void createTemporaryPlan();
struct diveplan diveplan;
struct divedatapoint *cloneDiveplan(struct diveplan *plan_src, struct diveplan *plan_copy);
void computeVariationsDone(QString text);