[accounts-dialog] Allow typeahead search in the user list



commit 2812b509250ddf52e4c3fc92b3f74fd5a606dc20
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Feb 1 20:53:38 2010 -0500

    Allow typeahead search in the user list
    
    ...and try to be somewhat smart about matching names.

 src/main.c |   66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)
---
diff --git a/src/main.c b/src/main.c
index 646f6af..4440a82 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1186,6 +1186,69 @@ focus_moved (GtkWindow         *window,
         }
 }
 
+static gboolean
+match_user (GtkTreeModel *model,
+            gint          column,
+            const gchar  *key,
+            GtkTreeIter  *iter,
+            gpointer      search_data)
+{
+        UmUser *user;
+        const gchar *name;
+        gchar *normalized_key = NULL;
+        gchar *normalized_name = NULL;
+        gchar *case_normalized_key = NULL;
+        gchar *case_normalized_name = NULL;
+        gchar *p;
+        gboolean result = TRUE;
+        gint i;
+
+        gtk_tree_model_get (model, iter, USER_COL, &user, -1);
+
+        if (!user) {
+                goto out;
+        }
+
+        normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL);
+        if (!normalized_key) {
+                goto out;
+        }
+
+        case_normalized_key = g_utf8_casefold (normalized_key, -1);
+
+        for (i = 0; i < 2; i++) {
+                if (i == 0)
+                        name = um_user_get_real_name (user);
+                else
+                        name = um_user_get_user_name (user);
+
+                g_free (normalized_name);
+                normalized_name = g_utf8_normalize (name, -1, G_NORMALIZE_ALL);
+                if (normalized_name) {
+                        g_free (case_normalized_name);
+                        case_normalized_name = g_utf8_casefold (normalized_name, -1);
+                        p = strstr (case_normalized_name, case_normalized_key);
+
+                        /* poor man's \b */
+                        if (p == case_normalized_name || (p && p[-1] == ' ')) {
+                                result = FALSE;
+                                break;
+                        }
+                }
+        }
+
+ out:
+        if (user) {
+                g_object_unref (user);
+        }
+        g_free (normalized_key);
+        g_free (case_normalized_key);
+        g_free (normalized_name);
+        g_free (case_normalized_name);
+
+        return result;
+}
+
 static void
 setup_main_window (UserAccountDialog *d)
 {
@@ -1217,6 +1280,9 @@ setup_main_window (UserAccountDialog *d)
         gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model), sort_users, NULL, NULL);
         gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
         gtk_tree_view_set_model (GTK_TREE_VIEW (userlist), model);
+        gtk_tree_view_set_search_column (GTK_TREE_VIEW (userlist), USER_COL);
+        gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (userlist),
+                                             match_user, NULL, NULL);
 
         g_signal_connect (d->um, "users-loaded", G_CALLBACK (users_loaded), d);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]