diff options
| -rw-r--r-- | profile-widget/profilewidget2.cpp | 18 | ||||
| -rw-r--r-- | qt-models/diveplannermodel.cpp | 16 | ||||
| -rw-r--r-- | qt-models/diveplannermodel.h | 4 |
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); |