mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: turn dive-trip location and notes into std::string
Simpler memory management. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
2fd226964c
commit
3ee41328f9
29 changed files with 157 additions and 179 deletions
|
@ -206,7 +206,6 @@ HEADERS += \
|
||||||
core/extradata.h \
|
core/extradata.h \
|
||||||
core/git-access.h \
|
core/git-access.h \
|
||||||
core/globals.h \
|
core/globals.h \
|
||||||
core/owning_ptrs.h \
|
|
||||||
core/pref.h \
|
core/pref.h \
|
||||||
core/profile.h \
|
core/profile.h \
|
||||||
core/qthelper.h \
|
core/qthelper.h \
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include "core/divesite.h"
|
#include "core/divesite.h"
|
||||||
#include "core/trip.h"
|
#include "core/trip.h"
|
||||||
#include "core/dive.h"
|
#include "core/dive.h"
|
||||||
#include "core/owning_ptrs.h"
|
|
||||||
|
|
||||||
#include <QUndoCommand>
|
#include <QUndoCommand>
|
||||||
#include <QCoreApplication> // For Q_DECLARE_TR_FUNCTIONS
|
#include <QCoreApplication> // For Q_DECLARE_TR_FUNCTIONS
|
||||||
|
@ -106,9 +105,8 @@
|
||||||
// 1) Dive 2 was deleted with the "add dive 2" command, because that was the owner.
|
// 1) Dive 2 was deleted with the "add dive 2" command, because that was the owner.
|
||||||
// 2) Dive 1 was not deleted, because it is owned by the backend.
|
// 2) Dive 1 was not deleted, because it is owned by the backend.
|
||||||
//
|
//
|
||||||
// To take ownership of dives/trips, the OnwingDivePtr and OwningTripPtr types are used. These
|
// To take ownership of dives/trips, std::unique_ptr<>s are used.
|
||||||
// are simply derived from std::unique_ptr and therefore use well-established semantics.
|
// Expressed in C-terms: std::unique_ptr<T> is the same as T* with the following
|
||||||
// Expressed in C-terms: std::unique_ptr<T> is exactly the same as T* with the following
|
|
||||||
// twists:
|
// twists:
|
||||||
// 1) default-initialized to NULL.
|
// 1) default-initialized to NULL.
|
||||||
// 2) if it goes out of scope (local scope or containing object destroyed), it does:
|
// 2) if it goes out of scope (local scope or containing object destroyed), it does:
|
||||||
|
@ -122,8 +120,8 @@
|
||||||
// move-semantics and Qt's containers are incompatible, owing to COW semantics.
|
// move-semantics and Qt's containers are incompatible, owing to COW semantics.
|
||||||
//
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
// OwningDivePtr dPtr; // Initialize to null-state: not owning any dive.
|
// std::unique_ptr<dive> dPtr; // Initialize to null-state: not owning any dive.
|
||||||
// OwningDivePtr dPtr(dive); // Take ownership of dive (which is of type struct dive *).
|
// std::unique_ptr<dive> dPtr(dive); // Take ownership of dive (which is of type struct dive *).
|
||||||
// // If dPtr goes out of scope, the dive will be freed with free_dive().
|
// // If dPtr goes out of scope, the dive will be freed with free_dive().
|
||||||
// struct dive *d = dPtr.release(); // Give up ownership of dive. dPtr is reset to null.
|
// struct dive *d = dPtr.release(); // Give up ownership of dive. dPtr is reset to null.
|
||||||
// struct dive *d = d.get(); // Get pointer dive, but don't release ownership.
|
// struct dive *d = d.get(); // Get pointer dive, but don't release ownership.
|
||||||
|
@ -131,10 +129,10 @@
|
||||||
// dPtr.reset(); // Delete currently owned dive and reset to null.
|
// dPtr.reset(); // Delete currently owned dive and reset to null.
|
||||||
// dPtr2 = dPtr1; // Fails to compile.
|
// dPtr2 = dPtr1; // Fails to compile.
|
||||||
// dPtr2 = std::move(dPtr1); // dPtr2 takes ownership, dPtr1 is reset to null.
|
// dPtr2 = std::move(dPtr1); // dPtr2 takes ownership, dPtr1 is reset to null.
|
||||||
// OwningDivePtr fun();
|
// std::unique_ptr<dive> fun();
|
||||||
// dPtr1 = fun(); // Compiles. Simply put: the compiler knows that the result of fun() will
|
// dPtr1 = fun(); // Compiles. Simply put: the compiler knows that the result of fun() will
|
||||||
// // be trashed and therefore can be moved-from.
|
// // be trashed and therefore can be moved-from.
|
||||||
// std::vector<OwningDivePtr> v: // Define an empty vector of owning pointers.
|
// std::vector<std::unique_ptr<dive>> v: // Define an empty vector of owning pointers.
|
||||||
// v.emplace_back(dive); // Take ownership of dive and add at end of vector
|
// v.emplace_back(dive); // Take ownership of dive and add at end of vector
|
||||||
// // If the vector goes out of scope, all dives will be freed with free_dive().
|
// // If the vector goes out of scope, all dives will be freed with free_dive().
|
||||||
// v.clear(v); // Reset the vector to zero length. If the elements weren't release()d,
|
// v.clear(v); // Reset the vector to zero length. If the elements weren't release()d,
|
||||||
|
|
|
@ -25,7 +25,7 @@ static void remove_trip_from_backend(dive_trip *trip)
|
||||||
// If the trip the dive belongs to becomes empty, it is removed and added to the tripsToAdd vector.
|
// If the trip the dive belongs to becomes empty, it is removed and added to the tripsToAdd vector.
|
||||||
// It is crucial that dives are added in reverse order of deletion, so that the indices are correctly
|
// It is crucial that dives are added in reverse order of deletion, so that the indices are correctly
|
||||||
// set and that the trips are added before they are used!
|
// set and that the trips are added before they are used!
|
||||||
DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector<OwningTripPtr> &tripsToAdd)
|
DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector<std::unique_ptr<dive_trip>> &tripsToAdd)
|
||||||
{
|
{
|
||||||
// If the dive was the current dive, reset the current dive. The calling
|
// If the dive was the current dive, reset the current dive. The calling
|
||||||
// command is responsible of finding a new dive.
|
// command is responsible of finding a new dive.
|
||||||
|
@ -124,7 +124,7 @@ void processByTrip(std::vector<std::pair<dive_trip *, dive *>> &dives, Function
|
||||||
DivesAndTripsToAdd DiveListBase::removeDives(DivesAndSitesToRemove &divesAndSitesToDelete)
|
DivesAndTripsToAdd DiveListBase::removeDives(DivesAndSitesToRemove &divesAndSitesToDelete)
|
||||||
{
|
{
|
||||||
std::vector<DiveToAdd> divesToAdd;
|
std::vector<DiveToAdd> divesToAdd;
|
||||||
std::vector<OwningTripPtr> tripsToAdd;
|
std::vector<std::unique_ptr<dive_trip>> tripsToAdd;
|
||||||
std::vector<std::unique_ptr<dive_site>> sitesToAdd;
|
std::vector<std::unique_ptr<dive_site>> sitesToAdd;
|
||||||
divesToAdd.reserve(divesAndSitesToDelete.dives.size());
|
divesToAdd.reserve(divesAndSitesToDelete.dives.size());
|
||||||
sitesToAdd.reserve(divesAndSitesToDelete.sites.size());
|
sitesToAdd.reserve(divesAndSitesToDelete.sites.size());
|
||||||
|
@ -159,7 +159,7 @@ DivesAndTripsToAdd DiveListBase::removeDives(DivesAndSitesToRemove &divesAndSite
|
||||||
processByTrip(dives, [&](dive_trip *trip, const QVector<dive *> &divesInTrip) {
|
processByTrip(dives, [&](dive_trip *trip, const QVector<dive *> &divesInTrip) {
|
||||||
// Check if this trip is supposed to be deleted, by checking if it was marked as "add it".
|
// Check if this trip is supposed to be deleted, by checking if it was marked as "add it".
|
||||||
bool deleteTrip = trip &&
|
bool deleteTrip = trip &&
|
||||||
std::find_if(tripsToAdd.begin(), tripsToAdd.end(), [trip](const OwningTripPtr &ptr)
|
std::find_if(tripsToAdd.begin(), tripsToAdd.end(), [trip](const std::unique_ptr<dive_trip> &ptr)
|
||||||
{ return ptr.get() == trip; }) != tripsToAdd.end();
|
{ return ptr.get() == trip; }) != tripsToAdd.end();
|
||||||
emit diveListNotifier.divesDeleted(trip, deleteTrip, divesInTrip);
|
emit diveListNotifier.divesDeleted(trip, deleteTrip, divesInTrip);
|
||||||
});
|
});
|
||||||
|
@ -209,7 +209,7 @@ DivesAndSitesToRemove DiveListBase::addDives(DivesAndTripsToAdd &toAdd)
|
||||||
// Remember the pointers so that we can later check if a trip was newly added
|
// Remember the pointers so that we can later check if a trip was newly added
|
||||||
std::vector<dive_trip *> addedTrips;
|
std::vector<dive_trip *> addedTrips;
|
||||||
addedTrips.reserve(toAdd.trips.size());
|
addedTrips.reserve(toAdd.trips.size());
|
||||||
for (OwningTripPtr &trip: toAdd.trips) {
|
for (std::unique_ptr<dive_trip> &trip: toAdd.trips) {
|
||||||
addedTrips.push_back(trip.get());
|
addedTrips.push_back(trip.get());
|
||||||
insert_trip(trip.release(), divelog.trips.get()); // Return ownership to backend
|
insert_trip(trip.release(), divelog.trips.get()); // Return ownership to backend
|
||||||
}
|
}
|
||||||
|
@ -260,14 +260,14 @@ static void renumberDives(QVector<QPair<dive *, int>> &divesToRenumber)
|
||||||
// passed-in structure. This means that calling the function twice on the same
|
// passed-in structure. This means that calling the function twice on the same
|
||||||
// object is a no-op concerning the dive. If the old trip was deleted from the
|
// object is a no-op concerning the dive. If the old trip was deleted from the
|
||||||
// core, an owning pointer to the removed trip is returned, otherwise a null pointer.
|
// core, an owning pointer to the removed trip is returned, otherwise a null pointer.
|
||||||
static OwningTripPtr moveDiveToTrip(DiveToTrip &diveToTrip)
|
static std::unique_ptr<dive_trip> moveDiveToTrip(DiveToTrip &diveToTrip)
|
||||||
{
|
{
|
||||||
// Firstly, check if we move to the same trip and bail if this is a no-op.
|
// Firstly, check if we move to the same trip and bail if this is a no-op.
|
||||||
if (diveToTrip.trip == diveToTrip.dive->divetrip)
|
if (diveToTrip.trip == diveToTrip.dive->divetrip)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
// Remove from old trip
|
// Remove from old trip
|
||||||
OwningTripPtr res;
|
std::unique_ptr<dive_trip> res;
|
||||||
|
|
||||||
// Remove dive from trip - if this is the last dive in the trip, remove the whole trip.
|
// Remove dive from trip - if this is the last dive in the trip, remove the whole trip.
|
||||||
dive_trip *trip = unregister_dive_from_trip(diveToTrip.dive);
|
dive_trip *trip = unregister_dive_from_trip(diveToTrip.dive);
|
||||||
|
@ -298,7 +298,7 @@ static void moveDivesBetweenTrips(DivesToTrip &dives)
|
||||||
createdTrips.reserve(dives.tripsToAdd.size());
|
createdTrips.reserve(dives.tripsToAdd.size());
|
||||||
|
|
||||||
// First, bring back the trip(s)
|
// First, bring back the trip(s)
|
||||||
for (OwningTripPtr &trip: dives.tripsToAdd) {
|
for (std::unique_ptr<dive_trip> &trip: dives.tripsToAdd) {
|
||||||
dive_trip *t = trip.release(); // Give up ownership
|
dive_trip *t = trip.release(); // Give up ownership
|
||||||
createdTrips.push_back(t);
|
createdTrips.push_back(t);
|
||||||
insert_trip(t, divelog.trips.get()); // Return ownership to backend
|
insert_trip(t, divelog.trips.get()); // Return ownership to backend
|
||||||
|
@ -306,7 +306,7 @@ static void moveDivesBetweenTrips(DivesToTrip &dives)
|
||||||
dives.tripsToAdd.clear();
|
dives.tripsToAdd.clear();
|
||||||
|
|
||||||
for (DiveToTrip &dive: dives.divesToMove) {
|
for (DiveToTrip &dive: dives.divesToMove) {
|
||||||
OwningTripPtr tripToAdd = moveDiveToTrip(dive);
|
std::unique_ptr<dive_trip> tripToAdd = moveDiveToTrip(dive);
|
||||||
// register trips that we'll have to readd
|
// register trips that we'll have to readd
|
||||||
if (tripToAdd)
|
if (tripToAdd)
|
||||||
dives.tripsToAdd.push_back(std::move(tripToAdd));
|
dives.tripsToAdd.push_back(std::move(tripToAdd));
|
||||||
|
@ -350,7 +350,7 @@ static void moveDivesBetweenTrips(DivesToTrip &dives)
|
||||||
std::find_if(divesMoved.begin() + j, divesMoved.end(), // Is this the last occurence of "from"?
|
std::find_if(divesMoved.begin() + j, divesMoved.end(), // Is this the last occurence of "from"?
|
||||||
[from](const DiveMoved &entry) { return entry.from == from; }) == divesMoved.end() &&
|
[from](const DiveMoved &entry) { return entry.from == from; }) == divesMoved.end() &&
|
||||||
std::find_if(dives.tripsToAdd.begin(), dives.tripsToAdd.end(), // Is "from" in tripsToAdd?
|
std::find_if(dives.tripsToAdd.begin(), dives.tripsToAdd.end(), // Is "from" in tripsToAdd?
|
||||||
[from](const OwningTripPtr &trip) { return trip.get() == from; }) != dives.tripsToAdd.end();
|
[from](const std::unique_ptr<dive_trip> &trip) { return trip.get() == from; }) != dives.tripsToAdd.end();
|
||||||
// Check if the to-trip has to be created. For this purpose, we saved an array of trips to be created.
|
// Check if the to-trip has to be created. For this purpose, we saved an array of trips to be created.
|
||||||
bool createTo = false;
|
bool createTo = false;
|
||||||
if (to) {
|
if (to) {
|
||||||
|
@ -417,7 +417,7 @@ AddDive::AddDive(dive *d, bool autogroup, bool newNumber)
|
||||||
// on dive-addition.
|
// on dive-addition.
|
||||||
|
|
||||||
// If we alloc a new-trip for autogrouping, get an owning pointer to it.
|
// If we alloc a new-trip for autogrouping, get an owning pointer to it.
|
||||||
OwningTripPtr allocTrip;
|
std::unique_ptr<dive_trip> allocTrip;
|
||||||
dive_trip *trip = divePtr->divetrip;
|
dive_trip *trip = divePtr->divetrip;
|
||||||
dive_site *site = divePtr->dive_site;
|
dive_site *site = divePtr->dive_site;
|
||||||
// We have to delete the pointers to trip and site, because this would prevent the core from adding to the
|
// We have to delete the pointers to trip and site, because this would prevent the core from adding to the
|
||||||
|
|
|
@ -23,7 +23,7 @@ struct DiveToAdd {
|
||||||
// Multiple trips, dives and dive sites that have to be added for a command
|
// Multiple trips, dives and dive sites that have to be added for a command
|
||||||
struct DivesAndTripsToAdd {
|
struct DivesAndTripsToAdd {
|
||||||
std::vector<DiveToAdd> dives;
|
std::vector<DiveToAdd> dives;
|
||||||
std::vector<OwningTripPtr> trips;
|
std::vector<std::unique_ptr<dive_trip>> trips;
|
||||||
std::vector<std::unique_ptr<dive_site>> sites;
|
std::vector<std::unique_ptr<dive_site>> sites;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ struct DiveToTrip
|
||||||
struct DivesToTrip
|
struct DivesToTrip
|
||||||
{
|
{
|
||||||
std::vector<DiveToTrip> divesToMove; // If dive_trip is null, remove from trip
|
std::vector<DiveToTrip> divesToMove; // If dive_trip is null, remove from trip
|
||||||
std::vector<OwningTripPtr> tripsToAdd;
|
std::vector<std::unique_ptr<dive_trip>> tripsToAdd;
|
||||||
};
|
};
|
||||||
|
|
||||||
// All divelist commands derive from a common base class. It keeps track
|
// All divelist commands derive from a common base class. It keeps track
|
||||||
|
@ -58,7 +58,7 @@ struct DivesToTrip
|
||||||
class DiveListBase : public Base {
|
class DiveListBase : public Base {
|
||||||
protected:
|
protected:
|
||||||
// These are helper functions to add / remove dive from the C-core structures.
|
// These are helper functions to add / remove dive from the C-core structures.
|
||||||
DiveToAdd removeDive(struct dive *d, std::vector<OwningTripPtr> &tripsToAdd);
|
DiveToAdd removeDive(struct dive *d, std::vector<std::unique_ptr<dive_trip>> &tripsToAdd);
|
||||||
dive *addDive(DiveToAdd &d);
|
dive *addDive(DiveToAdd &d);
|
||||||
DivesAndTripsToAdd removeDives(DivesAndSitesToRemove &divesAndSitesToDelete);
|
DivesAndTripsToAdd removeDives(DivesAndSitesToRemove &divesAndSitesToDelete);
|
||||||
DivesAndSitesToRemove addDives(DivesAndTripsToAdd &toAdd);
|
DivesAndSitesToRemove addDives(DivesAndTripsToAdd &toAdd);
|
||||||
|
@ -133,7 +133,7 @@ private:
|
||||||
// For redo
|
// For redo
|
||||||
DivesAndSitesToRemove divesToDelete;
|
DivesAndSitesToRemove divesToDelete;
|
||||||
|
|
||||||
std::vector<OwningTripPtr> tripsToAdd;
|
std::vector<std::unique_ptr<dive_trip>> tripsToAdd;
|
||||||
DivesAndTripsToAdd divesToAdd;
|
DivesAndTripsToAdd divesToAdd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,13 +41,12 @@ void EditTripBase::redo()
|
||||||
// ***** Location *****
|
// ***** Location *****
|
||||||
void EditTripLocation::set(dive_trip *t, const QString &s) const
|
void EditTripLocation::set(dive_trip *t, const QString &s) const
|
||||||
{
|
{
|
||||||
free(t->location);
|
t->location = s.toStdString();
|
||||||
t->location = copy_qstring(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString EditTripLocation::data(dive_trip *t) const
|
QString EditTripLocation::data(dive_trip *t) const
|
||||||
{
|
{
|
||||||
return QString(t->location);
|
return QString::fromStdString(t->location);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString EditTripLocation::fieldName() const
|
QString EditTripLocation::fieldName() const
|
||||||
|
@ -63,13 +62,12 @@ TripField EditTripLocation::fieldId() const
|
||||||
// ***** Notes *****
|
// ***** Notes *****
|
||||||
void EditTripNotes::set(dive_trip *t, const QString &s) const
|
void EditTripNotes::set(dive_trip *t, const QString &s) const
|
||||||
{
|
{
|
||||||
free(t->notes);
|
t->notes = s.toStdString();
|
||||||
t->notes = copy_qstring(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString EditTripNotes::data(dive_trip *t) const
|
QString EditTripNotes::data(dive_trip *t) const
|
||||||
{
|
{
|
||||||
return QString(t->notes);
|
return QString::fromStdString(t->notes);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString EditTripNotes::fieldName() const
|
QString EditTripNotes::fieldName() const
|
||||||
|
|
|
@ -30,7 +30,7 @@ protected:
|
||||||
void redo() override;
|
void redo() override;
|
||||||
|
|
||||||
// Get and set functions to be overriden by sub-classes.
|
// Get and set functions to be overriden by sub-classes.
|
||||||
virtual void set(struct dive_trip *t, const QString &) const = 0;
|
virtual void set(dive_trip *t, const QString &) const = 0;
|
||||||
virtual QString data(struct dive_trip *t) const = 0;
|
virtual QString data(struct dive_trip *t) const = 0;
|
||||||
virtual QString fieldName() const = 0; // Name of the field, used to create the undo menu-entry
|
virtual QString fieldName() const = 0; // Name of the field, used to create the undo menu-entry
|
||||||
virtual TripField fieldId() const = 0;
|
virtual TripField fieldId() const = 0;
|
||||||
|
|
|
@ -131,7 +131,6 @@ set(SUBSURFACE_CORE_LIB_SRCS
|
||||||
metrics.cpp
|
metrics.cpp
|
||||||
metrics.h
|
metrics.h
|
||||||
ostctools.cpp
|
ostctools.cpp
|
||||||
owning_ptrs.h
|
|
||||||
parse-gpx.cpp
|
parse-gpx.cpp
|
||||||
parse-xml.cpp
|
parse-xml.cpp
|
||||||
parse.cpp
|
parse.cpp
|
||||||
|
|
|
@ -1752,7 +1752,7 @@ static void merge_temperatures(struct dive *res, const struct dive *a, const str
|
||||||
*/
|
*/
|
||||||
static struct dive_trip *get_preferred_trip(const struct dive *a, const struct dive *b)
|
static struct dive_trip *get_preferred_trip(const struct dive *a, const struct dive *b)
|
||||||
{
|
{
|
||||||
dive_trip_t *atrip, *btrip;
|
dive_trip *atrip, *btrip;
|
||||||
|
|
||||||
/* If only one dive has a trip, choose that */
|
/* If only one dive has a trip, choose that */
|
||||||
atrip = a->divetrip;
|
atrip = a->divetrip;
|
||||||
|
@ -1769,13 +1769,13 @@ static struct dive_trip *get_preferred_trip(const struct dive *a, const struct d
|
||||||
return atrip;
|
return atrip;
|
||||||
|
|
||||||
/* Otherwise, look at the trip data and pick the "better" one */
|
/* Otherwise, look at the trip data and pick the "better" one */
|
||||||
if (!atrip->location)
|
if (atrip->location.empty())
|
||||||
return btrip;
|
return btrip;
|
||||||
if (!btrip->location)
|
if (btrip->location.empty())
|
||||||
return atrip;
|
return atrip;
|
||||||
if (!atrip->notes)
|
if (atrip->notes.empty())
|
||||||
return btrip;
|
return btrip;
|
||||||
if (!btrip->notes)
|
if (btrip->notes.empty())
|
||||||
return atrip;
|
return atrip;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -693,7 +693,7 @@ void insert_dive(struct dive_table *table, struct dive *d)
|
||||||
static void autogroup_dives(struct dive_table *table, struct trip_table *trip_table_arg)
|
static void autogroup_dives(struct dive_table *table, struct trip_table *trip_table_arg)
|
||||||
{
|
{
|
||||||
int from, to;
|
int from, to;
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
int i, j;
|
int i, j;
|
||||||
bool alloc;
|
bool alloc;
|
||||||
|
|
||||||
|
@ -1003,10 +1003,10 @@ void add_imported_dives(struct divelog *import_log, int flags)
|
||||||
* Returns true if trip was merged. In this case, the trip will be
|
* Returns true if trip was merged. In this case, the trip will be
|
||||||
* freed.
|
* freed.
|
||||||
*/
|
*/
|
||||||
bool try_to_merge_trip(struct dive_trip *trip_import, struct dive_table *import_table, bool prefer_imported,
|
static bool try_to_merge_trip(dive_trip *trip_import, struct dive_table *import_table, bool prefer_imported,
|
||||||
/* output parameters: */
|
/* output parameters: */
|
||||||
struct dive_table *dives_to_add, struct dive_table *dives_to_remove,
|
struct dive_table *dives_to_add, struct dive_table *dives_to_remove,
|
||||||
bool *sequence_changed, int *start_renumbering_at)
|
bool *sequence_changed, int *start_renumbering_at)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dive_trip *trip_old;
|
struct dive_trip *trip_old;
|
||||||
|
@ -1066,7 +1066,7 @@ void process_imported_dives(struct divelog *import_log, int flags,
|
||||||
device_table &devices_to_add)
|
device_table &devices_to_add)
|
||||||
{
|
{
|
||||||
int i, j, nr, start_renumbering_at = 0;
|
int i, j, nr, start_renumbering_at = 0;
|
||||||
struct dive_trip *trip_import, *new_trip;
|
dive_trip *new_trip;
|
||||||
bool sequence_changed = false;
|
bool sequence_changed = false;
|
||||||
bool new_dive_has_number = false;
|
bool new_dive_has_number = false;
|
||||||
bool last_old_dive_is_numbered;
|
bool last_old_dive_is_numbered;
|
||||||
|
@ -1141,7 +1141,7 @@ void process_imported_dives(struct divelog *import_log, int flags,
|
||||||
* will be imported so do a simple n*m loop until someone complains.
|
* will be imported so do a simple n*m loop until someone complains.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < import_log->trips->nr; i++) {
|
for (i = 0; i < import_log->trips->nr; i++) {
|
||||||
trip_import = import_log->trips->trips[i];
|
dive_trip *trip_import = import_log->trips->trips[i];
|
||||||
if ((flags & IMPORT_MERGE_ALL_TRIPS) || trip_import->autogen) {
|
if ((flags & IMPORT_MERGE_ALL_TRIPS) || trip_import->autogen) {
|
||||||
if (try_to_merge_trip(trip_import, import_log->dives.get(), flags & IMPORT_PREFER_IMPORTED, dives_to_add, dives_to_remove,
|
if (try_to_merge_trip(trip_import, import_log->dives.get(), flags & IMPORT_PREFER_IMPORTED, dives_to_add, dives_to_remove,
|
||||||
&sequence_changed, &start_renumbering_at))
|
&sequence_changed, &start_renumbering_at))
|
||||||
|
|
|
@ -837,7 +837,7 @@ static bool has_locations(const filter_constraint &c, const struct dive *d)
|
||||||
{
|
{
|
||||||
QStringList diveLocations;
|
QStringList diveLocations;
|
||||||
if (d->divetrip)
|
if (d->divetrip)
|
||||||
diveLocations.push_back(QString(d->divetrip->location).trimmed());
|
diveLocations.push_back(QString::fromStdString(d->divetrip->location).trimmed());
|
||||||
|
|
||||||
if (d->dive_site)
|
if (d->dive_site)
|
||||||
diveLocations.push_back(QString::fromStdString(d->dive_site->name).trimmed());
|
diveLocations.push_back(QString::fromStdString(d->dive_site->name).trimmed());
|
||||||
|
|
|
@ -139,7 +139,7 @@ static std::vector<QString> getWords(const dive *d)
|
||||||
}
|
}
|
||||||
// TODO: We should index trips separately!
|
// TODO: We should index trips separately!
|
||||||
if (d->divetrip)
|
if (d->divetrip)
|
||||||
tokenize(d->divetrip->location, res);
|
tokenize(QString::fromStdString(d->divetrip->location), res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct git_parser_state {
|
||||||
git_repository *repo = nullptr;
|
git_repository *repo = nullptr;
|
||||||
struct divecomputer *active_dc = nullptr;
|
struct divecomputer *active_dc = nullptr;
|
||||||
std::unique_ptr<dive> active_dive;
|
std::unique_ptr<dive> active_dive;
|
||||||
dive_trip_t *active_trip = nullptr;
|
std::unique_ptr<dive_trip> active_trip;
|
||||||
std::string fulltext_mode;
|
std::string fulltext_mode;
|
||||||
std::string fulltext_query;
|
std::string fulltext_query;
|
||||||
std::string filter_constraint_type;
|
std::string filter_constraint_type;
|
||||||
|
@ -889,10 +889,10 @@ static void parse_trip_time(char *, struct git_parser_state *)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
static void parse_trip_location(char *, struct git_parser_state *state)
|
static void parse_trip_location(char *, struct git_parser_state *state)
|
||||||
{ state->active_trip->location = get_first_converted_string_c(state); }
|
{ state->active_trip->location = get_first_converted_string(state); }
|
||||||
|
|
||||||
static void parse_trip_notes(char *, struct git_parser_state *state)
|
static void parse_trip_notes(char *, struct git_parser_state *state)
|
||||||
{ state->active_trip->notes = get_first_converted_string_c(state); }
|
{ state->active_trip->notes = get_first_converted_string(state); }
|
||||||
|
|
||||||
static void parse_settings_autogroup(char *, struct git_parser_state *state)
|
static void parse_settings_autogroup(char *, struct git_parser_state *state)
|
||||||
{
|
{
|
||||||
|
@ -1381,12 +1381,10 @@ static void for_each_line(git_blob *blob, line_fn_t *fn, struct git_parser_state
|
||||||
|
|
||||||
static void finish_active_trip(struct git_parser_state *state)
|
static void finish_active_trip(struct git_parser_state *state)
|
||||||
{
|
{
|
||||||
dive_trip_t *trip = state->active_trip;
|
auto &trip = state->active_trip;
|
||||||
|
|
||||||
if (trip) {
|
if (trip)
|
||||||
state->active_trip = NULL;
|
insert_trip(trip.release(), state->log->trips.get());
|
||||||
insert_trip(trip, state->log->trips.get());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void finish_active_dive(struct git_parser_state *state)
|
static void finish_active_dive(struct git_parser_state *state)
|
||||||
|
@ -1403,7 +1401,7 @@ static void create_new_dive(timestamp_t when, struct git_parser_state *state)
|
||||||
state->active_dive->when = when;
|
state->active_dive->when = when;
|
||||||
|
|
||||||
if (state->active_trip)
|
if (state->active_trip)
|
||||||
add_dive_to_trip(state->active_dive.get(), state->active_trip);
|
add_dive_to_trip(state->active_dive.get(), state->active_trip.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool validate_date(int yyyy, int mm, int dd)
|
static bool validate_date(int yyyy, int mm, int dd)
|
||||||
|
@ -1433,7 +1431,7 @@ static int dive_trip_directory(const char *root, const char *name, struct git_pa
|
||||||
if (!validate_date(yyyy, mm, dd))
|
if (!validate_date(yyyy, mm, dd))
|
||||||
return GIT_WALK_SKIP;
|
return GIT_WALK_SKIP;
|
||||||
finish_active_trip(state);
|
finish_active_trip(state);
|
||||||
state->active_trip = alloc_trip();
|
state->active_trip = std::make_unique<dive_trip>();
|
||||||
return GIT_WALK_OK;
|
return GIT_WALK_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1785,7 +1783,7 @@ static int parse_filter_preset(struct git_parser_state *state, const git_tree_en
|
||||||
static int walk_tree_file(const char *root, const git_tree_entry *entry, struct git_parser_state *state)
|
static int walk_tree_file(const char *root, const git_tree_entry *entry, struct git_parser_state *state)
|
||||||
{
|
{
|
||||||
auto &dive = state->active_dive;
|
auto &dive = state->active_dive;
|
||||||
dive_trip_t *trip = state->active_trip;
|
auto &trip = state->active_trip;
|
||||||
const char *name = git_tree_entry_name(entry);
|
const char *name = git_tree_entry_name(entry);
|
||||||
if (verbose > 1)
|
if (verbose > 1)
|
||||||
report_info("git load handling file %s\n", name);
|
report_info("git load handling file %s\n", name);
|
||||||
|
@ -1815,7 +1813,7 @@ static int walk_tree_file(const char *root, const git_tree_entry *entry, struct
|
||||||
return parse_settings_entry(state, entry);
|
return parse_settings_entry(state, entry);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
report_error("Unknown file %s%s (%p %p)", root, name, dive.get(), trip);
|
report_error("Unknown file %s%s (%p %p)", root, name, dive.get(), trip.get());
|
||||||
return GIT_WALK_SKIP;
|
return GIT_WALK_SKIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "libdivecomputer.h"
|
#include "libdivecomputer.h"
|
||||||
#include "owning_ptrs.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fills a device_data_t structure with known dc data and a descriptor.
|
* Fills a device_data_t structure with known dc data and a descriptor.
|
||||||
|
|
|
@ -9,16 +9,4 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
struct dive_trip;
|
|
||||||
|
|
||||||
void free_trip(struct dive_trip *);
|
|
||||||
|
|
||||||
// Classes used to automatically call the appropriate free_*() function for owning pointers that go out of scope.
|
|
||||||
struct TripDeleter {
|
|
||||||
void operator()(dive_trip *t) { free_trip(t); }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Owning pointers to dive, dive_trip, dive_site and event objects.
|
|
||||||
using OwningTripPtr = std::unique_ptr<dive_trip, TripDeleter>;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1385,13 +1385,13 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf, str
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We're in the top-level trip xml. Try to convert whatever value to a trip value */
|
/* We're in the top-level trip xml. Try to convert whatever value to a trip value */
|
||||||
static void try_to_fill_trip(dive_trip_t *dive_trip, const char *name, char *buf, struct parser_state *state)
|
static void try_to_fill_trip(dive_trip *dive_trip, const char *name, char *buf, struct parser_state *state)
|
||||||
{
|
{
|
||||||
start_match("trip", name, buf);
|
start_match("trip", name, buf);
|
||||||
|
|
||||||
if (MATCH("location", utf8_string, &dive_trip->location))
|
if (MATCH("location", utf8_string_std, &dive_trip->location))
|
||||||
return;
|
return;
|
||||||
if (MATCH("notes", utf8_string, &dive_trip->notes))
|
if (MATCH("notes", utf8_string_std, &dive_trip->notes))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nonmatch("trip", name, buf);
|
nonmatch("trip", name, buf);
|
||||||
|
@ -1528,7 +1528,7 @@ static bool entry(const char *name, char *buf, struct parser_state *state)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (state->cur_trip) {
|
if (state->cur_trip) {
|
||||||
try_to_fill_trip(state->cur_trip, name, buf, state);
|
try_to_fill_trip(state->cur_trip.get(), name, buf, state);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -19,14 +19,8 @@
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
|
|
||||||
parser_state::parser_state()
|
parser_state::parser_state() = default;
|
||||||
{
|
parser_state::~parser_state() = default;
|
||||||
}
|
|
||||||
|
|
||||||
parser_state::~parser_state()
|
|
||||||
{
|
|
||||||
free_trip(cur_trip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't have an explicit dive computer,
|
* If we don't have an explicit dive computer,
|
||||||
|
@ -275,7 +269,7 @@ void dive_end(struct parser_state *state)
|
||||||
return;
|
return;
|
||||||
if (is_dive(state)) {
|
if (is_dive(state)) {
|
||||||
if (state->cur_trip)
|
if (state->cur_trip)
|
||||||
add_dive_to_trip(state->cur_dive.get(), state->cur_trip);
|
add_dive_to_trip(state->cur_dive.get(), state->cur_trip.get());
|
||||||
record_dive_to_table(state->cur_dive.release(), state->log->dives.get());
|
record_dive_to_table(state->cur_dive.release(), state->log->dives.get());
|
||||||
}
|
}
|
||||||
state->cur_dive.reset();
|
state->cur_dive.reset();
|
||||||
|
@ -289,7 +283,7 @@ void trip_start(struct parser_state *state)
|
||||||
if (state->cur_trip)
|
if (state->cur_trip)
|
||||||
return;
|
return;
|
||||||
dive_end(state);
|
dive_end(state);
|
||||||
state->cur_trip = alloc_trip();
|
state->cur_trip = std::make_unique<dive_trip>();
|
||||||
memset(&state->cur_tm, 0, sizeof(state->cur_tm));
|
memset(&state->cur_tm, 0, sizeof(state->cur_tm));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,8 +291,7 @@ void trip_end(struct parser_state *state)
|
||||||
{
|
{
|
||||||
if (!state->cur_trip)
|
if (!state->cur_trip)
|
||||||
return;
|
return;
|
||||||
insert_trip(state->cur_trip, state->log->trips.get());
|
insert_trip(state->cur_trip.release(), state->log->trips.get());
|
||||||
state->cur_trip = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void picture_start(struct parser_state *state)
|
void picture_start(struct parser_state *state)
|
||||||
|
|
|
@ -59,7 +59,7 @@ struct parser_state {
|
||||||
std::unique_ptr<dive> cur_dive; /* owning */
|
std::unique_ptr<dive> cur_dive; /* owning */
|
||||||
std::unique_ptr<dive_site> cur_dive_site; /* owning */
|
std::unique_ptr<dive_site> cur_dive_site; /* owning */
|
||||||
location_t cur_location;
|
location_t cur_location;
|
||||||
struct dive_trip *cur_trip = nullptr; /* owning */
|
std::unique_ptr<dive_trip> cur_trip; /* owning */
|
||||||
struct sample *cur_sample = nullptr; /* non-owning */
|
struct sample *cur_sample = nullptr; /* non-owning */
|
||||||
struct picture cur_picture; /* owning */
|
struct picture cur_picture; /* owning */
|
||||||
std::unique_ptr<filter_preset> cur_filter; /* owning */
|
std::unique_ptr<filter_preset> cur_filter; /* owning */
|
||||||
|
|
|
@ -706,11 +706,12 @@ static int save_one_dive(git_repository *repo, struct dir *tree, struct dive *di
|
||||||
* similar.
|
* similar.
|
||||||
*/
|
*/
|
||||||
#define MAXTRIPNAME 15
|
#define MAXTRIPNAME 15
|
||||||
static void create_trip_name(dive_trip_t *trip, struct membuffer *name, struct tm *tm)
|
static void create_trip_name(dive_trip *trip, struct membuffer *name, struct tm *tm)
|
||||||
{
|
{
|
||||||
put_format(name, "%02u-", tm->tm_mday);
|
put_format(name, "%02u-", tm->tm_mday);
|
||||||
if (trip->location) {
|
if (!trip->location.empty()) {
|
||||||
char ascii_loc[MAXTRIPNAME+1], *p = trip->location;
|
char ascii_loc[MAXTRIPNAME+1];
|
||||||
|
const char *p = trip->location.c_str();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < MAXTRIPNAME; ) {
|
for (i = 0; i < MAXTRIPNAME; ) {
|
||||||
|
@ -740,7 +741,7 @@ static void create_trip_name(dive_trip_t *trip, struct membuffer *name, struct t
|
||||||
put_string(name, "trip");
|
put_string(name, "trip");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int save_trip_description(git_repository *repo, struct dir *dir, dive_trip_t *trip, struct tm *tm)
|
static int save_trip_description(git_repository *repo, struct dir *dir, dive_trip *trip, struct tm *tm)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
git_oid blob_id;
|
git_oid blob_id;
|
||||||
|
@ -751,8 +752,8 @@ static int save_trip_description(git_repository *repo, struct dir *dir, dive_tri
|
||||||
put_format(&desc, "time %02u:%02u:%02u\n",
|
put_format(&desc, "time %02u:%02u:%02u\n",
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
|
||||||
show_utf8(&desc, "location ", trip->location, "\n");
|
show_utf8(&desc, "location ", trip->location.c_str(), "\n");
|
||||||
show_utf8(&desc, "notes ", trip->notes, "\n");
|
show_utf8(&desc, "notes ", trip->notes.c_str(), "\n");
|
||||||
|
|
||||||
ret = git_blob_create_frombuffer(&blob_id, repo, desc.buffer, desc.len);
|
ret = git_blob_create_frombuffer(&blob_id, repo, desc.buffer, desc.len);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -779,7 +780,7 @@ static void verify_shared_date(timestamp_t when, struct tm *tm)
|
||||||
#define MIN_TIMESTAMP (0)
|
#define MIN_TIMESTAMP (0)
|
||||||
#define MAX_TIMESTAMP (0x7fffffffffffffff)
|
#define MAX_TIMESTAMP (0x7fffffffffffffff)
|
||||||
|
|
||||||
static int save_one_trip(git_repository *repo, struct dir *tree, dive_trip_t *trip, struct tm *tm, bool cached_ok)
|
static int save_one_trip(git_repository *repo, struct dir *tree, dive_trip *trip, struct tm *tm, bool cached_ok)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dive *dive;
|
struct dive *dive;
|
||||||
|
@ -982,7 +983,7 @@ static int create_git_tree(git_repository *repo, struct dir *root, bool select_o
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dive *dive;
|
struct dive *dive;
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
|
|
||||||
git_storage_update_progress(translate("gettextFromC", "Start saving data"));
|
git_storage_update_progress(translate("gettextFromC", "Start saving data"));
|
||||||
save_settings(repo, root);
|
save_settings(repo, root);
|
||||||
|
@ -1104,7 +1105,7 @@ static void create_commit_message(struct membuffer *msg, bool create_empty)
|
||||||
} else if (!changes_made.empty()) {
|
} else if (!changes_made.empty()) {
|
||||||
put_format(msg, "Changes made: \n\n%s\n", changes_made.c_str());
|
put_format(msg, "Changes made: \n\n%s\n", changes_made.c_str());
|
||||||
} else if (dive) {
|
} else if (dive) {
|
||||||
dive_trip_t *trip = dive->divetrip;
|
dive_trip *trip = dive->divetrip;
|
||||||
std::string location = get_dive_location(dive);
|
std::string location = get_dive_location(dive);
|
||||||
if (location.empty())
|
if (location.empty())
|
||||||
location = "no location";
|
location = "no location";
|
||||||
|
@ -1114,8 +1115,8 @@ static void create_commit_message(struct membuffer *msg, bool create_empty)
|
||||||
nr = dive->number;
|
nr = dive->number;
|
||||||
|
|
||||||
put_format(msg, "dive %d: %s", nr, location.c_str());
|
put_format(msg, "dive %d: %s", nr, location.c_str());
|
||||||
if (trip && !empty_string(trip->location) && location != trip->location)
|
if (trip && !trip->location.empty() && location != trip->location)
|
||||||
put_format(msg, " (%s)", trip->location);
|
put_format(msg, " (%s)", trip->location.c_str());
|
||||||
put_format(msg, "\n");
|
put_format(msg, "\n");
|
||||||
for (auto &dc: dive->dcs) {
|
for (auto &dc: dive->dcs) {
|
||||||
if (!dc.model.empty()) {
|
if (!dc.model.empty()) {
|
||||||
|
|
|
@ -405,7 +405,7 @@ static void write_no_trip(struct membuffer *b, int *dive_no, bool selected_only,
|
||||||
put_format(b, "]}\n\n");
|
put_format(b, "]}\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_trip(struct membuffer *b, dive_trip_t *trip, int *dive_no, bool selected_only, const char *photos_dir, const bool list_only, char *sep)
|
static void write_trip(struct membuffer *b, dive_trip *trip, int *dive_no, bool selected_only, const char *photos_dir, const bool list_only, char *sep)
|
||||||
{
|
{
|
||||||
const struct dive *dive;
|
const struct dive *dive;
|
||||||
const char *separator = "";
|
const char *separator = "";
|
||||||
|
@ -421,7 +421,7 @@ static void write_trip(struct membuffer *b, dive_trip_t *trip, int *dive_no, boo
|
||||||
found_sel_dive = 1;
|
found_sel_dive = 1;
|
||||||
put_format(b, "%c {", *sep);
|
put_format(b, "%c {", *sep);
|
||||||
(*sep) = ',';
|
(*sep) = ',';
|
||||||
write_attribute(b, "name", trip->location, ", ");
|
write_attribute(b, "name", trip->location.c_str(), ", ");
|
||||||
put_format(b, "\"dives\":[");
|
put_format(b, "\"dives\":[");
|
||||||
}
|
}
|
||||||
put_string(b, separator);
|
put_string(b, separator);
|
||||||
|
@ -438,7 +438,7 @@ static void write_trips(struct membuffer *b, const char *photos_dir, bool select
|
||||||
{
|
{
|
||||||
int i, dive_no = 0;
|
int i, dive_no = 0;
|
||||||
const struct dive *dive;
|
const struct dive *dive;
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
char sep_ = ' ';
|
char sep_ = ' ';
|
||||||
char *sep = &sep_;
|
char *sep = &sep_;
|
||||||
|
|
||||||
|
|
|
@ -543,16 +543,16 @@ int save_dive(FILE *f, struct dive *dive, bool anonymize)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void save_trip(struct membuffer *b, dive_trip_t *trip, bool anonymize)
|
static void save_trip(struct membuffer *b, dive_trip *trip, bool anonymize)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dive *dive;
|
struct dive *dive;
|
||||||
|
|
||||||
put_format(b, "<trip");
|
put_format(b, "<trip");
|
||||||
show_date(b, trip_date(trip));
|
show_date(b, trip_date(trip));
|
||||||
show_utf8(b, trip->location, " location=\'", "\'", 1);
|
show_utf8(b, trip->location.c_str(), " location=\'", "\'", 1);
|
||||||
put_format(b, ">\n");
|
put_format(b, ">\n");
|
||||||
show_utf8(b, trip->notes, "<notes>", "</notes>\n", 0);
|
show_utf8(b, trip->notes.c_str(), "<notes>", "</notes>\n", 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Incredibly cheesy: we want to save the dives sorted, and they
|
* Incredibly cheesy: we want to save the dives sorted, and they
|
||||||
|
@ -642,7 +642,7 @@ static void save_dives_buffer(struct membuffer *b, bool select_only, bool anonym
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dive *dive;
|
struct dive *dive;
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
|
|
||||||
put_format(b, "<divelog program='subsurface' version='%d'>\n<settings>\n", DATAFORMAT_VERSION);
|
put_format(b, "<divelog program='subsurface' version='%d'>\n<settings>\n", DATAFORMAT_VERSION);
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ stats_summary calculate_stats_summary(bool selected_only)
|
||||||
int current_year = -1;
|
int current_year = -1;
|
||||||
int current_month = 0;
|
int current_month = 0;
|
||||||
int prev_month = 0, prev_year = 0;
|
int prev_month = 0, prev_year = 0;
|
||||||
dive_trip_t *trip_ptr = nullptr;
|
dive_trip *trip_ptr = nullptr;
|
||||||
|
|
||||||
stats_summary out;
|
stats_summary out;
|
||||||
|
|
||||||
|
|
|
@ -309,7 +309,7 @@ QString formatTripTitle(const dive_trip *trip)
|
||||||
|
|
||||||
QDateTime localTime = timestampToDateTime(when);
|
QDateTime localTime = timestampToDateTime(when);
|
||||||
|
|
||||||
QString prefix = !empty_string(trip->location) ? QString(trip->location) + ", " : QString();
|
QString prefix = !trip->location.empty() ? QString::fromStdString(trip->location) + ", " : QString();
|
||||||
if (getday)
|
if (getday)
|
||||||
return prefix + loc.toString(localTime, prefs.date_format);
|
return prefix + loc.toString(localTime, prefs.date_format);
|
||||||
else
|
else
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#ifdef DEBUG_TRIP
|
#ifdef DEBUG_TRIP
|
||||||
void dump_trip_list()
|
void dump_trip_list()
|
||||||
{
|
{
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
timestamp_t last_time = 0;
|
timestamp_t last_time = 0;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ void dump_trip_list()
|
||||||
printf("\n\ntrip_table OUT OF ORDER!!!\n\n\n");
|
printf("\n\ntrip_table OUT OF ORDER!!!\n\n\n");
|
||||||
printf("%s trip %d to \"%s\" on %04u-%02u-%02u %02u:%02u:%02u (%d dives - %p)\n",
|
printf("%s trip %d to \"%s\" on %04u-%02u-%02u %02u:%02u:%02u (%d dives - %p)\n",
|
||||||
trip->autogen ? "autogen " : "",
|
trip->autogen ? "autogen " : "",
|
||||||
i + 1, trip->location,
|
i + 1, trip->location.c_str(),
|
||||||
tm.tm_year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
|
tm.tm_year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||||
trip->dives.nr, trip);
|
trip->dives.nr, trip);
|
||||||
last_time = trip_date(trip);
|
last_time = trip_date(trip);
|
||||||
|
@ -33,15 +33,19 @@ void dump_trip_list()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* free resources associated with a trip structure */
|
dive_trip::dive_trip() : id(dive_getUniqID())
|
||||||
void free_trip(dive_trip_t *trip)
|
|
||||||
{
|
{
|
||||||
if (trip) {
|
}
|
||||||
free(trip->location);
|
|
||||||
free(trip->notes);
|
dive_trip::~dive_trip()
|
||||||
free(trip->dives.dives);
|
{
|
||||||
free(trip);
|
free(dives.dives);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* free resources associated with a trip structure */
|
||||||
|
void free_trip(dive_trip *trip)
|
||||||
|
{
|
||||||
|
delete trip;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Trip table functions */
|
/* Trip table functions */
|
||||||
|
@ -87,7 +91,7 @@ bool is_trip_before_after(const struct dive *dive, bool before)
|
||||||
|
|
||||||
/* Add dive to a trip. Caller is responsible for removing dive
|
/* Add dive to a trip. Caller is responsible for removing dive
|
||||||
* from trip beforehand. */
|
* from trip beforehand. */
|
||||||
void add_dive_to_trip(struct dive *dive, dive_trip_t *trip)
|
void add_dive_to_trip(struct dive *dive, dive_trip *trip)
|
||||||
{
|
{
|
||||||
if (dive->divetrip == trip)
|
if (dive->divetrip == trip)
|
||||||
return;
|
return;
|
||||||
|
@ -103,7 +107,7 @@ void add_dive_to_trip(struct dive *dive, dive_trip_t *trip)
|
||||||
*/
|
*/
|
||||||
struct dive_trip *unregister_dive_from_trip(struct dive *dive)
|
struct dive_trip *unregister_dive_from_trip(struct dive *dive)
|
||||||
{
|
{
|
||||||
dive_trip_t *trip = dive->divetrip;
|
dive_trip *trip = dive->divetrip;
|
||||||
|
|
||||||
if (!trip)
|
if (!trip)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -113,7 +117,7 @@ struct dive_trip *unregister_dive_from_trip(struct dive *dive)
|
||||||
return trip;
|
return trip;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delete_trip(dive_trip_t *trip, struct trip_table *trip_table_arg)
|
static void delete_trip(dive_trip *trip, struct trip_table *trip_table_arg)
|
||||||
{
|
{
|
||||||
remove_trip(trip, trip_table_arg);
|
remove_trip(trip, trip_table_arg);
|
||||||
free_trip(trip);
|
free_trip(trip);
|
||||||
|
@ -126,15 +130,13 @@ void remove_dive_from_trip(struct dive *dive, struct trip_table *trip_table_arg)
|
||||||
delete_trip(trip, trip_table_arg);
|
delete_trip(trip, trip_table_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
dive_trip_t *alloc_trip()
|
dive_trip *alloc_trip()
|
||||||
{
|
{
|
||||||
dive_trip_t *res = (dive_trip_t *)calloc(1, sizeof(dive_trip_t));
|
return new dive_trip;
|
||||||
res->id = dive_getUniqID();
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* insert the trip into the trip table */
|
/* insert the trip into the trip table */
|
||||||
void insert_trip(dive_trip_t *dive_trip, struct trip_table *trip_table_arg)
|
void insert_trip(struct dive_trip *dive_trip, struct trip_table *trip_table_arg)
|
||||||
{
|
{
|
||||||
int idx = trip_table_get_insertion_index(trip_table_arg, dive_trip);
|
int idx = trip_table_get_insertion_index(trip_table_arg, dive_trip);
|
||||||
add_to_trip_table(trip_table_arg, idx, dive_trip);
|
add_to_trip_table(trip_table_arg, idx, dive_trip);
|
||||||
|
@ -143,12 +145,12 @@ void insert_trip(dive_trip_t *dive_trip, struct trip_table *trip_table_arg)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
dive_trip_t *create_trip_from_dive(struct dive *dive)
|
dive_trip *create_trip_from_dive(struct dive *dive)
|
||||||
{
|
{
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
|
|
||||||
trip = alloc_trip();
|
trip = alloc_trip();
|
||||||
trip->location = copy_string(get_dive_location(dive).c_str());
|
trip->location = get_dive_location(dive);
|
||||||
|
|
||||||
return trip;
|
return trip;
|
||||||
}
|
}
|
||||||
|
@ -163,10 +165,10 @@ dive_trip_t *create_trip_from_dive(struct dive *dive)
|
||||||
* exist, allocate a new trip. The bool "*allocated" is set to true
|
* exist, allocate a new trip. The bool "*allocated" is set to true
|
||||||
* if a new trip was allocated.
|
* if a new trip was allocated.
|
||||||
*/
|
*/
|
||||||
dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated)
|
dive_trip *get_trip_for_new_dive(struct dive *new_dive, bool *allocated)
|
||||||
{
|
{
|
||||||
struct dive *d;
|
struct dive *d;
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Find dive that is within TRIP_THRESHOLD of current dive */
|
/* Find dive that is within TRIP_THRESHOLD of current dive */
|
||||||
|
@ -190,7 +192,7 @@ dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lookup of trip in main trip_table based on its id */
|
/* lookup of trip in main trip_table based on its id */
|
||||||
dive_trip_t *get_trip_by_uniq_id(int tripId)
|
dive_trip *get_trip_by_uniq_id(int tripId)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < divelog.trips->nr; i++) {
|
for (int i = 0; i < divelog.trips->nr; i++) {
|
||||||
if (divelog.trips->trips[i]->id == tripId)
|
if (divelog.trips->trips[i]->id == tripId)
|
||||||
|
@ -221,7 +223,7 @@ bool trips_overlap(const struct dive_trip *t1, const struct dive_trip *t2)
|
||||||
* manually injects the new trips. If there are no dives to be autogrouped,
|
* manually injects the new trips. If there are no dives to be autogrouped,
|
||||||
* return NULL.
|
* return NULL.
|
||||||
*/
|
*/
|
||||||
dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *from, int *to, bool *allocated)
|
dive_trip *get_dives_to_autogroup(struct dive_table *table, int start, int *from, int *to, bool *allocated)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dive *lastdive = NULL;
|
struct dive *lastdive = NULL;
|
||||||
|
@ -231,7 +233,7 @@ dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *fr
|
||||||
*/
|
*/
|
||||||
for (i = start; i < table->nr; i++) {
|
for (i = start; i < table->nr; i++) {
|
||||||
struct dive *dive = table->dives[i];
|
struct dive *dive = table->dives[i];
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
|
|
||||||
if (dive->divetrip) {
|
if (dive->divetrip) {
|
||||||
lastdive = dive;
|
lastdive = dive;
|
||||||
|
@ -265,9 +267,8 @@ dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *fr
|
||||||
if (dive->divetrip || dive->notrip ||
|
if (dive->divetrip || dive->notrip ||
|
||||||
dive->when >= lastdive->when + TRIP_THRESHOLD)
|
dive->when >= lastdive->when + TRIP_THRESHOLD)
|
||||||
break;
|
break;
|
||||||
std::string location = get_dive_location(dive);
|
if (trip->location.empty())
|
||||||
if (!location.empty() && !trip->location)
|
trip->location = get_dive_location(dive);
|
||||||
trip->location = copy_string(get_dive_location(dive).c_str());
|
|
||||||
lastdive = dive;
|
lastdive = dive;
|
||||||
}
|
}
|
||||||
return trip;
|
return trip;
|
||||||
|
@ -277,21 +278,21 @@ dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *fr
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Out of two strings, copy the string that is not empty (if any). */
|
/* Out of two strings, get the string that is not empty (if any). */
|
||||||
static char *copy_non_empty_string(const char *a, const char *b)
|
static std::string non_empty_string(const std::string &a, const std::string &b)
|
||||||
{
|
{
|
||||||
return copy_string(empty_string(b) ? a : b);
|
return b.empty() ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This combines the information of two trips, generating a
|
/* This combines the information of two trips, generating a
|
||||||
* new trip. To support undo, we have to preserve the old trips. */
|
* new trip. To support undo, we have to preserve the old trips. */
|
||||||
dive_trip_t *combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b)
|
dive_trip *combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b)
|
||||||
{
|
{
|
||||||
dive_trip_t *trip;
|
dive_trip *trip;
|
||||||
|
|
||||||
trip = alloc_trip();
|
trip = alloc_trip();
|
||||||
trip->location = copy_non_empty_string(trip_a->location, trip_b->location);
|
trip->location = non_empty_string(trip_a->location, trip_b->location);
|
||||||
trip->notes = copy_non_empty_string(trip_a->notes, trip_b->notes);
|
trip->notes = non_empty_string(trip_a->notes, trip_b->notes);
|
||||||
|
|
||||||
return trip;
|
return trip;
|
||||||
}
|
}
|
||||||
|
|
41
core/trip.h
41
core/trip.h
|
@ -4,17 +4,22 @@
|
||||||
|
|
||||||
#include "divelist.h"
|
#include "divelist.h"
|
||||||
|
|
||||||
typedef struct dive_trip
|
#include <string>
|
||||||
|
|
||||||
|
struct dive_trip
|
||||||
{
|
{
|
||||||
char *location;
|
std::string location;
|
||||||
char *notes;
|
std::string notes;
|
||||||
struct dive_table dives;
|
struct dive_table dives = {};
|
||||||
int id; /* unique ID for this trip: used to pass trips through QML. */
|
int id; /* unique ID for this trip: used to pass trips through QML. */
|
||||||
/* Used by the io-routines to mark trips that have already been written. */
|
/* Used by the io-routines to mark trips that have already been written. */
|
||||||
bool saved;
|
bool saved = false;
|
||||||
bool autogen;
|
bool autogen = false;
|
||||||
bool selected;
|
bool selected = false;
|
||||||
} dive_trip_t;
|
|
||||||
|
dive_trip();
|
||||||
|
~dive_trip();
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct trip_table {
|
typedef struct trip_table {
|
||||||
int nr, allocated;
|
int nr, allocated;
|
||||||
|
@ -23,13 +28,13 @@ typedef struct trip_table {
|
||||||
|
|
||||||
static const trip_table_t empty_trip_table = { 0, 0, (struct dive_trip **)0 };
|
static const trip_table_t empty_trip_table = { 0, 0, (struct dive_trip **)0 };
|
||||||
|
|
||||||
extern void add_dive_to_trip(struct dive *, dive_trip_t *);
|
extern void add_dive_to_trip(struct dive *, dive_trip *);
|
||||||
extern struct dive_trip *unregister_dive_from_trip(struct dive *dive);
|
extern struct dive_trip *unregister_dive_from_trip(struct dive *dive);
|
||||||
extern void remove_dive_from_trip(struct dive *dive, struct trip_table *trip_table_arg);
|
extern void remove_dive_from_trip(struct dive *dive, struct trip_table *trip_table_arg);
|
||||||
|
|
||||||
extern void insert_trip(dive_trip_t *trip, struct trip_table *trip_table_arg);
|
extern void insert_trip(dive_trip *trip, struct trip_table *trip_table_arg);
|
||||||
extern int remove_trip(const dive_trip_t *trip, struct trip_table *trip_table_arg);
|
extern int remove_trip(const dive_trip *trip, struct trip_table *trip_table_arg);
|
||||||
extern void free_trip(dive_trip_t *trip);
|
extern void free_trip(dive_trip *trip);
|
||||||
extern timestamp_t trip_date(const struct dive_trip *trip);
|
extern timestamp_t trip_date(const struct dive_trip *trip);
|
||||||
extern timestamp_t trip_enddate(const struct dive_trip *trip);
|
extern timestamp_t trip_enddate(const struct dive_trip *trip);
|
||||||
|
|
||||||
|
@ -37,14 +42,14 @@ extern bool trip_less_than(const struct dive_trip *a, const struct dive_trip *b)
|
||||||
extern int comp_trips(const struct dive_trip *a, const struct dive_trip *b);
|
extern int comp_trips(const struct dive_trip *a, const struct dive_trip *b);
|
||||||
extern void sort_trip_table(struct trip_table *table);
|
extern void sort_trip_table(struct trip_table *table);
|
||||||
|
|
||||||
extern dive_trip_t *alloc_trip();
|
extern dive_trip *alloc_trip();
|
||||||
extern dive_trip_t *create_trip_from_dive(struct dive *dive);
|
extern dive_trip *create_trip_from_dive(struct dive *dive);
|
||||||
extern dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *from, int *to, bool *allocated);
|
extern dive_trip *get_dives_to_autogroup(struct dive_table *table, int start, int *from, int *to, bool *allocated);
|
||||||
extern dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated);
|
extern dive_trip *get_trip_for_new_dive(struct dive *new_dive, bool *allocated);
|
||||||
extern dive_trip_t *get_trip_by_uniq_id(int tripId);
|
extern dive_trip *get_trip_by_uniq_id(int tripId);
|
||||||
extern bool trips_overlap(const struct dive_trip *t1, const struct dive_trip *t2);
|
extern bool trips_overlap(const struct dive_trip *t1, const struct dive_trip *t2);
|
||||||
|
|
||||||
extern dive_trip_t *combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b);
|
extern dive_trip *combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b);
|
||||||
extern bool is_trip_before_after(const struct dive *dive, bool before);
|
extern bool is_trip_before_after(const struct dive *dive, bool before);
|
||||||
extern bool trip_is_single_day(const struct dive_trip *trip);
|
extern bool trip_is_single_day(const struct dive_trip *trip);
|
||||||
extern int trip_shown_dives(const struct dive_trip *trip);
|
extern int trip_shown_dives(const struct dive_trip *trip);
|
||||||
|
|
|
@ -620,8 +620,8 @@ void DiveListView::merge_trip(const QModelIndex &a, int offset)
|
||||||
int i = a.row() + offset;
|
int i = a.row() + offset;
|
||||||
QModelIndex b = a.sibling(i, 0);
|
QModelIndex b = a.sibling(i, 0);
|
||||||
|
|
||||||
dive_trip_t *trip_a = a.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>();
|
dive_trip *trip_a = a.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>();
|
||||||
dive_trip_t *trip_b = b.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>();
|
dive_trip *trip_b = b.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>();
|
||||||
if (trip_a == trip_b || !trip_a || !trip_b)
|
if (trip_a == trip_b || !trip_a || !trip_b)
|
||||||
return;
|
return;
|
||||||
Command::mergeTrips(trip_a, trip_b);
|
Command::mergeTrips(trip_a, trip_b);
|
||||||
|
@ -666,7 +666,7 @@ void DiveListView::addToTrip(int delta)
|
||||||
struct dive *d = contextMenuIndex.data(DiveTripModelBase::DIVE_ROLE).value<struct dive *>();
|
struct dive *d = contextMenuIndex.data(DiveTripModelBase::DIVE_ROLE).value<struct dive *>();
|
||||||
int nr = selectionModel()->selectedRows().count();
|
int nr = selectionModel()->selectedRows().count();
|
||||||
QModelIndex t;
|
QModelIndex t;
|
||||||
dive_trip_t *trip = NULL;
|
dive_trip *trip = NULL;
|
||||||
|
|
||||||
// now look for the trip to add to, for this, loop over the selected dives and
|
// now look for the trip to add to, for this, loop over the selected dives and
|
||||||
// check if its sibling is a trip.
|
// check if its sibling is a trip.
|
||||||
|
@ -708,7 +708,7 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
|
||||||
// let's remember where we are
|
// let's remember where we are
|
||||||
contextMenuIndex = indexAt(event->pos());
|
contextMenuIndex = indexAt(event->pos());
|
||||||
struct dive *d = contextMenuIndex.data(DiveTripModelBase::DIVE_ROLE).value<struct dive *>();
|
struct dive *d = contextMenuIndex.data(DiveTripModelBase::DIVE_ROLE).value<struct dive *>();
|
||||||
dive_trip_t *trip = contextMenuIndex.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>();
|
dive_trip *trip = contextMenuIndex.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>();
|
||||||
QMenu popup(this);
|
QMenu popup(this);
|
||||||
if (currentLayout == DiveTripModelBase::TREE) {
|
if (currentLayout == DiveTripModelBase::TREE) {
|
||||||
// verify if there is a node that`s not expanded.
|
// verify if there is a node that`s not expanded.
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#define PROFILEWIDGET_H
|
#define PROFILEWIDGET_H
|
||||||
|
|
||||||
#include "ui_profilewidget.h"
|
#include "ui_profilewidget.h"
|
||||||
#include "core/owning_ptrs.h"
|
|
||||||
#include "core/subsurface-qt/divelistnotifier.h"
|
#include "core/subsurface-qt/divelistnotifier.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
|
@ -140,9 +140,9 @@ void TabDiveNotes::tripChanged(dive_trip *trip, TripField field)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (field.notes)
|
if (field.notes)
|
||||||
ui.notes->setText(currentTrip->notes);
|
ui.notes->setText(QString::fromStdString(currentTrip->notes));
|
||||||
if (field.location)
|
if (field.location)
|
||||||
ui.diveTripLocation->setText(currentTrip->location);
|
ui.diveTripLocation->setText(QString::fromStdString(currentTrip->location));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isHtml(const QString &s)
|
static bool isHtml(const QString &s)
|
||||||
|
@ -220,13 +220,13 @@ void TabDiveNotes::updateData(const std::vector<dive *> &, dive *currentDive, in
|
||||||
ui.editDiveSiteButton->hide();
|
ui.editDiveSiteButton->hide();
|
||||||
// rename the remaining fields and fill data from selected trip
|
// rename the remaining fields and fill data from selected trip
|
||||||
ui.LocationLabel->setText(tr("Trip location"));
|
ui.LocationLabel->setText(tr("Trip location"));
|
||||||
ui.diveTripLocation->setText(currentTrip->location);
|
ui.diveTripLocation->setText(QString::fromStdString(currentTrip->location));
|
||||||
updateTripDate(currentTrip);
|
updateTripDate(currentTrip);
|
||||||
ui.locationTags->clear();
|
ui.locationTags->clear();
|
||||||
//TODO: Fix this.
|
//TODO: Fix this.
|
||||||
//ui.location->setText(currentTrip->location);
|
//ui.location->setText(QString::fromStdSTring(currentTrip->location));
|
||||||
ui.NotesLabel->setText(tr("Trip notes"));
|
ui.NotesLabel->setText(tr("Trip notes"));
|
||||||
ui.notes->setText(currentTrip->notes);
|
ui.notes->setText(QString::fromStdString(currentTrip->notes));
|
||||||
ui.depth->setVisible(false);
|
ui.depth->setVisible(false);
|
||||||
ui.depthLabel->setVisible(false);
|
ui.depthLabel->setVisible(false);
|
||||||
ui.duration->setVisible(false);
|
ui.duration->setVisible(false);
|
||||||
|
|
|
@ -1369,17 +1369,17 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
void QMLManager::updateTripDetails(QString tripIdString, QString tripLocation, QString tripNotes)
|
void QMLManager::updateTripDetails(QString tripIdString, QString tripLocation, QString tripNotes)
|
||||||
{
|
{
|
||||||
int tripId = tripIdString.toInt();
|
int tripId = tripIdString.toInt();
|
||||||
dive_trip_t *trip = get_trip_by_uniq_id(tripId);
|
dive_trip *trip = get_trip_by_uniq_id(tripId);
|
||||||
if (!trip) {
|
if (!trip) {
|
||||||
report_info("updateTripData: cannot find trip for tripId %s", qPrintable(tripIdString));
|
report_info("updateTripData: cannot find trip for tripId %s", qPrintable(tripIdString));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
if (tripLocation != trip->location) {
|
if (tripLocation != trip->location.c_str()) {
|
||||||
changed = true;
|
changed = true;
|
||||||
Command::editTripLocation(trip, tripLocation);
|
Command::editTripLocation(trip, tripLocation);
|
||||||
}
|
}
|
||||||
if (tripNotes != trip->notes) {
|
if (tripNotes != trip->notes.c_str()) {
|
||||||
changed = true;
|
changed = true;
|
||||||
Command::editTripNotes(trip, tripNotes);
|
Command::editTripNotes(trip, tripNotes);
|
||||||
}
|
}
|
||||||
|
@ -1412,7 +1412,7 @@ void QMLManager::addTripForDive(int id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (d->divetrip) {
|
if (d->divetrip) {
|
||||||
appendTextToLog(QString("Asked to create trip for dive %1 with id %2 but it's already part of a trip with location %3.").arg(d->number).arg(id).arg(d->divetrip->location));
|
appendTextToLog(QString("Asked to create trip for dive %1 with id %2 but it's already part of a trip with location %3.").arg(d->number).arg(id).arg(d->divetrip->location.c_str()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QVector <dive *> dives;
|
QVector <dive *> dives;
|
||||||
|
|
|
@ -81,7 +81,7 @@ QString DiveTripModelBase::tripTitle(const dive_trip *trip)
|
||||||
QString numDives = tr("(%n dive(s))", "", trip->dives.nr);
|
QString numDives = tr("(%n dive(s))", "", trip->dives.nr);
|
||||||
int shown = trip_shown_dives(trip);
|
int shown = trip_shown_dives(trip);
|
||||||
QString shownDives = shown != trip->dives.nr ? QStringLiteral(" ") + tr("(%L1 shown)").arg(shown) : QString();
|
QString shownDives = shown != trip->dives.nr ? QStringLiteral(" ") + tr("(%L1 shown)").arg(shown) : QString();
|
||||||
QString title(trip->location);
|
QString title = QString::fromStdString(trip->location);
|
||||||
|
|
||||||
if (title.isEmpty()) {
|
if (title.isEmpty()) {
|
||||||
// so use the date range
|
// so use the date range
|
||||||
|
@ -110,8 +110,8 @@ QVariant DiveTripModelBase::tripData(const dive_trip *trip, int column, int role
|
||||||
case MobileListModel::TripNrDivesRole: return trip->dives.nr;
|
case MobileListModel::TripNrDivesRole: return trip->dives.nr;
|
||||||
case MobileListModel::TripShortDateRole: return tripShortDate(trip);
|
case MobileListModel::TripShortDateRole: return tripShortDate(trip);
|
||||||
case MobileListModel::TripTitleRole: return tripTitle(trip);
|
case MobileListModel::TripTitleRole: return tripTitle(trip);
|
||||||
case MobileListModel::TripLocationRole: return QString(trip->location);
|
case MobileListModel::TripLocationRole: return QString::fromStdString(trip->location);
|
||||||
case MobileListModel::TripNotesRole: return QString(trip->notes);
|
case MobileListModel::TripNotesRole: return QString::fromStdString(trip->notes);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Set the font for all trips alike
|
// Set the font for all trips alike
|
||||||
|
@ -714,7 +714,7 @@ void DiveTripModelTree::populate()
|
||||||
update_cylinder_related_info(d);
|
update_cylinder_related_info(d);
|
||||||
if (d->hidden_by_filter)
|
if (d->hidden_by_filter)
|
||||||
continue;
|
continue;
|
||||||
dive_trip_t *trip = d->divetrip;
|
dive_trip *trip = d->divetrip;
|
||||||
|
|
||||||
// If this dive doesn't have a trip, add as top-level item.
|
// If this dive doesn't have a trip, add as top-level item.
|
||||||
if (!trip) {
|
if (!trip) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue