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