mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: convert weightsystem_t and weightsystem_table to C++
As for cylinders, this had to be done simultaneously, Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
28520da655
commit
640ecb345b
28 changed files with 137 additions and 247 deletions
|
@ -13,6 +13,7 @@
|
||||||
#include "core/divesite.h"
|
#include "core/divesite.h"
|
||||||
#include "core/picture.h"
|
#include "core/picture.h"
|
||||||
#include "core/pref.h"
|
#include "core/pref.h"
|
||||||
|
#include "core/range.h"
|
||||||
#include "core/sample.h"
|
#include "core/sample.h"
|
||||||
#include "core/selection.h"
|
#include "core/selection.h"
|
||||||
#include "core/taxonomy.h"
|
#include "core/taxonomy.h"
|
||||||
|
@ -155,11 +156,6 @@ void export_TeX(const char *filename, bool selected_only, bool plain, ExportCall
|
||||||
QString viz = star.repeated(dive->visibility);
|
QString viz = star.repeated(dive->visibility);
|
||||||
QString rating = star.repeated(dive->rating);
|
QString rating = star.repeated(dive->rating);
|
||||||
|
|
||||||
int i;
|
|
||||||
int qty_cyl;
|
|
||||||
int qty_weight;
|
|
||||||
double total_weight;
|
|
||||||
|
|
||||||
if (need_pagebreak) {
|
if (need_pagebreak) {
|
||||||
if (plain)
|
if (plain)
|
||||||
put_format(&buf, "\\vfill\\eject\n");
|
put_format(&buf, "\\vfill\\eject\n");
|
||||||
|
@ -204,7 +200,7 @@ void export_TeX(const char *filename, bool selected_only, bool plain, ExportCall
|
||||||
|
|
||||||
// Print cylinder data
|
// Print cylinder data
|
||||||
put_format(&buf, "\n%% Gas use information:\n");
|
put_format(&buf, "\n%% Gas use information:\n");
|
||||||
qty_cyl = 0;
|
int qty_cyl = 0;
|
||||||
for (int i = 0; i < static_cast<int>(dive->cylinders.size()); i++){
|
for (int i = 0; i < static_cast<int>(dive->cylinders.size()); i++){
|
||||||
const cylinder_t &cyl = dive->cylinders[i];
|
const cylinder_t &cyl = dive->cylinders[i];
|
||||||
if (is_cylinder_used(dive, i) || (prefs.include_unused_tanks && !cyl.type.description.empty())){
|
if (is_cylinder_used(dive, i) || (prefs.include_unused_tanks && !cyl.type.description.empty())){
|
||||||
|
@ -235,11 +231,10 @@ void export_TeX(const char *filename, bool selected_only, bool plain, ExportCall
|
||||||
|
|
||||||
//Code block prints all weights listed in dive.
|
//Code block prints all weights listed in dive.
|
||||||
put_format(&buf, "\n%% Weighting information:\n");
|
put_format(&buf, "\n%% Weighting information:\n");
|
||||||
qty_weight = 0;
|
int qty_weight = 0;
|
||||||
total_weight = 0;
|
double total_weight = 0;
|
||||||
for (i = 0; i < dive->weightsystems.nr; i++) {
|
for (auto [i, w]: enumerated_range(dive->weightsystems)) {
|
||||||
weightsystem_t w = dive->weightsystems.weightsystems[i];
|
put_format(&buf, "\\def\\%sweight%ctype{%s}\n", ssrf, 'a' + i, w.description.c_str());
|
||||||
put_format(&buf, "\\def\\%sweight%ctype{%s}\n", ssrf, 'a' + i, w.description);
|
|
||||||
put_format(&buf, "\\def\\%sweight%camt{%.3f\\%sweightunit}\n", ssrf, 'a' + i, get_weight_units(w.weight.grams, NULL, &unit), ssrf);
|
put_format(&buf, "\\def\\%sweight%camt{%.3f\\%sweightunit}\n", ssrf, 'a' + i, get_weight_units(w.weight.grams, NULL, &unit), ssrf);
|
||||||
qty_weight += 1;
|
qty_weight += 1;
|
||||||
total_weight += get_weight_units(w.weight.grams, NULL, &unit);
|
total_weight += get_weight_units(w.weight.grams, NULL, &unit);
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "core/event.h"
|
#include "core/event.h"
|
||||||
#include "core/fulltext.h"
|
#include "core/fulltext.h"
|
||||||
#include "core/qthelper.h" // for copy_qstring
|
#include "core/qthelper.h" // for copy_qstring
|
||||||
|
#include "core/range.h"
|
||||||
#include "core/sample.h"
|
#include "core/sample.h"
|
||||||
#include "core/selection.h"
|
#include "core/selection.h"
|
||||||
#include "core/subsurface-string.h"
|
#include "core/subsurface-string.h"
|
||||||
|
@ -629,7 +630,6 @@ static void swapCandQString(QString &q, char *&c)
|
||||||
PasteState::PasteState(dive *dIn, const dive *data, dive_components what) : d(dIn),
|
PasteState::PasteState(dive *dIn, const dive *data, dive_components what) : d(dIn),
|
||||||
tags(nullptr)
|
tags(nullptr)
|
||||||
{
|
{
|
||||||
memset(&weightsystems, 0, sizeof(weightsystems));
|
|
||||||
if (what.notes)
|
if (what.notes)
|
||||||
notes = data->notes;
|
notes = data->notes;
|
||||||
if (what.diveguide)
|
if (what.diveguide)
|
||||||
|
@ -686,7 +686,7 @@ PasteState::PasteState(dive *dIn, const dive *data, dive_components what) : d(dI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (what.weights)
|
if (what.weights)
|
||||||
copy_weights(&data->weightsystems, &weightsystems);
|
weightsystems = data->weightsystems;
|
||||||
if (what.number)
|
if (what.number)
|
||||||
number = data->number;
|
number = data->number;
|
||||||
if (what.when)
|
if (what.when)
|
||||||
|
@ -696,8 +696,6 @@ PasteState::PasteState(dive *dIn, const dive *data, dive_components what) : d(dI
|
||||||
PasteState::~PasteState()
|
PasteState::~PasteState()
|
||||||
{
|
{
|
||||||
taglist_free(tags);
|
taglist_free(tags);
|
||||||
clear_weightsystem_table(&weightsystems);
|
|
||||||
free(weightsystems.weightsystems);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PasteState::swap(dive_components what)
|
void PasteState::swap(dive_components what)
|
||||||
|
@ -952,10 +950,10 @@ bool AddWeight::workToBeDone()
|
||||||
void AddWeight::undo()
|
void AddWeight::undo()
|
||||||
{
|
{
|
||||||
for (dive *d: dives) {
|
for (dive *d: dives) {
|
||||||
if (d->weightsystems.nr <= 0)
|
if (d->weightsystems.empty())
|
||||||
continue;
|
continue;
|
||||||
remove_weightsystem(d, d->weightsystems.nr - 1);
|
d->weightsystems.pop_back();
|
||||||
emit diveListNotifier.weightRemoved(d, d->weightsystems.nr);
|
emit diveListNotifier.weightRemoved(d, d->weightsystems.size());
|
||||||
invalidate_dive_cache(d); // Ensure that dive is written in git_save()
|
invalidate_dive_cache(d); // Ensure that dive is written in git_save()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -963,31 +961,26 @@ void AddWeight::undo()
|
||||||
void AddWeight::redo()
|
void AddWeight::redo()
|
||||||
{
|
{
|
||||||
for (dive *d: dives) {
|
for (dive *d: dives) {
|
||||||
add_cloned_weightsystem(&d->weightsystems, empty_weightsystem);
|
d->weightsystems.emplace_back();
|
||||||
emit diveListNotifier.weightAdded(d, d->weightsystems.nr - 1);
|
emit diveListNotifier.weightAdded(d, d->weightsystems.size() - 1);
|
||||||
invalidate_dive_cache(d); // Ensure that dive is written in git_save()
|
invalidate_dive_cache(d); // Ensure that dive is written in git_save()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_weightsystem_index(const struct dive *d, weightsystem_t ws)
|
static int find_weightsystem_index(const struct dive *d, const weightsystem_t &ws)
|
||||||
{
|
{
|
||||||
for (int idx = 0; idx < d->weightsystems.nr; ++idx) {
|
return index_of_if(d->weightsystems, [&ws](auto &ws2) { return same_weightsystem(ws2, ws); });
|
||||||
if (same_weightsystem(d->weightsystems.weightsystems[idx], ws))
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EditWeightBase::EditWeightBase(int index, bool currentDiveOnly) :
|
EditWeightBase::EditWeightBase(int index, bool currentDiveOnly) :
|
||||||
EditDivesBase(currentDiveOnly),
|
EditDivesBase(currentDiveOnly)
|
||||||
ws(empty_weightsystem)
|
|
||||||
{
|
{
|
||||||
// Get the old weightsystem, bail if index is invalid
|
// Get the old weightsystem, bail if index is invalid
|
||||||
if (!current || index < 0 || index >= current->weightsystems.nr) {
|
if (!current || index < 0 || static_cast<size_t>(index) >= current->weightsystems.size()) {
|
||||||
dives.clear();
|
dives.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ws = clone_weightsystem(current->weightsystems.weightsystems[index]);
|
ws = current->weightsystems[index];
|
||||||
|
|
||||||
// Deleting a weightsystem from multiple dives is semantically ill-defined.
|
// Deleting a weightsystem from multiple dives is semantically ill-defined.
|
||||||
// What we will do is trying to delete the same weightsystem if it exists.
|
// What we will do is trying to delete the same weightsystem if it exists.
|
||||||
|
@ -1013,7 +1006,6 @@ EditWeightBase::EditWeightBase(int index, bool currentDiveOnly) :
|
||||||
|
|
||||||
EditWeightBase::~EditWeightBase()
|
EditWeightBase::~EditWeightBase()
|
||||||
{
|
{
|
||||||
free_weightsystem(ws);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EditWeightBase::workToBeDone()
|
bool EditWeightBase::workToBeDone()
|
||||||
|
@ -1035,7 +1027,7 @@ RemoveWeight::RemoveWeight(int index, bool currentDiveOnly) :
|
||||||
void RemoveWeight::undo()
|
void RemoveWeight::undo()
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < dives.size(); ++i) {
|
for (size_t i = 0; i < dives.size(); ++i) {
|
||||||
add_to_weightsystem_table(&dives[i]->weightsystems, indices[i], clone_weightsystem(ws));
|
add_to_weightsystem_table(&dives[i]->weightsystems, indices[i], ws);
|
||||||
emit diveListNotifier.weightAdded(dives[i], indices[i]);
|
emit diveListNotifier.weightAdded(dives[i], indices[i]);
|
||||||
invalidate_dive_cache(dives[i]); // Ensure that dive is written in git_save()
|
invalidate_dive_cache(dives[i]); // Ensure that dive is written in git_save()
|
||||||
}
|
}
|
||||||
|
@ -1052,8 +1044,7 @@ void RemoveWeight::redo()
|
||||||
|
|
||||||
// ***** Edit Weight *****
|
// ***** Edit Weight *****
|
||||||
EditWeight::EditWeight(int index, weightsystem_t wsIn, bool currentDiveOnly) :
|
EditWeight::EditWeight(int index, weightsystem_t wsIn, bool currentDiveOnly) :
|
||||||
EditWeightBase(index, currentDiveOnly),
|
EditWeightBase(index, currentDiveOnly)
|
||||||
new_ws(empty_weightsystem)
|
|
||||||
{
|
{
|
||||||
if (dives.empty())
|
if (dives.empty())
|
||||||
return;
|
return;
|
||||||
|
@ -1065,15 +1056,13 @@ EditWeight::EditWeight(int index, weightsystem_t wsIn, bool currentDiveOnly) :
|
||||||
setText(QStringLiteral("%1 [%2]").arg(Command::Base::tr("Edit weight (%n dive(s))", "", num_dives)).arg(getListOfDives(dives)));
|
setText(QStringLiteral("%1 [%2]").arg(Command::Base::tr("Edit weight (%n dive(s))", "", num_dives)).arg(getListOfDives(dives)));
|
||||||
|
|
||||||
// Try to untranslate the weightsystem name
|
// Try to untranslate the weightsystem name
|
||||||
new_ws = clone_weightsystem(wsIn);
|
new_ws = std::move(wsIn);
|
||||||
QString vString(new_ws.description);
|
QString vString = QString::fromStdString(new_ws.description);
|
||||||
auto it = std::find_if(ws_info_table.begin(), ws_info_table.end(),
|
auto it = std::find_if(ws_info_table.begin(), ws_info_table.end(),
|
||||||
[&vString](const ws_info &info)
|
[&vString](const ws_info &info)
|
||||||
{ return gettextFromC::tr(info.name.c_str()) == vString; });
|
{ return gettextFromC::tr(info.name.c_str()) == vString; });
|
||||||
if (it != ws_info_table.end()) {
|
if (it != ws_info_table.end())
|
||||||
free_weightsystem(new_ws);
|
new_ws.description = it->name;
|
||||||
new_ws.description = strdup(it->name.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If that doesn't change anything, do nothing
|
// If that doesn't change anything, do nothing
|
||||||
if (same_weightsystem(ws, new_ws)) {
|
if (same_weightsystem(ws, new_ws)) {
|
||||||
|
@ -1084,7 +1073,6 @@ EditWeight::EditWeight(int index, weightsystem_t wsIn, bool currentDiveOnly) :
|
||||||
|
|
||||||
EditWeight::~EditWeight()
|
EditWeight::~EditWeight()
|
||||||
{
|
{
|
||||||
free_weightsystem(new_ws);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditWeight::redo()
|
void EditWeight::redo()
|
||||||
|
|
|
@ -300,8 +300,8 @@ struct PasteState {
|
||||||
int surge;
|
int surge;
|
||||||
int chill;
|
int chill;
|
||||||
tag_entry *tags;
|
tag_entry *tags;
|
||||||
struct cylinder_table cylinders;
|
cylinder_table cylinders;
|
||||||
struct weightsystem_table weightsystems;
|
weightsystem_table weightsystems;
|
||||||
int number;
|
int number;
|
||||||
timestamp_t when;
|
timestamp_t when;
|
||||||
|
|
||||||
|
|
|
@ -631,7 +631,7 @@ static void wlog_compl_parser(std::string &wl_mem, struct dive *dt_dive, int dco
|
||||||
tmp = (int) two_bytes_to_int(runner[pos_weight + 1], runner[pos_weight]);
|
tmp = (int) two_bytes_to_int(runner[pos_weight + 1], runner[pos_weight]);
|
||||||
if (tmp != 0x7fff) {
|
if (tmp != 0x7fff) {
|
||||||
weightsystem_t ws = { {tmp * 10}, QT_TRANSLATE_NOOP("gettextFromC", "unknown"), false };
|
weightsystem_t ws = { {tmp * 10}, QT_TRANSLATE_NOOP("gettextFromC", "unknown"), false };
|
||||||
add_cloned_weightsystem(&dt_dive->weightsystems, ws);
|
dt_dive->weightsystems.push_back(std::move(ws));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -176,8 +176,7 @@ static void free_dive_structures(struct dive *d)
|
||||||
/* free tags, additional dive computers, and pictures */
|
/* free tags, additional dive computers, and pictures */
|
||||||
taglist_free(d->tag_list);
|
taglist_free(d->tag_list);
|
||||||
d->cylinders.clear();
|
d->cylinders.clear();
|
||||||
clear_weightsystem_table(&d->weightsystems);
|
d->weightsystems.clear();
|
||||||
free(d->weightsystems.weightsystems);
|
|
||||||
clear_picture_table(&d->pictures);
|
clear_picture_table(&d->pictures);
|
||||||
free(d->pictures.pictures);
|
free(d->pictures.pictures);
|
||||||
}
|
}
|
||||||
|
@ -204,7 +203,6 @@ void copy_dive(const struct dive *s, struct dive *d)
|
||||||
* relevant components that are referenced through pointers,
|
* relevant components that are referenced through pointers,
|
||||||
* so all the strings and the structured lists */
|
* so all the strings and the structured lists */
|
||||||
*d = *s;
|
*d = *s;
|
||||||
memset(&d->weightsystems, 0, sizeof(d->weightsystems));
|
|
||||||
memset(&d->pictures, 0, sizeof(d->pictures));
|
memset(&d->pictures, 0, sizeof(d->pictures));
|
||||||
d->full_text = NULL;
|
d->full_text = NULL;
|
||||||
invalidate_dive_cache(d);
|
invalidate_dive_cache(d);
|
||||||
|
@ -212,7 +210,6 @@ void copy_dive(const struct dive *s, struct dive *d)
|
||||||
d->diveguide = copy_string(s->diveguide);
|
d->diveguide = copy_string(s->diveguide);
|
||||||
d->notes = copy_string(s->notes);
|
d->notes = copy_string(s->notes);
|
||||||
d->suit = copy_string(s->suit);
|
d->suit = copy_string(s->suit);
|
||||||
copy_weights(&s->weightsystems, &d->weightsystems);
|
|
||||||
copy_pictures(&s->pictures, &d->pictures);
|
copy_pictures(&s->pictures, &d->pictures);
|
||||||
d->tag_list = taglist_copy(s->tag_list);
|
d->tag_list = taglist_copy(s->tag_list);
|
||||||
}
|
}
|
||||||
|
@ -260,7 +257,7 @@ void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_compo
|
||||||
if (what.cylinders)
|
if (what.cylinders)
|
||||||
copy_cylinder_types(s, d);
|
copy_cylinder_types(s, d);
|
||||||
if (what.weights)
|
if (what.weights)
|
||||||
copy_weights(&s->weightsystems, &d->weightsystems);
|
d->weightsystems = s->weightsystems;
|
||||||
if (what.number)
|
if (what.number)
|
||||||
d->number = s->number;
|
d->number = s->number;
|
||||||
if (what.when)
|
if (what.when)
|
||||||
|
@ -289,11 +286,6 @@ void copy_events_until(const struct dive *sd, struct dive *dd, int dcNr, int tim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_weightsystems(const struct dive *dive)
|
|
||||||
{
|
|
||||||
return dive->weightsystems.nr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only)
|
void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only)
|
||||||
{
|
{
|
||||||
if (!s || !d)
|
if (!s || !d)
|
||||||
|
@ -1116,8 +1108,6 @@ static void fixup_dive_dc(struct dive *dive, struct divecomputer &dc)
|
||||||
|
|
||||||
struct dive *fixup_dive(struct dive *dive)
|
struct dive *fixup_dive(struct dive *dive)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
sanitize_cylinder_info(dive);
|
sanitize_cylinder_info(dive);
|
||||||
dive->maxcns = dive->cns;
|
dive->maxcns = dive->cns;
|
||||||
|
|
||||||
|
@ -1146,10 +1136,8 @@ struct dive *fixup_dive(struct dive *dive)
|
||||||
cyl.end.mbar = 0;
|
cyl.end.mbar = 0;
|
||||||
}
|
}
|
||||||
update_cylinder_related_info(dive);
|
update_cylinder_related_info(dive);
|
||||||
for (i = 0; i < dive->weightsystems.nr; i++) {
|
for (auto &ws: dive->weightsystems)
|
||||||
const weightsystem_t &ws = dive->weightsystems.weightsystems[i];
|
|
||||||
add_weightsystem_description(ws);
|
add_weightsystem_description(ws);
|
||||||
}
|
|
||||||
/* we should always have a uniq ID as that gets assigned during dive creation,
|
/* we should always have a uniq ID as that gets assigned during dive creation,
|
||||||
* but we want to make sure... */
|
* but we want to make sure... */
|
||||||
if (!dive->id)
|
if (!dive->id)
|
||||||
|
@ -1769,26 +1757,20 @@ static void merge_cylinders(struct dive *res, const struct dive *a, const struct
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether a weightsystem table contains a given weightsystem */
|
/* Check whether a weightsystem table contains a given weightsystem */
|
||||||
static bool has_weightsystem(const struct weightsystem_table *t, const weightsystem_t w)
|
static bool has_weightsystem(const weightsystem_table &t, const weightsystem_t &w)
|
||||||
{
|
{
|
||||||
int i;
|
return any_of(t.begin(), t.end(), [&w] (auto &w2) { return same_weightsystem(w, w2); });
|
||||||
for (i = 0; i < t->nr; i++) {
|
|
||||||
if (same_weightsystem(w, t->weightsystems[i]))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void merge_equipment(struct dive *res, const struct dive *a, const struct dive *b)
|
static void merge_equipment(struct dive *res, const struct dive *a, const struct dive *b)
|
||||||
{
|
{
|
||||||
int i;
|
for (auto &ws: a->weightsystems) {
|
||||||
for (i = 0; i < a->weightsystems.nr; i++) {
|
if (!has_weightsystem(res->weightsystems, ws))
|
||||||
if (!has_weightsystem(&res->weightsystems, a->weightsystems.weightsystems[i]))
|
res->weightsystems.push_back(ws);
|
||||||
add_cloned_weightsystem(&res->weightsystems, a->weightsystems.weightsystems[i]);
|
|
||||||
}
|
}
|
||||||
for (i = 0; i < b->weightsystems.nr; i++) {
|
for (auto &ws: b->weightsystems) {
|
||||||
if (!has_weightsystem(&res->weightsystems, b->weightsystems.weightsystems[i]))
|
if (!has_weightsystem(res->weightsystems, ws))
|
||||||
add_cloned_weightsystem(&res->weightsystems, b->weightsystems.weightsystems[i]);
|
res->weightsystems.push_back(ws);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include "divemode.h"
|
#include "divemode.h"
|
||||||
#include "divecomputer.h"
|
#include "divecomputer.h"
|
||||||
#include "equipment.h" // TODO: remove
|
#include "equipment.h"
|
||||||
#include "picture.h" // TODO: remove
|
#include "picture.h" // TODO: remove
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -30,8 +30,8 @@ struct dive {
|
||||||
struct dive_site *dive_site = nullptr;
|
struct dive_site *dive_site = nullptr;
|
||||||
char *notes = nullptr;
|
char *notes = nullptr;
|
||||||
char *diveguide = nullptr, *buddy = nullptr;
|
char *diveguide = nullptr, *buddy = nullptr;
|
||||||
struct cylinder_table cylinders;
|
cylinder_table cylinders;
|
||||||
struct weightsystem_table weightsystems = { };
|
weightsystem_table weightsystems;
|
||||||
char *suit = nullptr;
|
char *suit = nullptr;
|
||||||
int number = 0;
|
int number = 0;
|
||||||
int rating = 0;
|
int rating = 0;
|
||||||
|
@ -190,7 +190,6 @@ extern struct event create_gas_switch_event(struct dive *dive, struct divecomput
|
||||||
extern void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, int *mean, int *duration);
|
extern void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, int *mean, int *duration);
|
||||||
extern int get_cylinder_index(const struct dive *dive, const struct event &ev);
|
extern int get_cylinder_index(const struct dive *dive, const struct event &ev);
|
||||||
extern struct gasmix get_gasmix_from_event(const struct dive *, const struct event &ev);
|
extern struct gasmix get_gasmix_from_event(const struct dive *, const struct event &ev);
|
||||||
extern int nr_weightsystems(const struct dive *dive);
|
|
||||||
extern bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id);
|
extern bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id);
|
||||||
|
|
||||||
/* UI related protopypes */
|
/* UI related protopypes */
|
||||||
|
|
|
@ -64,11 +64,12 @@ void get_dive_gas(const struct dive *dive, int *o2_p, int *he_p, int *o2max_p)
|
||||||
|
|
||||||
int total_weight(const struct dive *dive)
|
int total_weight(const struct dive *dive)
|
||||||
{
|
{
|
||||||
int i, total_grams = 0;
|
int total_grams = 0;
|
||||||
|
|
||||||
if (dive)
|
if (dive) {
|
||||||
for (i = 0; i < dive->weightsystems.nr; i++)
|
for (auto &ws: dive->weightsystems)
|
||||||
total_grams += dive->weightsystems.weightsystems[i].weight.grams;
|
total_grams += ws.weight.grams;
|
||||||
|
}
|
||||||
return total_grams;
|
return total_grams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include "pref.h"
|
#include "pref.h"
|
||||||
#include "range.h"
|
#include "range.h"
|
||||||
#include "subsurface-string.h"
|
#include "subsurface-string.h"
|
||||||
#include "table.h"
|
|
||||||
|
|
||||||
cylinder_t::cylinder_t() = default;
|
cylinder_t::cylinder_t() = default;
|
||||||
cylinder_t::~cylinder_t() = default;
|
cylinder_t::~cylinder_t() = default;
|
||||||
|
@ -55,33 +54,13 @@ const cylinder_t &cylinder_table::operator[](size_t i) const
|
||||||
: surface_air_cylinder;
|
: surface_air_cylinder;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Warning: this has strange semantics for C-code! Not the weightsystem object
|
weightsystem_t::weightsystem_t() = default;
|
||||||
* is freed, but the data it references. The object itself is passed in by value.
|
weightsystem_t::~weightsystem_t() = default;
|
||||||
* This is due to the fact how the table macros work.
|
weightsystem_t::weightsystem_t(weight_t w, std::string desc, bool auto_filled)
|
||||||
*/
|
: weight(w), description(std::move(desc)), auto_filled(auto_filled)
|
||||||
void free_weightsystem(weightsystem_t ws)
|
|
||||||
{
|
{
|
||||||
free((void *)ws.description);
|
|
||||||
ws.description = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_weights(const struct weightsystem_table *s, struct weightsystem_table *d)
|
|
||||||
{
|
|
||||||
clear_weightsystem_table(d);
|
|
||||||
for (int i = 0; i < s->nr; i++)
|
|
||||||
add_cloned_weightsystem(d, s->weightsystems[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* weightsystem table functions */
|
|
||||||
//static MAKE_GET_IDX(weightsystem_table, weightsystem_t, weightsystems)
|
|
||||||
static MAKE_GROW_TABLE(weightsystem_table, weightsystem_t, weightsystems)
|
|
||||||
//static MAKE_GET_INSERTION_INDEX(weightsystem_table, weightsystem_t, weightsystems, weightsystem_less_than)
|
|
||||||
MAKE_ADD_TO(weightsystem_table, weightsystem_t, weightsystems)
|
|
||||||
static MAKE_REMOVE_FROM(weightsystem_table, weightsystems)
|
|
||||||
//MAKE_SORT(weightsystem_table, weightsystem_t, weightsystems, comp_weightsystems)
|
|
||||||
//MAKE_REMOVE(weightsystem_table, weightsystem_t, weightsystem)
|
|
||||||
MAKE_CLEAR_TABLE(weightsystem_table, weightsystems, weightsystem)
|
|
||||||
|
|
||||||
const char *cylinderuse_text[NUM_GAS_USE] = {
|
const char *cylinderuse_text[NUM_GAS_USE] = {
|
||||||
QT_TRANSLATE_NOOP("gettextFromC", "OC-gas"), QT_TRANSLATE_NOOP("gettextFromC", "diluent"), QT_TRANSLATE_NOOP("gettextFromC", "oxygen"), QT_TRANSLATE_NOOP("gettextFromC", "not used")
|
QT_TRANSLATE_NOOP("gettextFromC", "OC-gas"), QT_TRANSLATE_NOOP("gettextFromC", "diluent"), QT_TRANSLATE_NOOP("gettextFromC", "oxygen"), QT_TRANSLATE_NOOP("gettextFromC", "not used")
|
||||||
};
|
};
|
||||||
|
@ -166,7 +145,7 @@ void add_cylinder_description(const cylinder_type_t &type)
|
||||||
|
|
||||||
void add_weightsystem_description(const weightsystem_t &weightsystem)
|
void add_weightsystem_description(const weightsystem_t &weightsystem)
|
||||||
{
|
{
|
||||||
if (empty_string(weightsystem.description))
|
if (weightsystem.description.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto it = std::find_if(ws_info_table.begin(), ws_info_table.end(),
|
auto it = std::find_if(ws_info_table.begin(), ws_info_table.end(),
|
||||||
|
@ -188,26 +167,6 @@ weight_t get_weightsystem_weight(const std::string &name)
|
||||||
return it != ws_info_table.end() ? it->weight : weight_t();
|
return it != ws_info_table.end() ? it->weight : weight_t();
|
||||||
}
|
}
|
||||||
|
|
||||||
weightsystem_t clone_weightsystem(weightsystem_t ws)
|
|
||||||
{
|
|
||||||
weightsystem_t res = { ws.weight, copy_string(ws.description), ws.auto_filled };
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add a clone of a weightsystem to the end of a weightsystem table.
|
|
||||||
* Cloned means that the description-string is copied. */
|
|
||||||
void add_cloned_weightsystem(struct weightsystem_table *t, weightsystem_t ws)
|
|
||||||
{
|
|
||||||
add_to_weightsystem_table(t, t->nr, clone_weightsystem(ws));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add a clone of a weightsystem to the end of a weightsystem table.
|
|
||||||
* Cloned means that the description-string is copied. */
|
|
||||||
void add_cloned_weightsystem_at(struct weightsystem_table *t, weightsystem_t ws)
|
|
||||||
{
|
|
||||||
add_to_weightsystem_table(t, t->nr, clone_weightsystem(ws));
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_cylinder(struct cylinder_table *t, int idx, cylinder_t cyl)
|
void add_cylinder(struct cylinder_table *t, int idx, cylinder_t cyl)
|
||||||
{
|
{
|
||||||
t->insert(t->begin() + idx, std::move(cyl));
|
t->insert(t->begin() + idx, std::move(cyl));
|
||||||
|
@ -216,7 +175,7 @@ void add_cylinder(struct cylinder_table *t, int idx, cylinder_t cyl)
|
||||||
bool same_weightsystem(weightsystem_t w1, weightsystem_t w2)
|
bool same_weightsystem(weightsystem_t w1, weightsystem_t w2)
|
||||||
{
|
{
|
||||||
return w1.weight.grams == w2.weight.grams &&
|
return w1.weight.grams == w2.weight.grams &&
|
||||||
same_string(w1.description, w2.description);
|
w1.description == w2.description;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_gas_string(struct gasmix gasmix, char *text, int len)
|
void get_gas_string(struct gasmix gasmix, char *text, int len)
|
||||||
|
@ -351,16 +310,20 @@ void remove_cylinder(struct dive *dive, int idx)
|
||||||
|
|
||||||
void remove_weightsystem(struct dive *dive, int idx)
|
void remove_weightsystem(struct dive *dive, int idx)
|
||||||
{
|
{
|
||||||
remove_from_weightsystem_table(&dive->weightsystems, idx);
|
dive->weightsystems.erase(dive->weightsystems.begin() + idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_to_weightsystem_table(weightsystem_table *table, int idx, weightsystem_t ws)
|
||||||
|
{
|
||||||
|
idx = std::clamp(idx, 0, static_cast<int>(table->size()));
|
||||||
|
table->insert(table->begin() + idx, std::move(ws));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ws is cloned.
|
|
||||||
void set_weightsystem(struct dive *dive, int idx, weightsystem_t ws)
|
void set_weightsystem(struct dive *dive, int idx, weightsystem_t ws)
|
||||||
{
|
{
|
||||||
if (idx < 0 || idx >= dive->weightsystems.nr)
|
if (idx < 0 || static_cast<size_t>(idx) >= dive->weightsystems.size())
|
||||||
return;
|
return;
|
||||||
free_weightsystem(dive->weightsystems.weightsystems[idx]);
|
dive->weightsystems[idx] = std::move(ws);
|
||||||
dive->weightsystems.weightsystems[idx] = clone_weightsystem(ws);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* when planning a dive we need to make sure that all cylinders have a sane depth assigned
|
/* when planning a dive we need to make sure that all cylinders have a sane depth assigned
|
||||||
|
|
|
@ -54,30 +54,22 @@ struct cylinder_table : public std::vector<cylinder_t> {
|
||||||
struct weightsystem_t
|
struct weightsystem_t
|
||||||
{
|
{
|
||||||
weight_t weight;
|
weight_t weight;
|
||||||
const char *description; /* "integrated", "belt", "ankle" */
|
std::string description; /* "integrated", "belt", "ankle" */
|
||||||
bool auto_filled; /* weight was automatically derived from the type */
|
bool auto_filled = false; /* weight was automatically derived from the type */
|
||||||
};
|
|
||||||
|
|
||||||
static const weightsystem_t empty_weightsystem = { { 0 }, 0, false };
|
weightsystem_t();
|
||||||
|
weightsystem_t(weight_t w, std::string desc, bool auto_filled);
|
||||||
|
~weightsystem_t();
|
||||||
|
};
|
||||||
|
|
||||||
/* Table of weightsystems. Attention: this stores weightsystems,
|
/* Table of weightsystems. Attention: this stores weightsystems,
|
||||||
* *not* pointers * to weightsystems. This has two crucial
|
* *not* pointers * to weightsystems. Therefore pointers to
|
||||||
* consequences:
|
* weightsystems are *not* stable.
|
||||||
* 1) Pointers to weightsystems are not stable. They may be
|
*/
|
||||||
* invalidated if the table is reallocated.
|
using weightsystem_table = std::vector<weightsystem_t>;
|
||||||
* 2) add_to_weightsystem_table(), etc. takes ownership of the
|
|
||||||
* weightsystem. Notably of the description string */
|
|
||||||
struct weightsystem_table {
|
|
||||||
int nr, allocated;
|
|
||||||
weightsystem_t *weightsystems;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern enum cylinderuse cylinderuse_from_text(const char *text);
|
extern enum cylinderuse cylinderuse_from_text(const char *text);
|
||||||
extern void copy_weights(const struct weightsystem_table *s, struct weightsystem_table *d);
|
|
||||||
extern weightsystem_t clone_weightsystem(weightsystem_t ws);
|
|
||||||
extern void free_weightsystem(weightsystem_t ws);
|
|
||||||
extern void copy_cylinder_types(const struct dive *s, struct dive *d);
|
extern void copy_cylinder_types(const struct dive *s, struct dive *d);
|
||||||
extern void add_cloned_weightsystem(struct weightsystem_table *t, weightsystem_t ws);
|
|
||||||
extern cylinder_t *add_empty_cylinder(struct cylinder_table *t);
|
extern cylinder_t *add_empty_cylinder(struct cylinder_table *t);
|
||||||
extern cylinder_t *get_cylinder(struct dive *d, int idx);
|
extern cylinder_t *get_cylinder(struct dive *d, int idx);
|
||||||
extern const cylinder_t *get_cylinder(const struct dive *d, int idx);
|
extern const cylinder_t *get_cylinder(const struct dive *d, int idx);
|
||||||
|
@ -99,8 +91,7 @@ extern void dump_cylinders(struct dive *dive, bool verbose);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Weightsystem table functions */
|
/* Weightsystem table functions */
|
||||||
extern void clear_weightsystem_table(struct weightsystem_table *);
|
extern void add_to_weightsystem_table(weightsystem_table *, int idx, weightsystem_t ws);
|
||||||
extern void add_to_weightsystem_table(struct weightsystem_table *, int idx, weightsystem_t ws);
|
|
||||||
|
|
||||||
/* Cylinder table functions */
|
/* Cylinder table functions */
|
||||||
extern void add_cylinder(struct cylinder_table *, int idx, cylinder_t cyl);
|
extern void add_cylinder(struct cylinder_table *, int idx, cylinder_t cyl);
|
||||||
|
|
|
@ -848,8 +848,8 @@ static bool has_locations(const filter_constraint &c, const struct dive *d)
|
||||||
static bool has_weight_type(const filter_constraint &c, const struct dive *d)
|
static bool has_weight_type(const filter_constraint &c, const struct dive *d)
|
||||||
{
|
{
|
||||||
QStringList weightsystemTypes;
|
QStringList weightsystemTypes;
|
||||||
for (int i = 0; i < d->weightsystems.nr; ++i)
|
for (auto &ws: d->weightsystems)
|
||||||
weightsystemTypes.push_back(d->weightsystems.weightsystems[i].description);
|
weightsystemTypes.push_back(QString::fromStdString(ws.description));
|
||||||
|
|
||||||
return check(c, weightsystemTypes);
|
return check(c, weightsystemTypes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,10 +127,8 @@ static std::vector<QString> getWords(const dive *d)
|
||||||
tokenize(QString::fromStdString(tag->tag->name), res);
|
tokenize(QString::fromStdString(tag->tag->name), res);
|
||||||
for (auto &cyl: d->cylinders)
|
for (auto &cyl: d->cylinders)
|
||||||
tokenize(QString::fromStdString(cyl.type.description), res);
|
tokenize(QString::fromStdString(cyl.type.description), res);
|
||||||
for (int i = 0; i < d->weightsystems.nr; ++i) {
|
for (auto &ws: d->weightsystems)
|
||||||
const weightsystem_t &ws = d->weightsystems.weightsystems[i];
|
tokenize(QString::fromStdString(ws.description), res);
|
||||||
tokenize(QString(ws.description), res);
|
|
||||||
}
|
|
||||||
// TODO: We should tokenize all dive-sites and trips first and then
|
// TODO: We should tokenize all dive-sites and trips first and then
|
||||||
// take the tokens from a cache.
|
// take the tokens from a cache.
|
||||||
if (d->dive_site) {
|
if (d->dive_site) {
|
||||||
|
|
|
@ -301,7 +301,7 @@ static int divinglog_dive(void *param, int, char **data, char **)
|
||||||
|
|
||||||
if (data[10]) {
|
if (data[10]) {
|
||||||
weightsystem_t ws = { { atoi(data[10]) * 1000 }, translate("gettextFromC", "unknown"), false };
|
weightsystem_t ws = { { atoi(data[10]) * 1000 }, translate("gettextFromC", "unknown"), false };
|
||||||
add_cloned_weightsystem(&state->cur_dive->weightsystems, ws);
|
state->cur_dive->weightsystems.push_back(std::move(ws));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data[11])
|
if (data[11])
|
||||||
|
|
|
@ -457,7 +457,7 @@ static void parse_weightsystem_keyvalue(void *_ws, const char *key, const std::s
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!strcmp(key, "description")) {
|
if (!strcmp(key, "description")) {
|
||||||
ws->description = strdup(value.c_str());
|
ws->description = value;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
report_error("Unknown weightsystem key/value pair (%s/%s)", key, value.c_str());
|
report_error("Unknown weightsystem key/value pair (%s/%s)", key, value.c_str());
|
||||||
|
@ -465,7 +465,7 @@ static void parse_weightsystem_keyvalue(void *_ws, const char *key, const std::s
|
||||||
|
|
||||||
static void parse_dive_weightsystem(char *line, struct git_parser_state *state)
|
static void parse_dive_weightsystem(char *line, struct git_parser_state *state)
|
||||||
{
|
{
|
||||||
weightsystem_t ws = empty_weightsystem;
|
weightsystem_t ws;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char c;
|
char c;
|
||||||
|
@ -476,7 +476,7 @@ static void parse_dive_weightsystem(char *line, struct git_parser_state *state)
|
||||||
line = parse_keyvalue_entry(parse_weightsystem_keyvalue, &ws, line, state);
|
line = parse_keyvalue_entry(parse_weightsystem_keyvalue, &ws, line, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_to_weightsystem_table(&state->active_dive->weightsystems, state->active_dive->weightsystems.nr, ws);
|
state->active_dive->weightsystems.push_back(std::move(ws));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int match_action(char *line, void *data,
|
static int match_action(char *line, void *data,
|
||||||
|
@ -1688,7 +1688,7 @@ static int parse_dive_entry(struct git_parser_state *state, const git_tree_entry
|
||||||
return report_error("Unable to read dive file");
|
return report_error("Unable to read dive file");
|
||||||
if (*suffix)
|
if (*suffix)
|
||||||
state->active_dive->number = atoi(suffix + 1);
|
state->active_dive->number = atoi(suffix + 1);
|
||||||
clear_weightsystem_table(&state->active_dive->weightsystems);
|
state->active_dive->weightsystems.clear();
|
||||||
state->o2pressure_sensor = 1;
|
state->o2pressure_sensor = 1;
|
||||||
for_each_line(blob, dive_parser, state);
|
for_each_line(blob, dive_parser, state);
|
||||||
git_blob_free(blob);
|
git_blob_free(blob);
|
||||||
|
|
|
@ -1230,8 +1230,8 @@ static void gps_picture_location(const char *buffer, struct picture *pic)
|
||||||
static void try_to_fill_dive(struct dive *dive, const char *name, char *buf, struct parser_state *state)
|
static void try_to_fill_dive(struct dive *dive, const char *name, char *buf, struct parser_state *state)
|
||||||
{
|
{
|
||||||
cylinder_t *cyl = !dive->cylinders.empty() ? &dive->cylinders.back() : NULL;
|
cylinder_t *cyl = !dive->cylinders.empty() ? &dive->cylinders.back() : NULL;
|
||||||
weightsystem_t *ws = dive->weightsystems.nr > 0 ?
|
weightsystem_t *ws = !dive->weightsystems.empty() > 0 ?
|
||||||
&dive->weightsystems.weightsystems[dive->weightsystems.nr - 1] : NULL;
|
&dive->weightsystems.back() : NULL;
|
||||||
pressure_t p;
|
pressure_t p;
|
||||||
weight_t w;
|
weight_t w;
|
||||||
start_match("dive", name, buf);
|
start_match("dive", name, buf);
|
||||||
|
@ -1339,15 +1339,15 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf, str
|
||||||
if (MATCH_STATE("airpressure.dive", pressure, &dive->surface_pressure))
|
if (MATCH_STATE("airpressure.dive", pressure, &dive->surface_pressure))
|
||||||
return;
|
return;
|
||||||
if (ws) {
|
if (ws) {
|
||||||
if (MATCH("description.weightsystem", utf8_string, (char **)&ws->description))
|
if (MATCH("description.weightsystem", utf8_string_std, &ws->description))
|
||||||
return;
|
return;
|
||||||
if (MATCH_STATE("weight.weightsystem", weight, &ws->weight))
|
if (MATCH_STATE("weight.weightsystem", weight, &ws->weight))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (MATCH_STATE("weight", weight, &w)) {
|
if (MATCH_STATE("weight", weight, &w)) {
|
||||||
weightsystem_t ws = empty_weightsystem;
|
weightsystem_t ws;
|
||||||
ws.weight = w;
|
ws.weight = w;
|
||||||
add_cloned_weightsystem(&dive->weightsystems, ws);
|
dive->weightsystems.push_back(std::move(ws));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (cyl) {
|
if (cyl) {
|
||||||
|
|
|
@ -323,7 +323,7 @@ void cylinder_end(struct parser_state *state)
|
||||||
|
|
||||||
void ws_start(struct parser_state *state)
|
void ws_start(struct parser_state *state)
|
||||||
{
|
{
|
||||||
add_cloned_weightsystem(&state->cur_dive->weightsystems, empty_weightsystem);
|
state->cur_dive->weightsystems.emplace_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ws_end(struct parser_state *state)
|
void ws_end(struct parser_state *state)
|
||||||
|
|
|
@ -162,19 +162,14 @@ static void save_cylinder_info(struct membuffer *b, struct dive *dive)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void save_weightsystem_info(struct membuffer *b, struct dive *dive)
|
static void save_weightsystem_info(struct membuffer *b, const struct dive *dive)
|
||||||
{
|
{
|
||||||
int i, nr;
|
for (auto &ws: dive->weightsystems) {
|
||||||
|
|
||||||
nr = nr_weightsystems(dive);
|
|
||||||
for (i = 0; i < nr; i++) {
|
|
||||||
weightsystem_t ws = dive->weightsystems.weightsystems[i];
|
|
||||||
int grams = ws.weight.grams;
|
int grams = ws.weight.grams;
|
||||||
const char *description = ws.description;
|
|
||||||
|
|
||||||
put_string(b, "weightsystem");
|
put_string(b, "weightsystem");
|
||||||
put_milli(b, " weight=", grams, "kg");
|
put_milli(b, " weight=", grams, "kg");
|
||||||
show_utf8(b, " description=", description, "");
|
show_utf8(b, " description=", ws.description.c_str(), "");
|
||||||
put_string(b, "\n");
|
put_string(b, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,24 +96,18 @@ static void put_HTML_bookmarks(struct membuffer *b, const struct dive *dive)
|
||||||
|
|
||||||
static void put_weightsystem_HTML(struct membuffer *b, const struct dive *dive)
|
static void put_weightsystem_HTML(struct membuffer *b, const struct dive *dive)
|
||||||
{
|
{
|
||||||
int i, nr;
|
|
||||||
|
|
||||||
nr = nr_weightsystems(dive);
|
|
||||||
|
|
||||||
put_string(b, "\"Weights\":[");
|
put_string(b, "\"Weights\":[");
|
||||||
|
|
||||||
const char *separator = "";
|
const char *separator = "";
|
||||||
|
|
||||||
for (i = 0; i < nr; i++) {
|
for (auto &ws: dive->weightsystems) {
|
||||||
weightsystem_t ws = dive->weightsystems.weightsystems[i];
|
|
||||||
int grams = ws.weight.grams;
|
int grams = ws.weight.grams;
|
||||||
const char *description = ws.description;
|
|
||||||
|
|
||||||
put_string(b, separator);
|
put_string(b, separator);
|
||||||
separator = ", ";
|
separator = ", ";
|
||||||
put_string(b, "{");
|
put_string(b, "{");
|
||||||
put_HTML_weight_units(b, grams, "\"weight\":\"", "\",");
|
put_HTML_weight_units(b, grams, "\"weight\":\"", "\",");
|
||||||
write_attribute(b, "description", description, " ");
|
write_attribute(b, "description", ws.description.c_str(), " ");
|
||||||
put_string(b, "}");
|
put_string(b, "}");
|
||||||
}
|
}
|
||||||
put_string(b, "],");
|
put_string(b, "],");
|
||||||
|
|
|
@ -197,20 +197,14 @@ static void save_cylinder_info(struct membuffer *b, struct dive *dive)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void save_weightsystem_info(struct membuffer *b, struct dive *dive)
|
static void save_weightsystem_info(struct membuffer *b, const struct dive *dive)
|
||||||
{
|
{
|
||||||
int i, nr;
|
for (auto &ws: dive->weightsystems) {
|
||||||
|
|
||||||
nr = nr_weightsystems(dive);
|
|
||||||
|
|
||||||
for (i = 0; i < nr; i++) {
|
|
||||||
weightsystem_t ws = dive->weightsystems.weightsystems[i];
|
|
||||||
int grams = ws.weight.grams;
|
int grams = ws.weight.grams;
|
||||||
const char *description = ws.description;
|
|
||||||
|
|
||||||
put_format(b, " <weightsystem");
|
put_format(b, " <weightsystem");
|
||||||
put_milli(b, " weight='", grams, " kg'");
|
put_milli(b, " weight='", grams, " kg'");
|
||||||
show_utf8(b, description, " description='", "'", 1);
|
show_utf8(b, ws.description.c_str(), " description='", "'", 1);
|
||||||
put_format(b, " />\n");
|
put_format(b, " />\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,21 +195,19 @@ QString formatSumWeight(const dive *d)
|
||||||
return get_weight_string(weight_t { total_weight(d) }, true);
|
return get_weight_string(weight_t { total_weight(d) }, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString getFormattedWeight(const struct dive *dive, int idx)
|
static QString getFormattedWeight(const weightsystem_t &weight)
|
||||||
{
|
{
|
||||||
const weightsystem_t *weight = &dive->weightsystems.weightsystems[idx];
|
if (weight.description.empty())
|
||||||
if (!weight->description)
|
|
||||||
return QString();
|
return QString();
|
||||||
QString fmt = QString(weight->description);
|
return QString::fromStdString(weight.description) +
|
||||||
fmt += ", " + get_weight_string(weight->weight, true);
|
", " + get_weight_string(weight.weight, true);
|
||||||
return fmt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString formatWeightList(const dive *d)
|
QString formatWeightList(const dive *d)
|
||||||
{
|
{
|
||||||
QString weights;
|
QString weights;
|
||||||
for (int i = 0; i < d->weightsystems.nr; i++) {
|
for (auto &ws: d->weightsystems) {
|
||||||
QString w = getFormattedWeight(d, i);
|
QString w = getFormattedWeight(ws);
|
||||||
if (w.isEmpty())
|
if (w.isEmpty())
|
||||||
continue;
|
continue;
|
||||||
weights += w + "; ";
|
weights += w + "; ";
|
||||||
|
@ -220,8 +218,8 @@ QString formatWeightList(const dive *d)
|
||||||
QStringList formatWeights(const dive *d)
|
QStringList formatWeights(const dive *d)
|
||||||
{
|
{
|
||||||
QStringList weights;
|
QStringList weights;
|
||||||
for (int i = 0; i < d->weightsystems.nr; i++) {
|
for (auto &ws: d->weightsystems) {
|
||||||
QString w = getFormattedWeight(d, i);
|
QString w = getFormattedWeight(ws);
|
||||||
if (w.isEmpty())
|
if (w.isEmpty())
|
||||||
continue;
|
continue;
|
||||||
weights << w;
|
weights << w;
|
||||||
|
|
|
@ -745,9 +745,9 @@ static void parse_tag(struct dive *dive, std::string_view tag, std::string_view
|
||||||
} else if (tag == "altitude") {
|
} else if (tag == "altitude") {
|
||||||
uemis_get_index(val, dive->dcs[0].surface_pressure.mbar);
|
uemis_get_index(val, dive->dcs[0].surface_pressure.mbar);
|
||||||
} else if (tag == "f32Weight") {
|
} else if (tag == "f32Weight") {
|
||||||
weightsystem_t ws = empty_weightsystem;
|
weightsystem_t ws;
|
||||||
uemis_get_weight(val, ws, dive->dcs[0].diveid);
|
uemis_get_weight(val, ws, dive->dcs[0].diveid);
|
||||||
add_cloned_weightsystem(&dive->weightsystems, ws);
|
dive->weightsystems.push_back(std::move(ws));
|
||||||
} else if (tag == "notes") {
|
} else if (tag == "notes") {
|
||||||
uemis_add_string(val, &dive->notes, " ");
|
uemis_add_string(val, &dive->notes, " ");
|
||||||
} else if (tag == "u8DiveSuit") {
|
} else if (tag == "u8DiveSuit") {
|
||||||
|
|
|
@ -335,10 +335,10 @@ void WSInfoDelegate::editorClosed(QWidget *, QAbstractItemDelegate::EndEditHint
|
||||||
void WSInfoDelegate::setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &) const
|
void WSInfoDelegate::setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &) const
|
||||||
{
|
{
|
||||||
WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model);
|
WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model);
|
||||||
QString weightName = currCombo.activeText;
|
std::string weightName = currCombo.activeText.toStdString();
|
||||||
weight_t weight = get_weightsystem_weight(qPrintable(weightName));
|
weight_t weight = get_weightsystem_weight(weightName.c_str());
|
||||||
|
|
||||||
mymodel->setTempWS(currCombo.currRow, weightsystem_t{ weight, copy_qstring(weightName), false });
|
mymodel->setTempWS(currCombo.currRow, weightsystem_t( weight, std::move(weightName), false ));
|
||||||
}
|
}
|
||||||
|
|
||||||
static QAbstractItemModel *createWSInfoModel(QWidget *parent)
|
static QAbstractItemModel *createWSInfoModel(QWidget *parent)
|
||||||
|
|
|
@ -356,12 +356,9 @@ void DiveComponentSelection::buttonClicked(QAbstractButton *button)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (what->weights) {
|
if (what->weights) {
|
||||||
int w;
|
|
||||||
text << tr("Weights:\n");
|
text << tr("Weights:\n");
|
||||||
for (w = 0; w < current_dive->weightsystems.nr; w++) {
|
for (auto &ws: current_dive->weightsystems)
|
||||||
weightsystem_t ws = current_dive->weightsystems.weightsystems[w];
|
text << QString::fromStdString(ws.description) << ws.weight.grams / 1000 << "kg\n";
|
||||||
text << ws.description << ws.weight.grams / 1000 << "kg\n";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (what->number)
|
if (what->number)
|
||||||
text << tr("Dive number: ") << current_dive->number << "\n";
|
text << tr("Dive number: ") << current_dive->number << "\n";
|
||||||
|
|
|
@ -562,7 +562,7 @@ QVariant TemplateLayout::getValue(QString list, QString property, const State &s
|
||||||
} else if (property == "weights") {
|
} else if (property == "weights") {
|
||||||
return formatWeights(d);
|
return formatWeights(d);
|
||||||
} else if (property == "singleWeight") {
|
} else if (property == "singleWeight") {
|
||||||
return d->weightsystems.nr <= 1;
|
return d->weightsystems.size() <= 1;
|
||||||
} else if (property == "suit") {
|
} else if (property == "suit") {
|
||||||
return d->suit;
|
return d->suit;
|
||||||
} else if (property == "cylinderList") {
|
} else if (property == "cylinderList") {
|
||||||
|
|
|
@ -1228,11 +1228,11 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
diveChanged = true;
|
diveChanged = true;
|
||||||
// not sure what we'd do if there was more than one weight system
|
// not sure what we'd do if there was more than one weight system
|
||||||
// defined - for now just ignore that case
|
// defined - for now just ignore that case
|
||||||
if (d->weightsystems.nr == 0) {
|
if (d->weightsystems.size() == 0) {
|
||||||
weightsystem_t ws = { { parseWeightToGrams(weight) } , strdup(qPrintable(tr("weight"))), false };
|
weightsystem_t ws = { { parseWeightToGrams(weight) } , tr("weight").toStdString(), false };
|
||||||
add_to_weightsystem_table(&d->weightsystems, 0, ws); // takes ownership of the string
|
add_to_weightsystem_table(&d->weightsystems, 0, std::move(ws));
|
||||||
} else if (d->weightsystems.nr == 1) {
|
} else if (d->weightsystems.size() == 1) {
|
||||||
d->weightsystems.weightsystems[0].weight.grams = parseWeightToGrams(weight);
|
d->weightsystems[0].weight.grams = parseWeightToGrams(weight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// start and end pressures
|
// start and end pressures
|
||||||
|
|
|
@ -303,7 +303,7 @@ QVariant DiveTripModelBase::diveData(const struct dive *d, int column, int role)
|
||||||
case MobileListModel::CylinderRole: return formatGetCylinder(d).join(", ");
|
case MobileListModel::CylinderRole: return formatGetCylinder(d).join(", ");
|
||||||
case MobileListModel::GetCylinderRole: return formatGetCylinder(d);
|
case MobileListModel::GetCylinderRole: return formatGetCylinder(d);
|
||||||
case MobileListModel::CylinderListRole: return formatFullCylinderList();
|
case MobileListModel::CylinderListRole: return formatFullCylinderList();
|
||||||
case MobileListModel::SingleWeightRole: return d->weightsystems.nr <= 1;
|
case MobileListModel::SingleWeightRole: return d->weightsystems.size() <= 1;
|
||||||
case MobileListModel::StartPressureRole: return formatStartPressure(d);
|
case MobileListModel::StartPressureRole: return formatStartPressure(d);
|
||||||
case MobileListModel::EndPressureRole: return formatEndPressure(d);
|
case MobileListModel::EndPressureRole: return formatEndPressure(d);
|
||||||
case MobileListModel::FirstGasRole: return formatFirstGas(d);
|
case MobileListModel::FirstGasRole: return formatFirstGas(d);
|
||||||
|
|
|
@ -12,8 +12,7 @@
|
||||||
|
|
||||||
WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
|
WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
|
||||||
d(nullptr),
|
d(nullptr),
|
||||||
tempRow(-1),
|
tempRow(-1)
|
||||||
tempWS(empty_weightsystem)
|
|
||||||
{
|
{
|
||||||
//enum Column {REMOVE, TYPE, WEIGHT};
|
//enum Column {REMOVE, TYPE, WEIGHT};
|
||||||
setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
|
setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
|
||||||
|
@ -26,11 +25,11 @@ WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
|
||||||
weightsystem_t WeightModel::weightSystemAt(const QModelIndex &index) const
|
weightsystem_t WeightModel::weightSystemAt(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
int row = index.row();
|
int row = index.row();
|
||||||
if (row < 0 || row >= d->weightsystems.nr) {
|
if (row < 0 || static_cast<size_t>(row) >= d->weightsystems.size()) {
|
||||||
qWarning("WeightModel: Accessing invalid weightsystem %d (of %d)", row, d->weightsystems.nr);
|
qWarning("WeightModel: Accessing invalid weightsystem %d (of %d)", row, static_cast<int>(d->weightsystems.size()));
|
||||||
return empty_weightsystem;
|
return weightsystem_t();
|
||||||
}
|
}
|
||||||
return d->weightsystems.weightsystems[index.row()];
|
return d->weightsystems[index.row()];
|
||||||
}
|
}
|
||||||
|
|
||||||
void WeightModel::clear()
|
void WeightModel::clear()
|
||||||
|
@ -40,7 +39,7 @@ void WeightModel::clear()
|
||||||
|
|
||||||
QVariant WeightModel::data(const QModelIndex &index, int role) const
|
QVariant WeightModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
if (!index.isValid() || index.row() >= d->weightsystems.nr)
|
if (!index.isValid() || static_cast<size_t>(index.row()) >= d->weightsystems.size())
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
weightsystem_t ws = index.row() == tempRow ? tempWS : weightSystemAt(index);
|
weightsystem_t ws = index.row() == tempRow ? tempWS : weightSystemAt(index);
|
||||||
|
@ -54,7 +53,7 @@ QVariant WeightModel::data(const QModelIndex &index, int role) const
|
||||||
case Qt::EditRole:
|
case Qt::EditRole:
|
||||||
switch (index.column()) {
|
switch (index.column()) {
|
||||||
case TYPE:
|
case TYPE:
|
||||||
return gettextFromC::tr(ws.description);
|
return gettextFromC::tr(ws.description.c_str());
|
||||||
case WEIGHT:
|
case WEIGHT:
|
||||||
return get_weight_string(ws.weight, true);
|
return get_weight_string(ws.weight, true);
|
||||||
}
|
}
|
||||||
|
@ -78,20 +77,16 @@ QVariant WeightModel::data(const QModelIndex &index, int role) const
|
||||||
// Ownership of passed in weight system will be taken. Caller must not use it any longer.
|
// Ownership of passed in weight system will be taken. Caller must not use it any longer.
|
||||||
void WeightModel::setTempWS(int row, weightsystem_t ws)
|
void WeightModel::setTempWS(int row, weightsystem_t ws)
|
||||||
{
|
{
|
||||||
if (!d || row < 0 || row >= d->weightsystems.nr) { // Sanity check: row must exist
|
if (!d || row < 0 || static_cast<size_t>(row) >= d->weightsystems.size()) // Sanity check: row must exist
|
||||||
free_weightsystem(ws);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
clearTempWS(); // Shouldn't be necessary, just in case: Reset old temporary row.
|
clearTempWS(); // Shouldn't be necessary, just in case: Reset old temporary row.
|
||||||
|
|
||||||
// It is really hard to get the editor-close-hints and setModelData calls under
|
// It is really hard to get the editor-close-hints and setModelData calls under
|
||||||
// control. Therefore, if the row is set to the already existing entry, don't
|
// control. Therefore, if the row is set to the already existing entry, don't
|
||||||
// enter temporary mode.
|
// enter temporary mode.
|
||||||
const weightsystem_t &oldWS = d->weightsystems.weightsystems[row];
|
const weightsystem_t &oldWS = d->weightsystems[row];
|
||||||
if (same_string(oldWS.description, ws.description)) {
|
if (oldWS.description != ws.description) {
|
||||||
free_weightsystem(ws);
|
|
||||||
} else {
|
|
||||||
tempRow = row;
|
tempRow = row;
|
||||||
tempWS = ws;
|
tempWS = ws;
|
||||||
|
|
||||||
|
@ -110,18 +105,18 @@ void WeightModel::clearTempWS()
|
||||||
return;
|
return;
|
||||||
int oldRow = tempRow;
|
int oldRow = tempRow;
|
||||||
tempRow = -1;
|
tempRow = -1;
|
||||||
free_weightsystem(tempWS);
|
tempWS = weightsystem_t();
|
||||||
dataChanged(index(oldRow, TYPE), index(oldRow, WEIGHT));
|
dataChanged(index(oldRow, TYPE), index(oldRow, WEIGHT));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WeightModel::commitTempWS()
|
void WeightModel::commitTempWS()
|
||||||
{
|
{
|
||||||
#ifndef SUBSURFACE_MOBILE
|
#ifndef SUBSURFACE_MOBILE
|
||||||
if (tempRow < 0 || !d || tempRow > d->weightsystems.nr)
|
if (tempRow < 0 || !d || static_cast<size_t>(tempRow) > d->weightsystems.size())
|
||||||
return;
|
return;
|
||||||
// Only submit a command if the type changed
|
// Only submit a command if the type changed
|
||||||
weightsystem_t ws = d->weightsystems.weightsystems[tempRow];
|
weightsystem_t ws = d->weightsystems[tempRow];
|
||||||
if (!same_string(ws.description, tempWS.description) || gettextFromC::tr(ws.description) != QString(tempWS.description)) {
|
if (ws.description != tempWS.description || gettextFromC::tr(ws.description.c_str()) != QString::fromStdString(tempWS.description)) {
|
||||||
int count = Command::editWeight(tempRow, tempWS, false);
|
int count = Command::editWeight(tempRow, tempWS, false);
|
||||||
emit divesEdited(count);
|
emit divesEdited(count);
|
||||||
}
|
}
|
||||||
|
@ -155,7 +150,7 @@ Qt::ItemFlags WeightModel::flags(const QModelIndex &index) const
|
||||||
|
|
||||||
int WeightModel::rowCount(const QModelIndex&) const
|
int WeightModel::rowCount(const QModelIndex&) const
|
||||||
{
|
{
|
||||||
return d ? d->weightsystems.nr : 0;
|
return d ? static_cast<int>(d->weightsystems.size()) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WeightModel::updateDive(dive *dIn)
|
void WeightModel::updateDive(dive *dIn)
|
||||||
|
|
|
@ -1021,8 +1021,8 @@ void smartrak_import(const char *file, struct divelog *log)
|
||||||
|
|
||||||
/* No DC related data */
|
/* No DC related data */
|
||||||
smtkdive->visibility = strtod((char *)col[coln(VISIBILITY)]->bind_ptr, NULL) > 25 ? 5 : lrint(strtod((char *)col[13]->bind_ptr, NULL) / 5);
|
smtkdive->visibility = strtod((char *)col[coln(VISIBILITY)]->bind_ptr, NULL) > 25 ? 5 : lrint(strtod((char *)col[13]->bind_ptr, NULL) / 5);
|
||||||
weightsystem_t ws = { {(int)lrint(strtod((char *)col[coln(WEIGHT)]->bind_ptr, NULL) * 1000)}, "", false };
|
weightsystem_t ws = { {(int)lrint(strtod((char *)col[coln(WEIGHT)]->bind_ptr, NULL) * 1000)}, std::string(), false };
|
||||||
add_cloned_weightsystem(&smtkdive->weightsystems, ws);
|
smtkdive->weightsystems.push_back(std::move(ws));
|
||||||
smtkdive->suit = strdup(get(suit_list, atoi((char *)col[coln(SUITIDX)]->bind_ptr) - 1).c_str());
|
smtkdive->suit = strdup(get(suit_list, atoi((char *)col[coln(SUITIDX)]->bind_ptr) - 1).c_str());
|
||||||
smtk_build_location(mdb_clon, (char *)col[coln(SITEIDX)]->bind_ptr, &smtkdive->dive_site, log);
|
smtk_build_location(mdb_clon, (char *)col[coln(SITEIDX)]->bind_ptr, &smtkdive->dive_site, log);
|
||||||
smtkdive->buddy = strdup(smtk_locate_buddy(mdb_clon, (char *)col[0]->bind_ptr, buddy_list).c_str());
|
smtkdive->buddy = strdup(smtk_locate_buddy(mdb_clon, (char *)col[0]->bind_ptr, buddy_list).c_str());
|
||||||
|
|
|
@ -1768,9 +1768,9 @@ struct SuitVariable : public StatsVariableTemplate<StatsVariable::Type::Discrete
|
||||||
static std::vector<QString> weightsystems(const dive *d)
|
static std::vector<QString> weightsystems(const dive *d)
|
||||||
{
|
{
|
||||||
std::vector<QString> res;
|
std::vector<QString> res;
|
||||||
res.reserve(d->weightsystems.nr);
|
res.reserve(d->weightsystems.size());
|
||||||
for (int i = 0; i < d->weightsystems.nr; ++i)
|
for (auto &ws: d->weightsystems)
|
||||||
add_to_vector_unique(res, QString(d->weightsystems.weightsystems[i].description).trimmed());
|
add_to_vector_unique(res, QString::fromStdString(ws.description).trimmed());
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue