| 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) |