[gnome-builder/wip/gtk4-port: 800/1774] libide/gtk: add helper to format for display
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 800/1774] libide/gtk: add helper to format for display
- Date: Mon, 11 Jul 2022 22:31:24 +0000 (UTC)
commit 2a240d1529924050209670958022cac49549384e
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]