diff --git a/data/schemas/io.elementary.files.gschema.xml b/data/schemas/io.elementary.files.gschema.xml index 2ee79022a3..e400caabdc 100644 --- a/data/schemas/io.elementary.files.gschema.xml +++ b/data/schemas/io.elementary.files.gschema.xml @@ -20,6 +20,7 @@ + diff --git a/libcore/Enums.vala b/libcore/Enums.vala index 9fb2405063..abe3dc845e 100644 --- a/libcore/Enums.vala +++ b/libcore/Enums.vala @@ -253,4 +253,45 @@ namespace Files { } } } + + // Matches settings enum for format of datetimes in view + public enum DateFormatMode { + ISO, + LOCALE, + INFORMAL, + COMPACT, + INVALID; + + public string to_string () { + switch (this) { + case ISO: + ///TRANSLATORS "ISO" is the acronym for "International Standards Organisation" + return _("ISO"); + case LOCALE: + return _("Locale"); + case INFORMAL: + return _("Informal"); + case COMPACT: + return _("Compact"); + default: + assert_not_reached (); + } + } + + public static DateFormatMode from_string (string format) { + var fmt = format.down (); + switch (fmt) { + case "iso": + ///TRANSLATORS "ISO" is the acronym for "International Standards Organisation" + return ISO; + case "locale": + return LOCALE; + case "informal": + return INFORMAL; + default: + assert_not_reached (); + } + } + } + } diff --git a/libcore/FileUtils.vala b/libcore/FileUtils.vala index a42562bf60..7e4d44d0d6 100644 --- a/libcore/FileUtils.vala +++ b/libcore/FileUtils.vala @@ -631,11 +631,14 @@ namespace Files.FileUtils { return ""; } - switch (Files.Preferences.get_default ().date_format.down ()) { - case "locale": + switch (Files.Preferences.get_default ().date_format) { + case DateFormatMode.LOCALE: return dt.format ("%c"); - case "iso" : + case DateFormatMode.ISO : return dt.format ("%Y-%m-%d %H:%M:%S"); + case DateFormatMode.COMPACT : + var locale_format_string = Posix.nl_langinfo (D_FMT); + return dt.format (string.join (" ", locale_format_string.down (), "%H:%M")); default: return get_informal_date_time (dt); } diff --git a/libcore/Preferences.vala b/libcore/Preferences.vala index 0bff19b3b9..0f8f8352b4 100644 --- a/libcore/Preferences.vala +++ b/libcore/Preferences.vala @@ -34,7 +34,7 @@ namespace Files { public bool sort_directories_first { get; set; default = true; } public bool remember_history { get; set; default = true; } - public string date_format {set; get; default = "iso";} + public DateFormatMode date_format {set; get; default = DateFormatMode.ISO;} public string clock_format {set; get; default = "24h";} public static Preferences get_default () { diff --git a/src/View/AbstractDirectoryView.vala b/src/View/AbstractDirectoryView.vala index b6e6529bb8..e2f231ff3c 100644 --- a/src/View/AbstractDirectoryView.vala +++ b/src/View/AbstractDirectoryView.vala @@ -409,6 +409,7 @@ namespace Files { prefs.notify["show-remote-thumbnails"].connect (on_show_thumbnails_changed); prefs.notify["show-local-thumbnails"].connect (on_show_thumbnails_changed); prefs.notify["sort-directories-first"].connect (on_sort_directories_first_changed); + prefs.notify["date-format"].connect (on_dateformat_changed); prefs.bind_property ( "singleclick-select", this, "singleclick_select", BindingFlags.DEFAULT | BindingFlags.SYNC_CREATE ); @@ -1455,6 +1456,10 @@ namespace Files { dir.load_hiddens (); } + private void on_dateformat_changed () { + slot.reload (); + } + /** Handle popup menu events */ private bool on_popup_menu () { Gdk.Event event = Gtk.get_current_event (); diff --git a/src/View/Widgets/AppMenu.vala b/src/View/Widgets/AppMenu.vala index 86d0244374..009773af6c 100644 --- a/src/View/Widgets/AppMenu.vala +++ b/src/View/Widgets/AppMenu.vala @@ -9,6 +9,7 @@ public class Files.AppMenu : Gtk.Popover { private Gtk.Button zoom_default_button; private Gtk.Button zoom_in_button; private Gtk.Button zoom_out_button; + private Gtk.ComboBoxText datetimeformat_combo; private string[] redo_accels; private string[] undo_accels; private unowned UndoManager undo_manager; @@ -112,6 +113,22 @@ public class Files.AppMenu : Gtk.Popover { }; show_remote_thumbnails.get_style_context ().add_class (Gtk.STYLE_CLASS_MENUITEM); + ///TRANSLATORS The format of the date (possibly with time) shown in the Modified column of the file view + var datetimeformat_label = new Gtk.Label (_("Date & Time Format")); + datetimeformat_combo = new Gtk.ComboBoxText (); + for (uint dfm = 0; dfm < DateFormatMode.INVALID; dfm++) { + datetimeformat_combo.append_text (((DateFormatMode) dfm).to_string ()); + } + + //TODO Add a custom format wizard? Or a detailed informat format? Or "days ago" format? + datetimeformat_combo.active = (int) Files.Preferences.get_default ().date_format; + + var datetimeformat_box = new Gtk.Box (HORIZONTAL, 6); + datetimeformat_box.add (datetimeformat_label); + datetimeformat_box.add (datetimeformat_combo); + + datetimeformat_box.get_style_context ().add_class ("menuitem"); + var menu_box = new Gtk.Box (VERTICAL, 0) { margin_bottom = 6 }; @@ -126,6 +143,8 @@ public class Files.AppMenu : Gtk.Popover { menu_box.add (show_hidden_button); menu_box.add (show_local_thumbnails); menu_box.add (show_remote_thumbnails); + menu_box.add (new Gtk.Separator (HORIZONTAL) { margin_top = 3, margin_bottom = 3 }); + menu_box.add (datetimeformat_box); menu_box.show_all (); child = menu_box; @@ -139,6 +158,11 @@ public class Files.AppMenu : Gtk.Popover { Files.icon_view_settings.changed["zoom-level"].connect (on_zoom_setting_changed); Files.list_view_settings.changed["zoom-level"].connect (on_zoom_setting_changed); Files.column_view_settings.changed["zoom-level"].connect (on_zoom_setting_changed); + app_settings.changed["date-format"].connect (on_dateformat_setting_changed); + + datetimeformat_combo.changed.connect (() => { + app_settings.set_enum ("date-format", datetimeformat_combo.active); + }); } private void set_undo_redo_tooltips () { @@ -177,4 +201,8 @@ public class Files.AppMenu : Gtk.Popover { zoom_in_button.sensitive = zoom_level < max_zoom; zoom_out_button.sensitive = zoom_level > min_zoom; } + + private void on_dateformat_setting_changed (Settings settings, string key) { + datetimeformat_combo.active = settings.get_enum (key); + } }