Mercurial > pidgin
diff src/gtknotify.c @ 10439:911530134bf8
[gaim-migrate @ 11697]
sf patch #1086253, from Alex Converse
closes sf rfe #991372, from Adam Petaccia
"New Buddy Search Results Dialog," used for oscar
Also some memleak fixes from me. My bad.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 28 Dec 2004 06:24:32 +0000 |
parents | ec140184437b |
children | e6b87f7e8988 |
line wrap: on
line diff
--- a/src/gtknotify.c Mon Dec 27 21:24:20 2004 +0000 +++ b/src/gtknotify.c Tue Dec 28 06:24:32 2004 +0000 @@ -33,6 +33,7 @@ #include "gtkstock.h" #include "util.h" +#include "gtkblist.h" #include "gtkimhtml.h" #include "gtknotify.h" #include "gtkutils.h" @@ -46,6 +47,22 @@ } GaimNotifyMailData; +typedef struct +{ + GaimAccount *account; + GtkListStore *model; + GtkWidget *treeview; + GtkWidget *window; + +} GaimNotifySearchResultsData; + +enum +{ + COLUMN_ICON, + COLUMN_SCREENNAME, + NUM_COLUMNS +}; + static void *gaim_gtk_notify_emails(size_t count, gboolean detailed, const char **subjects, const char **froms, const char **tos, @@ -73,6 +90,33 @@ gaim_notify_close(GAIM_NOTIFY_FORMATTED, win); } +static void +searchresults_close_cb(GaimNotifySearchResultsData *data, GdkEvent *event, void *user_data) +{ + gaim_notify_close(GAIM_NOTIFY_SEARCHRESULTS, data); +} + +static void +add_buddy_helper_cb(GtkWidget *widget, GaimNotifySearchResultsData *data) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + gchar *buddy; + + g_return_if_fail(data != NULL); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->treeview)); + + 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); + } +} + static void * gaim_gtk_notify_message(GaimNotifyMsgType type, const char *title, const char *primary, const char *secondary, @@ -378,6 +422,140 @@ } static void * +gaim_gtk_notify_searchresults(GaimConnection *gc, const char *title, + const char *primary, const char *secondary, + const char **results, GCallback cb, + void *user_data) +{ + GtkWidget *window; + 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; + + data = g_malloc(sizeof(GaimNotifySearchResultsData)); + + /* Create the window */ + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), (title ? title :_("Search Results"))); + gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_container_set_border_width(GTK_CONTAINER(window), 12); + + g_signal_connect_swapped(G_OBJECT(window), "delete_event", + G_CALLBACK(searchresults_close_cb), data); + + /* Setup the main vbox */ + vbox = gtk_vbox_new(FALSE, 12); + gtk_container_add(GTK_CONTAINER(window), vbox); + gtk_widget_show(vbox); + + /* Setup the descriptive label */ + label_text = g_strdup_printf( + "<span weight=\"bold\" size=\"larger\">%s</span>%s%s", + (primary ? primary : ""), + (primary && secondary ? "\n" : ""), + (secondary ? secondary : "")); + label = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(label), label_text); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + g_free(label_text); + + /* Setup the list model */ + model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); + + /* Setup the scrolled window containing the treeview */ + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + GTK_SHADOW_IN); + gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); + gtk_widget_show(sw); + + /* 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_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_container_add(GTK_CONTAINER(sw), treeview); + gtk_widget_show(treeview); + + /* icon column */ + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), + -1, "Icon", renderer, + "pixbuf", COLUMN_ICON, + 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); + + /* Setup the button area */ + button_area = gtk_hbutton_box_new(); + gtk_box_pack_start(GTK_BOX(vbox), button_area, FALSE, FALSE, 0); + gtk_button_box_set_layout(GTK_BUTTON_BOX(button_area), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(button_area), 12); + 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); + + /* 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 = create_prpl_icon(gc->account); + scaled = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); + + for (i = 0; results[i] != NULL; i++) + { + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, + COLUMN_ICON, scaled, + COLUMN_SCREENNAME, results[i], + -1); + } + + data->account = gc->account; + data->model = model; + data->treeview = treeview; + data->window = window; + + /* Connect Signals */ + g_signal_connect(G_OBJECT(add_button), "clicked", + G_CALLBACK(add_buddy_helper_cb), data); + g_signal_connect_swapped(G_OBJECT(close_button), "clicked", + G_CALLBACK(searchresults_close_cb), data); + + /* Show the window */ + gtk_widget_show(window); + return data; +} + +static void * gaim_gtk_notify_userinfo(GaimConnection *gc, const char *who, const char *title, const char *primary, const char *secondary, const char *text, @@ -399,6 +577,14 @@ g_free(data->url); g_free(data); } + else if (type == GAIM_NOTIFY_SEARCHRESULTS) + { + GaimNotifySearchResultsData *data = (GaimNotifySearchResultsData *)ui_handle; + + gtk_widget_destroy(data->window); + + g_free(data); + } else gtk_widget_destroy(GTK_WIDGET(ui_handle)); } @@ -612,6 +798,7 @@ gaim_gtk_notify_email, gaim_gtk_notify_emails, gaim_gtk_notify_formatted, + gaim_gtk_notify_searchresults, gaim_gtk_notify_userinfo, gaim_gtk_notify_uri, gaim_gtk_close_notify