pidgin/gtkrequest.c

changeset 20829
45e8af6abc7b
parent 20817
79a95c8d9b2c
child 21648
83ac1ce298b6
equal deleted inserted replaced
20817:79a95c8d9b2c 20829:45e8af6abc7b
27 #include "pidgin.h" 27 #include "pidgin.h"
28 28
29 #include "prefs.h" 29 #include "prefs.h"
30 #include "util.h" 30 #include "util.h"
31 31
32 #include "gtkblist.h"
33 #include "gtkimhtml.h" 32 #include "gtkimhtml.h"
34 #include "gtkimhtmltoolbar.h" 33 #include "gtkimhtmltoolbar.h"
35 #include "gtkrequest.h" 34 #include "gtkrequest.h"
36 #include "gtkutils.h" 35 #include "gtkutils.h"
37 #include "pidginstock.h" 36 #include "pidginstock.h"
949 G_CALLBACK(field_account_cb), 948 G_CALLBACK(field_account_cb),
950 purple_request_field_account_get_filter(field), 949 purple_request_field_account_get_filter(field),
951 field); 950 field);
952 951
953 return widget; 952 return widget;
954 }
955
956 static GtkWidget *
957 create_blist_field(PurpleRequestField *field)
958 {
959 GtkTreeStore *model;
960 GtkWidget *tree, *sw;
961 PurpleBlistNode *node;
962 GtkCellRenderer *rend;
963 GtkTreeViewColumn *column;
964 GtkTreeIter parent = {0, NULL, NULL, NULL}, iter;
965 PurpleRequestBlistFlags flags = field->u.blist.flags;
966 gboolean offline = !!(field->u.blist.flags & PURPLE_REQUEST_BLIST_FLAG_ALLOW_OFFLINE);
967
968 /* Create the treeview. Populate the blistnodes.
969 * Hook to signed-on, signed-off signals to update the list when account goes online/offline.
970 * Hook to buddy-signed-on/off, -status-changed signals to update the status pixbuf.
971 */
972
973 model = gtk_tree_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF);
974 node = purple_blist_get_root();
975 while (node) {
976 GdkPixbuf *status = NULL, *prpl = NULL;
977 const char *name = NULL;
978 if ((PURPLE_BLIST_NODE_IS_BUDDY(node) || PURPLE_BLIST_NODE_IS_CONTACT(node))
979 && (flags & PURPLE_REQUEST_BLIST_FLAG_BUDDY)) {
980 PurpleBuddy *buddy;
981 GtkTreeIter *p = NULL;
982 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
983 buddy = (PurpleBuddy*)node;
984 p = &parent;
985 } else {
986 buddy = purple_contact_get_priority_buddy((PurpleContact*)node);
987 parent = iter;
988 }
989 if (PURPLE_BUDDY_IS_ONLINE(buddy)) {
990 gtk_tree_store_append(model, &iter, p);
991 name = purple_buddy_get_name(buddy);
992 status = pidgin_blist_get_status_icon(node, PIDGIN_STATUS_ICON_SMALL);
993 }
994 } else if (PURPLE_BLIST_NODE_IS_CHAT(node) && (flags & PURPLE_REQUEST_BLIST_FLAG_CHAT)) {
995 gtk_tree_store_append(model, &iter, NULL);
996 name = purple_chat_get_name((PurpleChat*)node);
997 status = pidgin_blist_get_status_icon(node, PIDGIN_STATUS_ICON_SMALL);
998 }
999 if (name)
1000 gtk_tree_store_set(model, &iter,
1001 0, status,
1002 1, name,
1003 2, prpl,
1004 -1);
1005 if (prpl)
1006 gdk_pixbuf_unref(prpl);
1007 if (status)
1008 gdk_pixbuf_unref(status);
1009 node = purple_blist_node_next(node, offline);
1010 }
1011
1012 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
1013 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
1014 gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), 1);
1015 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(tree), pidgin_tree_view_search_equal_func, NULL, NULL);
1016 gtk_widget_show(tree);
1017
1018 column = gtk_tree_view_column_new();
1019 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
1020
1021 rend = gtk_cell_renderer_pixbuf_new();
1022 gtk_tree_view_column_pack_start(column, rend, FALSE);
1023 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", 0, NULL);
1024
1025 rend = gtk_cell_renderer_text_new();
1026 gtk_tree_view_column_pack_start(column, rend, TRUE);
1027 gtk_tree_view_column_set_attributes(column, rend, "markup", 1, NULL);
1028
1029 rend = gtk_cell_renderer_pixbuf_new();
1030 gtk_tree_view_column_pack_start(column, rend, FALSE);
1031 gtk_tree_view_column_set_attributes(column, rend, "pixbuf", 2, NULL);
1032
1033 sw = gtk_scrolled_window_new(NULL,NULL);
1034 gtk_widget_show(sw);
1035 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_NONE);
1036 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1037 gtk_container_add(GTK_CONTAINER(sw), tree);
1038
1039 return sw;
1040 } 953 }
1041 954
1042 static void 955 static void
1043 select_field_list_item(GtkTreeModel *model, GtkTreePath *path, 956 select_field_list_item(GtkTreeModel *model, GtkTreePath *path,
1044 GtkTreeIter *iter, gpointer data) 957 GtkTreeIter *iter, gpointer data)
1413 widget = create_list_field(field); 1326 widget = create_list_field(field);
1414 else if (type == PURPLE_REQUEST_FIELD_IMAGE) 1327 else if (type == PURPLE_REQUEST_FIELD_IMAGE)
1415 widget = create_image_field(field); 1328 widget = create_image_field(field);
1416 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) 1329 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
1417 widget = create_account_field(field); 1330 widget = create_account_field(field);
1418 else if (type == PURPLE_REQUEST_FIELD_BLIST)
1419 widget = create_blist_field(field);
1420 else 1331 else
1421 continue; 1332 continue;
1422 1333
1423 if (label) 1334 if (label)
1424 gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget); 1335 gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget);

mercurial