Mercurial > pidgin
comparison src/buddy.c @ 4702:cb5b23dfd82b
[gaim-migrate @ 5013]
Started on buddy list drag-n-drop. This will be useful mostly for editing the buddy list
but I decided to sleep before doing that. You can drag a buddy into a conversation window
now, though. Which is cool. But, even that's not complete yet. I'll have fun tomorrow.
committer: Tailor Script <tailor@pidgin.im>
| author | Sean Egan <seanegan@gmail.com> |
|---|---|
| date | Tue, 11 Mar 2003 07:57:53 +0000 |
| parents | ac7ca2bd6d4f |
| children | 56c70997fe5c |
comparison
equal
deleted
inserted
replaced
| 4701:ac7ca2bd6d4f | 4702:cb5b23dfd82b |
|---|---|
| 176 GaimBlistNode *node; | 176 GaimBlistNode *node; |
| 177 GValue val = { 0, }; | 177 GValue val = { 0, }; |
| 178 GtkTreeIter iter; | 178 GtkTreeIter iter; |
| 179 GtkWidget *menu, *menuitem; | 179 GtkWidget *menu, *menuitem; |
| 180 GtkWidget *image; | 180 GtkWidget *image; |
| 181 GtkTreeSelection *sel; | |
| 181 GList *list; | 182 GList *list; |
| 182 struct prpl *prpl; | 183 struct prpl *prpl; |
| 183 | 184 |
| 184 if (event->button != 3) | 185 if (event->button != 3) |
| 185 return FALSE; | 186 return FALSE; |
| 230 | 231 |
| 231 gtk_widget_show_all(menu); | 232 gtk_widget_show_all(menu); |
| 232 | 233 |
| 233 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); | 234 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); |
| 234 | 235 |
| 235 return FALSE; | 236 #if (1) /* This code only exists because GTK doesn't work. If we return FALSE here, as would be normal |
| 237 * the event propoagates down and somehow gets interpreted as the start of a drag event. */ | |
| 238 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
| 239 gtk_tree_selection_select_path(sel, path); | |
| 240 return TRUE; | |
| 241 #endif | |
| 236 } | 242 } |
| 237 | 243 |
| 238 static void gaim_gtk_blist_reordered_cb(GtkTreeModel *model, | 244 static void gaim_gtk_blist_reordered_cb(GtkTreeModel *model, |
| 239 GtkTreePath *path, | 245 GtkTreePath *path, |
| 240 GtkTreeIter *iter, | 246 GtkTreeIter *iter, |
| 279 gtk_widget_show(widget); | 285 gtk_widget_show(widget); |
| 280 else | 286 else |
| 281 gtk_widget_hide(widget); | 287 gtk_widget_hide(widget); |
| 282 } else if (GTK_IS_CONTAINER(widget)) { | 288 } else if (GTK_IS_CONTAINER(widget)) { |
| 283 gtk_container_foreach(GTK_CONTAINER(widget), gaim_gtk_blist_update_toolbar_icons, NULL); | 289 gtk_container_foreach(GTK_CONTAINER(widget), gaim_gtk_blist_update_toolbar_icons, NULL); |
| 290 } | |
| 291 } | |
| 292 | |
| 293 static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, | |
| 294 GdkDragContext *dc, | |
| 295 GtkSelectionData *data, | |
| 296 guint info, | |
| 297 guint time, | |
| 298 gpointer *null) | |
| 299 { | |
| 300 if (data->target == gdk_atom_intern("GAIM_BUDDY", FALSE)) { | |
| 301 GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); | |
| 302 GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); | |
| 303 GtkTreeIter iter; | |
| 304 GaimBlistNode *node = NULL; | |
| 305 GValue val = {0}; | |
| 306 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, sourcerow); | |
| 307 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 308 node = g_value_get_pointer(&val); | |
| 309 if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 310 gtk_selection_data_set (data, | |
| 311 gdk_atom_intern ("GAIM_BUDDY", FALSE), | |
| 312 8, /* bits */ | |
| 313 (void*)&node, | |
| 314 sizeof (node)); | |
| 315 } | |
| 316 | |
| 317 } | |
| 318 | |
| 319 static void gaim_gtk_blist_drag_data_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, | |
| 320 GtkSelectionData *sd, guint info, guint t) | |
| 321 { | |
| 322 if (sd->target == gdk_atom_intern("GAIM_BUDDY", FALSE)) { | |
| 323 struct buddy *b = NULL; | |
| 324 GtkTreePath *path = NULL; | |
| 325 memcpy(&b, sd->data, sizeof(b)); | |
| 326 gtk_tree_view_get_dest_row_at_pos(widget, x, y, &path, GTK_TREE_VIEW_DROP_INTO_OR_AFTER); | |
| 284 } | 327 } |
| 285 } | 328 } |
| 286 | 329 |
| 287 /*************************************************** | 330 /*************************************************** |
| 288 * Crap * | 331 * Crap * |
| 551 static void gaim_gtk_blist_new_node(GaimBlistNode *node) | 594 static void gaim_gtk_blist_new_node(GaimBlistNode *node) |
| 552 { | 595 { |
| 553 node->ui_data = g_new0(struct gaim_gtk_blist_node, 1); | 596 node->ui_data = g_new0(struct gaim_gtk_blist_node, 1); |
| 554 } | 597 } |
| 555 | 598 |
| 599 enum {DRAG_BUDDY, DRAG_ROW}; | |
| 600 | |
| 556 static void gaim_gtk_blist_show(struct gaim_buddy_list *list) | 601 static void gaim_gtk_blist_show(struct gaim_buddy_list *list) |
| 557 { | 602 { |
| 558 GtkItemFactory *ift; | 603 GtkItemFactory *ift; |
| 559 GtkCellRenderer *rend; | 604 GtkCellRenderer *rend; |
| 560 GtkTreeViewColumn *column; | 605 GtkTreeViewColumn *column; |
| 561 GtkWidget *sw; | 606 GtkWidget *sw; |
| 562 GtkWidget *button; | 607 GtkWidget *button; |
| 563 GtkSizeGroup *sg; | 608 GtkSizeGroup *sg; |
| 609 GtkTargetEntry gte[] = {{"GAIM_BUDDY", GTK_TARGET_SAME_APP, DRAG_ROW}, | |
| 610 {"application/x-im-contact", 0, DRAG_BUDDY}}; | |
| 564 | 611 |
| 565 if (gtkblist) { | 612 if (gtkblist) { |
| 566 gtk_widget_show(gtkblist->window); | 613 gtk_widget_show(gtkblist->window); |
| 567 return; | 614 return; |
| 568 } | 615 } |
| 598 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | 645 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| 599 gtk_widget_set_size_request(sw, 200, 200); | 646 gtk_widget_set_size_request(sw, 200, 200); |
| 600 | 647 |
| 601 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, | 648 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, |
| 602 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); | 649 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); |
| 603 /* This is broken because GTK is broken | 650 |
| 604 g_signal_connect(G_OBJECT(gtkblist->treemodel), "row-reordered", gaim_gtk_blist_reordered_cb, NULL); */ | |
| 605 | |
| 606 gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); | 651 gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); |
| 652 | |
| 653 /* Set up dnd */ | |
| 654 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), GDK_BUTTON1_MASK, gte, | |
| 655 2, GDK_ACTION_COPY); | |
| 656 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), gte, 2, | |
| 657 GDK_ACTION_COPY | GDK_ACTION_MOVE); | |
| 658 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", gaim_gtk_blist_drag_data_rcv_cb, NULL); | |
| 659 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", gaim_gtk_blist_drag_data_get_cb, NULL); | |
| 660 | |
| 607 | 661 |
| 608 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); | 662 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); |
| 609 | 663 |
| 610 rend = gtk_cell_renderer_pixbuf_new(); | 664 rend = gtk_cell_renderer_pixbuf_new(); |
| 611 column = gtk_tree_view_column_new_with_attributes("Status", rend, "pixbuf", STATUS_ICON_COLUMN, NULL); | 665 column = gtk_tree_view_column_new_with_attributes("Status", rend, "pixbuf", STATUS_ICON_COLUMN, NULL); |
