aboutsummaryrefslogtreecommitdiffstats
path: root/qt-models
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-01-26 07:48:22 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2021-04-02 13:53:23 -0700
commit1ec0790d504d8a9d5e6694afff04f9ae92d01af8 (patch)
treec799e7bdd7e20303f1030f771058c3561441e409 /qt-models
parente419ebf55a28d2483951e52ca274aedd96f11789 (diff)
downloadsubsurface-1ec0790d504d8a9d5e6694afff04f9ae92d01af8.tar.gz
planner: remove displayed_dive from DivePlannerModel
To remove global state, make the dive that DivePlannerModel works on a member variable. Pass the dive in createSimpleDive() and loadFromDive(). Moreover, this should pave the way to more fine-grained undo in the planner. Ultimately, the planner should not be modal. Attention: for now, the dive must still be displayed_dive, because of the convoluted way in which the profile and the planner work on the same dive. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models')
-rw-r--r--qt-models/diveplannermodel.cpp112
-rw-r--r--qt-models/diveplannermodel.h3
2 files changed, 60 insertions, 55 deletions
diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp
index e0c0e2d69..038783d1c 100644
--- a/qt-models/diveplannermodel.cpp
+++ b/qt-models/diveplannermodel.cpp
@@ -43,13 +43,14 @@ void DivePlannerPointsModel::removeSelectedPoints(const QVector<int> &rows)
cylinders.updateTrashIcon();
}
-void DivePlannerPointsModel::createSimpleDive()
+void DivePlannerPointsModel::createSimpleDive(struct dive *dIn)
{
// clean out the dive and give it an id and the correct dc model
- clear_dive(&displayed_dive);
- displayed_dive.id = dive_getUniqID();
- displayed_dive.when = QDateTime::currentMSecsSinceEpoch() / 1000L + gettimezoneoffset() + 3600;
- displayed_dive.dc.model = strdup("planned dive"); // don't translate! this is stored in the XML file
+ d = dIn;
+ clear_dive(d);
+ d->id = dive_getUniqID();
+ d->when = QDateTime::currentMSecsSinceEpoch() / 1000L + gettimezoneoffset() + 3600;
+ d->dc.model = strdup("planned dive"); // don't translate! this is stored in the XML file
clear();
setupCylinders();
@@ -57,7 +58,7 @@ void DivePlannerPointsModel::createSimpleDive()
// initialize the start time in the plan
diveplan.when = dateTimeToTimestamp(startTime);
- displayed_dive.when = diveplan.when;
+ d->when = diveplan.when;
// Use gas from the first cylinder
int cylinderid = 0;
@@ -92,8 +93,10 @@ void DivePlannerPointsModel::setupStartTime()
}
}
-void DivePlannerPointsModel::loadFromDive(dive *d)
+void DivePlannerPointsModel::loadFromDive(dive *dIn)
{
+ d = dIn;
+
int depthsum = 0;
int samplecount = 0;
o2pressure_t last_sp;
@@ -102,7 +105,7 @@ void DivePlannerPointsModel::loadFromDive(dive *d)
const struct event *evd = NULL;
enum divemode_t current_divemode = UNDEF_COMP_TYPE;
recalc = false;
- cylinders.updateDive(&displayed_dive);
+ cylinders.updateDive(d);
duration_t lasttime = { 0 };
duration_t lastrecordedtime = {};
duration_t newtime = {};
@@ -175,45 +178,45 @@ void DivePlannerPointsModel::loadFromDive(dive *d)
// setup the cylinder widget accordingly
void DivePlannerPointsModel::setupCylinders()
{
- clear_cylinder_table(&displayed_dive.cylinders);
+ clear_cylinder_table(&d->cylinders);
if (mode == PLAN && current_dive) {
// take the displayed cylinders from the selected dive as starting point
- copy_used_cylinders(current_dive, &displayed_dive, !prefs.display_unused_tanks);
- reset_cylinders(&displayed_dive, true);
+ copy_used_cylinders(current_dive, d, !prefs.display_unused_tanks);
+ reset_cylinders(d, true);
- if (displayed_dive.cylinders.nr > 0) {
- cylinders.updateDive(&displayed_dive);
+ if (d->cylinders.nr > 0) {
+ cylinders.updateDive(d);
return; // We have at least one cylinder
}
}
if (!empty_string(prefs.default_cylinder)) {
cylinder_t cyl = empty_cylinder;
- fill_default_cylinder(&displayed_dive, &cyl);
+ fill_default_cylinder(d, &cyl);
cyl.start = cyl.type.workingpressure;
- add_cylinder(&displayed_dive.cylinders, 0, cyl);
+ add_cylinder(&d->cylinders, 0, cyl);
} else {
cylinder_t cyl = empty_cylinder;
// roughly an AL80
cyl.type.description = copy_qstring(tr("unknown"));
cyl.type.size.mliter = 11100;
cyl.type.workingpressure.mbar = 207000;
- add_cylinder(&displayed_dive.cylinders, 0, cyl);
+ add_cylinder(&d->cylinders, 0, cyl);
}
- reset_cylinders(&displayed_dive, false);
- cylinders.updateDive(&displayed_dive);
+ reset_cylinders(d, false);
+ cylinders.updateDive(d);
}
// Update the dive's maximum depth. Returns true if max. depth changed
bool DivePlannerPointsModel::updateMaxDepth()
{
- int prevMaxDepth = displayed_dive.maxdepth.mm;
- displayed_dive.maxdepth.mm = 0;
+ int prevMaxDepth = d->maxdepth.mm;
+ d->maxdepth.mm = 0;
for (int i = 0; i < rowCount(); i++) {
divedatapoint p = at(i);
- if (p.depth.mm > displayed_dive.maxdepth.mm)
- displayed_dive.maxdepth.mm = p.depth.mm;
+ if (p.depth.mm > d->maxdepth.mm)
+ d->maxdepth.mm = p.depth.mm;
}
- return displayed_dive.maxdepth.mm != prevMaxDepth;
+ return d->maxdepth.mm != prevMaxDepth;
}
void DivePlannerPointsModel::removeDeco()
@@ -289,13 +292,13 @@ QVariant DivePlannerPointsModel::data(const QModelIndex &index, int role) const
case GAS:
/* Check if we have the same gasmix two or more times
* If yes return more verbose string */
- int same_gas = same_gasmix_cylinder(get_cylinder(&displayed_dive, p.cylinderid), p.cylinderid, &displayed_dive, true);
+ int same_gas = same_gasmix_cylinder(get_cylinder(d, p.cylinderid), p.cylinderid, d, true);
if (same_gas == -1)
- return get_gas_string(get_cylinder(&displayed_dive, p.cylinderid)->gasmix);
+ return get_gas_string(get_cylinder(d, p.cylinderid)->gasmix);
else
- return get_gas_string(get_cylinder(&displayed_dive, p.cylinderid)->gasmix) +
+ return get_gas_string(get_cylinder(d, p.cylinderid)->gasmix) +
QString(" (%1 %2 ").arg(tr("cyl.")).arg(p.cylinderid + 1) +
- get_cylinder(&displayed_dive, p.cylinderid)->type.description + ")";
+ get_cylinder(d, p.cylinderid)->type.description + ")";
}
} else if (role == Qt::DecorationRole) {
switch (index.column()) {
@@ -388,7 +391,7 @@ bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &v
p.setpoint = p.divemode == CCR ? prefs.defaultsetpoint : 0;
}
if (index.row() == 0)
- displayed_dive.dc.divemode = (enum divemode_t) value.toInt();
+ d->dc.divemode = (enum divemode_t) value.toInt();
break;
}
editStop(index.row(), p);
@@ -450,6 +453,7 @@ int DivePlannerPointsModel::rowCount(const QModelIndex&) const
}
DivePlannerPointsModel::DivePlannerPointsModel(QObject *parent) : QAbstractTableModel(parent),
+ d(nullptr),
cylinders(true),
mode(NOTHING),
recalc(false)
@@ -539,7 +543,7 @@ void DivePlannerPointsModel::setGFLow(const int gflow)
void DivePlannerPointsModel::setRebreatherMode(int mode)
{
int i;
- displayed_dive.dc.divemode = (divemode_t) mode;
+ d->dc.divemode = (divemode_t) mode;
for (i=0; i < rowCount(); i++) {
divepoints[i].setpoint = mode == CCR ? prefs.defaultsetpoint : 0;
divepoints[i].divemode = (enum divemode_t) mode;
@@ -724,7 +728,7 @@ void DivePlannerPointsModel::setStartDate(const QDate &date)
{
startTime.setDate(date);
diveplan.when = dateTimeToTimestamp(startTime);
- displayed_dive.when = diveplan.when;
+ d->when = diveplan.when;
emitDataChanged();
}
@@ -732,7 +736,7 @@ void DivePlannerPointsModel::setStartTime(const QTime &t)
{
startTime.setTime(t);
diveplan.when = dateTimeToTimestamp(startTime);
- displayed_dive.when = diveplan.when;
+ d->when = diveplan.when;
emitDataChanged();
}
@@ -813,7 +817,7 @@ int DivePlannerPointsModel::addStop(int milimeters, int seconds, int cylinderid_
}
}
if (divemode == UNDEF_COMP_TYPE)
- divemode = displayed_dive.dc.divemode;
+ divemode = d->dc.divemode;
// add the new stop
beginInsertRows(QModelIndex(), row, row);
@@ -1023,8 +1027,8 @@ void DivePlannerPointsModel::createTemporaryPlan()
// what does the cache do???
struct deco_state *cache = NULL;
struct divedatapoint *dp = NULL;
- for (int i = 0; i < displayed_dive.cylinders.nr; i++) {
- cylinder_t *cyl = get_cylinder(&displayed_dive, i);
+ for (int i = 0; i < d->cylinders.nr; i++) {
+ cylinder_t *cyl = get_cylinder(d, i);
if (cyl->depth.mm && cyl->cylinder_use != NOT_USED) {
dp = create_dp(0, cyl->depth.mm, i, 0);
if (diveplan.dp) {
@@ -1045,7 +1049,7 @@ void DivePlannerPointsModel::createTemporaryPlan()
struct diveplan *plan_copy;
memset(&plan_deco_state, 0, sizeof(struct deco_state));
- plan(&plan_deco_state, &diveplan, &displayed_dive, DECOTIMESTEP, stoptable, &cache, isPlanner(), false);
+ plan(&plan_deco_state, &diveplan, d, DECOTIMESTEP, stoptable, &cache, isPlanner(), false);
plan_copy = (struct diveplan *)malloc(sizeof(struct diveplan));
lock_planner();
cloneDiveplan(&diveplan, plan_copy);
@@ -1059,12 +1063,12 @@ void DivePlannerPointsModel::createTemporaryPlan()
computeVariations(plan_copy, &plan_deco_state);
#endif
final_deco_state = plan_deco_state;
- emit calculatedPlanNotes(QString(displayed_dive.notes));
+ emit calculatedPlanNotes(QString(d->notes));
}
// throw away the cache
free(cache);
#if DEBUG_PLAN
- save_dive(stderr, &displayed_dive);
+ save_dive(stderr, d);
dump_plan(&diveplan);
#endif
}
@@ -1084,7 +1088,7 @@ void DivePlannerPointsModel::saveDuplicatePlan()
createPlan(true);
}
-struct divedatapoint * DivePlannerPointsModel::cloneDiveplan(struct diveplan *plan_src, struct diveplan *plan_copy)
+struct divedatapoint *DivePlannerPointsModel::cloneDiveplan(struct diveplan *plan_src, struct diveplan *plan_copy)
{
divedatapoint *src, *last_segment;
divedatapoint **dp;
@@ -1152,7 +1156,7 @@ void DivePlannerPointsModel::computeVariations(struct diveplan *original_plan, c
return;
struct dive *dive = alloc_dive();
- copy_dive(&displayed_dive, dive);
+ copy_dive(d, dive);
struct decostop original[60], deeper[60], shallower[60], shorter[60], longer[60];
struct deco_state *cache = NULL, *save = NULL;
struct diveplan plan_copy;
@@ -1241,10 +1245,10 @@ finish:
void DivePlannerPointsModel::computeVariationsDone(QString variations)
{
- QString notes = QString(displayed_dive.notes);
- free(displayed_dive.notes);
- displayed_dive.notes = copy_qstring(notes.replace("VARIATIONS", variations));
- emit calculatedPlanNotes(QString(displayed_dive.notes));
+ QString notes = QString(d->notes);
+ free(d->notes);
+ d->notes = copy_qstring(notes.replace("VARIATIONS", variations));
+ emit calculatedPlanNotes(QString(d->notes));
}
void DivePlannerPointsModel::createPlan(bool replanCopy)
@@ -1258,7 +1262,7 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
//TODO: C-based function here?
struct decostop stoptable[60];
- plan(&ds_after_previous_dives, &diveplan, &displayed_dive, DECOTIMESTEP, stoptable, &cache, isPlanner(), true);
+ plan(&ds_after_previous_dives, &diveplan, d, DECOTIMESTEP, stoptable, &cache, isPlanner(), true);
struct diveplan *plan_copy;
plan_copy = (struct diveplan *)malloc(sizeof(struct diveplan));
lock_planner();
@@ -1269,7 +1273,7 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
free(cache);
// Fixup planner notes.
- if (current_dive && displayed_dive.id == current_dive->id) {
+ if (current_dive && d->id == current_dive->id) {
// Try to identify old planner output and remove only this part
// Treat user provided text as plain text.
QTextDocument notesDocument;
@@ -1295,8 +1299,8 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
}
// Deal with line breaks
oldnotes.replace("\n", "<br>");
- oldnotes.append(displayed_dive.notes);
- displayed_dive.notes = copy_qstring(oldnotes);
+ oldnotes.append(d->notes);
+ d->notes = copy_qstring(oldnotes);
// If we save as new create a copy of the dive here
}
@@ -1305,24 +1309,24 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
// so that the Undo-commands update the display accordingly (see condition in updateDiveInfo().
// Now, add or modify the dive.
- if (!current_dive || displayed_dive.id != current_dive->id) {
+ if (!current_dive || d->id != current_dive->id) {
// we were planning a new dive, not re-planning an existing one
- displayed_dive.divetrip = nullptr; // Should not be necessary, just in case!
+ d->divetrip = nullptr; // Should not be necessary, just in case!
#if !defined(SUBSURFACE_TESTING)
- Command::addDive(&displayed_dive, autogroup, true);
+ Command::addDive(d, autogroup, true);
#endif // !SUBSURFACE_TESTING
} else {
- copy_events_until(current_dive, &displayed_dive, preserved_until.seconds);
+ copy_events_until(current_dive, d, preserved_until.seconds);
if (replanCopy) {
// we were planning an old dive and save as a new dive
- displayed_dive.id = dive_getUniqID(); // Things will break horribly if we create dives with the same id.
+ d->id = dive_getUniqID(); // Things will break horribly if we create dives with the same id.
#if !defined(SUBSURFACE_TESTING)
- Command::addDive(&displayed_dive, false, false);
+ Command::addDive(d, false, false);
#endif // !SUBSURFACE_TESTING
} else {
// we were planning an old dive and rewrite the plan
#if !defined(SUBSURFACE_TESTING)
- Command::replanDive(&displayed_dive);
+ Command::replanDive(d);
#endif // !SUBSURFACE_TESTING
}
}
diff --git a/qt-models/diveplannermodel.h b/qt-models/diveplannermodel.h
index 8cc12c5c8..5a5fc0155 100644
--- a/qt-models/diveplannermodel.h
+++ b/qt-models/diveplannermodel.h
@@ -39,7 +39,7 @@ public:
void removeSelectedPoints(const QVector<int> &rows);
void setPlanMode(Mode mode);
bool isPlanner() const;
- void createSimpleDive();
+ void createSimpleDive(struct dive *d);
Mode currentMode() const;
bool setRecalc(bool recalc);
bool recalcQ() const;
@@ -130,6 +130,7 @@ private:
void computeVariations(struct diveplan *diveplan, const struct deco_state *ds);
void computeVariationsFreeDeco(struct diveplan *diveplan, struct deco_state *ds);
int analyzeVariations(struct decostop *min, struct decostop *mid, struct decostop *max, const char *unit);
+ struct dive *d;
CylindersModel cylinders;
Mode mode;
bool recalc;