changeset 10791:2ab4b5acc8d1

[gaim-migrate @ 12433] " When you autocomplete a screenname in a dialog box that also includes an account selector, it should also autocomplete the account. This patch implements that." --rlaager this is how I would expect things to work. I was hit by this just the other day. committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Thu, 07 Apr 2005 15:22:21 +0000
parents 35edd4d021a4
children 643f458f8414
files src/gtkdialogs.c src/gtkrequest.c src/request.h
diffstat 3 files changed, 65 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/gtkdialogs.c	Thu Apr 07 15:08:14 2005 +0000
+++ b/src/gtkdialogs.c	Thu Apr 07 15:22:21 2005 +0000
@@ -458,6 +458,7 @@
 	gaim_request_field_group_add_field(group, field);
 
 	field = gaim_request_field_account_new("account", _("_Account"), NULL);
+	gaim_request_field_set_type_hint(field, "account");
 	gaim_request_field_set_visible(field,
 		(gaim_connections_get_all() != NULL &&
 		 gaim_connections_get_all()->next != NULL));
@@ -600,6 +601,7 @@
 	gaim_request_field_group_add_field(group, field);
 
 	field = gaim_request_field_account_new("account", _("_Account"), NULL);
+	gaim_request_field_set_type_hint(field, "account");
 	gaim_request_field_set_visible(field,
 		(gaim_connections_get_all() != NULL &&
 		 gaim_connections_get_all()->next != NULL));
@@ -654,6 +656,7 @@
 	gaim_request_field_group_add_field(group, field);
 
 	field = gaim_request_field_account_new("account", _("_Account"), NULL);
+	gaim_request_field_set_type_hint(field, "account");
 	gaim_request_field_account_set_show_all(field, TRUE);
 	gaim_request_field_set_visible(field,
 		(gaim_accounts_get_all() != NULL &&
--- a/src/gtkrequest.c	Thu Apr 07 15:08:14 2005 +0000
+++ b/src/gtkrequest.c	Thu Apr 07 15:22:21 2005 +0000
@@ -673,6 +673,7 @@
 				names = g_list_append(names, ((GaimContact *)cnode)->alias);
 				names = g_list_append(names,
 					(gpointer)gaim_buddy_get_contact_alias(buddy));
+				names = g_list_append(names, buddy->account);
 #endif /* NEW_STYLE_COMPLETION */
 
 				names = g_list_append(names, buddy->name);
@@ -805,14 +806,55 @@
 }
 
 static gboolean screenname_completion_match_selected_cb(GtkEntryCompletion *completion,
-		GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) {
+		GtkTreeModel *model, GtkTreeIter *iter, gpointer *user_data) {
 
 	GValue val = { 0, };
+	GaimRequestField *screen_field = user_data[1];
+	GList *fields = screen_field->group->fields;
 
 	gtk_tree_model_get_value(model, iter, 1, &val);
-	gtk_entry_set_text(GTK_ENTRY(user_data), g_value_get_string(&val));
+	gtk_entry_set_text(GTK_ENTRY(user_data[0]), g_value_get_string(&val));
 	g_value_unset(&val);
 
+	do {
+		GaimRequestField *field = fields->data;
+
+		if (gaim_request_field_get_type(field) == GAIM_REQUEST_FIELD_ACCOUNT) {
+			const char *type_hint = gaim_request_field_get_type_hint(field);
+
+			if (type_hint != NULL && !strcmp(type_hint, "account")) {
+				/* We found the corresponding account field. */
+				GaimAccount *account;
+				GtkOptionMenu *optmenu = GTK_OPTION_MENU(field->ui_data);
+
+				gtk_tree_model_get_value(model, iter, 3, &val);
+				account = g_value_get_pointer(&val);
+				g_value_unset(&val);
+
+				/* Set the account in the request API. */
+				gaim_request_field_account_set_value(field, account);
+
+				if (optmenu != NULL) {
+					GList *items = GTK_MENU_SHELL(gtk_option_menu_get_menu(optmenu))->children;
+					guint index = 0;
+
+					do {
+						if (account == g_object_get_data(G_OBJECT(items->data), "account")) {
+							/* Set the account in the GUI. */
+
+							gtk_option_menu_set_history(GTK_OPTION_MENU(field->ui_data), index);
+							return TRUE;
+						}
+						index++;
+					} while ((items = items->next) != NULL);
+				}
+
+				return TRUE;
+			}
+		}
+
+	} while ((fields = fields->next) != NULL);
+
 	return TRUE;
 }
 #endif /* !NEW_STYLE_COMPLETION */
@@ -824,19 +866,22 @@
 	GtkListStore *store;
 	GtkTreeIter iter;
 	GtkEntryCompletion *completion;
-	GList *aliases_and_screennames, *l;
+	GList *aliases_and_screennames;
+	GList *l;
+	gpointer *data;
 
 	/* Store the displayed completion value, the screenname, and the value for comparison. */
-	store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+	store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
 
 	aliases_and_screennames = get_online_names();
 
-	/* Loop through the list three elements at a time. */
-	for (l = aliases_and_screennames; l != NULL; l = l->next->next->next)
+	/* Loop through the list four elements at a time. */
+	for (l = aliases_and_screennames; l != NULL; l = l->next->next->next->next)
 	{
 		char *contact_alias = l->data;
 		char *buddy_alias = l->next->data;
-		char *screenname = l->next->next->data;
+		GaimAccount *account = l->next->next->data;
+		char *screenname = l->next->next->next->data;
 		gboolean completion_added = FALSE;
 
 		/* There's no sense listing things like: 'xxx "xxx"'
@@ -848,6 +893,7 @@
 					0, completion_entry,
 					1, screenname,
 					2, buddy_alias,
+					3, account,
 					-1);
 			g_free(completion_entry);
 			completion_added = TRUE;
@@ -865,6 +911,7 @@
 						0, completion_entry,
 						1, screenname,
 						2, contact_alias,
+						3, account,
 						-1);
 				g_free(completion_entry);
 				completion_added = TRUE;
@@ -878,6 +925,7 @@
 					0, screenname,
 					1, screenname,
 					2, NULL,
+					3, account,
 					-1);
 		}
 	}
@@ -886,8 +934,13 @@
 
 	completion = gtk_entry_completion_new();
 	gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL);
+
+	data = g_new0(gpointer, 2);
+	data[0] = entry;
+	data[1] = field;
 	g_signal_connect(G_OBJECT(completion), "match-selected",
-		G_CALLBACK(screenname_completion_match_selected_cb), entry);
+		G_CALLBACK(screenname_completion_match_selected_cb), data);
+
 	gtk_entry_set_completion(GTK_ENTRY(entry), completion);
 	g_object_unref(completion);
 
--- a/src/request.h	Thu Apr 07 15:08:14 2005 +0000
+++ b/src/request.h	Thu Apr 07 15:22:21 2005 +0000
@@ -450,7 +450,7 @@
  * Sets the type hint for the field.
  *
  * This is optionally used by the UIs to provide such features as
- * auto-completion for type hints like "screenname."
+ * auto-completion for type hints like "account" and "screenname".
  *
  * @param field     The field.
  * @param type_hint The type hint.