src/gtkblist.c

changeset 11016
9990e360ee9c
parent 10992
ccf59743dae4
child 11018
a3843543f132
equal deleted inserted replaced
11015:1958a7131f10 11016:9990e360ee9c
532 static void gtk_blist_menu_join_cb(GtkWidget *w, GaimChat *chat) 532 static void gtk_blist_menu_join_cb(GtkWidget *w, GaimChat *chat)
533 { 533 {
534 serv_join_chat(chat->account->gc, chat->components); 534 serv_join_chat(chat->account->gc, chat->components);
535 } 535 }
536 536
537 static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1,
538 char *arg2, gpointer nada)
539 {
540 GtkTreeIter iter;
541 GtkTreePath *path;
542 GValue val = {0,};
543 GaimBlistNode *node;
544
545 path = gtk_tree_path_new_from_string (arg1);
546 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
547 gtk_tree_path_free (path);
548 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
549 node = g_value_get_pointer(&val);
550 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), TRUE);
551 g_object_set(G_OBJECT(gtkblist->text_rend), "editable", FALSE, NULL);
552 switch (node->type){
553 case GAIM_BLIST_CONTACT_NODE:
554 gaim_blist_alias_buddy(gaim_contact_get_priority_buddy((GaimContact*)node), arg2);
555 break;
556 case GAIM_BLIST_BUDDY_NODE:
557 gaim_blist_alias_buddy((GaimBuddy*)node, arg2);
558 break;
559 case GAIM_BLIST_GROUP_NODE:
560 gaim_blist_rename_group((GaimGroup*)node, arg2);
561 break;
562 case GAIM_BLIST_CHAT_NODE:
563 gaim_blist_alias_chat((GaimChat*)node, arg2);
564 break;
565 default:
566 break;
567 }
568 }
569
570 static void
571 gtk_blist_edit_starting(GtkCellRenderer *renderer,
572 GtkCellEditable *editable,
573 gchar *pathstr,
574 gpointer user_data)
575 {
576 GtkTreePath *path;
577 GtkTreeIter iter;
578 GaimBlistNode *node;
579 GValue val = {0,};
580
581 path = gtk_tree_path_new_from_string (pathstr);
582 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
583 gtk_tree_path_free (path);
584 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
585 node = g_value_get_pointer(&val);
586
587 switch (node->type) {
588 case GAIM_BLIST_BUDDY_NODE:
589 gtk_entry_set_text(GTK_ENTRY(editable), ((GaimBuddy*)node)->alias);
590 break;
591 case GAIM_BLIST_CONTACT_NODE:
592 gtk_entry_set_text(GTK_ENTRY(editable), (gaim_contact_get_priority_buddy((GaimContact*)node))->alias);
593 break;
594 case GAIM_BLIST_GROUP_NODE:
595 gtk_entry_set_text(GTK_ENTRY(editable), ((GaimGroup*)node)->name);
596 break;
597 case GAIM_BLIST_CHAT_NODE:
598 gtk_entry_set_text(GTK_ENTRY(editable), ((GaimChat*)node)->alias);
599 break;
600 default:
601 break;
602 }
603 }
604
537 static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node) 605 static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node)
538 { 606 {
539 if(GAIM_BLIST_NODE_IS_BUDDY(node)) 607 GtkTreeIter iter;
540 gaim_gtkdialogs_alias_buddy((GaimBuddy*)node); 608 GtkTreePath *path;
541 else if(GAIM_BLIST_NODE_IS_CONTACT(node)) 609
542 gaim_gtkdialogs_alias_contact((GaimContact*)node); 610 if (!(get_iter_from_node(node, &iter))) {
543 else if(GAIM_BLIST_NODE_IS_CHAT(node)) 611 /* This is either a bug, or the buddy is in a collapsed contact */
544 gaim_gtkdialogs_alias_chat((GaimChat*)node); 612 node = node->parent;
613 if (!get_iter_from_node(node, &iter))
614 /* Now it's definitely a bug */
615 return;
616 }
617 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter);
618 g_object_set(G_OBJECT(gtkblist->text_rend), "editable", TRUE, NULL);
619 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), FALSE);
620 gtk_widget_grab_focus(gtkblist->treeview);
621 gtk_tree_view_set_cursor(GTK_TREE_VIEW(gtkblist->treeview), path, gtkblist->text_column, TRUE);
622 gtk_tree_path_free(path);
545 } 623 }
546 624
547 static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b) 625 static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b)
548 { 626 {
549 gaim_gtkpounce_dialog_show(b->account, b->name, NULL); 627 gaim_gtkpounce_dialog_show(b->account, b->name, NULL);
1252 gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD, 1330 gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD,
1253 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL); 1331 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL);
1254 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, 1332 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE,
1255 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); 1333 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
1256 gaim_new_item_from_stock(menu, _("_Rename"), NULL, 1334 gaim_new_item_from_stock(menu, _("_Rename"), NULL,
1257 G_CALLBACK(show_rename_group), node, 0, 0, NULL); 1335 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
1258 1336
1259 gaim_gtk_append_blist_node_extended_menu(menu, node); 1337 gaim_gtk_append_blist_node_extended_menu(menu, node);
1260 1338
1261 return menu; 1339 return menu;
1262 } 1340 }
2614 }; 2692 };
2615 2693
2616 /********************************************************* 2694 /*********************************************************
2617 * Private Utility functions * 2695 * Private Utility functions *
2618 *********************************************************/ 2696 *********************************************************/
2619 static void
2620 rename_group_cb(GaimGroup *g, const char *new_name)
2621 {
2622 gaim_blist_rename_group(g, new_name);
2623 }
2624
2625 /*
2626 * Should disallow empty group names.
2627 */
2628 static void
2629 show_rename_group(GtkWidget *unused, GaimGroup *g)
2630 {
2631 gaim_request_input(NULL, _("Rename Group"), _("New group name"),
2632 _("Please enter a new name for the selected group."),
2633 g->name, FALSE, FALSE, NULL,
2634 _("OK"), G_CALLBACK(rename_group_cb),
2635 _("Cancel"), NULL, g);
2636 }
2637 2697
2638 static char *gaim_get_tooltip_text(GaimBlistNode *node) 2698 static char *gaim_get_tooltip_text(GaimBlistNode *node)
2639 { 2699 {
2640 GString *str = g_string_new(""); 2700 GString *str = g_string_new("");
2641 GaimPlugin *prpl; 2701 GaimPlugin *prpl;
3469 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); 3529 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL);
3470 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); 3530 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL);
3471 3531
3472 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); 3532 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE);
3473 3533
3474 column = gtk_tree_view_column_new (); 3534 gtkblist->text_column = column = gtk_tree_view_column_new ();
3475 3535
3476 rend = gtk_cell_renderer_pixbuf_new(); 3536 rend = gtk_cell_renderer_pixbuf_new();
3477 gtk_tree_view_column_pack_start(column, rend, FALSE); 3537 gtk_tree_view_column_pack_start(column, rend, FALSE);
3478 gtk_tree_view_column_set_attributes(column, rend, 3538 gtk_tree_view_column_set_attributes(column, rend,
3479 "pixbuf", STATUS_ICON_COLUMN, 3539 "pixbuf", STATUS_ICON_COLUMN,
3480 "visible", STATUS_ICON_VISIBLE_COLUMN, 3540 "visible", STATUS_ICON_VISIBLE_COLUMN,
3481 NULL); 3541 NULL);
3482 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); 3542 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL);
3483 3543
3484 rend = gtk_cell_renderer_text_new(); 3544 gtkblist->text_rend = rend = gtk_cell_renderer_text_new();
3485 gtk_tree_view_column_pack_start (column, rend, TRUE); 3545 gtk_tree_view_column_pack_start (column, rend, TRUE);
3486 gtk_tree_view_column_set_attributes(column, rend, 3546 gtk_tree_view_column_set_attributes(column, rend,
3487 "markup", NAME_COLUMN, 3547 "markup", NAME_COLUMN,
3488 NULL); 3548 NULL);
3549 g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), NULL);
3550 g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_edit_starting), NULL);
3489 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); 3551 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL);
3490 #if GTK_CHECK_VERSION(2,6,0) 3552 #if GTK_CHECK_VERSION(2,6,0)
3491 gtk_tree_view_column_set_expand (column, TRUE); 3553 gtk_tree_view_column_set_expand (column, TRUE);
3492 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); 3554 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
3493 #endif 3555 #endif
3645 3707
3646 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { 3708 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) {
3647 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; 3709 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data;
3648 GtkTreePath *path; 3710 GtkTreePath *path;
3649 3711
3650 /* XXX: why do we assume we have a buddy here? */
3651 if (!gtknode) { 3712 if (!gtknode) {
3652 #if 0
3653 gaim_debug_error("gtkblist", "buddy %s has no ui_data\n", ((GaimBuddy *)node)->name);
3654 #endif
3655 return FALSE; 3713 return FALSE;
3656 } 3714 }
3657 3715
3658 if (!gtkblist) { 3716 if (!gtkblist) {
3659 gaim_debug_error("gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n"); 3717 gaim_debug_error("gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n");
3660 return FALSE; 3718 return FALSE;
3661 } 3719 }
3662 3720
3663 if (!gtknode->row) 3721 if (!gtknode->row)
3664 return FALSE; 3722 return FALSE;
3723
3665 3724
3666 if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL) 3725 if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL)
3667 return FALSE; 3726 return FALSE;
3727
3668 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) { 3728 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) {
3669 gtk_tree_path_free(path); 3729 gtk_tree_path_free(path);
3670 return FALSE; 3730 return FALSE;
3671 } 3731 }
3672 gtk_tree_path_free(path); 3732 gtk_tree_path_free(path);
3756 newpath = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), 3816 newpath = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel),
3757 iter); 3817 iter);
3758 gtknode->row = 3818 gtknode->row =
3759 gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel), 3819 gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel),
3760 newpath); 3820 newpath);
3821
3761 gtk_tree_path_free(newpath); 3822 gtk_tree_path_free(newpath);
3762 3823
3763 gtk_tree_store_set(gtkblist->treemodel, iter, 3824 gtk_tree_store_set(gtkblist->treemodel, iter,
3764 NODE_COLUMN, node, 3825 NODE_COLUMN, node,
3765 -1); 3826 -1);

mercurial