summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--divesite.c21
-rw-r--r--divesite.h2
-rw-r--r--qt-ui/locationinformation.cpp2
3 files changed, 22 insertions, 3 deletions
diff --git a/divesite.c b/divesite.c
index 2b5c48849..96c41d1bf 100644
--- a/divesite.c
+++ b/divesite.c
@@ -1,6 +1,7 @@
/* divesite.c */
#include "divesite.h"
#include "dive.h"
+#include "divelist.h"
#include <math.h>
@@ -276,9 +277,27 @@ void clear_dive_site(struct dive_site *ds)
free_taxonomy(&ds->taxonomy);
}
-void merge_dive_sites(uint32_t* uuids, int count)
+void merge_dive_sites(uint32_t ref, uint32_t* uuids, int count)
{
+ int curr_dive, i;
+ struct dive *d;
+ for(i = 0; i < count; i++){
+ if (uuids[i] == ref)
+ continue;
+
+ for_each_dive(curr_dive, d) {
+ if (d->dive_site_uuid != uuids[i] )
+ continue;
+ d->dive_site_uuid = ref;
+ }
+ }
+ for(int i = 0; i < count; i++) {
+ if (uuids[i] == ref)
+ continue;
+ delete_dive_site(uuids[i]);
+ }
+ mark_divelist_changed(true);
}
uint32_t find_or_create_dive_site_with_name(const char *name, timestamp_t divetime)
diff --git a/divesite.h b/divesite.h
index 154788460..345b50448 100644
--- a/divesite.h
+++ b/divesite.h
@@ -66,7 +66,7 @@ void copy_dive_site(struct dive_site *orig, struct dive_site *copy);
void clear_dive_site(struct dive_site *ds);
unsigned int get_distance(degrees_t lat1, degrees_t lon1, degrees_t lat2, degrees_t lon2);
uint32_t find_or_create_dive_site_with_name(const char *name, timestamp_t divetime);
-void merge_dive_sites(uint32_t *uuids, int count);
+void merge_dive_sites(uint32_t ref, uint32_t *uuids, int count);
#define INVALID_DIVE_SITE_NAME "development use only - not a valid dive site name"
diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp
index d029dd2a1..9e2821ceb 100644
--- a/qt-ui/locationinformation.cpp
+++ b/qt-ui/locationinformation.cpp
@@ -70,7 +70,7 @@ void LocationInformationWidget::mergeSelectedDiveSites() {
Q_FOREACH(const QModelIndex& idx, selection) {
selected_dive_sites[i] = (uint32_t) idx.data(LocationInformationModel::UUID_ROLE).toInt();
}
- merge_dive_sites(selected_dive_sites, i);
+ merge_dive_sites(displayed_dive_site.uuid, selected_dive_sites, i);
free(selected_dive_sites);
}