]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-individual-widget.c
use gtk_box_new() instead of gtk_[h,v]box_new()
[empathy.git] / libempathy-gtk / empathy-individual-widget.c
index 7354ee83e462440b2c824a5ee56a82acb597540d..5a1c559d13229262613f68d6ee7005dd7cce29ff 100644 (file)
@@ -46,7 +46,6 @@
 #include "empathy-groups-widget.h"
 #include "empathy-gtk-enum-types.h"
 #include "empathy-individual-widget.h"
-#include "empathy-string-parser.h"
 #include "empathy-ui-utils.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
@@ -96,7 +95,7 @@ typedef struct {
   /* Location */
   GtkWidget *vbox_location;
   GtkWidget *subvbox_location;
-  GtkWidget *table_location;
+  GtkWidget *grid_location;
   GtkWidget *label_location;
 #ifdef HAVE_LIBCHAMPLAIN
   GtkWidget *viewport_map;
@@ -190,7 +189,7 @@ update_weak_contact (EmpathyIndividualWidget *self)
               presence_type_cur = folks_presence_details_get_presence_type (
                   presence);
 
-              if (folks_presence_details_typecmp (
+              if (tp_contact == NULL || folks_presence_details_typecmp (
                     presence_type_cur, presence_type) > 0)
                 {
                   presence_type = presence_type_cur;
@@ -214,6 +213,21 @@ update_weak_contact (EmpathyIndividualWidget *self)
     }
 }
 
+static void
+add_row (GtkGrid *grid,
+    guint row,
+    GtkWidget *title,
+    GtkWidget *value)
+{
+  gtk_grid_attach (grid, title, 0, row, 1, 1);
+  gtk_misc_set_alignment (GTK_MISC (title), 0, 0.5);
+  gtk_widget_show (title);
+
+  gtk_grid_attach (grid, value, 1, row, 1, 1);
+  gtk_misc_set_alignment (GTK_MISC (value), 0, 0.5);
+  gtk_widget_show (value);
+}
+
 static guint
 details_update_show (EmpathyIndividualWidget *self,
     TpContact *contact)
@@ -221,6 +235,9 @@ details_update_show (EmpathyIndividualWidget *self,
   EmpathyIndividualWidgetPriv *priv = GET_PRIV (self);
   GList *info, *l;
   guint n_rows = 0;
+  GtkWidget *channels_label;
+  TpConnection *conn;
+  TpAccount *account;
 
   info = tp_contact_get_contact_info (contact);
   info = g_list_sort (info, (GCompareFunc) empathy_contact_info_field_cmp);
@@ -229,8 +246,8 @@ details_update_show (EmpathyIndividualWidget *self,
       TpContactInfoField *field = l->data;
       gchar *title;
       const gchar *value;
-      gboolean linkify;
-      GtkWidget *w;
+      EmpathyContactInfoFormatFunc format;
+      GtkWidget *title_widget, *value_widget;
 
       if (field->field_value == NULL || field->field_value[0] == NULL)
         continue;
@@ -238,44 +255,60 @@ details_update_show (EmpathyIndividualWidget *self,
       value = field->field_value[0];
 
       if (!empathy_contact_info_lookup_field (field->field_name,
-          NULL, &linkify))
+          NULL, &format))
         {
           DEBUG ("Unhandled ContactInfo field: %s", field->field_name);
           continue;
         }
 
+      /* Skip empty field */
+      if (tp_str_empty (value))
+        continue;
+
       /* Add Title */
       title = empathy_contact_info_field_label (field->field_name,
           field->parameters);
-      w = gtk_label_new (title);
-      g_free (title);
-      gtk_grid_attach (GTK_GRID (priv->grid_details),
-          w, 0, n_rows, 1, 1);
-      gtk_misc_set_alignment (GTK_MISC (w), 0, 0.5);
-      gtk_widget_show (w);
+      title_widget = gtk_label_new (title);
 
       /* Add Value */
-      w = gtk_label_new (value);
+      value_widget = gtk_label_new (value);
 
-      if (linkify == TRUE)
+      if (format != NULL)
         {
           gchar *markup;
 
-          markup = empathy_add_link_markup (value);
-          gtk_label_set_markup (GTK_LABEL (w), markup);
+          markup = format (field->field_value);
+          gtk_label_set_markup (GTK_LABEL (value_widget), markup);
           g_free (markup);
         }
 
-      gtk_label_set_selectable (GTK_LABEL (w),
+      gtk_label_set_selectable (GTK_LABEL (value_widget),
           (priv->flags & EMPATHY_INDIVIDUAL_WIDGET_FOR_TOOLTIP) ? FALSE : TRUE);
 
-      gtk_grid_attach (GTK_GRID (priv->grid_details),
-          w, 1, n_rows, 1, 1);
-      gtk_misc_set_alignment (GTK_MISC (w), 0, 0.5);
-      gtk_widget_show (w);
+      add_row (GTK_GRID (priv->grid_details), n_rows, title_widget,
+          value_widget);
+
+      n_rows++;
+    }
+
+  conn = tp_contact_get_connection (contact);
+  account = tp_connection_get_account (conn);
+
+  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 (priv->grid_details), n_rows, title_widget,
+          channels_label);
 
       n_rows++;
     }
+
   g_list_free (info);
 
   return n_rows;
@@ -582,12 +615,12 @@ location_update (EmpathyIndividualWidget *self)
     }
 
   /* Prepare the location information table */
-  if (priv->table_location != NULL)
-    gtk_widget_destroy (priv->table_location);
+  if (priv->grid_location != NULL)
+    gtk_widget_destroy (priv->grid_location);
 
-  priv->table_location = gtk_table_new (1, 2, FALSE);
+  priv->grid_location = gtk_grid_new ();
   gtk_box_pack_start (GTK_BOX (priv->subvbox_location),
-      priv->table_location, FALSE, FALSE, 5);
+      priv->grid_location, FALSE, FALSE, 5);
 
 
   for (i = 0; (skey = ordered_geolocation_keys[i]); i++)
@@ -604,8 +637,8 @@ location_update (EmpathyIndividualWidget *self)
 
       label = gtk_label_new (user_label);
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
-      gtk_table_attach (GTK_TABLE (priv->table_location),
-          label, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 10, 0);
+      gtk_grid_attach (GTK_GRID (priv->grid_location),
+          label, 0, row, 1, 1);
       gtk_widget_show (label);
 
       if (G_VALUE_TYPE (gvalue) == G_TYPE_DOUBLE)
@@ -629,8 +662,8 @@ location_update (EmpathyIndividualWidget *self)
       if (svalue != NULL)
         {
           label = gtk_label_new (svalue);
-          gtk_table_attach_defaults (GTK_TABLE (priv->table_location),
-              label, 1, 2, row, row + 1);
+          gtk_grid_attach (GTK_GRID (priv->grid_location),
+              label, 1, row, 1, 1);
           gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
           gtk_widget_show (label);
 
@@ -659,7 +692,7 @@ location_update (EmpathyIndividualWidget *self)
   if (row > 0)
     {
       /* We can display some fields */
-      gtk_widget_show (priv->table_location);
+      gtk_widget_show (priv->grid_location);
     }
   else if (display_map == FALSE)
     {
@@ -1290,7 +1323,7 @@ alias_presence_avatar_favourite_set_up (EmpathyIndividualWidget *self,
   current_row++;
 
   /* Presence */
-  priv->hbox_presence = gtk_hbox_new (FALSE, 6);
+  priv->hbox_presence = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
 
   /* Presence image */
   image = gtk_image_new_from_stock (GTK_STOCK_MISSING_IMAGE,
@@ -1445,7 +1478,7 @@ add_persona (EmpathyIndividualWidget *self,
   gtk_widget_show (label);
 
   /* Pack the protocol icon with the account name in an hbox */
-  hbox = GTK_BOX (gtk_hbox_new (FALSE, 6));
+  hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6));
 
   account_label = gtk_label_new (NULL);
   gtk_label_set_selectable (GTK_LABEL (account_label),
@@ -1507,7 +1540,7 @@ add_persona (EmpathyIndividualWidget *self,
   gtk_widget_show (GTK_WIDGET (grid));
 
   /* Pack a separator after the grid */
-  separator = gtk_hseparator_new ();
+  separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
   g_object_set_data (G_OBJECT (grid), "separator", separator);
   gtk_box_pack_start (GTK_BOX (priv->vbox_individual), separator, FALSE, FALSE,
       0);
@@ -1944,7 +1977,7 @@ empathy_individual_widget_init (EmpathyIndividualWidget *self)
       NULL);
   g_free (filename);
 
-  priv->table_location = NULL;
+  priv->grid_location = NULL;
 
   gtk_box_pack_start (GTK_BOX (self), priv->vbox_individual_widget, TRUE, TRUE,
       0);
@@ -2055,7 +2088,7 @@ finalize (GObject *object)
 {
   EmpathyIndividualWidgetPriv *priv = GET_PRIV (object);
 
-  g_hash_table_destroy (priv->persona_grids);
+  g_hash_table_unref (priv->persona_grids);
 
   G_OBJECT_CLASS (empathy_individual_widget_parent_class)->finalize (object);
 }