[gtk/wip/baedert/filechooser-search] filechooserwidget: Prefer the start of filenames when searching



commit 803dd687a76859e70f3a1b9687357387d2d2bb1c
Author: Timm Bäder <mail baedert org>
Date:   Wed May 15 17:54:34 2019 +0200

    filechooserwidget: Prefer the start of filenames when searching

 gtk/gtkfilechooserwidget.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 101572f7df..4eb48eb458 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -3944,6 +3944,45 @@ compare_name (GtkFileSystemModel   *model,
   return result;
 }
 
+static int
+compare_name_with_query (GtkFileSystemModel   *model,
+                         GtkTreeIter          *a,
+                         GtkTreeIter          *b,
+                         GtkQuery             *query)
+{
+  const char *key_a, *key_b;
+  int hit_a, hit_b;
+  int result;
+
+  key_a = g_value_get_string (_gtk_file_system_model_get_value (model, a, MODEL_COL_NAME_COLLATED));
+  key_b = g_value_get_string (_gtk_file_system_model_get_value (model, b, MODEL_COL_NAME_COLLATED));
+
+  hit_a = key_a - strstr (key_a, gtk_query_get_text (query));
+  hit_b = key_b - strstr (key_b, gtk_query_get_text (query));
+
+  if (hit_a < hit_b)
+    {
+      result = 1;
+    }
+  else if (hit_b < hit_a)
+    {
+      result = -1;
+    }
+  else
+    {
+      if (key_a && key_b)
+        result = strcmp (key_a, key_b);
+      else if (key_a)
+        result = 1;
+      else if (key_b)
+        result = -1;
+      else
+        result = 0;
+    }
+
+  return result;
+}
+
 static gint
 compare_size (GtkFileSystemModel   *model,
               GtkTreeIter          *a,
@@ -4077,7 +4116,7 @@ search_sort_func (GtkTreeModel *model,
   result = compare_location (fs_model, a, b, impl);
 
   if (result == 0)
-    result = compare_name (fs_model, a, b, impl);
+    result = compare_name_with_query (fs_model, a, b, impl->priv->search_query);
 
   if (result == 0)
     result = compare_time (fs_model, a, b, impl);


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