diff src/gtknotify.c @ 11359:9480e0d0f563

[gaim-migrate @ 13581] Search results notification extended so that any column can be added. committer: Tailor Script <tailor@pidgin.im>
author Bartoz Oler <bartosz@pidgin.im>
date Sun, 28 Aug 2005 22:21:24 +0000
parents b9b9b67f6325
children c9b815aeddc1
line wrap: on
line diff
--- a/src/gtknotify.c	Sun Aug 28 22:18:08 2005 +0000
+++ b/src/gtknotify.c	Sun Aug 28 22:21:24 2005 +0000
@@ -56,12 +56,12 @@
 
 } GaimNotifySearchResultsData;
 
-enum
+typedef struct
 {
-	COLUMN_ICON,
-	COLUMN_SCREENNAME,
-	NUM_COLUMNS
-};
+	GaimNotifySearchButton *button;
+	GaimNotifySearchResultsData *data;
+
+} GaimNotifySearchResultsButtonData;
 
 static void *gaim_gtk_notify_emails(size_t count, gboolean detailed,
 									const char **subjects,
@@ -97,12 +97,17 @@
 }
 
 static void
-add_buddy_helper_cb(GtkWidget *widget, GaimNotifySearchResultsData *data)
+searchresults_callback_wrapper_cb(GtkWidget *widget, GaimNotifySearchResultsButtonData *bd)
 {
+	GaimNotifySearchResultsData *data = bd->data;
+
 	GtkTreeSelection *selection;
 	GtkTreeModel *model;
 	GtkTreeIter iter;
-	gchar *buddy;
+	GaimNotifySearchButton *button;
+	GList *row = NULL;
+	gchar *str;
+	int i;
 
 	g_return_if_fail(data != NULL);
 
@@ -110,11 +115,14 @@
 
 	if (gtk_tree_selection_get_selected(selection, &model, &iter))
 	{
-		gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
-						   COLUMN_SCREENNAME, &buddy, -1);
-		gaim_blist_request_add_buddy(data->account, buddy, NULL, NULL);
-		g_free(buddy);
+		for (i = 1; i < gtk_tree_model_get_n_columns(GTK_TREE_MODEL(model)); i++) {
+			gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, i, &str, -1);
+			row = g_list_append(row, str);
+		}
 	}
+
+	button = bd->button;
+	button->callback(gaim_account_get_connection(data->account), row);
 }
 
 static void *
@@ -426,26 +434,64 @@
 	return window;
 }
 
+static void
+gaim_gtk_notify_searchresults_new_rows(GaimConnection *gc, GaimNotifySearchResults *results,
+									   void *data_, void *user_data)
+{
+	GaimNotifySearchResultsData *data = data_;
+	GtkListStore *model = data->model;
+	GtkTreeIter iter;
+	GdkPixbuf *icon, *scaled;
+	int col_num;
+	int i, j;
+	
+	gtk_list_store_clear(data->model);
+
+	icon = gaim_gtk_create_prpl_icon(gaim_connection_get_account(gc));
+	scaled = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR);
+
+	/* +1 is for the automagically created Status column. */
+	col_num = gaim_notify_searchresults_get_columns_count(results) + 1;
+
+	for (i = 0; i < gaim_notify_searchresults_get_rows_count(results); i++) {
+		GList *row = gaim_notify_searchresults_row_get(results, i);
+
+		gtk_list_store_append(model, &iter);
+		gtk_list_store_set(model, &iter, 0, scaled, -1);
+
+		for (j = 1; j < col_num; j++) {
+			GValue v = {0, };
+			char *escaped = g_markup_escape_text(g_list_nth_data(row, j - 1), -1);
+
+			g_value_init(&v, G_TYPE_STRING);
+			g_value_set_string(&v, escaped);
+			gtk_list_store_set_value(model, &iter, j, &v);
+			g_free(escaped);
+		}
+	}
+}
+
 static void *
 gaim_gtk_notify_searchresults(GaimConnection *gc, const char *title,
 							  const char *primary, const char *secondary,
-							  const char **results, GCallback cb,
+							  GaimNotifySearchResults *results, GCallback cb,
 							  void *user_data)
 {
 	GtkWidget *window;
+	GtkWidget *treeview;
+	GtkWidget *button, *close_button;
+	GType *col_types;
+	GtkListStore *model;
+	GtkCellRenderer *renderer;
+	int col_num;
+	int i;
+	GList *buttons = NULL;
+
 	GtkWidget *vbox;
 	GtkWidget *button_area;
 	GtkWidget *label;
-	GtkWidget *close_button;
-	GtkWidget *add_button;
 	GtkWidget *sw;
-	GtkWidget *treeview;
-	GdkPixbuf *icon, *scaled;
 	GaimNotifySearchResultsData *data;
-	GtkListStore *model;
-	GtkCellRenderer *renderer;
-	GtkTreeIter iter;
-	int i;
 	char *label_text;
 	char *primary_esc, *secondary_esc;
 
@@ -483,8 +529,18 @@
 	gtk_widget_show(label);
 	g_free(label_text);
 
+	/* +1 is for the automagically created Status column. */
+	col_num = gaim_notify_searchresults_get_columns_count(results) + 1;
+
 	/* Setup the list model */
-	model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
+	col_types = g_new0(GType, col_num);
+
+	/* There always is this first column. */
+	col_types[0] = GDK_TYPE_PIXBUF;
+	for (i = 1; i < col_num; i++) {
+		col_types[i] = G_TYPE_STRING;
+	}
+	model = gtk_list_store_newv(col_num, col_types);
 
 	/* Setup the scrolled window containing the treeview */
 	sw = gtk_scrolled_window_new(NULL, NULL);
@@ -498,27 +554,25 @@
 	/* Setup the treeview */
 	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
 	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
-	gtk_widget_set_size_request(treeview, 250, 150);
+	gtk_widget_set_size_request(treeview, 500, 400);
 	gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
 								GTK_SELECTION_SINGLE);
-	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
 	gtk_container_add(GTK_CONTAINER(sw), treeview);
 	gtk_widget_show(treeview);
 
-	/* icon column */
-	renderer = gtk_cell_renderer_pixbuf_new ();
+	renderer = gtk_cell_renderer_pixbuf_new();
 	gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
-					-1, "Icon", renderer,
-					"pixbuf", COLUMN_ICON,
-					NULL);
+					-1, "", renderer, "pixbuf", 0, NULL);
 
-	/* screenname column */
-	renderer = gtk_cell_renderer_text_new();
-	gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
-					-1, "Screenname", renderer,
-					"text", COLUMN_SCREENNAME,
-					NULL);
+	for (i = 1; i < col_num; i++) {
+		renderer = gtk_cell_renderer_text_new();
 
+		gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), -1,
+				gaim_notify_searchresults_column_get_title(results, i-1),
+				renderer, "text", i, NULL);
+	}
+	
 	/* Setup the button area */
 	button_area = gtk_hbutton_box_new();
 	gtk_box_pack_start(GTK_BOX(vbox), button_area, FALSE, FALSE, 0);
@@ -526,39 +580,48 @@
 	gtk_box_set_spacing(GTK_BOX(button_area), GAIM_HIG_BORDER);
 	gtk_widget_show(button_area);
 
-	/* Add the Add button */
-	add_button = gtk_button_new_from_stock(GTK_STOCK_ADD);
-	gtk_box_pack_start(GTK_BOX(button_area), add_button, FALSE, FALSE, 0);
-	gtk_widget_show(add_button);
+	for (i = 0; i < g_list_length(results->buttons); i++) {
+		GaimNotifySearchButton *b = g_list_nth_data(results->buttons, i);
+		button = NULL;
+		switch (b->type) {
+			case GAIM_NOTIFY_BUTTON_CONTINUE:
+				button = gtk_button_new_from_stock(GTK_STOCK_GO_FORWARD);
+				break;
+			case GAIM_NOTIFY_BUTTON_ADD_BUDDY:
+				button = gtk_button_new_from_stock(GTK_STOCK_ADD);
+				break;
+			default:
+				gaim_debug_warning("gtknotify", "Incorrect button type: %d\n", b->type);
+		}
+		if (button != NULL) {
+			gtk_box_pack_start(GTK_BOX(button_area), button, FALSE, FALSE, 0);
+			gtk_widget_show(button);
+			buttons = g_list_append(buttons, button);
+		}
+	}
 
 	/* Add the Close button */
 	close_button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
 	gtk_box_pack_start(GTK_BOX(button_area), close_button, FALSE, FALSE, 0);
 	gtk_widget_show(close_button);
 
-	/* Add the buddies to the tree view */
-	icon = gaim_gtk_create_prpl_icon(gc->account);
-	scaled = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR);
-
-	for (i = 0; results[i] != NULL; i++)
-	{
-		char *escaped = g_markup_escape_text(results[i], -1);
-		gtk_list_store_append(model, &iter);
-		gtk_list_store_set(model, &iter,
-						   COLUMN_ICON, scaled,
-						   COLUMN_SCREENNAME, escaped,
-						   -1);
-		g_free(escaped);
-	}
-
 	data->account = gc->account;
 	data->model = model;
 	data->treeview = treeview;
 	data->window = window;
 
+	/* Insert rows. */
+	gaim_gtk_notify_searchresults_new_rows(gc, results, data, NULL);
+
 	/* Connect Signals */
-	g_signal_connect(G_OBJECT(add_button), "clicked",
-					 G_CALLBACK(add_buddy_helper_cb), data);
+	for (i = 0; i < g_list_length(results->buttons); i++) {
+		GaimNotifySearchResultsButtonData *bd = g_new0(GaimNotifySearchResultsButtonData, 1);
+		bd->button = g_list_nth_data(results->buttons, i);
+		bd->data = data;
+		g_signal_connect(G_OBJECT(g_list_nth_data(buttons, i)), "clicked",
+						 G_CALLBACK(searchresults_callback_wrapper_cb), bd);
+	}
+
 	g_signal_connect_swapped(G_OBJECT(close_button), "clicked",
 							 G_CALLBACK(searchresults_close_cb), data);
 
@@ -811,6 +874,7 @@
 	gaim_gtk_notify_emails,
 	gaim_gtk_notify_formatted,
 	gaim_gtk_notify_searchresults,
+	gaim_gtk_notify_searchresults_new_rows,
 	gaim_gtk_notify_userinfo,
 	gaim_gtk_notify_uri,
 	gaim_gtk_close_notify