diff options
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-contact-widget.c | 964 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-widget.h | 7 |
2 files changed, 10 insertions, 961 deletions
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c index e8cce0373..bf65fc7b8 100644 --- a/libempathy-gtk/empathy-contact-widget.c +++ b/libempathy-gtk/empathy-contact-widget.c @@ -27,16 +27,10 @@ #include <gtk/gtk.h> #include <glib/gi18n-lib.h> -#ifdef HAVE_LIBCHAMPLAIN -#include <champlain/champlain.h> -#include <champlain-gtk/champlain-gtk.h> -#endif - #include <telepathy-glib/account.h> #include <telepathy-glib/util.h> #include <telepathy-glib/interfaces.h> -#include <libempathy/empathy-location.h> #include <libempathy/empathy-time.h> #include <libempathy/empathy-utils.h> #include <libempathy/empathy-client-factory.h> @@ -104,27 +98,9 @@ struct _EmpathyContactWidgetPriv GtkWidget *label_details; GtkWidget *label_left_account; - /* Location */ - GtkWidget *vbox_location; - GtkWidget *subvbox_location; - GtkWidget *grid_location; - GtkWidget *label_location; -#ifdef HAVE_LIBCHAMPLAIN - GtkWidget *viewport_map; - GtkWidget *map_view_embed; - ChamplainView *map_view; -#endif - /* Groups */ GtkWidget *groups_widget; - /* Details */ - GtkWidget *hbox_details_requested; - GtkWidget *spinner_details; - GList *details_to_set; - GCancellable *details_cancellable; - gboolean details_changed; - /* Client */ GtkWidget *vbox_client; GtkWidget *grid_client; @@ -147,551 +123,6 @@ enum COL_COUNT }; -static gboolean -field_value_is_empty (TpContactInfoField *field) -{ - guint i; - - if (field->field_value == NULL) - return TRUE; - - /* Field is empty if all its values are empty */ - for (i = 0; field->field_value[i] != NULL; i++) - { - if (!tp_str_empty (field->field_value[i])) - return FALSE; - } - - return TRUE; -} - -static void -set_contact_info_cb (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GError *error = NULL; - - if (!tp_connection_set_contact_info_finish (TP_CONNECTION (source), result, - &error)) - { - DEBUG ("SetContactInfo() failed: %s", error->message); - g_error_free (error); - return; - } - - DEBUG ("SetContactInfo() succeeded"); -} - -static void -contact_widget_save (EmpathyContactWidget *self) -{ - TpConnection *connection; - GList *l, *next; - - connection = empathy_contact_get_connection (self->priv->contact); - - /* Remove empty fields */ - for (l = self->priv->details_to_set; l != NULL; l = next) - { - TpContactInfoField *field = l->data; - - next = l->next; - if (field_value_is_empty (field)) - { - DEBUG ("Drop empty field: %s", field->field_name); - tp_contact_info_field_free (field); - self->priv->details_to_set = - g_list_delete_link (self->priv->details_to_set, l); - } - } - - if (self->priv->details_to_set != NULL) - { - if (self->priv->details_changed) - { - tp_connection_set_contact_info_async (connection, - self->priv->details_to_set, set_contact_info_cb, NULL); - } - - tp_contact_info_list_free (self->priv->details_to_set); - self->priv->details_to_set = NULL; - } -} - -static void -contact_widget_details_setup (EmpathyContactWidget *self) -{ - gtk_widget_hide (self->priv->label_details); - - self->priv->spinner_details = gtk_spinner_new (); - gtk_box_pack_end (GTK_BOX (self->priv->hbox_details_requested), - self->priv->spinner_details, TRUE, TRUE, 0); - gtk_widget_show (self->priv->spinner_details); -} - -static void -contact_widget_details_changed_cb (GtkEntry *entry, - EmpathyContactWidget *self) -{ - const gchar *strv[] = { NULL, NULL }; - TpContactInfoField *field; - - self->priv->details_changed = TRUE; - - field = g_object_get_data ((GObject *) entry, DATA_FIELD); - g_assert (field != NULL); - - strv[0] = gtk_entry_get_text (entry); - - if (field->field_value != NULL) - g_strfreev (field->field_value); - field->field_value = g_strdupv ((GStrv) strv); -} - -static void -contact_widget_bday_changed_cb (EmpathyCalendarButton *button, - GDate *date, - EmpathyContactWidget *self) -{ - const gchar *strv[] = { NULL, NULL }; - TpContactInfoField *field; - - self->priv->details_changed = TRUE; - - field = g_object_get_data ((GObject *) button, DATA_FIELD); - g_assert (field != NULL); - - if (date != NULL) - { - gchar tmp[255]; - - g_date_strftime (tmp, sizeof (tmp), EMPATHY_DATE_FORMAT_DISPLAY_SHORT, - date); - strv[0] = tmp; - } - - if (field->field_value != NULL) - g_strfreev (field->field_value); - field->field_value = g_strdupv ((GStrv) strv); -} - -static void contact_widget_details_notify_cb (EmpathyContactWidget *self); - -static gboolean -field_name_in_field_list (GList *list, - const gchar *name) -{ - GList *l; - - for (l = list; l != NULL; l = g_list_next (l)) - { - TpContactInfoField *field = l->data; - - if (!tp_strdiff (field->field_name, name)) - return TRUE; - } - - return FALSE; -} - -static TpContactInfoFieldSpec * -get_spec_from_list (GList *list, - const gchar *name) -{ - GList *l; - - for (l = list; l != NULL; l = g_list_next (l)) - { - TpContactInfoFieldSpec *spec = l->data; - - if (!tp_strdiff (spec->name, name)) - return spec; - } - - return NULL; -} - -static void -add_row (GtkGrid *grid, - GtkWidget *title, - GtkWidget *value) -{ - gtk_grid_attach_next_to (grid, title, NULL, GTK_POS_BOTTOM, 2, 1); - gtk_misc_set_alignment (GTK_MISC (title), 1, 0.5); - gtk_style_context_add_class (gtk_widget_get_style_context (title), - GTK_STYLE_CLASS_DIM_LABEL); - gtk_widget_show (title); - - g_object_set_data (G_OBJECT (title), "added-row", (gpointer) TRUE); - - gtk_grid_attach_next_to (grid, value, title, GTK_POS_RIGHT, 1, 1); - gtk_widget_set_hexpand (value, TRUE); - - if (GTK_IS_MISC (value)) - gtk_misc_set_alignment (GTK_MISC (value), 0, 0.5); - - gtk_widget_show (value); - - g_object_set_data (G_OBJECT (value), "added-row", (gpointer) TRUE); -} - -static guint -contact_widget_details_update_edit (EmpathyContactWidget *self) -{ - TpContact *contact; - TpConnection *connection; - GList *specs, *l; - guint n_rows = 0; - GList *info; - const char **field_names = empathy_contact_info_get_field_names (NULL); - guint i; - - g_assert (self->priv->details_to_set == NULL); - - self->priv->details_changed = FALSE; - - contact = empathy_contact_get_tp_contact (self->priv->contact); - connection = tp_contact_get_connection (contact); - - info = tp_contact_get_contact_info (contact); - - specs = tp_connection_get_contact_info_supported_fields (connection); - - /* Look at the fields set in our vCard */ - for (l = info; l != NULL; l = l->next) - { - TpContactInfoField *field = l->data; - - /* make a copy for the details_to_set list */ - field = tp_contact_info_field_copy (field); - DEBUG ("Field %s is in our vCard", field->field_name); - - self->priv->details_to_set = g_list_prepend (self->priv->details_to_set, - field); - } - - /* Add fields which are supported but not in the vCard */ - for (i = 0; field_names[i] != NULL; i++) - { - TpContactInfoFieldSpec *spec; - TpContactInfoField *field; - - /* Check if the field was in the vCard */ - if (field_name_in_field_list (self->priv->details_to_set, - field_names[i])) - continue; - - /* Check if the CM supports the field */ - spec = get_spec_from_list (specs, field_names[i]); - if (spec == NULL) - continue; - - /* add an empty field so user can set a value */ - field = tp_contact_info_field_new (spec->name, spec->parameters, NULL); - - self->priv->details_to_set = g_list_prepend (self->priv->details_to_set, - field); - } - - /* Add widgets for supported fields */ - self->priv->details_to_set = g_list_sort (self->priv->details_to_set, - (GCompareFunc) empathy_contact_info_field_spec_cmp); - - for (l = self->priv->details_to_set; l != NULL; l= g_list_next (l)) - { - TpContactInfoField *field = l->data; - GtkWidget *label, *w; - TpContactInfoFieldSpec *spec; - gboolean has_field; - char *title; - - has_field = empathy_contact_info_lookup_field (field->field_name, - NULL, NULL); - if (!has_field) - { - /* Empathy doesn't display this field so we can't change it. - * But we put it in the details_to_set list so it won't be erased - * when calling SetContactInfo (bgo #630427) */ - DEBUG ("Unhandled ContactInfo field spec: %s", field->field_name); - continue; - } - - spec = get_spec_from_list (specs, field->field_name); - /* We shouldn't have added the field to details_to_set if it's not - * supported by the CM */ - g_assert (spec != NULL); - - if (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_OVERWRITTEN_BY_NICKNAME) - { - DEBUG ("Ignoring field '%s' due it to having the " - "Overwritten_By_Nickname flag", field->field_name); - continue; - } - - /* Add Title */ - title = empathy_contact_info_field_label (field->field_name, - field->parameters, - (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_PARAMETERS_EXACT)); - label = gtk_label_new (title); - g_free (title); - - /* TODO: if TP_CONTACT_INFO_FIELD_FLAG_PARAMETERS_EXACT is not set we - * should allow user to tag the vCard fields (bgo#672034) */ - - /* Add Value */ - if (!tp_strdiff (field->field_name, "bday")) - { - w = empathy_calendar_button_new (); - - if (field->field_value[0]) - { - GDate date; - - g_date_set_parse (&date, field->field_value[0]); - if (g_date_valid (&date)) - { - empathy_calendar_button_set_date (EMPATHY_CALENDAR_BUTTON (w), - &date); - } - } - - g_signal_connect (w, "date-changed", - G_CALLBACK (contact_widget_bday_changed_cb), self); - } - else - { - w = gtk_entry_new (); - gtk_entry_set_text (GTK_ENTRY (w), - field->field_value[0] ? field->field_value[0] : ""); - g_signal_connect (w, "changed", - G_CALLBACK (contact_widget_details_changed_cb), self); - } - - gtk_widget_show (w); - add_row (GTK_GRID (self->priv->grid_contact), label, w); - - g_object_set_data ((GObject *) w, DATA_FIELD, field); - - n_rows++; - } - - g_list_free (specs); - g_list_free (info); - - return n_rows; -} - -static guint -contact_widget_details_update_show (EmpathyContactWidget *self) -{ - TpContact *contact; - GList *info, *l; - guint n_rows = 0; - GtkWidget *channels_label; - TpAccount *account; - - contact = empathy_contact_get_tp_contact (self->priv->contact); - info = tp_contact_get_contact_info (contact); - info = g_list_sort (info, (GCompareFunc) empathy_contact_info_field_cmp); - for (l = info; l != NULL; l = l->next) - { - TpContactInfoField *field = l->data; - const gchar *value; - gchar *markup = NULL, *title; - GtkWidget *title_widget, *value_widget; - EmpathyContactInfoFormatFunc format; - - if (field->field_value == NULL || field->field_value[0] == NULL) - continue; - - value = field->field_value[0]; - - if (!empathy_contact_info_lookup_field (field->field_name, NULL, &format)) - { - DEBUG ("Unhandled ContactInfo field: %s", field->field_name); - continue; - } - - if (format != NULL) - { - markup = format (field->field_value); - - if (markup == NULL) - { - DEBUG ("Invalid value for field '%s' (first element was '%s')", - field->field_name, field->field_value[0]); - continue; - } - } - - /* Add Title */ - title = empathy_contact_info_field_label (field->field_name, - field->parameters, TRUE); - title_widget = gtk_label_new (title); - g_free (title); - - /* Add Value */ - value_widget = gtk_label_new (value); - if (markup != NULL) - { - gtk_label_set_markup (GTK_LABEL (value_widget), markup); - g_free (markup); - } - - if ((self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP) == 0) - gtk_label_set_selectable (GTK_LABEL (value_widget), TRUE); - - add_row (GTK_GRID (self->priv->grid_contact), title_widget, - value_widget); - - n_rows++; - } - - account = empathy_contact_get_account (self->priv->contact); - - channels_label = empathy_contact_info_create_channel_list_label (account, - info, n_rows); - - if (channels_label != NULL) - { - GtkWidget *title_widget; - - title_widget = gtk_label_new (_("Channels:")); - - add_row (GTK_GRID (self->priv->grid_contact), title_widget, - channels_label); - - n_rows++; - } - - g_list_free (info); - - return n_rows; -} - -static void -contact_widget_foreach (GtkWidget *widget, - gpointer data) -{ - if (g_object_get_data (G_OBJECT (widget), "added-row") != NULL) - gtk_widget_destroy (widget); -} - -static void -contact_widget_details_notify_cb (EmpathyContactWidget *self) -{ - guint n_rows; - - gtk_container_foreach (GTK_CONTAINER (self->priv->grid_contact), - contact_widget_foreach, NULL); - - if ((self->priv->flags & EMPATHY_CONTACT_WIDGET_EDIT_DETAILS) != 0) - n_rows = contact_widget_details_update_edit (self); - else - n_rows = contact_widget_details_update_show (self); - - gtk_widget_set_visible (self->priv->label_details, n_rows > 0); - - gtk_widget_hide (self->priv->hbox_details_requested); - gtk_spinner_stop (GTK_SPINNER (self->priv->spinner_details)); -} - -static void -contact_widget_details_request_cb (GObject *object, - GAsyncResult *res, - gpointer user_data) -{ - TpContact *contact = TP_CONTACT (object); - EmpathyContactWidget *self = user_data; - GError *error = NULL; - - if (!tp_contact_request_contact_info_finish (contact, res, &error)) - { - /* If the request got cancelled it could mean the contact widget is - * destroyed, so we should not dereference self */ - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - { - g_clear_error (&error); - return; - } - - gtk_widget_hide (self->priv->label_details); - g_clear_error (&error); - } - else - { - contact_widget_details_notify_cb (self); - } - - /* If we are going to edit ContactInfo, we don't want live updates */ - if ((self->priv->flags & EMPATHY_CONTACT_WIDGET_EDIT_DETAILS) == 0) - { - g_signal_connect_swapped (contact, "notify::contact-info", - G_CALLBACK (contact_widget_details_notify_cb), self); - } - - tp_clear_object (&self->priv->details_cancellable); -} - -static void -fetch_contact_information (EmpathyContactWidget *self, - TpConnection *connection) -{ - TpContact *contact; - TpContactInfoFlags flags; - - if (!tp_proxy_has_interface_by_id (connection, - TP_IFACE_QUARK_CONNECTION_INTERFACE_CONTACT_INFO)) - { - gtk_widget_hide (self->priv->label_details); - return; - } - - /* If we want to edit info, but connection does not support that, stop */ - flags = tp_connection_get_contact_info_flags (connection); - if ((flags & TP_CONTACT_INFO_FLAG_CAN_SET) == 0 && - (self->priv->flags & EMPATHY_CONTACT_WIDGET_EDIT_DETAILS) != 0) - { - gtk_widget_hide (self->priv->label_details); - return; - } - - /* Request the contact's info */ - gtk_widget_show (self->priv->hbox_details_requested); - gtk_spinner_start (GTK_SPINNER (self->priv->spinner_details)); - - contact = empathy_contact_get_tp_contact (self->priv->contact); - g_assert (self->priv->details_cancellable == NULL); - self->priv->details_cancellable = g_cancellable_new (); - tp_contact_request_contact_info_async (contact, - self->priv->details_cancellable, contact_widget_details_request_cb, - self); -} - -static void -contact_widget_details_update (EmpathyContactWidget *self) -{ - TpContact *tp_contact = NULL; - - if ((self->priv->flags & EMPATHY_CONTACT_WIDGET_SHOW_DETAILS) == 0 && - (self->priv->flags & EMPATHY_CONTACT_WIDGET_EDIT_DETAILS) == 0) - return; - - gtk_widget_hide (self->priv->label_details); - - if (self->priv->contact != NULL) - tp_contact = empathy_contact_get_tp_contact (self->priv->contact); - - if (tp_contact != NULL) - { - TpConnection *connection; - - connection = tp_contact_get_connection (tp_contact); - - fetch_contact_information (self, connection); - } -} static void contact_widget_client_update (EmpathyContactWidget *self) @@ -730,253 +161,6 @@ contact_widget_groups_update (EmpathyContactWidget *self) gtk_widget_hide (self->priv->groups_widget); } -/* Converts the Location's GHashTable's key to a user readable string */ -static const gchar * -location_key_to_label (const gchar *key) -{ - if (tp_strdiff (key, EMPATHY_LOCATION_COUNTRY_CODE) == FALSE) - return _("Country ISO Code:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_COUNTRY) == FALSE) - return _("Country:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_REGION) == FALSE) - return _("State:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_LOCALITY) == FALSE) - return _("City:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_AREA) == FALSE) - return _("Area:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_POSTAL_CODE) == FALSE) - return _("Postal Code:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_STREET) == FALSE) - return _("Street:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_BUILDING) == FALSE) - return _("Building:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_FLOOR) == FALSE) - return _("Floor:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_ROOM) == FALSE) - return _("Room:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_TEXT) == FALSE) - return _("Text:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_DESCRIPTION) == FALSE) - return _("Description:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_URI) == FALSE) - return _("URI:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_ACCURACY_LEVEL) == FALSE) - return _("Accuracy Level:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_ERROR) == FALSE) - return _("Error:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_VERTICAL_ERROR_M) == FALSE) - return _("Vertical Error (meters):"); - else if (tp_strdiff (key, EMPATHY_LOCATION_HORIZONTAL_ERROR_M) == FALSE) - return _("Horizontal Error (meters):"); - else if (tp_strdiff (key, EMPATHY_LOCATION_SPEED) == FALSE) - return _("Speed:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_BEARING) == FALSE) - return _("Bearing:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_CLIMB) == FALSE) - return _("Climb Speed:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_TIMESTAMP) == FALSE) - return _("Last Updated on:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_LON) == FALSE) - return _("Longitude:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_LAT) == FALSE) - return _("Latitude:"); - else if (tp_strdiff (key, EMPATHY_LOCATION_ALT) == FALSE) - return _("Altitude:"); - else - { - DEBUG ("Unexpected Location key: %s", key); - return key; - } -} - -static void -contact_widget_location_update (EmpathyContactWidget *self) -{ - GHashTable *location; - GValue *value; -#ifdef HAVE_LIBCHAMPLAIN - gdouble lat = 0.0, lon = 0.0; - gboolean has_position = TRUE; -#endif - GtkWidget *label; - guint row = 0; - static const gchar* ordered_geolocation_keys[] = { - EMPATHY_LOCATION_TEXT, - EMPATHY_LOCATION_URI, - EMPATHY_LOCATION_DESCRIPTION, - EMPATHY_LOCATION_BUILDING, - EMPATHY_LOCATION_FLOOR, - EMPATHY_LOCATION_ROOM, - EMPATHY_LOCATION_STREET, - EMPATHY_LOCATION_AREA, - EMPATHY_LOCATION_LOCALITY, - EMPATHY_LOCATION_REGION, - EMPATHY_LOCATION_COUNTRY, - NULL - }; - int i; - const gchar *skey; - gboolean display_map = FALSE; - - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_SHOW_LOCATION)) - { - gtk_widget_hide (self->priv->vbox_location); - return; - } - - location = empathy_contact_get_location (self->priv->contact); - if (location == NULL || g_hash_table_size (location) == 0) - { - gtk_widget_hide (self->priv->vbox_location); - return; - } - - value = g_hash_table_lookup (location, EMPATHY_LOCATION_TIMESTAMP); - if (value == NULL) - { - gchar *loc = g_strdup_printf ("<b>%s</b>", _("Location")); - gtk_label_set_markup (GTK_LABEL (self->priv->label_location), loc); - g_free (loc); - } - else - { - gchar *user_date; - gchar *text; - gint64 stamp; - gchar *tmp; - - stamp = g_value_get_int64 (value); - - user_date = empathy_time_to_string_relative (stamp); - - tmp = g_strdup_printf ("<b>%s</b>", _("Location")); - /* translators: format is "Location, $date" */ - text = g_strdup_printf (_("%s, %s"), tmp, user_date); - g_free (tmp); - gtk_label_set_markup (GTK_LABEL (self->priv->label_location), text); - g_free (user_date); - g_free (text); - } - - - /* Prepare the location self grid */ - if (self->priv->grid_location != NULL) - { - gtk_widget_destroy (self->priv->grid_location); - } - - self->priv->grid_location = gtk_grid_new (); - gtk_box_pack_start (GTK_BOX (self->priv->subvbox_location), - self->priv->grid_location, FALSE, FALSE, 5); - - - for (i = 0; (skey = ordered_geolocation_keys[i]); i++) - { - const gchar* user_label; - GValue *gvalue; - char *svalue = NULL; - - gvalue = g_hash_table_lookup (location, (gpointer) skey); - if (gvalue == NULL) - continue; - - user_label = location_key_to_label (skey); - - label = gtk_label_new (user_label); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - gtk_grid_attach (GTK_GRID (self->priv->grid_location), - label, 0, row, 1, 1); - gtk_widget_show (label); - - if (G_VALUE_TYPE (gvalue) == G_TYPE_DOUBLE) - { - gdouble dvalue; - dvalue = g_value_get_double (gvalue); - svalue = g_strdup_printf ("%f", dvalue); - } - else if (G_VALUE_TYPE (gvalue) == G_TYPE_STRING) - { - svalue = g_value_dup_string (gvalue); - } - else if (G_VALUE_TYPE (gvalue) == G_TYPE_INT64) - { - gint64 time_; - - time_ = g_value_get_int64 (value); - svalue = empathy_time_to_string_utc (time_, _("%B %e, %Y at %R UTC")); - } - - if (svalue != NULL) - { - label = gtk_label_new (svalue); - gtk_grid_attach (GTK_GRID (self->priv->grid_location), - label, 1, row, 1, 1); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0); - gtk_widget_show (label); - - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP)) - gtk_label_set_selectable (GTK_LABEL (label), TRUE); - } - - g_free (svalue); - row++; - } - -#ifdef HAVE_LIBCHAMPLAIN - if (has_position && - !(self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP)) - { - /* Cannot be displayed in tooltips until Clutter-Gtk can deal with such - * windows */ - display_map = TRUE; - } -#endif - - if (row > 0) - { - /* We can display some fields */ - gtk_widget_show (self->priv->grid_location); - } - else if (!display_map) - { - /* Can't display either fields or map */ - gtk_widget_hide (self->priv->vbox_location); - return; - } - -#ifdef HAVE_LIBCHAMPLAIN - if (display_map) - { - ClutterActor *marker; - ChamplainMarkerLayer *layer; - - self->priv->map_view_embed = gtk_champlain_embed_new (); - self->priv->map_view = gtk_champlain_embed_get_view ( - GTK_CHAMPLAIN_EMBED (self->priv->map_view_embed)); - - gtk_container_add (GTK_CONTAINER (self->priv->viewport_map), - self->priv->map_view_embed); - g_object_set (G_OBJECT (self->priv->map_view), - "kinetic-mode", TRUE, - "zoom-level", 10, - NULL); - - layer = champlain_marker_layer_new (); - champlain_view_add_layer (self->priv->map_view, CHAMPLAIN_LAYER (layer)); - - marker = champlain_label_new_with_text ( - empathy_contact_get_alias (self->priv->contact), NULL, NULL, NULL); - champlain_location_set_location (CHAMPLAIN_LOCATION (marker), lat, lon); - champlain_marker_layer_add_marker (layer, CHAMPLAIN_MARKER (marker)); - - champlain_view_center_on (self->priv->map_view, lat, lon); - gtk_widget_show_all (self->priv->viewport_map); - } -#endif - - gtk_widget_show (self->priv->vbox_location); -} - static void save_avatar_menu_activate_cb (GtkWidget *widget, EmpathyContactWidget *self) @@ -1135,46 +319,6 @@ set_nickname_cb (GObject *source, } } -/* Update all the contact info fields having the -* Overwritten_By_Nickname flag to the new alias. This avoid accidentally -* reseting the alias when calling SetContactInfo(). See bgo #644298 for -* details. */ -static void -update_nickname_in_contact_info (EmpathyContactWidget *self, - TpConnection *connection, - const gchar *nickname) -{ - GList *specs, *l; - - specs = tp_connection_get_contact_info_supported_fields (connection); - - for (l = self->priv->details_to_set; l != NULL; l= g_list_next (l)) - { - TpContactInfoField *field = l->data; - TpContactInfoFieldSpec *spec; - - spec = get_spec_from_list (specs, field->field_name); - /* We shouldn't have added the field to details_to_set if it's not - * supported by the CM */ - g_assert (spec != NULL); - - if (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_OVERWRITTEN_BY_NICKNAME) - { - const gchar *strv[] = { nickname, NULL }; - - DEBUG ("Updating field '%s' to '%s' as it has the " - "Overwritten_By_Nickname flag and Account.Nickname has " - "been updated", field->field_name, nickname); - - if (field->field_value != NULL) - g_strfreev (field->field_value); - field->field_value = g_strdupv ((GStrv) strv); - } - } - - g_list_free (specs); -} - static gboolean contact_widget_entry_alias_focus_event_cb (GtkEditable *editable, GdkEventFocus *event, @@ -1200,9 +344,6 @@ contact_widget_entry_alias_focus_event_cb (GtkEditable *editable, tp_account_set_nickname_async (account, alias, set_nickname_cb, NULL); - - update_nickname_in_contact_info (self, - empathy_contact_get_connection (self->priv->contact), alias); } } else @@ -1248,31 +389,14 @@ contact_widget_remove_contact (EmpathyContactWidget *self) { if (self->priv->contact) { - TpContact *tp_contact; - - contact_widget_save (self); - g_signal_handlers_disconnect_by_func (self->priv->contact, contact_widget_name_notify_cb, self); g_signal_handlers_disconnect_by_func (self->priv->contact, contact_widget_presence_notify_cb, self); - tp_contact = empathy_contact_get_tp_contact (self->priv->contact); - if (tp_contact != NULL) - { - g_signal_handlers_disconnect_by_func (tp_contact, - contact_widget_details_notify_cb, self); - } - g_object_unref (self->priv->contact); self->priv->contact = NULL; } - - if (self->priv->details_cancellable != NULL) - { - g_cancellable_cancel (self->priv->details_cancellable); - tp_clear_object (&self->priv->details_cancellable); - } } static void contact_widget_change_contact (EmpathyContactWidget *self); @@ -1312,25 +436,6 @@ contact_widget_contact_update (EmpathyContactWidget *self) contact_widget_change_contact, self); } } - else - { - if ((self->priv->flags & EMPATHY_CONTACT_WIDGET_NO_ACCOUNT) == 0) - { - if (account) - { - const gchar *name; - - name = tp_account_get_display_name (account); - gtk_label_set_label (GTK_LABEL (self->priv->label_account), - name); - - name = tp_account_get_icon_name (account); - gtk_image_set_from_icon_name ( - GTK_IMAGE (self->priv->image_account), - name, GTK_ICON_SIZE_MENU); - } - } - } /* Update id widget */ if (self->priv->flags & EMPATHY_CONTACT_WIDGET_EDIT_ID) @@ -1348,15 +453,7 @@ contact_widget_contact_update (EmpathyContactWidget *self) gtk_widget_show (self->priv->widget_alias); gtk_widget_show (self->priv->widget_avatar); - gtk_widget_set_visible (self->priv->hbox_presence, - !(self->priv->flags & EMPATHY_CONTACT_WIDGET_NO_STATUS)); - - if (empathy_contact_is_user (self->priv->contact)) - gtk_label_set_text (GTK_LABEL (self->priv->label_details), - _("Personal Details")); - else - gtk_label_set_text (GTK_LABEL (self->priv->label_details), - _("Contact Details")); + gtk_widget_set_visible (self->priv->hbox_presence, TRUE); } else { @@ -1388,9 +485,7 @@ contact_widget_set_contact (EmpathyContactWidget *self, /* Update self for widgets */ contact_widget_contact_update (self); contact_widget_groups_update (self); - contact_widget_details_update (self); contact_widget_client_update (self); - contact_widget_location_update (self); } static void @@ -1498,8 +593,7 @@ contact_widget_contact_setup (EmpathyContactWidget *self) TRUE); gtk_misc_set_alignment (GTK_MISC (self->priv->label_status), 0, 0.5); - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP)) - gtk_label_set_selectable (GTK_LABEL (self->priv->label_status), TRUE); + gtk_label_set_selectable (GTK_LABEL (self->priv->label_status), TRUE); gtk_box_pack_start (GTK_BOX (self->priv->hbox_presence), self->priv->label_status, TRUE, TRUE, 0); @@ -1514,31 +608,6 @@ contact_widget_contact_setup (EmpathyContactWidget *self) G_CALLBACK (contact_widget_change_contact), self); } - else if (self->priv->flags & EMPATHY_CONTACT_WIDGET_NO_ACCOUNT) - { - /* Don't display the account */ - gtk_widget_hide (self->priv->label_left_account); - } - else - { - /* Pack the protocol icon with the account name in an hbox */ - self->priv->widget_account = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - - self->priv->label_account = gtk_label_new (NULL); - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP)) { - gtk_label_set_selectable (GTK_LABEL (self->priv->label_account), TRUE); - } - gtk_misc_set_alignment (GTK_MISC (self->priv->label_account), 0, 0.5); - gtk_widget_show (self->priv->label_account); - - self->priv->image_account = gtk_image_new (); - gtk_widget_show (self->priv->image_account); - - gtk_box_pack_start (GTK_BOX (self->priv->widget_account), - self->priv->image_account, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (self->priv->widget_account), - self->priv->label_account, FALSE, TRUE, 0); - } if (self->priv->widget_account != NULL) { @@ -1579,9 +648,7 @@ contact_widget_contact_setup (EmpathyContactWidget *self) else { self->priv->widget_id = gtk_label_new (NULL); - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP)) { - gtk_label_set_selectable (GTK_LABEL (self->priv->widget_id), TRUE); - } + gtk_label_set_selectable (GTK_LABEL (self->priv->widget_id), TRUE); gtk_misc_set_alignment (GTK_MISC (self->priv->widget_id), 0, 0.5); } @@ -1596,10 +663,9 @@ contact_widget_contact_setup (EmpathyContactWidget *self) { self->priv->widget_alias = gtk_entry_new (); - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_NO_SET_ALIAS)) - g_signal_connect (self->priv->widget_alias, "focus-out-event", - G_CALLBACK (contact_widget_entry_alias_focus_event_cb), - self); + g_signal_connect (self->priv->widget_alias, "focus-out-event", + G_CALLBACK (contact_widget_entry_alias_focus_event_cb), + self); /* Make return activate the window default (the Close button) */ gtk_entry_set_activates_default (GTK_ENTRY (self->priv->widget_alias), @@ -1608,9 +674,7 @@ contact_widget_contact_setup (EmpathyContactWidget *self) else { self->priv->widget_alias = gtk_label_new (NULL); - if (!(self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP)) { - gtk_label_set_selectable (GTK_LABEL (self->priv->widget_alias), TRUE); - } + gtk_label_set_selectable (GTK_LABEL (self->priv->widget_alias), TRUE); gtk_misc_set_alignment (GTK_MISC (self->priv->widget_alias), 0, 0.5); } @@ -1618,9 +682,7 @@ contact_widget_contact_setup (EmpathyContactWidget *self) self->priv->widget_alias, 2, 2, 1, 1); gtk_widget_set_hexpand (self->priv->widget_alias, TRUE); - if (self->priv->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP) { - gtk_label_set_selectable (GTK_LABEL (self->priv->label_status), FALSE); - } + gtk_label_set_selectable (GTK_LABEL (self->priv->label_status), FALSE); gtk_widget_show (self->priv->widget_alias); } @@ -1676,14 +738,7 @@ empathy_contact_widget_new (EmpathyContact *contact, "image_state", &self->priv->image_state, "grid_contact", &self->priv->grid_contact, "vbox_avatar", &self->priv->vbox_avatar, - "vbox_location", &self->priv->vbox_location, - "subvbox_location", &self->priv->subvbox_location, - "label_location", &self->priv->label_location, -#ifdef HAVE_LIBCHAMPLAIN - "viewport_map", &self->priv->viewport_map, -#endif "groups_widget", &self->priv->groups_widget, - "hbox_details_requested", &self->priv->hbox_details_requested, "vbox_client", &self->priv->vbox_client, "grid_client", &self->priv->grid_client, "hbox_client_requested", &self->priv->hbox_client_requested, @@ -1697,9 +752,10 @@ empathy_contact_widget_new (EmpathyContact *contact, /* Create widgets */ contact_widget_contact_setup (self); - contact_widget_details_setup (self); contact_widget_client_setup (self); + gtk_widget_hide (self->priv->label_details); + if (contact != NULL) contact_widget_set_contact (self, contact); else if (self->priv->flags & EMPATHY_CONTACT_WIDGET_EDIT_ACCOUNT || diff --git a/libempathy-gtk/empathy-contact-widget.h b/libempathy-gtk/empathy-contact-widget.h index 00423c7ff..6979d161d 100644 --- a/libempathy-gtk/empathy-contact-widget.h +++ b/libempathy-gtk/empathy-contact-widget.h @@ -96,13 +96,6 @@ typedef enum EMPATHY_CONTACT_WIDGET_EDIT_ACCOUNT = 1 << 2, EMPATHY_CONTACT_WIDGET_EDIT_ID = 1 << 3, EMPATHY_CONTACT_WIDGET_EDIT_GROUPS = 1 << 4, - EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP = 1 << 5, - EMPATHY_CONTACT_WIDGET_SHOW_LOCATION = 1 << 6, - EMPATHY_CONTACT_WIDGET_NO_SET_ALIAS = 1 << 7, - EMPATHY_CONTACT_WIDGET_SHOW_DETAILS = 1 << 8, - EMPATHY_CONTACT_WIDGET_EDIT_DETAILS = 1 << 9, - EMPATHY_CONTACT_WIDGET_NO_STATUS = 1 << 10, - EMPATHY_CONTACT_WIDGET_NO_ACCOUNT = 1 << 11, } EmpathyContactWidgetFlags; GtkWidget * empathy_contact_widget_new (EmpathyContact *contact, |