Move again models in header view. Now sort model is again inside filter model
authorJosé Dapena Paz <jdapena@igalia.com>
Mon, 8 Feb 2010 16:20:32 +0000 (17:20 +0100)
committerJosé Dapena Paz <jdapena@igalia.com>
Mon, 8 Feb 2010 16:43:27 +0000 (17:43 +0100)
as we want to avoid resorting on changing the live search filter condition.

Fixes NB#155972

src/modest-utils.c
src/modest-widget-memory.c
src/widgets/modest-header-view.c

index 9eda9e9..d578895 100644 (file)
@@ -548,6 +548,7 @@ launch_sort_headers_dialog (ModestWindow *parent_window,
        gint attachments_sort_id;
        gint priority_sort_id;
        GtkTreeSortable *sortable;
+       GtkTreeModel *filter;
 
        /* Get header window */
        if (MODEST_IS_HEADER_WINDOW (parent_window)) {
@@ -613,7 +614,8 @@ launch_sort_headers_dialog (ModestWindow *parent_window,
        sort_ids[sort_key] = TNY_HEADER_FLAG_PRIORITY_MASK;
        priority_sort_id = sort_key;
        
-       sortable = GTK_TREE_SORTABLE (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)));
+       filter = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+       sortable = GTK_TREE_SORTABLE (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter)));
        /* Launch dialogs */
        if (!gtk_tree_sortable_get_sort_column_id (sortable,
                                                   &current_sort_colid, &current_sort_type)) {
index fc882ed..4526b4e 100644 (file)
@@ -374,7 +374,7 @@ restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view,
                GList *cols = NULL;
                GList *colwidths = NULL;
                GList *colsortables = NULL;
-               GtkTreeModel *sortable;
+               GtkTreeModel *sortable, *filter;
 
                cursor = data = modest_conf_get_string (conf, key, NULL);
                while (cursor && sscanf (cursor, "%d:%d:%d ", &col, &width, &sort) == 3) {
@@ -401,7 +401,8 @@ restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view,
                if (cols) {
                        GList *viewcolumns, *colcursor, *widthcursor;
                        modest_header_view_set_columns (header_view, cols, type);
-                       sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+                       filter = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+                       sortable = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter));
 
                        widthcursor = colwidths;
                        colcursor = viewcolumns = gtk_tree_view_get_columns (GTK_TREE_VIEW(header_view));
@@ -430,7 +431,8 @@ restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view,
        }
 
        if (sort_colid >= 0) {
-               GtkTreeModel *sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+               GtkTreeModel *filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+               GtkTreeModel *sortable = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
                if (sort_colid == TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN)
                        modest_header_view_sort_by_column_id (header_view, 0, sort_type);
                gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sortable),
index c08b94d..ce85179 100644 (file)
@@ -369,7 +369,7 @@ remove_all_columns (ModestHeaderView *obj)
 gboolean
 modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, TnyFolderType type)
 {
-       GtkTreeModel *sortable;
+       GtkTreeModel *sortable, *filter_model;
        GtkTreeViewColumn *column=NULL;
        GtkTreeSelection *selection = NULL;
        GtkCellRenderer *renderer_header,
@@ -473,7 +473,11 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
 
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
-       sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       sortable = NULL;
+       filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       if (GTK_IS_TREE_MODEL_FILTER (filter_model)) {
+               sortable = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+       }
 
        /* Add new columns */
        for (cursor = columns; cursor; cursor = g_list_next(cursor)) {
@@ -1177,18 +1181,18 @@ modest_header_view_set_folder_intern (ModestHeaderView *self,
                                              set_folder_intern_get_headers_async_cb,
                                              NULL, self);
 
-       /* Create a tree model filter to hide and show rows for cut operations  */
-       filter_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (headers), NULL);
-       gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model),
-                                               filter_row, self, NULL);
-       g_object_unref (headers);
-
        /* Init filter_row function to examine empty status */
        priv->status  = HEADER_VIEW_INIT;
 
        /* Create sortable model */
-       sortable = gtk_tree_model_sort_new_with_model (filter_model);
-       g_object_unref (filter_model);
+       sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (headers));
+       g_object_unref (headers);
+
+       /* Create a tree model filter to hide and show rows for cut operations  */
+       filter_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (sortable), NULL);
+       gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model),
+                                               filter_row, self, NULL);
+       g_object_unref (sortable);
 
        /* install our special sorting functions */
        cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
@@ -1215,9 +1219,9 @@ modest_header_view_set_folder_intern (ModestHeaderView *self,
        }
 
        /* Set new model */
-       gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
+       gtk_tree_view_set_model (GTK_TREE_VIEW (self), filter_model);
        modest_header_view_notify_observers (self, sortable, tny_folder_get_id (folder));
-       g_object_unref (sortable);
+       g_object_unref (filter_model);
 
        /* Free */
        g_list_free (cols);
@@ -1229,7 +1233,7 @@ modest_header_view_sort_by_column_id (ModestHeaderView *self,
                                      GtkSortType sort_type)
 {
        ModestHeaderViewPrivate *priv = NULL;
-       GtkTreeModel *sortable = NULL;
+       GtkTreeModel *sortable = NULL, *filter_model = NULL;
        TnyFolderType type;
 
        g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
@@ -1237,7 +1241,10 @@ modest_header_view_sort_by_column_id (ModestHeaderView *self,
 
        /* Get model and private data */
        priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
-       sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       if (GTK_IS_TREE_MODEL_FILTER (filter_model)) {
+               sortable = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+       }
 
        /* Sort tree model */
        type  = modest_tny_folder_guess_folder_type (priv->folder);
@@ -2322,20 +2329,17 @@ _clear_hidding_filter (ModestHeaderView *header_view)
 void
 modest_header_view_refilter (ModestHeaderView *header_view)
 {
-       GtkTreeModel *model, *sortable = NULL;
+       GtkTreeModel *filter_model = NULL;
        ModestHeaderViewPrivate *priv = NULL;
 
        g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW (header_view));
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
 
        /* Hide cut headers */
-       sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
-       if (GTK_IS_TREE_MODEL_SORT (sortable)) {
-               model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sortable));
-               if (GTK_IS_TREE_MODEL_FILTER (model)) {
-                       priv->status = HEADER_VIEW_INIT;
-                       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model));
-               }
+       filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+       if (GTK_IS_TREE_MODEL_FILTER (filter_model)) {
+               priv->status = HEADER_VIEW_INIT;
+               gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
        }
 }
 
@@ -2732,7 +2736,41 @@ on_live_search_refilter (HildonLiveSearch *livesearch,
        } else {
                modest_header_view_set_filter_string (MODEST_HEADER_VIEW (self), NULL);
        }
-       
+
+       priv->live_search_timeout = 0;
+
+       return FALSE;
+}
+
+static gboolean
+on_live_search_refilter (HildonLiveSearch *livesearch,
+                        ModestHeaderView *self)
+{
+       ModestHeaderViewPrivate *priv;
+       GtkTreeModel *model, *sortable, *filter;
+
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
+
+       if (priv->live_search_timeout > 0) {
+               g_source_remove (priv->live_search_timeout);
+               priv->live_search_timeout = 0;
+       }
+
+       model = NULL;
+       filter = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       if (GTK_IS_TREE_MODEL_FILTER (filter)) {
+               sortable = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter));
+               if (GTK_IS_TREE_MODEL_SORT (sortable)) {
+                       model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sortable));
+               }
+       }
+
+       if (model && tny_list_get_length (TNY_LIST (model)) > 250) {
+               priv->live_search_timeout = g_timeout_add (1000, (GSourceFunc) on_live_search_timeout, self);
+       } else {
+               on_live_search_timeout (self);
+       }
+
        return TRUE;
 }