[empathy] Display relative time to user



commit c40737394bff5c27daea7e4ee08f240224475904
Author: Pierre-Luc Beaudoin <pierre-luc pierlux com>
Date:   Tue May 26 15:38:32 2009 -0400

    Display relative time to user
    
    The time of the geolocation update is displayed relatively to
    current time (1 min ago, 3 hours ago).
    
    The function just prints ("in the future") for debugging purpuses
    for time in the future.
---
 libempathy-gtk/empathy-contact-widget.c |   13 +++++++---
 libempathy/empathy-time.c               |   41 +++++++++++++++++++++++++++++++
 libempathy/empathy-time.h               |    1 +
 src/empathy-map-view.c                  |   19 +++++++++++++-
 4 files changed, 69 insertions(+), 5 deletions(-)

diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index 22f2746..226c5cb 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -1340,9 +1340,9 @@ contact_widget_location_update (EmpathyContactWidget *information)
       stamp = g_value_get_int64 (value);
       time = stamp;
 
-      user_date = empathy_time_to_string_local (time, _("%B %e, %Y at %R"));
+      user_date = empathy_time_to_string_relative (time);
 
-      text = g_strconcat ( _("<b>Location</b> on "), user_date, NULL);
+      text = g_strconcat ( _("<b>Location</b>, "), user_date, NULL);
       gtk_label_set_markup (GTK_LABEL (information->label_location), text);
       g_free (text);
     }
@@ -1367,8 +1367,6 @@ contact_widget_location_update (EmpathyContactWidget *information)
       char *svalue = NULL;
 
       skey = (const gchar *) key;
-      if (tp_strdiff (skey, EMPATHY_LOCATION_TIMESTAMP) == FALSE)
-        continue;
 
       user_label = location_key_to_label (skey);
       gvalue = (GValue *) pvalue;
@@ -1389,6 +1387,13 @@ contact_widget_location_update (EmpathyContactWidget *information)
         {
           svalue = g_value_dup_string (gvalue);
         }
+      else if (G_VALUE_TYPE (gvalue) == G_TYPE_INT64)
+        {
+          time_t time;
+
+          time = g_value_get_int64 (value);
+          svalue = empathy_time_to_string_utc (time, _("%B %e, %Y at %R UTC"));
+        }
 
       if (svalue != NULL)
         {
diff --git a/libempathy/empathy-time.c b/libempathy/empathy-time.c
index 15b5c30..a482f4d 100644
--- a/libempathy/empathy-time.c
+++ b/libempathy/empathy-time.c
@@ -25,6 +25,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <glib/gi18n.h>
 
 #include "empathy-time.h"
 
@@ -122,3 +123,43 @@ empathy_time_to_string_local (time_t       t,
 	return g_strdup (stamp);
 }
 
+gchar  *
+empathy_time_to_string_relative (time_t then)
+{
+	time_t now;
+	gint   seconds;
+
+	now = time (NULL);
+	seconds = now - then;
+
+	if (seconds > 0) {
+		if (seconds < 60) {
+			seconds /= 60;
+			return g_strdup_printf (ngettext ("%d second ago",
+				"%d seconds ago", seconds), seconds);
+		}
+		else if (seconds < (60 * 60)) {
+			seconds /= 60;
+			return g_strdup_printf (ngettext ("%d minute ago",
+				"%d minutes ago", seconds), seconds);
+		}
+		else if (seconds < (60 * 60 * 24)) {
+			seconds /= 60 * 60;
+			return g_strdup_printf (ngettext ("%d hour ago",
+				"%d hours ago", seconds), seconds);
+		}
+		else if (seconds < (60 * 60 * 24 * 7)) {
+			seconds /= 60 * 60 * 24;
+			return g_strdup_printf (ngettext ("%d day ago",
+				"%d days ago", seconds), seconds);
+		}
+		else {
+			seconds /= 60 * 60 * 24 * 30;
+			return g_strdup_printf (ngettext ("%d month ago",
+				"%d months ago", seconds), seconds);
+		}
+	}
+	else {
+		return g_strdup ("in the future");
+	}
+}
diff --git a/libempathy/empathy-time.h b/libempathy/empathy-time.h
index a673738..2875d2f 100644
--- a/libempathy/empathy-time.h
+++ b/libempathy/empathy-time.h
@@ -40,6 +40,7 @@ gchar  *empathy_time_to_string_utc   (time_t       t,
 				      const gchar *format);
 gchar  *empathy_time_to_string_local (time_t       t,
 				      const gchar *format);
+gchar  *empathy_time_to_string_relative (time_t t);
 
 G_END_DECLS
 
diff --git a/src/empathy-map-view.c b/src/empathy-map-view.c
index 6881954..8c6dc54 100644
--- a/src/empathy-map-view.c
+++ b/src/empathy-map-view.c
@@ -296,6 +296,10 @@ map_view_contacts_foreach (GtkTreeModel *model,
   GHashTable *location;
   GdkPixbuf *avatar;
   const gchar *name;
+  gchar *date;
+  gchar *label;
+  GValue *gtime;
+  time_t time;
 
   gtk_tree_model_get (model, iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT,
      &contact, -1);
@@ -321,7 +325,20 @@ map_view_contacts_foreach (GtkTreeModel *model,
     champlain_marker_set_image (CHAMPLAIN_MARKER (marker), NULL);
 
   name = empathy_contact_get_name (contact);
-  champlain_marker_set_text (CHAMPLAIN_MARKER (marker), name);
+  gtime = g_hash_table_lookup (location, EMPATHY_LOCATION_TIMESTAMP);
+  if (gtime != NULL)
+    {
+      time = g_value_get_int64 (gtime);
+      date = empathy_time_to_string_relative (time);
+      label = g_strconcat ("<b>", name, "</b>\n<small>", date, "</small>", NULL);
+    }
+  else
+    {
+      label = g_strconcat ("<b>", name, "</b>\n", NULL);
+    }
+  champlain_marker_set_use_markup (CHAMPLAIN_MARKER (marker), TRUE);
+  champlain_marker_set_text (CHAMPLAIN_MARKER (marker), label);
+  g_free (label);
 
   clutter_container_add (CLUTTER_CONTAINER (window->layer), marker, NULL);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]