Dive site: pass dive-site pointers to merge_dive_sites()

Instead of passing uuids, pass a pointer to the dive site.
This is small step in an effort to remove uuids.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-10-23 19:40:41 +02:00 committed by Dirk Hohndel
parent f527a70831
commit 64f0902e0d
3 changed files with 14 additions and 13 deletions

View file

@ -309,26 +309,26 @@ void clear_dive_site(struct dive_site *ds)
free_taxonomy(&ds->taxonomy); free_taxonomy(&ds->taxonomy);
} }
void merge_dive_sites(uint32_t ref, uint32_t* uuids, int count) void merge_dive_sites(struct dive_site *ref, struct dive_site *dive_sites[], int count)
{ {
int curr_dive, i; int curr_dive, i;
struct dive *d; struct dive *d;
for(i = 0; i < count; i++){ for(i = 0; i < count; i++){
if (uuids[i] == ref) if (dive_sites[i] == ref)
continue; continue;
for_each_dive(curr_dive, d) { for_each_dive(curr_dive, d) {
if (d->dive_site_uuid != uuids[i] ) if (d->dive_site_uuid != dive_sites[i]->uuid )
continue; continue;
d->dive_site_uuid = ref; d->dive_site_uuid = ref->uuid;
invalidate_dive_cache(d); invalidate_dive_cache(d);
} }
} }
for(i = 0; i < count; i++) { for(i = 0; i < count; i++) {
if (uuids[i] == ref) if (dive_sites[i] == ref)
continue; continue;
delete_dive_site(get_dive_site_by_uuid(uuids[i])); delete_dive_site(dive_sites[i]);
} }
mark_divelist_changed(true); mark_divelist_changed(true);
} }

View file

@ -72,7 +72,7 @@ void merge_dive_site(struct dive_site *a, struct dive_site *b);
void clear_dive_site(struct dive_site *ds); void clear_dive_site(struct dive_site *ds);
unsigned int get_distance(const location_t *loc1, const location_t *loc2); unsigned int get_distance(const location_t *loc1, const location_t *loc2);
struct dive_site *find_or_create_dive_site_with_name(const char *name, timestamp_t divetime); struct dive_site *find_or_create_dive_site_with_name(const char *name, timestamp_t divetime);
void merge_dive_sites(uint32_t ref, uint32_t *uuids, int count); void merge_dive_sites(struct dive_site *ref, struct dive_site *dive_sites[], int count);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -80,17 +80,18 @@ void LocationInformationWidget::mergeSelectedDiveSites()
return; return;
QModelIndexList selection = ui.diveSiteListView->selectionModel()->selectedIndexes(); QModelIndexList selection = ui.diveSiteListView->selectionModel()->selectedIndexes();
uint32_t *selected_dive_sites = (uint32_t *)malloc(sizeof(uint32_t) * selection.count()); // std::vector guarantees contiguous storage and can therefore be passed to C-code
int i = 0; std::vector<struct dive_site *> selected_dive_sites;
selected_dive_sites.reserve(selection.count());
Q_FOREACH (const QModelIndex &idx, selection) { Q_FOREACH (const QModelIndex &idx, selection) {
selected_dive_sites[i] = (uint32_t)idx.data(LocationInformationModel::UUID_ROLE).toInt(); struct dive_site *ds = get_dive_site_by_uuid(idx.data(LocationInformationModel::UUID_ROLE).toUInt());
i++; if (ds)
selected_dive_sites.push_back(ds);
} }
merge_dive_sites(diveSite->uuid, selected_dive_sites, i); merge_dive_sites(diveSite, selected_dive_sites.data(), (int)selected_dive_sites.size());
LocationInformationModel::instance()->update(); LocationInformationModel::instance()->update();
QSortFilterProxyModel *m = (QSortFilterProxyModel *)ui.diveSiteListView->model(); QSortFilterProxyModel *m = (QSortFilterProxyModel *)ui.diveSiteListView->model();
m->invalidate(); m->invalidate();
free(selected_dive_sites);
} }
void LocationInformationWidget::updateLabels() void LocationInformationWidget::updateLabels()