[gtk+/wip/matthiasc/filechooser] file chooser: Improve time and date formatting



commit d33bca8660adb4d5368606a6048acaec96e36363
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jul 2 02:37:59 2015 -0700

    file chooser: Improve time and date formatting
    
    Use the same formats as nautilus, and put date and time in
    separate cells, so they are neatly aligned.

 gtk/gtkfilechooserwidget.c                   |  115 ++++++++++++++++++++++----
 gtk/org.gtk.Settings.FileChooser.gschema.xml |   12 +++
 gtk/ui/gtkfilechooserwidget.ui               |   25 +++++-
 3 files changed, 134 insertions(+), 18 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 2ac24a5..fc22163 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -305,6 +305,7 @@ struct _GtkFileChooserWidgetPrivate {
   GtkCellRenderer *list_name_renderer;
   GtkCellRenderer *list_pixbuf_renderer;
   GtkTreeViewColumn *list_time_column;
+  GtkCellRenderer *list_date_renderer;
   GtkCellRenderer *list_time_renderer;
   GtkTreeViewColumn *list_size_column;
   GtkCellRenderer *list_size_renderer;
@@ -378,6 +379,7 @@ enum {
   MODEL_COL_IS_SENSITIVE,
   MODEL_COL_SURFACE,
   MODEL_COL_SIZE_TEXT,
+  MODEL_COL_DATE_TEXT,
   MODEL_COL_TIME_TEXT,
   MODEL_COL_LOCATION_TEXT,
   MODEL_COL_LOCATION_DIST,
@@ -397,6 +399,7 @@ enum {
        G_TYPE_BOOLEAN,           /* MODEL_COL_IS_SENSITIVE */  \
        CAIRO_GOBJECT_TYPE_SURFACE,  /* MODEL_COL_SURFACE */    \
        G_TYPE_STRING,            /* MODEL_COL_SIZE_TEXT */     \
+       G_TYPE_STRING,            /* MODEL_COL_DATE_TEXT */     \
        G_TYPE_STRING,            /* MODEL_COL_TIME_TEXT */     \
        G_TYPE_STRING,            /* MODEL_COL_LOCATION_TEXT */ \
        G_TYPE_INT,               /* MODEL_COL_LOCATION_DIST */ \
@@ -4056,35 +4059,93 @@ string_replace (const gchar *input,
 }
 
 static char *
-my_g_format_time_for_display (GtkFileChooserWidget *impl,
+my_g_format_date_for_display (GtkFileChooserWidget *impl,
                               glong                 secs)
 {
   GDateTime *now, *time;
   GTimeSpan time_diff;
   gchar *clock_format;
-  gboolean use_24 = TRUE;
+  gchar *date_format;
+  gboolean use_24;
+  gboolean with_time;
   const gchar *format;
   gchar *date_str;
   GSettings *settings;
 
-  now = g_date_time_new_now_local ();
   time = g_date_time_new_from_unix_local (secs);
-  time_diff = g_date_time_difference (now, time);
 
   settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl));
   clock_format = g_settings_get_string (settings, "clock-format");
+  date_format = g_settings_get_string (settings, "date-format");
   use_24 = g_strcmp0 (clock_format, "24h") == 0;
+  with_time = g_strcmp0 (date_format, "with-time") == 0;
   g_free (clock_format);
+  g_free (date_format);
+
+  now = g_date_time_new_now_local ();
+  time_diff = g_date_time_difference (now, time);
 
   /* Translators: see g_date_time_format() for details on the format */
   if (time_diff >= 0 && time_diff < G_TIME_SPAN_DAY)
-    format = use_24 ? _("%H:%M") : _("%-I:%M %P");
+    {
+      if (with_time)
+        format = "";
+      else
+        format = use_24 ? _("%H:%M") : _("%l:%M %p");
+    }
   else if (time_diff >= 0 && time_diff < 2 * G_TIME_SPAN_DAY)
-    format = use_24 ? _("Yesterday at %H:%M") : _("Yesterday at %-I:%M %P");
+    {
+      format = _("Yesterday");
+    }
   else if (time_diff >= 0 && time_diff < 7 * G_TIME_SPAN_DAY)
-    format = "%A"; /* Days from last week */
+    {
+      format = "%a"; /* Days from last week */
+    }
+  else if (g_date_time_get_year (now) == g_date_time_get_year (time))
+    {
+      format = _("%-e %b");
+    }
   else
-    format = "%x"; /* Any other date */
+    {
+      format = N_("%-e %b %Y");
+    }
+
+  g_date_time_unref (now);
+
+  date_str = g_date_time_format (time, format);
+
+  if (g_get_charset (NULL))
+    {
+      gchar *ret;
+      ret = string_replace (date_str, ":", "\xE2\x80\x8E∶");
+      g_free (date_str);
+      date_str = ret;
+    }
+
+  g_date_time_unref (time);
+
+  return date_str;
+}
+
+static char *
+my_g_format_time_for_display (GtkFileChooserWidget *impl,
+                              glong                 secs)
+{
+  GDateTime *time;
+  gchar *clock_format;
+  gboolean use_24;
+  const gchar *format;
+  gchar *date_str;
+  GSettings *settings;
+
+  time = g_date_time_new_from_unix_local (secs);
+
+  settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl));
+  clock_format = g_settings_get_string (settings, "clock-format");
+  use_24 = g_strcmp0 (clock_format, "24h") == 0;
+  g_free (clock_format);
+
+  format = use_24 ? _("%H:%M") : _("%l:%M %p");
 
   date_str = g_date_time_format (time, format);
 
@@ -4097,7 +4158,6 @@ my_g_format_time_for_display (GtkFileChooserWidget *impl,
     }
 
   g_date_time_unref (time);
-  g_date_time_unref (now);
 
   return date_str;
 }
@@ -4270,6 +4330,7 @@ file_system_model_set (GtkFileSystemModel *model,
         g_value_take_string (value, g_format_size (g_file_info_get_size (info)));
       break;
     case MODEL_COL_TIME:
+    case MODEL_COL_DATE_TEXT:
     case MODEL_COL_TIME_TEXT:
       {
         glong time;
@@ -4283,8 +4344,10 @@ file_system_model_set (GtkFileSystemModel *model,
           g_value_set_long (value, time);
         else if (time == 0)
           g_value_set_static_string (value, _("Unknown"));
+        else if (column == MODEL_COL_DATE_TEXT)
+          g_value_take_string (value, my_g_format_date_for_display (impl, time));
         else
-          g_value_take_string (value, my_g_format_time_for_display (impl, time)); 
+          g_value_take_string (value, my_g_format_time_for_display (impl, time));
         break;
       }
     case MODEL_COL_ELLIPSIZE:
@@ -7147,6 +7210,24 @@ path_bar_clicked (GtkPathBar            *path_bar,
 }
 
 static void
+update_time_renderer_visible (GtkFileChooserWidget *impl)
+{
+  GtkFileChooserWidgetPrivate *priv = impl->priv;
+  GSettings *settings;
+  gchar *date_format;
+  gboolean with_time;
+
+  settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl));
+  date_format = g_settings_get_string (settings, "date-format");
+  with_time = g_strcmp0 (date_format, "with-time") == 0;
+  g_free (date_format);
+
+  g_object_set (priv->list_time_renderer,
+                "visible", with_time,
+                NULL);
+}
+
+static void
 update_cell_renderer_attributes (GtkFileChooserWidget *impl)
 {
   GtkFileChooserWidgetPrivate *priv = impl->priv;
@@ -7170,21 +7251,24 @@ update_cell_renderer_attributes (GtkFileChooserWidget *impl)
                                        NULL);
 
   gtk_tree_view_column_set_attributes (priv->list_time_column,
+                                       priv->list_date_renderer,
+                                       "text", MODEL_COL_DATE_TEXT,
+                                       "sensitive", MODEL_COL_IS_SENSITIVE,
+                                       NULL);
+
+  gtk_tree_view_column_set_attributes (priv->list_time_column,
                                        priv->list_time_renderer,
                                        "text", MODEL_COL_TIME_TEXT,
                                        "sensitive", MODEL_COL_IS_SENSITIVE,
                                        NULL);
 
-  g_object_set (priv->list_location_renderer,
-                "ellipsize", PANGO_ELLIPSIZE_START,
-                "width-chars", 15,
-                "max-width-chars", 30,
-                NULL);
   gtk_tree_view_column_set_attributes (priv->list_location_column,
                                        priv->list_location_renderer,
                                        "text", MODEL_COL_LOCATION_TEXT,
                                        "sensitive", MODEL_COL_IS_SENSITIVE,
                                        NULL);
+
+  update_time_renderer_visible (impl);
 }
 
 static void
@@ -7735,6 +7819,7 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
   gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_pixbuf_renderer);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_name_renderer);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_time_column);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_date_renderer);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_time_renderer);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_size_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, list_size_renderer);
diff --git a/gtk/org.gtk.Settings.FileChooser.gschema.xml b/gtk/org.gtk.Settings.FileChooser.gschema.xml
index 0ec539b..c3753f2 100644
--- a/gtk/org.gtk.Settings.FileChooser.gschema.xml
+++ b/gtk/org.gtk.Settings.FileChooser.gschema.xml
@@ -43,6 +43,11 @@
     <value nick='12h' value='1'/>
   </enum>
 
+  <enum id='org.gtk.Settings.FileChooser.DateFormat'>
+    <value nick='regular' value='0'/>
+    <value nick='with-time' value='1'/>
+  </enum>
+
   <schema id='org.gtk.Settings.FileChooser' path='/org/gtk/settings/file-chooser/'>
     <key name='last-folder-uri' type='s'>
       <default>""</default>
@@ -136,6 +141,13 @@
         Whether the time is shown in 24h or 12h format.
       </description>
     </key>
+    <key name="date-format" enum="org.gtk.Settings.FileChooser.DateFormat">
+      <default>'regular'</default>
+      <summary>Date format</summary>
+      <description>
+        The amount of detail to show in the Modified column.
+      </description>
+    </key>
   </schema>
 
 </schemalist>
diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui
index ba25c21..5b1a773 100644
--- a/gtk/ui/gtkfilechooserwidget.ui
+++ b/gtk/ui/gtkfilechooserwidget.ui
@@ -213,7 +213,8 @@
                                     <property name="title" translatable="yes">Size</property>
                                     <child>
                                       <object class="GtkCellRendererText" id="list_size_renderer">
-                                        <property name="alignment">right</property>
+                                        <property name="xalign">0</property>
+                                        <property name="xpad">6</property>
                                       </object>
                                     </child>
                                   </object>
@@ -224,7 +225,13 @@
                                     <property name="visible">False</property>
                                     <property name="title" translatable="yes">Location</property>
                                     <child>
-                                      <object class="GtkCellRendererText" id="list_location_renderer"/>
+                                      <object class="GtkCellRendererText" id="list_location_renderer">
+                                        <property name="xalign">0</property>
+                                        <property name="ellipsize">start</property>
+                                        <property name="width-chars">15</property>
+                                        <property name="max-width-chars">30</property>
+                                        <property name="xpad">6</property>
+                                      </object>
                                     </child>
                                   </object>
                                 </child>
@@ -233,7 +240,19 @@
                                     <property name="resizable">True</property>
                                     <property name="title" translatable="yes">Modified</property>
                                     <child>
-                                      <object class="GtkCellRendererText" id="list_time_renderer"/>
+                                      <object class="GtkCellRendererText" id="list_date_renderer">
+                                        <property name="xalign">1</property>
+                                        <property name="xpad">6</property>
+                                      </object>
+                                      <cell-packing>
+                                        <property name="expand">True</property>
+                                      </cell-packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="list_time_renderer">
+                                        <property name="xalign">1</property>
+                                        <property name="xpad">6</property>
+                                      </object>
                                     </child>
                                   </object>
                                 </child>


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