X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=libempathy-gtk%2Fempathy-contact-menu.c;h=0de7c1ca6afdd78c4ab7847db97c4aa6d7db8c23;hp=0f98bbdce62398e5c3dd3a927718202dd0350af5;hb=aedb2729fa86eafc2891bc522cad68285d41b8a5;hpb=9fe194288e580fcbd79fcae90050ccb8b6380a63 diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c index 0f98bbdc..0de7c1ca 100644 --- a/libempathy-gtk/empathy-contact-menu.c +++ b/libempathy-gtk/empathy-contact-menu.c @@ -28,9 +28,11 @@ #include #include +#include #include #include #include +#include #include "empathy-contact-menu.h" #include "empathy-images.h" @@ -55,6 +57,13 @@ empathy_contact_menu_new (EmpathyContact *contact, menu = gtk_menu_new (); shell = GTK_MENU_SHELL (menu); + /* Add Contact */ + item = empathy_contact_add_menu_item_new (contact); + if (item) { + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + /* Chat */ if (features & EMPATHY_CONTACT_FEATURE_CHAT) { item = empathy_contact_chat_menu_item_new (contact); @@ -116,6 +125,77 @@ empathy_contact_menu_new (EmpathyContact *contact, return menu; } +static void +empathy_contact_add_menu_item_activated (GtkMenuItem *item, + EmpathyContact *contact) +{ + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (item)); + if (!GTK_WIDGET_TOPLEVEL (toplevel) || !GTK_IS_WINDOW (toplevel)) { + toplevel = NULL; + } + + empathy_new_contact_dialog_show_with_contact (GTK_WINDOW (toplevel), + contact); +} + +GtkWidget * +empathy_contact_add_menu_item_new (EmpathyContact *contact) +{ + GtkWidget *item; + GtkWidget *image; + EmpathyContactManager *manager; + TpConnection *connection; + GList *l, *members; + gboolean found = FALSE; + EmpathyContactListFlags flags; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + if (!empathy_contact_manager_initialized ()) { + return NULL; + } + + manager = empathy_contact_manager_dup_singleton (); + connection = empathy_contact_get_connection (contact); + + flags = empathy_contact_manager_get_flags_for_connection (manager, + connection); + + if (!(flags & EMPATHY_CONTACT_LIST_CAN_ADD)) { + return NULL; + } + + members = empathy_contact_list_get_members (EMPATHY_CONTACT_LIST (manager)); + for (l = members; l; l = l->next) { + if (!found && empathy_contact_equal (l->data, contact)) { + found = TRUE; + /* we keep iterating so that we don't leak contact + * refs */ + } + + g_object_unref (l->data); + } + g_list_free (members); + g_object_unref (manager); + + if (found) { + return NULL; + } + + item = gtk_image_menu_item_new_with_mnemonic (_("_Add Contact...")); + image = gtk_image_new_from_icon_name (GTK_STOCK_ADD, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + + g_signal_connect (item, "activate", + G_CALLBACK (empathy_contact_add_menu_item_activated), + contact); + + return item; +} + static void empathy_contact_chat_menu_item_activated (GtkMenuItem *item, EmpathyContact *contact) @@ -123,7 +203,6 @@ empathy_contact_chat_menu_item_activated (GtkMenuItem *item, empathy_dispatcher_chat_with_contact (contact, NULL, NULL); } - GtkWidget * empathy_contact_chat_menu_item_new (EmpathyContact *contact) { @@ -306,17 +385,36 @@ contact_edit_menu_item_activate_cb (EmpathyContact *contact) GtkWidget * empathy_contact_edit_menu_item_new (EmpathyContact *contact) { + EmpathyContactManager *manager; GtkWidget *item; GtkWidget *image; + gboolean enable = FALSE; g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + if (empathy_contact_manager_initialized ()) { + TpConnection *connection; + EmpathyContactListFlags flags; + + manager = empathy_contact_manager_dup_singleton (); + connection = empathy_contact_get_connection (contact); + flags = empathy_contact_manager_get_flags_for_connection ( + manager, connection); + + enable = (flags & EMPATHY_CONTACT_LIST_CAN_ALIAS || + flags & EMPATHY_CONTACT_LIST_CAN_GROUP); + + g_object_unref (manager); + } + item = gtk_image_menu_item_new_with_mnemonic (_("_Edit")); image = gtk_image_new_from_icon_name (GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); gtk_widget_show (image); + gtk_widget_set_sensitive (item, enable); + g_signal_connect_swapped (item, "activate", G_CALLBACK (contact_edit_menu_item_activate_cb), contact);