diff src/metadata.c @ 1429:985366bccfb8

do not allow to add keywords with the same name as siblings
author nadvornik
date Fri, 13 Mar 2009 23:19:58 +0000
parents 3019f5d3a3c7
children cf4029d10d38
line wrap: on
line diff
--- a/src/metadata.c	Fri Mar 13 16:45:21 2009 +0000
+++ b/src/metadata.c	Fri Mar 13 23:19:58 2009 +0000
@@ -765,6 +765,66 @@
 	return ret;
 }
 
+gboolean keyword_same_parent(GtkTreeModel *keyword_tree, GtkTreeIter *a, GtkTreeIter *b)
+{
+	GtkTreeIter parent_a;
+	GtkTreeIter parent_b;
+	
+	gboolean valid_pa = gtk_tree_model_iter_parent(keyword_tree, &parent_a, a);
+	gboolean valid_pb = gtk_tree_model_iter_parent(keyword_tree, &parent_b, b);
+
+	if (valid_pa && valid_pb)
+		{
+		return keyword_compare(keyword_tree, &parent_a, &parent_b) == 0;
+		}
+	else
+		{
+		return (!valid_pa && !valid_pb); /* both are toplevel */
+		}
+}
+
+gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, GtkTreeIter *sibling, const gchar *name, gboolean exclude_sibling)
+{
+	GtkTreeIter parent;
+	GtkTreeIter iter;
+	gboolean toplevel = FALSE;
+	gboolean ret;
+	gchar *casefold;
+	
+	if (parent_ptr)
+		{
+		parent = *parent_ptr;
+		}
+	else if (sibling)
+		{
+		toplevel = !gtk_tree_model_iter_parent(keyword_tree, &parent, sibling);
+		}
+	else
+		{
+		toplevel = TRUE;
+		}
+	
+	if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &iter, toplevel ? NULL : &parent)) return FALSE;
+	
+	casefold = g_utf8_casefold(name, -1);
+	ret = FALSE;
+	
+	while (TRUE)
+		{
+		if (!(exclude_sibling && sibling && keyword_compare(keyword_tree, &iter, sibling) == 0))
+			{
+			gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter);
+			ret = strcmp(casefold, iter_casefold) == 0;
+			g_free(iter_casefold);
+			}
+		if (ret) break;
+		if (!gtk_tree_model_iter_next(keyword_tree, &iter)) break;
+		}
+	g_free(casefold);
+	return ret;
+}
+
+
 void keyword_copy(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
 {