Only update tags in the selected dives if they were changed

If current_dive and displayed_dive still have the same tags then we
shouldn't touch the tags of other selected dives.

Fixes #826

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2015-02-10 06:31:37 -08:00
parent d60a620193
commit 585d6a004b
3 changed files with 22 additions and 0 deletions

18
dive.c
View file

@ -2618,6 +2618,24 @@ bool taglist_contains(struct tag_entry *tag_list, const char *tag)
return false;
}
// check if all tags in subtl are included in supertl (so subtl is a subset of supertl)
static bool taglist_contains_all(struct tag_entry *subtl, struct tag_entry *supertl)
{
while (subtl) {
if (!taglist_contains(supertl, subtl->tag->name))
return false;
subtl = subtl->next;
}
return true;
}
// if tl1 is both a subset and superset of tl2 they must be the same
bool taglist_equal(struct tag_entry *tl1, struct tag_entry *tl2)
{
return taglist_contains_all(tl1, tl2) && taglist_contains_all(tl2, tl1);
}
// count the dives where the tag list contains the given tag
int count_dives_with_tag(const char *tag)
{

1
dive.h
View file

@ -238,6 +238,7 @@ void taglist_init_global();
void taglist_free(struct tag_entry *tag_list);
bool taglist_contains(struct tag_entry *tag_list, const char *tag);
bool taglist_equal(struct tag_entry *tl1, struct tag_entry *tl2);
int count_dives_with_tag(const char *tag);
int count_dives_with_person(const char *person);
int count_dives_with_location(const char *location);

View file

@ -1099,6 +1099,9 @@ void MainTab::saveTags()
Q_FOREACH (const QString& tag, ui.tagWidget->getBlockStringList())
taglist_add_tag(&displayed_dive.tag_list, tag.toUtf8().data());
taglist_cleanup(&displayed_dive.tag_list);
// we need to check if the tags were changed before just overwriting them
if (taglist_equal(displayed_dive.tag_list, cd->tag_list))
return;
MODIFY_SELECTED_DIVES(
QString tag;
taglist_free(mydive->tag_list);