Add a checkbox to turn off plan variations

... as those come with a performance penalty

Signed-off-by: Robert C. Helling <helling@atdotde.de>
This commit is contained in:
Robert C. Helling 2017-09-18 16:10:47 +02:00 committed by Dirk Hohndel
parent 5e9bdce195
commit a6f186279f
10 changed files with 117 additions and 59 deletions

View file

@ -101,8 +101,13 @@ void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_d
get_current_date()); get_current_date());
} }
len += snprintf(buffer + len, sz_buffer - len, translate("gettextFromC", "Runtime: %dmin VARIATIONS<br></div>"), if (prefs.display_variations)
diveplan_duration(diveplan)); len += snprintf(buffer + len, sz_buffer - len, translate("gettextFromC", "Runtime: %dmin VARIATIONS<br></div>"),
diveplan_duration(diveplan));
else
len += snprintf(buffer + len, sz_buffer - len, translate("gettextFromC", "Runtime: %dmin<br></div>"),
diveplan_duration(diveplan));
if (!plan_verbatim) { if (!plan_verbatim) {
len += snprintf(buffer + len, sz_buffer - len, "<table><thead><tr><th></th><th>%s</th>", len += snprintf(buffer + len, sz_buffer - len, "<table><thead><tr><th></th><th>%s</th>",

View file

@ -126,6 +126,7 @@ struct preferences {
bool display_runtime; bool display_runtime;
bool display_duration; bool display_duration;
bool display_transitions; bool display_transitions;
bool display_variations;
bool safetystop; bool safetystop;
bool switch_at_req_stop; bool switch_at_req_stop;
int reserve_gas; int reserve_gas;

View file

@ -1214,6 +1214,11 @@ bool DivePlannerSettings::displayTransitions() const
return prefs.display_transitions; return prefs.display_transitions;
} }
bool DivePlannerSettings::displayVariations() const
{
return prefs.display_variations;
}
bool DivePlannerSettings::doo2breaks() const bool DivePlannerSettings::doo2breaks() const
{ {
return prefs.doo2breaks; return prefs.doo2breaks;
@ -1368,6 +1373,18 @@ void DivePlannerSettings::setDisplayTransitions(bool value)
emit displayTransitionsChanged(value); emit displayTransitionsChanged(value);
} }
void DivePlannerSettings::setDisplayVariations(bool value)
{
if (value == prefs.display_variations)
return;
QSettings s;
s.beginGroup(group);
s.setValue("display_variations", value);
prefs.display_variations = value;
emit displayVariationsChanged(value);
}
void DivePlannerSettings::setDoo2breaks(bool value) void DivePlannerSettings::setDoo2breaks(bool value)
{ {
if (value == prefs.doo2breaks) if (value == prefs.doo2breaks)
@ -2339,6 +2356,7 @@ void SettingsObjectWrapper::load()
GET_BOOL("display_duration", display_duration); GET_BOOL("display_duration", display_duration);
GET_BOOL("display_runtime", display_runtime); GET_BOOL("display_runtime", display_runtime);
GET_BOOL("display_transitions", display_transitions); GET_BOOL("display_transitions", display_transitions);
GET_BOOL("display_variations", display_variations);
GET_BOOL("safetystop", safetystop); GET_BOOL("safetystop", safetystop);
GET_BOOL("doo2breaks", doo2breaks); GET_BOOL("doo2breaks", doo2breaks);
GET_BOOL("switch_at_req_stop",switch_at_req_stop); GET_BOOL("switch_at_req_stop",switch_at_req_stop);
@ -2397,6 +2415,7 @@ void SettingsObjectWrapper::sync()
s.setValue("display_duration", prefs.display_duration); s.setValue("display_duration", prefs.display_duration);
s.setValue("display_runtime", prefs.display_runtime); s.setValue("display_runtime", prefs.display_runtime);
s.setValue("display_transitions", prefs.display_transitions); s.setValue("display_transitions", prefs.display_transitions);
s.setValue("display_variations", prefs.display_variations);
s.setValue("safetystop", prefs.safetystop); s.setValue("safetystop", prefs.safetystop);
s.setValue("reserve_gas", prefs.reserve_gas); s.setValue("reserve_gas", prefs.reserve_gas);
s.setValue("ascrate75", prefs.ascrate75); s.setValue("ascrate75", prefs.ascrate75);

View file

@ -398,6 +398,7 @@ class DivePlannerSettings : public QObject {
Q_PROPERTY(bool display_runtime READ displayRuntime WRITE setDisplayRuntime NOTIFY displayRuntimeChanged) Q_PROPERTY(bool display_runtime READ displayRuntime WRITE setDisplayRuntime NOTIFY displayRuntimeChanged)
Q_PROPERTY(bool display_duration READ displayDuration WRITE setDisplayDuration NOTIFY displayDurationChanged) Q_PROPERTY(bool display_duration READ displayDuration WRITE setDisplayDuration NOTIFY displayDurationChanged)
Q_PROPERTY(bool display_transitions READ displayTransitions WRITE setDisplayTransitions NOTIFY displayTransitionsChanged) Q_PROPERTY(bool display_transitions READ displayTransitions WRITE setDisplayTransitions NOTIFY displayTransitionsChanged)
Q_PROPERTY(bool display_variations READ displayVariations WRITE setDisplayVariations NOTIFY displayVariationsChanged)
Q_PROPERTY(bool doo2breaks READ doo2breaks WRITE setDoo2breaks NOTIFY doo2breaksChanged) Q_PROPERTY(bool doo2breaks READ doo2breaks WRITE setDoo2breaks NOTIFY doo2breaksChanged)
Q_PROPERTY(bool drop_stone_mode READ dropStoneMode WRITE setDropStoneMode NOTIFY dropStoneModeChanged) Q_PROPERTY(bool drop_stone_mode READ dropStoneMode WRITE setDropStoneMode NOTIFY dropStoneModeChanged)
Q_PROPERTY(bool safetystop READ safetyStop WRITE setSafetyStop NOTIFY safetyStopChanged) Q_PROPERTY(bool safetystop READ safetyStop WRITE setSafetyStop NOTIFY safetyStopChanged)
@ -425,6 +426,7 @@ public:
bool displayRuntime() const; bool displayRuntime() const;
bool displayDuration() const; bool displayDuration() const;
bool displayTransitions() const; bool displayTransitions() const;
bool displayVariations() const;
bool doo2breaks() const; bool doo2breaks() const;
bool dropStoneMode() const; bool dropStoneMode() const;
bool safetyStop() const; bool safetyStop() const;
@ -451,6 +453,7 @@ public slots:
void setDisplayRuntime(bool value); void setDisplayRuntime(bool value);
void setDisplayDuration(bool value); void setDisplayDuration(bool value);
void setDisplayTransitions(bool value); void setDisplayTransitions(bool value);
void setDisplayVariations(bool value);
void setDoo2breaks(bool value); void setDoo2breaks(bool value);
void setDropStoneMode(bool value); void setDropStoneMode(bool value);
void setSafetyStop(bool value); void setSafetyStop(bool value);
@ -477,6 +480,7 @@ signals:
void displayRuntimeChanged(bool value); void displayRuntimeChanged(bool value);
void displayDurationChanged(bool value); void displayDurationChanged(bool value);
void displayTransitionsChanged(bool value); void displayTransitionsChanged(bool value);
void displayVariationsChanged(bool value);
void doo2breaksChanged(bool value); void doo2breaksChanged(bool value);
void dropStoneModeChanged(bool value); void dropStoneModeChanged(bool value);
void safetyStopChanged(bool value); void safetyStopChanged(bool value);

View file

@ -66,6 +66,7 @@ struct preferences default_prefs = {
.display_runtime = true, .display_runtime = true,
.display_duration = true, .display_duration = true,
.display_transitions = true, .display_transitions = true,
.display_variations = false,
.safetystop = true, .safetystop = true,
.bottomsac = 20000, .bottomsac = 20000,
.decosac = 17000, .decosac = 17000,

View file

@ -322,6 +322,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
ui.display_duration->setChecked(prefs.display_duration); ui.display_duration->setChecked(prefs.display_duration);
ui.display_runtime->setChecked(prefs.display_runtime); ui.display_runtime->setChecked(prefs.display_runtime);
ui.display_transitions->setChecked(prefs.display_transitions); ui.display_transitions->setChecked(prefs.display_transitions);
ui.display_variations->setChecked(prefs.display_variations);
ui.safetystop->setChecked(prefs.safetystop); ui.safetystop->setChecked(prefs.safetystop);
ui.sacfactor->setValue(prefs.sacfactor / 100.0); ui.sacfactor->setValue(prefs.sacfactor / 100.0);
ui.problemsolvingtime->setValue(prefs.problemsolvingtime); ui.problemsolvingtime->setValue(prefs.problemsolvingtime);
@ -355,6 +356,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
connect(ui.display_duration, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayDuration(bool))); connect(ui.display_duration, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayDuration(bool)));
connect(ui.display_runtime, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayRuntime(bool))); connect(ui.display_runtime, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayRuntime(bool)));
connect(ui.display_transitions, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayTransitions(bool))); connect(ui.display_transitions, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayTransitions(bool)));
connect(ui.display_variations, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayVariations(bool)));
connect(ui.safetystop, SIGNAL(toggled(bool)), plannerModel, SLOT(setSafetyStop(bool))); connect(ui.safetystop, SIGNAL(toggled(bool)), plannerModel, SLOT(setSafetyStop(bool)));
connect(ui.reserve_gas, SIGNAL(valueChanged(int)), plannerModel, SLOT(setReserveGas(int))); connect(ui.reserve_gas, SIGNAL(valueChanged(int)), plannerModel, SLOT(setReserveGas(int)));
connect(ui.ascRate75, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); connect(ui.ascRate75, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged()));

View file

@ -685,6 +685,23 @@
<property name="spacing"> <property name="spacing">
<number>2</number> <number>2</number>
</property> </property>
<item row="3" column="0">
<widget class="QCheckBox" name="verbatim_plan">
<property name="text">
<string>Verbatim dive plan</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="display_transitions">
<property name="toolTip">
<string>In diveplan, list transitions or treat them as implicit</string>
</property>
<property name="text">
<string>Display transitions in deco</string>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="display_runtime"> <widget class="QCheckBox" name="display_runtime">
<property name="toolTip"> <property name="toolTip">
@ -708,20 +725,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="4" column="0">
<widget class="QCheckBox" name="display_transitions"> <widget class="QCheckBox" name="display_variations">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip"> <property name="toolTip">
<string>In diveplan, list transitions or treat them as implicit</string> <string>Compute variations of plan (performance cost)</string>
</property> </property>
<property name="text"> <property name="text">
<string>Display transitions in deco</string> <string>Display plan variations</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="verbatim_plan">
<property name="text">
<string>Verbatim dive plan</string>
</property> </property>
</widget> </widget>
</item> </item>

View file

@ -12,7 +12,7 @@ int getTotalWork(print_options *printOptions)
if (printOptions->print_selected) { if (printOptions->print_selected) {
// return the correct number depending on all/selected dives // return the correct number depending on all/selected dives
// but don't return 0 as we might divide by this number // but don't return 0 as we might divide by this number
return amount_selected ? amount_selected : 1; return amount_selected && !in_planner() ? amount_selected : 1;
} }
return dive_table.nr; return dive_table.nr;
} }
@ -98,15 +98,21 @@ QString TemplateLayout::generate()
QVariantList diveList; QVariantList diveList;
struct dive *dive; struct dive *dive;
int i; if (in_planner()) {
for_each_dive (i, dive) { DiveObjectHelper *d = new DiveObjectHelper(&displayed_dive);
//TODO check for exporting selected dives only
if (!dive->selected && PrintOptions->print_selected)
continue;
DiveObjectHelper *d = new DiveObjectHelper(dive);
diveList.append(QVariant::fromValue(d)); diveList.append(QVariant::fromValue(d));
progress++; emit progressUpdated(100.0);
emit progressUpdated(lrint(progress * 100.0 / totalWork)); } else {
int i;
for_each_dive (i, dive) {
//TODO check for exporting selected dives only
if (!dive->selected && PrintOptions->print_selected)
continue;
DiveObjectHelper *d = new DiveObjectHelper(dive);
diveList.append(QVariant::fromValue(d));
progress++;
emit progressUpdated(lrint(progress * 100.0 / totalWork));
}
} }
Grantlee::Context c; Grantlee::Context c;
c.insert("dives", diveList); c.insert("dives", diveList);

View file

@ -522,6 +522,13 @@ void DivePlannerPointsModel::setDisplayTransitions(bool value)
emitDataChanged(); emitDataChanged();
} }
void DivePlannerPointsModel::setDisplayVariations(bool value)
{
auto planner = SettingsObjectWrapper::instance()->planner_settings;
planner->setDisplayVariations(value);
emitDataChanged();
}
void DivePlannerPointsModel::setDecoMode(int mode) void DivePlannerPointsModel::setDecoMode(int mode)
{ {
auto planner = SettingsObjectWrapper::instance()->planner_settings; auto planner = SettingsObjectWrapper::instance()->planner_settings;
@ -934,52 +941,51 @@ void DivePlannerPointsModel::computeVariations()
struct diveplan plan_copy; struct diveplan plan_copy;
struct divedatapoint *last_segment; struct divedatapoint *last_segment;
if(!in_planner()) if(in_planner() && prefs.display_variations) {
return; cache_deco_state(&save);
cache_deco_state(&save); cloneDiveplan(&plan_copy);
cloneDiveplan(&plan_copy); plan(&plan_copy, dive, 1, original, &cache, true, false);
plan(&plan_copy, dive, 1, original, &cache, true, false); free_dps(&plan_copy);
free_dps(&plan_copy); restore_deco_state(save, false);
restore_deco_state(save, false);
last_segment = cloneDiveplan(&plan_copy); last_segment = cloneDiveplan(&plan_copy);
last_segment->depth.mm += 1000; last_segment->depth.mm += 1000;
last_segment->next->depth.mm += 1000; last_segment->next->depth.mm += 1000;
plan(&plan_copy, dive, 1, deeper, &cache, true, false); plan(&plan_copy, dive, 1, deeper, &cache, true, false);
free_dps(&plan_copy); free_dps(&plan_copy);
restore_deco_state(save, false); restore_deco_state(save, false);
last_segment = cloneDiveplan(&plan_copy); last_segment = cloneDiveplan(&plan_copy);
last_segment->depth.mm -= 1000; last_segment->depth.mm -= 1000;
last_segment->next->depth.mm -= 1000; last_segment->next->depth.mm -= 1000;
plan(&plan_copy, dive, 1, shallower, &cache, true, false); plan(&plan_copy, dive, 1, shallower, &cache, true, false);
free_dps(&plan_copy); free_dps(&plan_copy);
restore_deco_state(save, false); restore_deco_state(save, false);
last_segment = cloneDiveplan(&plan_copy); last_segment = cloneDiveplan(&plan_copy);
last_segment->next->time += 60; last_segment->next->time += 60;
plan(&plan_copy, dive, 1, longer, &cache, true, false); plan(&plan_copy, dive, 1, longer, &cache, true, false);
free_dps(&plan_copy); free_dps(&plan_copy);
restore_deco_state(save, false); restore_deco_state(save, false);
last_segment = cloneDiveplan(&plan_copy);
last_segment->next->time -= 60;
plan(&plan_copy, dive, 1, shorter, &cache, true, false);
free_dps(&plan_copy);
restore_deco_state(save, false);
last_segment = cloneDiveplan(&plan_copy);
last_segment->next->time -= 60;
plan(&plan_copy, dive, 1, shorter, &cache, true, false);
free_dps(&plan_copy);
restore_deco_state(save, false);
#ifdef SHOWSTOPVARIATIONS #ifdef SHOWSTOPVARIATIONS
printf("\n\n"); printf("\n\n");
#endif #endif
QString notes(displayed_dive.notes); QString notes(displayed_dive.notes);
free(displayed_dive.notes); free(displayed_dive.notes);
char buf[200]; char buf[200];
sprintf(buf, "+ %d:%02d /m + %d:%02d /min", FRACTION(analyzeVariations(shallower, original, deeper, "m"),60), sprintf(buf, "+ %d:%02d /m + %d:%02d /min", FRACTION(analyzeVariations(shallower, original, deeper, "m"),60),
FRACTION(analyzeVariations(shorter, original, longer, "min"), 60)); FRACTION(analyzeVariations(shorter, original, longer, "min"), 60));
displayed_dive.notes = strdup(notes.replace("VARIATIONS", QString(buf)).toUtf8().data()); displayed_dive.notes = strdup(notes.replace("VARIATIONS", QString(buf)).toUtf8().data());
}
setRecalc(oldRecalc); setRecalc(oldRecalc);
} }

View file

@ -78,6 +78,7 @@ slots:
void setDisplayRuntime(bool value); void setDisplayRuntime(bool value);
void setDisplayDuration(bool value); void setDisplayDuration(bool value);
void setDisplayTransitions(bool value); void setDisplayTransitions(bool value);
void setDisplayVariations(bool value);
void setDecoMode(int mode); void setDecoMode(int mode);
void setSafetyStop(bool value); void setSafetyStop(bool value);
void savePlan(); void savePlan();