[gnome-builder/wip/gtk4-port] libide/gtk: add helper to format for display



commit 8fd9fe54d3b9616364892aa6dd6fbbac228dc116
Author: Christian Hergert <chergert redhat com>
Date:   Thu Apr 28 21:46:26 2022 -0700

    libide/gtk: add helper to format for display

 src/libide/gtk/ide-gtk.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/libide/gtk/ide-gtk.h | 38 +++++++++++++++++++-----------------
 2 files changed, 71 insertions(+), 18 deletions(-)
---
diff --git a/src/libide/gtk/ide-gtk.c b/src/libide/gtk/ide-gtk.c
index 9bf838d30..5c7039ea7 100644
--- a/src/libide/gtk/ide-gtk.c
+++ b/src/libide/gtk/ide-gtk.c
@@ -22,6 +22,8 @@
 
 #include "config.h"
 
+#include <glib/gi18n.h>
+
 #include <libide-threading.h>
 
 #include "ide-animation.h"
@@ -415,3 +417,52 @@ ide_g_time_span_to_label (GTimeSpan span)
     return g_strdup_printf ("%02"G_GINT64_FORMAT":%02"G_GINT64_FORMAT":%02"G_GINT64_FORMAT,
                             hours, minutes, seconds);
 }
+
+/**
+ * ide_g_date_time_format_for_display:
+ * @self: A #GDateTime
+ *
+ * Helper function to create a human-friendly string describing approximately
+ * how long ago a #GDateTime is.
+ *
+ * Returns: (transfer full): A newly allocated string describing the
+ *   date and time imprecisely such as "Yesterday".
+ */
+char *
+ide_g_date_time_format_for_display (GDateTime *self)
+{
+  g_autoptr(GDateTime) now = NULL;
+  GTimeSpan diff;
+  gint years;
+
+  /*
+   * TODO:
+   *
+   * There is probably a lot more we can do here to be friendly for
+   * various locales, but this will get us started.
+   */
+
+  g_return_val_if_fail (self != NULL, NULL);
+
+  now = g_date_time_new_now_utc ();
+  diff = g_date_time_difference (now, self) / G_USEC_PER_SEC;
+
+  if (diff < 0)
+    return g_strdup ("");
+  else if (diff < (60 * 45))
+    return g_strdup (_("Just now"));
+  else if (diff < (60 * 90))
+    return g_strdup (_("An hour ago"));
+  else if (diff < (60 * 60 * 24 * 2))
+    return g_strdup (_("Yesterday"));
+  else if (diff < (60 * 60 * 24 * 7))
+    return g_date_time_format (self, "%A");
+  else if (diff < (60 * 60 * 24 * 365))
+    return g_date_time_format (self, "%OB");
+  else if (diff < (60 * 60 * 24 * 365 * 1.5))
+    return g_strdup (_("About a year ago"));
+
+  years = MAX (2, diff / (60 * 60 * 24 * 365));
+
+  return g_strdup_printf (ngettext ("About %u year ago", "About %u years ago", years), years);
+}
diff --git a/src/libide/gtk/ide-gtk.h b/src/libide/gtk/ide-gtk.h
index 0bebec027..e2a6b8d0a 100644
--- a/src/libide/gtk/ide-gtk.h
+++ b/src/libide/gtk/ide-gtk.h
@@ -31,31 +31,33 @@
 G_BEGIN_DECLS
 
 IDE_AVAILABLE_IN_ALL
-gboolean ide_gtk_show_uri_on_window          (GtkWindow        *window,
-                                              const char       *uri,
-                                              gint64            timestamp,
-                                              GError           **error);
+gboolean ide_gtk_show_uri_on_window           (GtkWindow        *window,
+                                               const char       *uri,
+                                               gint64            timestamp,
+                                               GError           **error);
 IDE_AVAILABLE_IN_ALL
-void     ide_gtk_window_present              (GtkWindow         *window);
+void     ide_gtk_window_present               (GtkWindow         *window);
 IDE_AVAILABLE_IN_ALL
-void      ide_gtk_progress_bar_start_pulsing (GtkProgressBar    *progress);
+void      ide_gtk_progress_bar_start_pulsing  (GtkProgressBar    *progress);
 IDE_AVAILABLE_IN_ALL
-void      ide_gtk_progress_bar_stop_pulsing  (GtkProgressBar    *progress);
+void      ide_gtk_progress_bar_stop_pulsing   (GtkProgressBar    *progress);
 IDE_AVAILABLE_IN_ALL
-void      ide_gtk_widget_show_with_fade      (GtkWidget         *widget);
+void      ide_gtk_widget_show_with_fade       (GtkWidget         *widget);
 IDE_AVAILABLE_IN_ALL
-void      ide_gtk_widget_hide_with_fade      (GtkWidget         *widget);
+void      ide_gtk_widget_hide_with_fade       (GtkWidget         *widget);
 IDE_AVAILABLE_IN_ALL
-void      ide_gtk_list_store_insert_sorted   (GtkListStore      *store,
-                                              GtkTreeIter       *iter,
-                                              gconstpointer      key,
-                                              guint              compare_column,
-                                              GCompareDataFunc   compare_func,
-                                              gpointer           compare_data);
+void      ide_gtk_list_store_insert_sorted    (GtkListStore      *store,
+                                               GtkTreeIter       *iter,
+                                               gconstpointer      key,
+                                               guint              compare_column,
+                                               GCompareDataFunc   compare_func,
+                                               gpointer           compare_data);
 IDE_AVAILABLE_IN_ALL
-void       ide_gtk_widget_destroyed          (GtkWidget         *widget,
-                                              GtkWidget        **location);
+void       ide_gtk_widget_destroyed           (GtkWidget         *widget,
+                                               GtkWidget        **location);
 IDE_AVAILABLE_IN_ALL
-char      *ide_g_time_span_to_label          (GTimeSpan          span);
+char      *ide_g_time_span_to_label           (GTimeSpan          span);
+IDE_AVAILABLE_IN_ALL
+char      *ide_g_date_time_format_for_display (GDateTime         *self);
 
 G_END_DECLS


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