summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c24
-rw-r--r--dive.h3
-rw-r--r--qt-ui/maintab.cpp4
3 files changed, 29 insertions, 2 deletions
diff --git a/dive.c b/dive.c
index ce04bd54e..349bc104a 100644
--- a/dive.c
+++ b/dive.c
@@ -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;
diff --git a/dive.h b/dive.h
index 60693f2a1..ef57e2964 100644
--- a/dive.h
+++ b/dive.h
@@ -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);