diff options
-rw-r--r-- | dive.c | 24 | ||||
-rw-r--r-- | dive.h | 3 | ||||
-rw-r--r-- | qt-ui/maintab.cpp | 4 |
3 files changed, 29 insertions, 2 deletions
@@ -2089,6 +2089,30 @@ static void join_dive_computers(struct divecomputer *res, struct divecomputer *a remove_redundant_dc(res, prefer_downloaded); } +static bool tag_seen_before(struct tag_entry *start, struct tag_entry *before) +{ + while(start && start != before) { + if (same_string(start->tag->name, before->tag->name)) + return true; + start = start->next; + } + return false; +} + +/* remove duplicates and empty nodes */ +void taglist_cleanup(struct tag_entry **tag_list) +{ + struct tag_entry **tl = tag_list; + while (*tl) { + /* skip tags that are empty or that we have seen before */ + if (same_string((*tl)->tag->name, "") || tag_seen_before(*tag_list, *tl)) { + *tl = (*tl)->next; + continue; + } + tl = &(*tl)->next; + } +} + int taglist_get_tagstring(struct tag_entry *tag_list, char *buffer, int len) { int i = 0; @@ -197,6 +197,9 @@ struct divetag *taglist_add_tag(struct tag_entry **tag_list, const char *tag); */ int taglist_get_tagstring(struct tag_entry *tag_list, char *buffer, int len); +/* cleans up a list: removes empty tags and duplicates */ +void taglist_cleanup(struct tag_entry **tag_list); + void taglist_init_global(); void taglist_free(struct tag_entry *tag_list); diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index f84c63ec2..6fc4db8df 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -934,9 +934,9 @@ void MainTab::on_timeEdit_timeChanged(const QTime &time) void MainTab::saveTags() { struct dive *cd = current_dive; - Q_FOREACH(const QString& tag, ui.tagWidget->getBlockStringList()){ + Q_FOREACH (const QString& tag, ui.tagWidget->getBlockStringList()) taglist_add_tag(&displayed_dive.tag_list, tag.toUtf8().data()); - } + taglist_cleanup(&displayed_dive.tag_list); MODIFY_SELECTED_DIVES( QString tag; taglist_free(mydive->tag_list); |