[gnome-shell: 11/14] calendar: Use relative times for notification timestamps



commit f3d1c78c7dd6f526ec8ddb71fbb3ff6ad2b60a3f
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   |   36 ++++++++++++++++++++++++++++++++++++
 js/ui/calendar.js |    9 ++++++---
 2 files changed, 42 insertions(+), 3 deletions(-)
---
diff --git a/js/misc/util.js b/js/misc/util.js
index 0221e15..20d6f27 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,41 @@ 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 minutesAgo = timespan / GLib.TIME_SPAN_MINUTE;
+    let hoursAgo = timespan / GLib.TIME_SPAN_HOUR;
+    let daysAgo = timespan / GLib.TIME_SPAN_DAY;
+    let weeksAgo = daysAgo / 7;
+    let monthsAgo = daysAgo / 30;
+    let yearsAgo = weeksAgo / 52;
+
+    if (minutesAgo < 5)
+        return _("Just now");
+    if (hoursAgo < 1)
+        return Gettext.ngettext("%d minute ago",
+                                "%d minutes ago", minutesAgo).format(minutesAgo);
+    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 < 8)
+        return Gettext.ngettext("%d week ago",
+                                "%d weeks ago", weeksAgo).format(weeksAgo);
+    if (yearsAgo < 1)
+        return Gettext.ngettext("%d month ago",
+                                "%d months ago", monthsAgo).format(monthsAgo);
+    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 b34f0ef..721fc9f 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -957,9 +957,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]