[gnome-builder] plugins/menu-search: sort search results by score
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] plugins/menu-search: sort search results by score
- Date: Thu, 21 Jul 2022 08:31:37 +0000 (UTC)
commit d266208357feab37d2b7405fbc6e08db1f036739
Author: Christian Hergert <chergert redhat com>
Date: Thu Jul 21 01:31:27 2022 -0700
plugins/menu-search: sort search results by score
We still need a better term-list and compare than strcasecmp(), but that
is still better than fuzzy for this.
src/plugins/menu-search/gbp-menu-search-provider.c | 29 +++++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
---
diff --git a/src/plugins/menu-search/gbp-menu-search-provider.c
b/src/plugins/menu-search/gbp-menu-search-provider.c
index c08478010..6b726c712 100644
--- a/src/plugins/menu-search/gbp-menu-search-provider.c
+++ b/src/plugins/menu-search/gbp-menu-search-provider.c
@@ -39,13 +39,13 @@ struct _GbpMenuSearchProvider
static GIcon *default_gicon;
static void
-populate_from_menu_model (GListStore *store,
+populate_from_menu_model (GPtrArray *ar,
GMenuModel *menu,
const char *query)
{
guint n_items;
- g_assert (G_IS_LIST_STORE (store));
+ g_assert (ar != NULL);
g_assert (G_IS_MENU_MODEL (menu));
n_items = g_menu_model_get_n_items (menu);
@@ -58,6 +58,8 @@ populate_from_menu_model (GListStore *store,
g_autofree char *icon_name = NULL;
g_autofree char *description = NULL;
g_autofree char *action = NULL;
+ guint label_prio = 0;
+ guint desc_prio = 0;
if (!g_menu_model_get_item_attribute (menu, i, "label", "s", &label) ||
!g_menu_model_get_item_attribute (menu, i, "action", "s", &action) ||
@@ -68,9 +70,13 @@ populate_from_menu_model (GListStore *store,
strcasestr (description, query) == NULL)
continue;
+ gtk_source_completion_fuzzy_match (label, query, &label_prio);
+ gtk_source_completion_fuzzy_match (description, query, &desc_prio);
+
result = g_object_new (GBP_TYPE_MENU_SEARCH_RESULT,
"title", label,
"subtitle", description,
+ "priority", MAX (label_prio, desc_prio),
NULL);
if (g_menu_model_get_item_attribute (menu, i, "verb-icon", "s", &icon_name))
@@ -86,10 +92,20 @@ populate_from_menu_model (GListStore *store,
target = g_menu_model_get_item_attribute_value (menu, i, "target", NULL);
gbp_menu_search_result_set_action (GBP_MENU_SEARCH_RESULT (result), action, target);
- g_list_store_append (store, result);
+ g_ptr_array_add (ar, g_steal_pointer (&result));
}
}
+static int
+sort_results (gconstpointer a,
+ gconstpointer b)
+{
+ const IdeSearchResult * const *ra = a;
+ const IdeSearchResult * const *rb = b;
+
+ return ide_search_result_compare (*ra, *rb);
+}
+
static void
gbp_menu_search_provider_search_async (IdeSearchProvider *provider,
const char *query,
@@ -100,6 +116,7 @@ gbp_menu_search_provider_search_async (IdeSearchProvider *provider,
{
g_autoptr(IdeTask) task = NULL;
g_autoptr(GListStore) store = NULL;
+ g_autoptr(GPtrArray) ar = NULL;
const char * const *menu_ids;
IdeApplication *app;
@@ -116,14 +133,18 @@ gbp_menu_search_provider_search_async (IdeSearchProvider *provider,
app = IDE_APPLICATION_DEFAULT;
menu_ids = ide_menu_manager_get_menu_ids (app->menu_manager);
store = g_list_store_new (IDE_TYPE_SEARCH_RESULT);
+ ar = g_ptr_array_new_with_free_func (g_object_unref);
for (guint i = 0; menu_ids[i]; i++)
{
GMenu *menu = ide_menu_manager_get_menu_by_id (app->menu_manager, menu_ids[i]);
- populate_from_menu_model (store, G_MENU_MODEL (menu), query);
+ populate_from_menu_model (ar, G_MENU_MODEL (menu), query);
}
+ g_ptr_array_sort (ar, sort_results);
+ g_list_store_splice (store, 0, 0, ar->pdata, ar->len);
+
ide_task_return_pointer (task, g_steal_pointer (&store), g_object_unref);
IDE_EXIT;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]