summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-07-30 10:33:25 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-10-11 16:22:27 -0700
commit63b65a7e20615d7e049ab09ae7dc6053d705c04b (patch)
tree870e1872e70cea37eabcedaea5564721cab79ed4
parentec7d85835fb26ee9c0a9c780907441c312d7ac3f (diff)
downloadsubsurface-63b65a7e20615d7e049ab09ae7dc6053d705c04b.tar.gz
Undo: implement autogrouping of trips in DiveAdd
If the autogroup flag is set, search for appropriate trips in DiveAdd() and add the dive to this trip. If no trip exists, add a new trip. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/divelist.c32
-rw-r--r--core/divelist.h1
-rw-r--r--desktop-widgets/command.cpp4
-rw-r--r--desktop-widgets/command.h2
-rw-r--r--desktop-widgets/command_divelist.cpp25
-rw-r--r--desktop-widgets/command_divelist.h2
-rw-r--r--desktop-widgets/tab-widgets/maintab.cpp2
7 files changed, 58 insertions, 10 deletions
diff --git a/core/divelist.c b/core/divelist.c
index 08fde01ff..902bbb5ac 100644
--- a/core/divelist.c
+++ b/core/divelist.c
@@ -24,6 +24,7 @@
* void add_dive_to_trip(struct dive *dive, dive_trip_t *trip)
* dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive)
* dive_trip_t *get_dives_to_autogroup(int start, int *from, int *to, bool *allocated)
+ * dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated)
* void autogroup_dives(void)
* void combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b)
* dive_trip_t *combine_trips_create(struct dive_trip *trip_a, struct dive_trip *trip_b)
@@ -926,6 +927,37 @@ dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive)
}
/*
+ * Find a trip a new dive should be autogrouped with. If no such trips
+ * exist, allocate a new trip. The bool "*allocated" is set to true
+ * if a new trip was allocated.
+ */
+dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated)
+{
+ struct dive *d;
+ dive_trip_t *trip;
+ int i;
+
+ /* Find dive that is within TRIP_THRESHOLD of current dive */
+ for_each_dive(i, d) {
+ /* Check if we're past the range of possible dives */
+ if (d->when >= new_dive->when + TRIP_THRESHOLD)
+ break;
+
+ if (d->when + TRIP_THRESHOLD >= new_dive->when && d->divetrip) {
+ /* Found a dive with trip in the range */
+ *allocated = false;
+ return d->divetrip;
+ }
+ }
+
+ /* Didn't find a trip -> allocate a new one */
+ trip = create_trip_from_dive(new_dive);
+ trip->autogen = true;
+ *allocated = true;
+ return trip;
+}
+
+/*
* Collect dives for auto-grouping. Pass in first dive which should be checked.
* Returns range of dives that should be autogrouped and trip it should be
* associated to. If the returned trip was newly allocated, the last bool
diff --git a/core/divelist.h b/core/divelist.h
index 8bcf9f55c..9449e36e2 100644
--- a/core/divelist.h
+++ b/core/divelist.h
@@ -32,6 +32,7 @@ extern dive_trip_t *alloc_trip(void);
extern dive_trip_t *create_trip_from_dive(struct dive *dive);
extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive);
extern dive_trip_t *get_dives_to_autogroup(int start, int *from, int *to, bool *allocated);
+extern dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated);
extern void autogroup_dives(void);
extern struct dive *merge_two_dives(struct dive *a, struct dive *b);
extern bool consecutive_selected();
diff --git a/desktop-widgets/command.cpp b/desktop-widgets/command.cpp
index a86b1fe76..fe16f1898 100644
--- a/desktop-widgets/command.cpp
+++ b/desktop-widgets/command.cpp
@@ -6,9 +6,9 @@
namespace Command {
// Dive-list related commands
-void addDive(dive *d)
+void addDive(dive *d, bool autogroup)
{
- execute(new AddDive(d));
+ execute(new AddDive(d, autogroup));
}
void deleteDive(const QVector<struct dive*> &divesToDelete)
diff --git a/desktop-widgets/command.h b/desktop-widgets/command.h
index 213d8bcda..924365806 100644
--- a/desktop-widgets/command.h
+++ b/desktop-widgets/command.h
@@ -15,7 +15,7 @@ QAction *undoAction(QObject *parent); // Create an undo action.
QAction *redoAction(QObject *parent); // Create an redo action.
// Dive-list related commands
-void addDive(dive *d);
+void addDive(dive *d, bool autogroup);
void deleteDive(const QVector<struct dive*> &divesToDelete);
void shiftTime(const QVector<dive *> &changedDives, int amount);
void renumberDives(const QVector<QPair<int, int>> &divesToRenumber);
diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp
index bca6967e6..732932de3 100644
--- a/desktop-widgets/command_divelist.cpp
+++ b/desktop-widgets/command_divelist.cpp
@@ -289,16 +289,31 @@ static void moveDivesBetweenTrips(DivesToTrip &dives)
std::reverse(dives.divesToMove.begin(), dives.divesToMove.end());
}
-AddDive::AddDive(dive *d)
+AddDive::AddDive(dive *d, bool autogroup)
{
setText(tr("add dive"));
d->maxdepth.mm = 0;
fixup_dive(d);
- d->divetrip = nullptr; // TODO: consider autogroup == true
- int idx = dive_get_insertion_index(d);
- d->number = get_dive_nr_at_idx(idx);
+ d->divetrip = nullptr;
+
+ // Get an owning pointer to a copy of the dive
+ // Note: this destroys the old dive!
+ OwningDivePtr divePtr(clone_dive(d));
+
+ // If we alloc a new-trip for autogrouping, get an owning pointer to it.
+ OwningTripPtr allocTrip;
+ dive_trip *trip = nullptr;
+ if (autogroup) {
+ bool alloc;
+ trip = get_trip_for_new_dive(divePtr.get(), &alloc);
+ if (alloc)
+ allocTrip.reset(trip);
+ }
+
+ int idx = dive_get_insertion_index(divePtr.get());
+ divePtr->number = get_dive_nr_at_idx(idx);
- divesToAdd.push_back({ OwningDivePtr(clone_dive(d)), nullptr, d->divetrip, idx });
+ divesToAdd.push_back({ std::move(divePtr), std::move(allocTrip), trip, idx });
}
bool AddDive::workToBeDone()
diff --git a/desktop-widgets/command_divelist.h b/desktop-widgets/command_divelist.h
index e09d3bdc6..69824ce9f 100644
--- a/desktop-widgets/command_divelist.h
+++ b/desktop-widgets/command_divelist.h
@@ -40,7 +40,7 @@ struct DivesToTrip
class AddDive : public Base {
public:
- AddDive(dive *dive);
+ AddDive(dive *dive, bool autogroup);
private:
void undo() override;
void redo() override;
diff --git a/desktop-widgets/tab-widgets/maintab.cpp b/desktop-widgets/tab-widgets/maintab.cpp
index 1f4fbc518..5f740b969 100644
--- a/desktop-widgets/tab-widgets/maintab.cpp
+++ b/desktop-widgets/tab-widgets/maintab.cpp
@@ -799,7 +799,7 @@ void MainTab::acceptChanges()
updateDiveSite(ui.location->currDiveSiteUuid(), &displayed_dive);
copyTagsToDisplayedDive();
- Command::addDive(&displayed_dive);
+ Command::addDive(&displayed_dive, autogroup);
editMode = NONE;
MainWindow::instance()->exitEditState();