Mercurial > pidgin.yaz
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); |