[gnome-shell/wip/fmuellner/calendar-refresh: 12/15] calendar: Use relative times for notification timestamps



commit 3e30b7ab3977ebaa77d8ec38ff6d36a2752e6dad
Author: Florian Müllner <fmuellner gnome org>
Date:   Mon Feb 27 02:17:29 2017 +0100

    calendar: Use relative times for notification timestamps
    
    For notifications in the message list, it is usually less relevant
    when exactly it occurred, but how long ago. So rather than showing
    the exact time and expecting the user to figuring out the timespan
    themselves, change the format to something human readable.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=775763

 js/misc/util.js   |   30 ++++++++++++++++++++++++++++++
 js/ui/calendar.js |    9 ++++++---
 2 files changed, 36 insertions(+), 3 deletions(-)
---
diff --git a/js/misc/util.js b/js/misc/util.js
index 0221e15..90d7fc7 100644
--- a/js/misc/util.js
+++ b/js/misc/util.js
@@ -1,6 +1,7 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Clutter = imports.gi.Clutter;
+const Gettext = imports.gettext;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Lang = imports.lang;
@@ -163,6 +164,35 @@ function _handleSpawnError(command, err) {
     Main.notifyError(title, err.message);
 }
 
+function formatTimeSpan(date) {
+    let now = GLib.DateTime.new_now_local();
+
+    let timespan = now.difference(date);
+
+    let hoursAgo = timespan / GLib.TIME_SPAN_HOUR;
+    let daysAgo = timespan / GLib.TIME_SPAN_DAY;
+    let weeksAgo = daysAgo / 7;
+    let yearsAgo = weeksAgo / 52;
+
+    if (timespan < 20 * GLib.TIME_SPAN_MINUTE)
+        return _("Just now");
+    if (hoursAgo < 1)
+        return _("A while ago")
+    if (daysAgo < 1)
+        return Gettext.ngettext("%d hour ago",
+                                "%d hours ago", hoursAgo).format(hoursAgo);
+    if (daysAgo < 2)
+        return _("Yesterday");
+    if (daysAgo < 15)
+        return Gettext.ngettext("%d day ago",
+                                "%d days ago", daysAgo).format(daysAgo);
+    if (weeksAgo < 52)
+        return Gettext.ngettext("%d week ago",
+                                "%d weeks ago", weeksAgo).format(weeksAgo);
+    return Gettext.ngettext("%d year ago",
+                            "%d years ago", yearsAgo).format(yearsAgo);
+}
+
 function formatTime(time, params) {
     let date;
     // HACK: The built-in Date type sucks at timezones, which we need for the
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
index ef42493..9bafc03 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -956,9 +956,12 @@ const NotificationSection = new Lang.Class({
     },
 
     _createTimeLabel: function(datetime) {
-        let label = Util.createTimeLabel(datetime);
-        label.style_class = 'event-time',
-        label.x_align = Clutter.ActorAlign.START;
+        let label = new St.Label({ style_class: 'event-time',
+                                   x_align: Clutter.ActorAlign.START });
+        label.connect('notify::mapped', () => {
+            if (label.mapped)
+                label.text = Util.formatTimeSpan(datetime);
+        });
         return label;
     },
 


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