[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, ®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;
+}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list