X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view.c;h=03e1ed8bd80302ee2ef597d63e3382de473ce40a;hp=bbc5d52ce3b4c31537b5983056b86c52bc0e5991;hb=aab537f6ce755830767baa7260d7879449ceeb38;hpb=e240d7d9a13e75427b9774f3978b99c4458b3cf2 diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index bbc5d52..03e1ed8 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -100,6 +100,17 @@ static void modest_header_view_notify_observers( GtkTreeModel *model, const gchar *tny_folder_id); +static gboolean modest_header_view_on_expose_event( + GtkTreeView *header_view, + GdkEventExpose *event, + gpointer user_data); + +typedef enum { + HEADER_VIEW_NON_EMPTY, + HEADER_VIEW_EMPTY, + HEADER_VIEW_INIT +} HeaderViewStatus; + typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate; struct _ModestHeaderViewPrivate { TnyFolder *folder; @@ -125,7 +136,7 @@ struct _ModestHeaderViewPrivate { gulong selection_changed_handler; gulong acc_removed_handler; - gboolean empty; + HeaderViewStatus status; }; typedef struct _HeadersCountChangedHelper HeadersCountChangedHelper; @@ -518,7 +529,7 @@ modest_header_view_init (ModestHeaderView *obj) priv->monitor = NULL; priv->observers_lock = g_mutex_new (); - priv->empty = TRUE; + priv->status = HEADER_VIEW_INIT; priv->observer_list_lock = g_mutex_new(); priv->observer_list = NULL; @@ -644,6 +655,10 @@ modest_header_view_new (TnyFolder *folder, ModestHeaderViewStyle style) G_CALLBACK (on_account_removed), self); + g_signal_connect (self, "expose-event", + G_CALLBACK(modest_header_view_on_expose_event), + NULL); + return GTK_WIDGET(self); } @@ -815,13 +830,6 @@ modest_header_view_get_columns (ModestHeaderView *self) } -/* gboolean */ -/* modest_header_view_is_empty (ModestHeaderView *self) */ -/* { */ -/* g_return_val_if_fail (self, FALSE); */ -/* return FALSE; /\* FIXME *\/ */ -/* } */ - gboolean modest_header_view_set_style (ModestHeaderView *self, @@ -865,6 +873,35 @@ modest_header_view_get_style (ModestHeaderView *self) return MODEST_HEADER_VIEW_GET_PRIVATE(self)->style; } +/* This is used to automatically select the first header if the user + * has not selected any header yet. + */ +static gboolean +modest_header_view_on_expose_event(GtkTreeView *header_view, + GdkEventExpose *event, + gpointer user_data) +{ + GtkTreeSelection *sel; + GtkTreeModel *model; + GtkTreeIter tree_iter; + + /* I'm invalidating this method because it causes an annoying + efect, the focus changes to the header view when selecting + a folder in the folder view because of this code and it + shouldn't. We need to find another way to set the passive + focus on it. Sergio. */ + return FALSE; + + model = gtk_tree_view_get_model(header_view); + + sel = gtk_tree_view_get_selection(header_view); + if(!gtk_tree_selection_count_selected_rows(sel)) + if (gtk_tree_model_get_iter_first(model, &tree_iter)) + gtk_tree_selection_select_iter(sel, &tree_iter); + + return FALSE; +} + /* * This function sets a sortable model in the header view. It's just * used for developing purposes, because it only does a @@ -931,6 +968,9 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder) sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers)); g_object_unref (G_OBJECT (headers)); + /* Init filter_row function to examine empty status */ + priv->status = HEADER_VIEW_INIT; + /* Create a tree model filter to hide and show rows for cut operations */ filter_model = gtk_tree_model_filter_new (sortable, NULL); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model), @@ -1112,18 +1152,17 @@ modest_header_view_set_folder (ModestHeaderView *self, /* Pick my reference. Nothing to do with the mail operation */ priv->folder = g_object_ref (folder); - /* no message selected */ + /* Clear the selection if exists */ + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); + gtk_tree_selection_unselect_all(selection); g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, NULL); + /* create the helper */ info = g_malloc0 (sizeof(SetFolderHelper)); info->header_view = self; info->cb = callback; info->user_data = user_data; - /* bug 57631: Clear the selection if exists */ - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - gtk_tree_selection_unselect_all(selection); - /* Create the mail operation (source will be the parent widget) */ mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, source); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), @@ -1338,11 +1377,12 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context, GtkTreeModel *model = NULL; GtkTreeIter iter; GtkTreePath *source_row = NULL; - GtkTreeSelection *sel = NULL; +/* GtkTreeSelection *sel = NULL;*/ source_row = get_selected_row (GTK_TREE_VIEW (widget), &model); if ((source_row == NULL) || (!gtk_tree_model_get_iter(model, &iter, source_row))) return; + switch (info) { case MODEST_HEADER_ROW: gtk_tree_set_row_drag_data (selection_data, model, source_row); @@ -1361,12 +1401,15 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context, g_message ("%s: default switch case.", __FUNCTION__); } + /* commenting out the next, fixes NB#62963 */ +#if 0 /* Set focus on next header */ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW (widget)); gtk_tree_path_next (source_row); gtk_tree_selection_select_path (sel, source_row); gtk_tree_path_free (source_row); +#endif } /* Header view drag types */ @@ -1535,6 +1578,7 @@ folder_monitor_update (TnyFolderObserver *self, ModestHeaderViewPrivate *priv = NULL; TnyFolderChangeChanged changed; HeadersCountChangedHelper *helper = NULL; + TnyFolder *folder = NULL; changed = tny_folder_change_get_changed (change); @@ -1542,8 +1586,9 @@ folder_monitor_update (TnyFolderObserver *self, view has changed before this call to the observer happens */ priv = MODEST_HEADER_VIEW_GET_PRIVATE (MODEST_HEADER_VIEW (self)); - if (tny_folder_change_get_folder (change) != priv->folder) - return; + folder = tny_folder_change_get_folder (change); + if (folder != priv->folder) + goto frees; /* Check folder count */ if ((changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) || @@ -1551,12 +1596,18 @@ folder_monitor_update (TnyFolderObserver *self, helper = g_slice_new0 (HeadersCountChangedHelper); helper->self = MODEST_HEADER_VIEW(self); helper->change = g_object_ref(change); - - g_idle_add_full (G_PRIORITY_DEFAULT, - idle_notify_headers_count_changed, - helper, - idle_notify_headers_count_changed_destroy); + +/* if (folder != NULL) */ +/* tny_folder_poke_status (folder); */ + + idle_notify_headers_count_changed (helper); + idle_notify_headers_count_changed_destroy (helper); } + + /* Free */ + frees: + if (folder != NULL) + g_object_unref (folder); } gboolean @@ -1566,7 +1617,7 @@ modest_header_view_is_empty (ModestHeaderView *self) priv = MODEST_HEADER_VIEW_GET_PRIVATE (MODEST_HEADER_VIEW (self)); - return priv->empty; + return priv->status == HEADER_VIEW_EMPTY; } void @@ -1683,7 +1734,7 @@ filter_row (GtkTreeModel *model, } frees: - priv->empty = priv->empty && !visible; + priv->status = ((gboolean) priv->status) && !visible; /* Free */ if (header) @@ -1718,7 +1769,7 @@ modest_header_view_refilter (ModestHeaderView *header_view) g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view)); priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view); - priv->empty = TRUE; + priv->status = HEADER_VIEW_EMPTY; /* Hide cut headers */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));