[Xfce4-commits] [xfce/xfce4-appfinder] 01/03: Sort by app name

noreply at xfce.org noreply at xfce.org
Wed Nov 1 01:58:17 CET 2017


This is an automated email from the git hooks/post-receive script.

a   n   d   r   e       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/xfce4-appfinder.

commit 5b9a0c8553fa29309b64dd7bc5975f702c5132b1
Author: Andre Miranda <andreldm at xfce.org>
Date:   Thu Oct 12 16:59:52 2017 -0300

    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, &regular_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, &regular_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;
+}

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list