changeset 2406:16fcfac12c77

Fix #417: Natural sort order https://github.com/BestImageViewer/geeqie/issues/417 Refer also to commit bd34c324c92456f5182579d6922d7aba664f93c3 Include an option on the Files tab of Preferences to permit the selection of either g_utf8_collate_key() or g_utf8_collate_key_for_filename() for the sort order of files and folders
author Colin Clark <cclark@mcb.net>
date Tue, 13 Dec 2016 20:12:06 +0000
parents eb6d9ba8a759
children e7901e526fbb
files doc/docbook/GuideOptionsFiltering.xml src/filedata.c src/options.c src/options.h src/preferences.c src/rcfile.c
diffstat 6 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/doc/docbook/GuideOptionsFiltering.xml	Sun Dec 04 09:33:33 2016 +0100
+++ b/doc/docbook/GuideOptionsFiltering.xml	Tue Dec 13 20:12:06 2016 +0000
@@ -37,6 +37,14 @@
       </varlistentry>
       <varlistentry>
         <term>
+          <guilabel>Natural sort order</guilabel>
+        </term>
+        <listitem>
+          <para>Files and folders are sorted with the dot '.' treated as a special case, so the order is e.g. "event.c" "event.h" "eventgenerator.c". Also, files containing numbers are sorted as "file1" "file5" "file10".</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
           <guilabel>Disable file extension checks</guilabel>
         </term>
         <listitem>
--- a/src/filedata.c	Sun Dec 04 09:33:33 2016 +0100
+++ b/src/filedata.c	Tue Dec 13 20:12:06 2016 +0000
@@ -279,8 +279,21 @@
 	g_free(fd->collate_key_name);
 	g_free(fd->collate_key_name_nocase);
 
+#if GTK_CHECK_VERSION(2, 8, 0)
+	if (options->file_sort.natural)
+		{
+	 	fd->collate_key_name = g_utf8_collate_key_for_filename(fd->name, -1);
+	 	fd->collate_key_name_nocase = g_utf8_collate_key_for_filename(caseless_name, -1);
+		}
+	else
+		{
+		fd->collate_key_name = g_utf8_collate_key(valid_name, -1);
+		fd->collate_key_name_nocase = g_utf8_collate_key(caseless_name, -1);
+		}
+#else
 	fd->collate_key_name = g_utf8_collate_key(valid_name, -1);
 	fd->collate_key_name_nocase = g_utf8_collate_key(caseless_name, -1);
+#endif
 
 	g_free(valid_name);
 	g_free(caseless_name);
--- a/src/options.c	Sun Dec 04 09:33:33 2016 +0100
+++ b/src/options.c	Tue Dec 13 20:12:06 2016 +0000
@@ -69,6 +69,7 @@
 	options->file_sort.ascending = TRUE;
 	options->file_sort.case_sensitive = FALSE;
 	options->file_sort.method = SORT_NAME;
+	options->file_sort.natural = FALSE;
 
 	options->fullscreen.above = FALSE;
 	options->fullscreen.clean_flip = FALSE;
--- a/src/options.h	Sun Dec 04 09:33:33 2016 +0100
+++ b/src/options.h	Tue Dec 13 20:12:06 2016 +0000
@@ -129,6 +129,7 @@
 		SortType method;
 		gboolean ascending;
 		gboolean case_sensitive; /* file sorting method (case) */
+		gboolean natural;
 	} file_sort;
 
 	/* slideshow */
--- a/src/preferences.c	Sun Dec 04 09:33:33 2016 +0100
+++ b/src/preferences.c	Tue Dec 13 20:12:06 2016 +0000
@@ -216,6 +216,7 @@
 	if (options->file_filter.show_parent_directory != c_options->file_filter.show_parent_directory) refresh = TRUE;
 	if (options->file_filter.show_dot_directory != c_options->file_filter.show_dot_directory) refresh = TRUE;
 	if (options->file_sort.case_sensitive != c_options->file_sort.case_sensitive) refresh = TRUE;
+	if (options->file_sort.natural != c_options->file_sort.natural) refresh = TRUE;
 	if (options->file_filter.disable_file_extension_checks != c_options->file_filter.disable_file_extension_checks) refresh = TRUE;
 	if (options->file_filter.disable != c_options->file_filter.disable) refresh = TRUE;
 
@@ -260,6 +261,7 @@
 	options->file_filter.disable_file_extension_checks = c_options->file_filter.disable_file_extension_checks;
 
 	options->file_sort.case_sensitive = c_options->file_sort.case_sensitive;
+	options->file_sort.natural = c_options->file_sort.natural;
 	options->file_filter.disable = c_options->file_filter.disable;
 
 	config_entry_to_option(sidecar_ext_entry, &options->sidecar.ext, NULL);
@@ -1704,6 +1706,8 @@
 			      options->file_filter.show_parent_directory, &c_options->file_filter.show_parent_directory);
 	pref_checkbox_new_int(group, _("Case sensitive sort"),
 			      options->file_sort.case_sensitive, &c_options->file_sort.case_sensitive);
+	pref_checkbox_new_int(group, _("Natural sort order"),
+					  options->file_sort.natural, &c_options->file_sort.natural);
 	pref_checkbox_new_int(group, _("Disable file extension checks"),
 			      options->file_filter.disable_file_extension_checks, &c_options->file_filter.disable_file_extension_checks);
 
--- a/src/rcfile.c	Sun Dec 04 09:33:33 2016 +0100
+++ b/src/rcfile.c	Tue Dec 13 20:12:06 2016 +0000
@@ -353,6 +353,7 @@
 	WRITE_NL(); WRITE_INT(*options, file_sort.method);
 	WRITE_NL(); WRITE_BOOL(*options, file_sort.ascending);
 	WRITE_NL(); WRITE_BOOL(*options, file_sort.case_sensitive);
+	WRITE_NL(); WRITE_BOOL(*options, file_sort.natural);
 
 	/* Fullscreen Options */
 	WRITE_NL(); WRITE_INT(*options, fullscreen.screen);
@@ -623,6 +624,7 @@
 		if (READ_UINT(*options, file_sort.method)) continue;
 		if (READ_BOOL(*options, file_sort.ascending)) continue;
 		if (READ_BOOL(*options, file_sort.case_sensitive)) continue;
+		if (READ_BOOL(*options, file_sort.natural)) continue;
 
 		/* File operations *options */
 		if (READ_BOOL(*options, file_ops.enable_in_place_rename)) continue;