diff src/request.c @ 7909:5be22af4ebfc

[gaim-migrate @ 8569] Reworked the list field API a bit. Items now have data associated with them (which is not automatically freed by the API). committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sun, 21 Dec 2003 20:51:05 +0000
parents 1d0bc32f8038
children cc77bd88cd72
line wrap: on
line diff
--- a/src/request.c	Sun Dec 21 19:58:11 2003 +0000
+++ b/src/request.c	Sun Dec 21 20:51:05 2003 +0000
@@ -299,6 +299,8 @@
 			g_list_foreach(field->u.list.selected, (GFunc)g_free, NULL);
 			g_list_free(field->u.list.selected);
 		}
+
+		g_hash_table_destroy(field->u.list.item_data);
 	}
 
 	g_free(field);
@@ -649,37 +651,22 @@
 }
 
 GaimRequestField *
-gaim_request_field_list_new(const char *id, const char *text, GList *items)
+gaim_request_field_list_new(const char *id, const char *text)
 {
 	GaimRequestField *field;
 
-	g_return_val_if_fail(id    != NULL, NULL);
-	g_return_val_if_fail(items != NULL, NULL);
+	g_return_val_if_fail(id   != NULL, NULL);
+	g_return_val_if_fail(text != NULL, NULL);
 
 	field = gaim_request_field_new(id, text, GAIM_REQUEST_FIELD_LIST);
 
-	gaim_request_field_list_set_items(field, items);
+	field->u.list.item_data = g_hash_table_new_full(g_str_hash, g_str_equal,
+													g_free, NULL);
 
 	return field;
 }
 
 void
-gaim_request_field_list_set_items(GaimRequestField *field, GList *items)
-{
-	g_return_if_fail(field != NULL);
-	g_return_if_fail(items != NULL);
-	g_return_if_fail(field->type == GAIM_REQUEST_FIELD_LIST);
-
-	if (field->u.list.items != NULL)
-	{
-		g_list_foreach(field->u.list.items, (GFunc)g_free, NULL);
-		g_list_free(field->u.list.items);
-	}
-
-	field->u.list.items = items;
-}
-
-void
 gaim_request_field_list_set_multi_select(GaimRequestField *field,
 										 gboolean multi_select)
 {
@@ -698,14 +685,29 @@
 	return field->u.list.multiple_selection;
 }
 
+void *
+gaim_request_field_list_get_data(const GaimRequestField *field,
+								 const char *text)
+{
+	g_return_val_if_fail(field != NULL, NULL);
+	g_return_val_if_fail(text  != NULL, NULL);
+	g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_LIST, NULL);
+
+	return g_hash_table_lookup(field->u.list.item_data, text);
+}
+
 void
-gaim_request_field_list_add(GaimRequestField *field, const char *item)
+gaim_request_field_list_add(GaimRequestField *field, const char *item,
+							void *data)
 {
 	g_return_if_fail(field != NULL);
 	g_return_if_fail(item  != NULL);
+	g_return_if_fail(data  != NULL);
 	g_return_if_fail(field->type == GAIM_REQUEST_FIELD_LIST);
 
 	field->u.list.items = g_list_append(field->u.list.items, g_strdup(item));
+
+	g_hash_table_insert(field->u.list.item_data, g_strdup(item), data);
 }
 
 void
@@ -715,8 +717,8 @@
 	g_return_if_fail(item  != NULL);
 	g_return_if_fail(field->type == GAIM_REQUEST_FIELD_LIST);
 
-	field->u.list.selected =
-		g_list_append(field->u.list.selected, g_strdup(item));
+	field->u.list.selected = g_list_append(field->u.list.selected,
+										   g_strdup(item));
 }
 
 void
@@ -725,7 +727,17 @@
 	g_return_if_fail(field != NULL);
 	g_return_if_fail(field->type == GAIM_REQUEST_FIELD_LIST);
 
-	gaim_request_field_list_set_selected(field, NULL);
+	if (field->u.list.items != NULL)
+	{
+		g_list_foreach(field->u.list.items, (GFunc)g_free, NULL);
+		g_list_free(field->u.list.items);
+		field->u.list.items = NULL;
+	}
+
+	g_hash_table_destroy(field->u.list.item_data);
+
+	field->u.list.item_data = g_hash_table_new_full(g_str_hash, g_str_equal,
+													g_free, NULL);
 }
 
 void
@@ -739,6 +751,7 @@
 	{
 		g_list_foreach(field->u.list.selected, (GFunc)g_free, NULL);
 		g_list_free(field->u.list.selected);
+		field->u.list.selected = NULL;
 	}
 
 	field->u.list.selected = items;