X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view.c;h=1b52c1eb40661c7e8963bab95fb4459c901c80c1;hp=72da5b9400009a9bb14deab240e9839120a2f574;hb=004e051469e80cc145ee2fb886682bd1ff07b213;hpb=2ec979376a461aa861afae9328230144ae4e06b3 diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 72da5b9..1b52c1e 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -143,6 +143,7 @@ struct _ModestHeaderViewPrivate { /* Filter tree model */ gchar **hidding_ids; guint n_selected; + GtkTreeRowReference *autoselect_reference; gint sort_colid[2][TNY_FOLDER_TYPE_NUM]; gint sort_type[2][TNY_FOLDER_TYPE_NUM]; @@ -380,8 +381,10 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn g_object_set_data (G_OBJECT (renderer_recpt_box), "date-renderer", renderer_compact_date_or_status); g_object_set (G_OBJECT (renderer_subject_box), "yalign", 1.0, NULL); +#ifdef MODEST_PLATFORM_MAEMO gtk_cell_renderer_set_fixed_size (renderer_subject_box, -1, 32); gtk_cell_renderer_set_fixed_size (renderer_recpt_box, -1, 32); +#endif g_object_set (G_OBJECT (renderer_recpt_box), "yalign", 0.0, NULL); g_object_set(G_OBJECT(renderer_header), "ellipsize", PANGO_ELLIPSIZE_END, @@ -403,9 +406,15 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn g_object_set (G_OBJECT (renderer_attach), "yalign", 0.0, NULL); +#ifdef MODEST_PLATFORM_MAEMO gtk_cell_renderer_set_fixed_size (renderer_attach, 32, 26); gtk_cell_renderer_set_fixed_size (renderer_priority, 32, 26); gtk_cell_renderer_set_fixed_size (renderer_compact_header, -1, 64); +#else + gtk_cell_renderer_set_fixed_size (renderer_attach, 16, 16); + gtk_cell_renderer_set_fixed_size (renderer_priority, 16, 16); + /* gtk_cell_renderer_set_fixed_size (renderer_compact_header, -1, 64); */ +#endif remove_all_columns (self); @@ -562,6 +571,7 @@ modest_header_view_init (ModestHeaderView *obj) priv->monitor = NULL; priv->observers_lock = g_mutex_new (); + priv->autoselect_reference = NULL; priv->status = HEADER_VIEW_INIT; priv->status_timeout = 0; @@ -646,6 +656,11 @@ modest_header_view_finalize (GObject *obj) /* Clear hidding array created by cut operation */ _clear_hidding_filter (MODEST_HEADER_VIEW (obj)); + if (priv->autoselect_reference != NULL) { + gtk_tree_row_reference_free (priv->autoselect_reference); + priv->autoselect_reference = NULL; + } + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -932,21 +947,71 @@ modest_header_view_on_expose_event(GtkTreeView *header_view, GtkTreeSelection *sel; GtkTreeModel *model; GtkTreeIter tree_iter; + ModestHeaderViewPrivate *priv; + priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view); model = gtk_tree_view_get_model(header_view); if (!model) return FALSE; sel = gtk_tree_view_get_selection(header_view); - if(!gtk_tree_selection_count_selected_rows(sel)) + if(!gtk_tree_selection_count_selected_rows(sel)) { if (gtk_tree_model_get_iter_first(model, &tree_iter)) { + GtkTreePath *tree_iter_path; /* Prevent the widget from getting the focus when selecting the first item */ + tree_iter_path = gtk_tree_model_get_path (model, &tree_iter); g_object_set(header_view, "can-focus", FALSE, NULL); gtk_tree_selection_select_iter(sel, &tree_iter); + gtk_tree_view_set_cursor (header_view, tree_iter_path, NULL, FALSE); g_object_set(header_view, "can-focus", TRUE, NULL); + if (priv->autoselect_reference) { + gtk_tree_row_reference_free (priv->autoselect_reference); + } + priv->autoselect_reference = gtk_tree_row_reference_new (model, tree_iter_path); + gtk_tree_path_free (tree_iter_path); } + } else { + if (priv->autoselect_reference != NULL) { + gboolean moved_selection = FALSE; + GtkTreePath * last_path; + if (gtk_tree_selection_count_selected_rows (sel) != 1) { + moved_selection = TRUE; + } else { + GList *rows; + + rows = gtk_tree_selection_get_selected_rows (sel, NULL); + last_path = gtk_tree_row_reference_get_path (priv->autoselect_reference); + if (gtk_tree_path_compare (last_path, (GtkTreePath *) rows->data) != 0) + moved_selection = TRUE; + g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); + g_list_free (rows); + } + if (moved_selection) { + gtk_tree_row_reference_free (priv->autoselect_reference); + priv->autoselect_reference = NULL; + } else { + + if (gtk_tree_model_get_iter_first (model, &tree_iter)) { + GtkTreePath *current_path; + current_path = gtk_tree_model_get_path (model, &tree_iter); + last_path = gtk_tree_row_reference_get_path (priv->autoselect_reference); + if (gtk_tree_path_compare (current_path, last_path) != 0) { + g_object_set(header_view, "can-focus", FALSE, NULL); + gtk_tree_selection_unselect_all (sel); + gtk_tree_selection_select_iter(sel, &tree_iter); + gtk_tree_view_set_cursor (header_view, current_path, NULL, FALSE); + g_object_set(header_view, "can-focus", TRUE, NULL); + gtk_tree_row_reference_free (priv->autoselect_reference); + priv->autoselect_reference = gtk_tree_row_reference_new (model, current_path); + } + gtk_tree_path_free (current_path); + gtk_tree_path_free (last_path); + } + } + } + } return FALSE; } @@ -981,6 +1046,9 @@ set_folder_intern_get_headers_async_cb (TnyFolder *folder, self = MODEST_HEADER_VIEW (user_data); priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + if (cancelled || err) + return; + /* Add IDLE observer (monitor) and another folder observer for new messages (self) */ g_mutex_lock (priv->observers_lock); @@ -1225,11 +1293,11 @@ refresh_folder_error_handler (ModestMailOperation *mail_op, void modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder, + gboolean refresh, RefreshAsyncUserCallback callback, gpointer user_data) { ModestHeaderViewPrivate *priv; - SetFolderHelper *info; ModestWindow *main_win; g_return_if_fail (self); @@ -1257,8 +1325,9 @@ modest_header_view_set_folder (ModestHeaderView *self, } if (folder) { - ModestMailOperation *mail_op = NULL; GtkTreeSelection *selection; + SetFolderHelper *info; + ModestMailOperation *mail_op = NULL; /* Set folder in the model */ modest_header_view_set_folder_intern (self, folder); @@ -1279,7 +1348,7 @@ modest_header_view_set_folder (ModestHeaderView *self, 0, TRUE, NULL); /* create the helper */ - info = g_malloc0 (sizeof(SetFolderHelper)); + info = g_malloc0 (sizeof (SetFolderHelper)); info->header_view = g_object_ref (self); info->cb = callback; info->user_data = user_data; @@ -1288,15 +1357,18 @@ modest_header_view_set_folder (ModestHeaderView *self, mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(main_win), refresh_folder_error_handler, NULL, NULL); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - - /* Refresh the folder asynchronously */ - modest_mail_operation_refresh_folder (mail_op, - folder, - folder_refreshed_cb, - info); - + if (refresh) { + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + /* Refresh the folder asynchronously */ + modest_mail_operation_refresh_folder (mail_op, + folder, + folder_refreshed_cb, + info); + } else { + folder_refreshed_cb (mail_op, folder, info); + } /* Free */ g_object_unref (mail_op); } else { @@ -1803,7 +1875,7 @@ on_button_press_event(GtkWidget * self, GdkEventButton * event, gpointer userdat /* If it's already opened then do not let the button-press event go on because it'll perform a message open because we're clicking on to an already selected header */ - return (already_opened) ? TRUE : FALSE; + return FALSE; } static void @@ -1890,7 +1962,7 @@ modest_header_view_clear (ModestHeaderView *self) { g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self)); - modest_header_view_set_folder (self, NULL, NULL, NULL); + modest_header_view_set_folder (self, NULL, FALSE, NULL, NULL); } void