| 948 G_CALLBACK(field_account_cb), |
949 G_CALLBACK(field_account_cb), |
| 949 purple_request_field_account_get_filter(field), |
950 purple_request_field_account_get_filter(field), |
| 950 field); |
951 field); |
| 951 |
952 |
| 952 return widget; |
953 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; |
| 953 } |
1040 } |
| 954 |
1041 |
| 955 static void |
1042 static void |
| 956 select_field_list_item(GtkTreeModel *model, GtkTreePath *path, |
1043 select_field_list_item(GtkTreeModel *model, GtkTreePath *path, |
| 957 GtkTreeIter *iter, gpointer data) |
1044 GtkTreeIter *iter, gpointer data) |