From 5b9a0c8553fa29309b64dd7bc5975f702c5132b1 Mon Sep 17 00:00:00 2001 From: Andre Miranda Date: Thu, 12 Oct 2017 16:59:52 -0300 Subject: [PATCH] Sort by app name --- src/appfinder-window.c | 92 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/src/appfinder-window.c b/src/appfinder-window.c index 690f496..80318b7 100644 --- a/src/appfinder-window.c +++ b/src/appfinder-window.c @@ -112,6 +112,10 @@ static void xfce_appfinder_window_icon_theme_changed (XfceAppfi static void xfce_appfinder_window_launch_clicked (XfceAppfinderWindow *window); static void xfce_appfinder_window_execute (XfceAppfinderWindow *window, gboolean close_on_succeed); +static gint xfce_appfinder_window_sort_items (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer data); struct _XfceAppfinderWindowClass { @@ -124,6 +128,9 @@ struct _XfceAppfinderWindow XfceAppfinderModel *model; + GtkTreeModel *sort_model; + GtkTreeModel *filter_model; + XfceAppfinderCategoryModel *category_model; XfceAppfinderActions *actions; @@ -419,6 +426,8 @@ xfce_appfinder_window_finalize (GObject *object) g_object_unref (G_OBJECT (window->model)); g_object_unref (G_OBJECT (window->category_model)); + g_object_unref (G_OBJECT (window->filter_model)); + g_object_unref (G_OBJECT (window->sort_model)); g_object_unref (G_OBJECT (window->completion)); g_object_unref (G_OBJECT (window->icon_find)); @@ -665,7 +674,6 @@ xfce_appfinder_window_view (XfceAppfinderWindow *window) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; - GtkTreeModel *filter_model; GtkTreeSelection *selection; GtkWidget *view; gboolean icon_view; @@ -678,12 +686,15 @@ xfce_appfinder_window_view (XfceAppfinderWindow *window) gtk_widget_destroy (window->view); } - filter_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (window->model), NULL); - gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model), xfce_appfinder_window_item_visible, window, NULL); + window->filter_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (window->model), NULL); + gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (window->filter_model), xfce_appfinder_window_item_visible, window, NULL); + + window->sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (window->filter_model)); + gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (window->sort_model), xfce_appfinder_window_sort_items, window->entry, NULL); if (icon_view) { - window->view = view = gtk_icon_view_new_with_model (filter_model); + window->view = view = gtk_icon_view_new_with_model (window->sort_model); gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (view), GTK_SELECTION_BROWSE); gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (view), XFCE_APPFINDER_MODEL_COLUMN_ICON); gtk_icon_view_set_text_column (GTK_ICON_VIEW (view), XFCE_APPFINDER_MODEL_COLUMN_TITLE); @@ -697,7 +708,7 @@ xfce_appfinder_window_view (XfceAppfinderWindow *window) } else { - window->view = view = gtk_tree_view_new_with_model (filter_model); + window->view = view = gtk_tree_view_new_with_model (window->sort_model); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE); gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view), FALSE); gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (view), XFCE_APPFINDER_MODEL_COLUMN_TOOLTIP); @@ -742,8 +753,6 @@ xfce_appfinder_window_view (XfceAppfinderWindow *window) G_CALLBACK (xfce_appfinder_window_view_button_press_event), window); gtk_container_add (GTK_CONTAINER (window->viewscroll), view); gtk_widget_show (view); - - g_object_unref (G_OBJECT (filter_model)); } @@ -1153,7 +1162,6 @@ xfce_appfinder_window_entry_changed_idle (gpointer data) const gchar *text; GdkPixbuf *pixbuf; gchar *normalized; - GtkTreeModel *model; text = gtk_entry_get_text (GTK_ENTRY (window->entry)); @@ -1174,11 +1182,12 @@ xfce_appfinder_window_entry_changed_idle (gpointer data) } APPFINDER_DEBUG ("refilter entry"); + + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (window->filter_model)); + g_printf ("FILTER TEXT: %s\n", window->filter_text); + if (GTK_IS_TREE_VIEW (window->view)) - model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->view)); - else - model = gtk_icon_view_get_model (GTK_ICON_VIEW (window->view)); - gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model)); + gtk_tree_view_scroll_to_point (GTK_TREE_VIEW (window->view), 0, 0); } else { @@ -1434,7 +1443,7 @@ xfce_appfinder_window_category_changed (GtkTreeSelection *selection, model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->view)); else model = gtk_icon_view_get_model (GTK_ICON_VIEW (window->view)); - gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model)); + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (window->filter_model)); /* store last category */ if (xfconf_channel_get_bool (window->channel, "/remember-category", FALSE)) @@ -1673,7 +1682,7 @@ xfce_appfinder_window_execute (XfceAppfinderWindow *window, gboolean close_on_succeed) { GtkTreeModel *model; - GtkTreeIter iter, orig; + GtkTreeIter iter, iter_sort, iter_filter; GError *error = NULL; gboolean result = FALSE; GdkScreen *screen; @@ -1694,12 +1703,14 @@ xfce_appfinder_window_execute (XfceAppfinderWindow *window, if (xfce_appfinder_window_view_get_selected (window, &model, &iter)) { - gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &orig, &iter); - result = xfce_appfinder_model_execute (window->model, &orig, screen, ®ular_command, &error); + gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (model), &iter_sort, &iter); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model))), + &iter_filter, &iter_sort); + result = xfce_appfinder_model_execute (window->model, &iter_filter, screen, ®ular_command, &error); if (!result && regular_command) { - gtk_tree_model_get (model, &iter, XFCE_APPFINDER_MODEL_COLUMN_COMMAND, &cmd, -1); + gtk_tree_model_get (model, &iter_filter, XFCE_APPFINDER_MODEL_COLUMN_COMMAND, &cmd, -1); result = xfce_appfinder_window_execute_command (cmd, screen, window, FALSE, NULL, &error); g_free (cmd); } @@ -1806,3 +1817,50 @@ xfce_appfinder_window_set_expanded (XfceAppfinderWindow *window, xfce_appfinder_window_entry_changed (window); xfce_appfinder_window_item_changed (window); } + + + +static gint +xfce_appfinder_window_sort_items (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer data) +{ + gchar *normalized, *casefold, *title_a, *title_b, *found; + GtkWidget *entry = GTK_WIDGET (data); + gint result = -1; + + appfinder_return_val_if_fail (GTK_IS_ENTRY (entry), 0); + + normalized = g_utf8_normalize (gtk_entry_get_text (GTK_ENTRY (entry)), -1, G_NORMALIZE_ALL); + casefold = g_utf8_casefold (normalized, -1); + g_free (normalized); + + gtk_tree_model_get (model, a, XFCE_APPFINDER_MODEL_COLUMN_TITLE, &title_a, -1); + normalized = g_utf8_normalize (title_a, -1, G_NORMALIZE_ALL); + title_a = g_utf8_casefold (normalized, -1); + g_free (normalized); + + gtk_tree_model_get (model, b, XFCE_APPFINDER_MODEL_COLUMN_TITLE, &title_b, -1); + normalized = g_utf8_normalize (title_b, -1, G_NORMALIZE_ALL); + title_b = g_utf8_casefold (normalized, -1); + g_free (normalized); + + if (strcmp (casefold, "") == 0) + result = g_strcmp0 (title_a, title_b); + else + { + if (found = g_strrstr (title_a, casefold)) + result -= (G_MAXINT - (found - title_a)); + + if (found = g_strrstr (title_b, casefold)) + result += (G_MAXINT - (found - title_b)); + } + + g_printf ("\tsorting: %d - %s - %s - %s\n", result, casefold, title_a, title_b); + + g_free (casefold); + g_free (title_a); + g_free (title_b); + return result; +} -- 2.14.2