X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view.c;h=753377a486ea62367da53c7f2113872786e836fc;hb=915c00d90d2a73db49dac99e958c6a8417fdb7da;hp=08e0852344ff202571b8fd6f21633eaece9b9c51;hpb=8ed441df7e0650e5cc2721072c18f8347fff181e;p=modest diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 08e0852..753377a 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -64,7 +64,6 @@ static void setup_drag_and_drop (GtkTreeView *self); typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate; struct _ModestHeaderViewPrivate { TnyFolder *folder; - TnyList *headers; ModestHeaderViewStyle style; TnyFolderMonitor *monitor; @@ -358,7 +357,6 @@ modest_header_view_init (ModestHeaderView *obj) priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj); priv->folder = NULL; - priv->headers = NULL; priv->monitor = NULL; priv->monitor_lock = g_mutex_new (); @@ -376,11 +374,6 @@ modest_header_view_finalize (GObject *obj) self = MODEST_HEADER_VIEW(obj); priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); - if (priv->headers) { - g_object_unref (G_OBJECT(priv->headers)); - priv->headers = NULL; - } - g_mutex_lock (priv->monitor_lock); if (priv->monitor) { tny_folder_monitor_stop (priv->monitor); @@ -609,6 +602,39 @@ modest_header_view_get_style (ModestHeaderView *self) return MODEST_HEADER_VIEW_GET_PRIVATE(self)->style; } +/* + * This function sets a sortable model in the header view. It's just + * used for developing purposes, because it only does a + * gtk_tree_view_set_model + */ +static void +modest_header_view_set_model (GtkTreeView *header_view, GtkTreeModel *model) +{ + GtkTreeModel *old_model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); + + if (old_model_sort && GTK_IS_TREE_MODEL_SORT (old_model_sort)) { + GtkTreeModel *old_model; + + old_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (old_model_sort)); + gtk_tree_view_set_model (header_view, model); + modest_runtime_verify_object_death (old_model, ""); + modest_runtime_verify_object_death (old_model_sort, ""); + } else { + ModestHeaderViewPrivate *priv; + + priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view); + g_mutex_lock (priv->monitor_lock); + if (priv->monitor) { + tny_folder_monitor_stop (priv->monitor); + g_object_unref (G_OBJECT (priv->monitor)); + priv->monitor = NULL; + } + g_mutex_unlock (priv->monitor_lock); + gtk_tree_view_set_model (header_view, model); + } + + return; +} static void on_refresh_folder (TnyFolder *folder, @@ -620,31 +646,29 @@ on_refresh_folder (TnyFolder *folder, ModestHeaderView *self; ModestHeaderViewPrivate *priv; GList *cols, *cursor; + TnyList *headers; if (cancelled) { - GtkTreeSelection *selection; +/* GtkTreeSelection *selection; */ + +/* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (user_data)); */ +/* gtk_tree_selection_unselect_all (selection); */ - g_warning ("Operation_cancelled %s\n", (*error) ? (*error)->message : "unknown"); + g_warning ("Operation cancelled %s\n", (*error) ? (*error)->message : "unknown"); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (user_data)); - gtk_tree_selection_unselect_all (selection); return; } self = MODEST_HEADER_VIEW(user_data); priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); - if (priv->headers) { - g_object_unref (priv->headers); - modest_runtime_verify_object_death(priv->headers,""); - } - - priv->headers = TNY_LIST(tny_gtk_header_list_model_new ()); + headers = TNY_LIST (tny_gtk_header_list_model_new ()); - tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(priv->headers), + tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(headers), folder, TRUE); - sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers)); + sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers)); + g_object_unref (G_OBJECT (headers)); /* install our special sorting functions */ cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self)); @@ -653,7 +677,7 @@ on_refresh_folder (TnyFolder *folder, MODEST_HEADER_VIEW_COLUMN)); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable), col_id, - (GtkTreeIterCompareFunc)cmp_rows, + (GtkTreeIterCompareFunc) cmp_rows, cursor->data, NULL); cursor = g_list_next(cursor); } @@ -661,19 +685,17 @@ on_refresh_folder (TnyFolder *folder, /* Add a folder observer */ g_mutex_lock (priv->monitor_lock); - -/* if (priv->monitor) { */ -/* tny_folder_monitor_stop (priv->monitor); */ -/* g_object_unref (G_OBJECT (priv->monitor)); */ -/* } */ -/* priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (folder)); */ -/* tny_folder_monitor_add_list (priv->monitor, TNY_LIST (priv->headers)); */ -/* tny_folder_monitor_start (priv->monitor); */ - + if (priv->monitor) { + tny_folder_monitor_stop (priv->monitor); + g_object_unref (G_OBJECT (priv->monitor)); + } + priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (folder)); + tny_folder_monitor_add_list (priv->monitor, TNY_LIST (headers)); + tny_folder_monitor_start (priv->monitor); g_mutex_unlock (priv->monitor_lock); /* Set new model */ - gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable); + modest_header_view_set_model (GTK_TREE_VIEW (self), sortable); g_object_unref (G_OBJECT (sortable)); } @@ -717,25 +739,25 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) ModestHeaderViewPrivate *priv; priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); - /* Unset the old one */ - if (priv->folder) + if (priv->folder) { g_object_unref (priv->folder); - - priv->folder = folder; + priv->folder = NULL; + } if (folder) { - g_object_ref (priv->folder); + + priv->folder = g_object_ref (folder); tny_folder_refresh_async (folder, on_refresh_folder, on_refresh_folder_status_update, self); - /* no message selected */ + /* no message selected */ g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, NULL); } else { - gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL); + modest_header_view_set_model (GTK_TREE_VIEW (self), NULL); } } @@ -804,6 +826,8 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, header); + + g_object_unref (G_OBJECT (header)); } @@ -948,6 +972,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, } } +/* Drag and drop stuff */ static void drag_data_get_cb (GtkWidget *widget, GdkDragContext *context, @@ -972,31 +997,6 @@ drag_data_get_cb (GtkWidget *widget, gtk_tree_path_free (source_row); } -static void -drag_data_delete_cb (GtkWidget *widget, - GdkDragContext *context, - gpointer user_data) -{ - GtkTreeIter iter; - GtkTreePath *source_row; - GtkTreeModel *model_sort, *model; - TnyHeader *header; - - model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); - model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model_sort)); - source_row = g_object_steal_data (G_OBJECT (widget), ROW_REF_DATA_NAME); - - /* Delete the source row */ - gtk_tree_model_get_iter (model, &iter, source_row); - gtk_tree_model_get (model, &iter, - TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, - -1); - tny_list_remove (TNY_LIST (model), G_OBJECT (header)); - g_object_unref (G_OBJECT (header)); - - gtk_tree_path_free (source_row); -} - /* Header view drag types */ const GtkTargetEntry header_view_drag_types[] = { @@ -1016,9 +1016,4 @@ setup_drag_and_drop (GtkTreeView *self) "drag_data_get", GTK_SIGNAL_FUNC(drag_data_get_cb), NULL); - - gtk_signal_connect(GTK_OBJECT (self), - "drag_data_delete", - GTK_SIGNAL_FUNC(drag_data_delete_cb), - NULL); }