diff options
author | Timm Bäder <mail@baedert.org> | 2019-07-04 10:41:44 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2019-07-04 10:41:44 +0200 |
commit | 09efa8ecdd8169e6ec800fa60ce3e66ca636679b (patch) | |
tree | 4f28359ad549e93ba8ebbbe6b7578e2f65ed549b | |
parent | 8ccb3915f9c5b4a879ac95d2004b3a8cf878fd7e (diff) | |
download | gtk+-wip/baedert/search.tar.gz |
filechooserwidget: Sort search hits after query positionwip/baedert/search
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index c419e16d9c..94855d6e44 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -4007,6 +4007,50 @@ compare_name (GtkFileSystemModel *model, return result; } +static int +compare_query_pos (GtkFileSystemModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + GtkFileChooserWidget *impl) +{ + GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl); + const char *query = NULL; + const char *name_a, *name_b; + char *normalized_a, *normalized_b; + char *cmp_a, *cmp_b; + gsize pos1, pos2; + + /* Just for safety */ + if (!priv->search_query) + return 0; + + query = gtk_query_get_text (priv->search_query); + + name_a = g_value_get_string (_gtk_file_system_model_get_value (model, a, MODEL_COL_NAME)); + name_b = g_value_get_string (_gtk_file_system_model_get_value (model, b, MODEL_COL_NAME)); + + normalized_a = g_utf8_normalize (name_a, -1, G_NORMALIZE_NFD); + normalized_b = g_utf8_normalize (name_b, -1, G_NORMALIZE_NFD); + + cmp_a = g_utf8_strdown (normalized_a, -1); + cmp_b = g_utf8_strdown (normalized_b, -1); + + pos1 = strstr(cmp_a, query) - cmp_a; + pos2 = strstr(cmp_b, query) - cmp_b; + + g_free (cmp_a); + g_free (cmp_b); + g_free (normalized_a); + g_free (normalized_b); + + if (pos1 < pos2) + return -1; + else if (pos1 > pos2) + return 1; + + return 0; +} + static gint compare_size (GtkFileSystemModel *model, GtkTreeIter *a, @@ -4173,6 +4217,9 @@ search_sort_func (GtkTreeModel *model, result = compare_location (fs_model, a, b, impl); if (result == 0) + result = compare_query_pos (fs_model, a, b, impl); + + if (result == 0) result = compare_name (fs_model, a, b, impl); if (result == 0) |