From: Jose Dapena Paz Date: Fri, 29 Jun 2007 16:58:46 +0000 (+0000) Subject: * src/widgets/modest-header-view-render.c: X-Git-Tag: git_migration_finished~3034 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=e8b728c2f975a5fb4e7a14d50303e94ad81d23af;ds=sidebyside * src/widgets/modest-header-view-render.c: * Added some implementation work to retrieve the send status of mails in outbox. get_status_string() obtains the proper string for a status, get_status_of_uid() should retrieve the current status trying in all send queues, the cell renderer has a specific path for the case of outbox. * As currently it does not get the proper status from the send queue, we set always "waiting". * src/widgets/modest-header-view-priv.h: * Added an enum of the types of compact cell renderer. * src/widgets/modest-header-view.c: * Pass the proper mode to the compact cell renderer (incoming, outgoing, outbox). pmo-trunk-r2502 --- diff --git a/src/widgets/modest-header-view-priv.h b/src/widgets/modest-header-view-priv.h index ad5f263..226c42d 100644 --- a/src/widgets/modest-header-view-priv.h +++ b/src/widgets/modest-header-view-priv.h @@ -60,6 +60,12 @@ void _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data); +typedef enum _ModestHeaderViewCompactHeaderMode { + MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_IN = 0, + MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUT = 1, + MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX = 2 +} ModestHeaderViewCompactHeaderMode; + G_END_DECLS #endif /* __MODEST_HEADER_VIEW_PRIV_H__ */ diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index c5384ca..5f93295 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -31,11 +31,70 @@ #include #include #include +#include +#include +#include #include #include #include #include + +void +fill_list_of_caches (gpointer key, gpointer value, gpointer userdata) +{ + GSList **send_queues = (GSList **) userdata; + *send_queues = g_slist_prepend (*send_queues, value); +} + +static ModestTnySendQueueStatus +get_status_of_uid (const gchar *uid) +{ + ModestCacheMgr *cache_mgr; + GHashTable *send_queue_cache; + GSList *send_queues = NULL, *node; + /* get_msg_status returns suspended by default, so we want to detect changes */ + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + + cache_mgr = modest_runtime_get_cache_mgr (); + send_queue_cache = modest_cache_mgr_get_cache (cache_mgr, + MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE); + + g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues); + + for (node = send_queues; node != NULL; node = g_slist_next (node)) { + ModestTnySendQueueStatus queue_status = modest_tny_send_queue_get_msg_status ( + MODEST_TNY_SEND_QUEUE (node->data), uid); + if (queue_status != MODEST_TNY_SEND_QUEUE_SUSPENDED) + status = queue_status; + break; + } + g_slist_free (send_queues); + return status; +} + +static const gchar * +get_status_string (ModestTnySendQueueStatus status) +{ + switch (status) { + case MODEST_TNY_SEND_QUEUE_WAITING: + return _("mcen_li_outbox_waiting"); + break; + case MODEST_TNY_SEND_QUEUE_SENDING: + return _("mcen_li_outbox_sending"); + break; + case MODEST_TNY_SEND_QUEUE_SUSPENDED: + return _("mcen_li_outbox_suspended"); + break; + case MODEST_TNY_SEND_QUEUE_FAILED: + return _("mcen_li_outbox_failed"); + break; + default: + return ""; + break; + } +} + static GdkPixbuf* get_pixbuf_for_flag (TnyHeaderFlags flag) { @@ -196,10 +255,11 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe TnyHeaderFlags flags; gchar *address, *subject, *header; time_t date; - gboolean is_incoming; - GtkCellRenderer *recipient_cell, *date_cell, *subject_cell, + ModestHeaderViewCompactHeaderMode header_mode; + GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, *attach_cell, *priority_cell, *recipient_box, *subject_box; + TnyHeader *msg_header; gchar *display_date = NULL, *tmp_date = NULL; recipient_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "recpt-box-renderer")); @@ -208,12 +268,11 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe subject_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "subject-renderer")); attach_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "attach-renderer")); recipient_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "recipient-renderer")); - date_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "date-renderer")); + date_or_status_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "date-renderer")); - is_incoming = GPOINTER_TO_INT(user_data); /* GPOINTER_TO_BOOLEAN is not available - * in older versions of glib...*/ + header_mode = GPOINTER_TO_INT (user_data); - if (is_incoming) + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_IN) gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &address, @@ -225,7 +284,8 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &address, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, -1); /* flags */ @@ -255,19 +315,34 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe g_free (header); set_common_flags (recipient_cell, flags); - /* in some rare cases, mail might have no Date: field. it case, - * don't show the date, instead of bogus 1/1/1970 - */ - if (date) - tmp_date = modest_text_utils_get_display_date (date); - else - tmp_date = g_strdup (""); - - display_date = g_strdup_printf ("%s", tmp_date); - g_object_set (G_OBJECT (date_cell), "markup", display_date, NULL); - g_free (tmp_date); - g_free (display_date); - set_common_flags (date_cell, flags); + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING; + const gchar *status_str = ""; + if (msg_header != NULL) { + status = get_status_of_uid (tny_header_get_message_id (msg_header)); + } + status_str = get_status_string (status); + /* TODO: for now we set the status to waiting always, we need a way to + * retrieve the current send status of a message */ + status_str = get_status_string (MODEST_TNY_SEND_QUEUE_WAITING); + display_date = g_strdup_printf("%s", status_str); + g_object_set (G_OBJECT (date_or_status_cell), "markup", display_date, NULL); + g_free (display_date); + } else { + /* in some rare cases, mail might have no Date: field. it case, + * don't show the date, instead of bogus 1/1/1970 + */ + if (date) + tmp_date = modest_text_utils_get_display_date (date); + else + tmp_date = g_strdup (""); + + display_date = g_strdup_printf ("%s", tmp_date); + g_object_set (G_OBJECT (date_or_status_cell), "markup", display_date, NULL); + g_free (tmp_date); + g_free (display_date); + } + set_common_flags (date_or_status_cell, flags); } diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index d51952e..e477ec8 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -283,7 +283,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn GtkTreeViewColumn *column=NULL; GtkTreeSelection *selection = NULL; GtkCellRenderer *renderer_msgtype,*renderer_header, - *renderer_attach, *renderer_compact_date; + *renderer_attach, *renderer_compact_date_or_status; GtkCellRenderer *renderer_compact_header, *renderer_recpt_box, *renderer_subject, *renderer_subject_box, *renderer_recpt, *renderer_priority; @@ -304,7 +304,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn renderer_subject_box = modest_hbox_cell_renderer_new (); renderer_recpt = gtk_cell_renderer_text_new (); renderer_subject = gtk_cell_renderer_text_new (); - renderer_compact_date = gtk_cell_renderer_text_new (); + renderer_compact_date_or_status = gtk_cell_renderer_text_new (); modest_vbox_cell_renderer_append (MODEST_VBOX_CELL_RENDERER (renderer_compact_header), renderer_subject_box, FALSE); g_object_set_data (G_OBJECT (renderer_compact_header), "subject-box-renderer", renderer_subject_box); @@ -318,8 +318,8 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn g_object_set_data (G_OBJECT (renderer_recpt_box), "attach-renderer", renderer_attach); modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_recpt_box), renderer_recpt, TRUE); g_object_set_data (G_OBJECT (renderer_recpt_box), "recipient-renderer", renderer_recpt); - modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_recpt_box), renderer_compact_date, FALSE); - g_object_set_data (G_OBJECT (renderer_recpt_box), "date-renderer", renderer_compact_date); + modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_recpt_box), renderer_compact_date_or_status, FALSE); + g_object_set_data (G_OBJECT (renderer_recpt_box), "date-renderer", renderer_compact_date_or_status); g_object_set(G_OBJECT(renderer_header), "ellipsize", PANGO_ELLIPSIZE_END, @@ -330,7 +330,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn g_object_set (G_OBJECT (renderer_recpt), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - g_object_set(G_OBJECT(renderer_compact_date), + g_object_set(G_OBJECT(renderer_compact_date_or_status), "xalign", 1.0, NULL); @@ -397,16 +397,18 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, FALSE, (GtkTreeCellDataFunc)_modest_header_view_compact_header_cell_data, - GINT_TO_POINTER(TRUE)); + GINT_TO_POINTER(MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_IN)); compact_column = column; break; case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT: column = get_new_column (_("Header"), renderer_compact_header, TRUE, - TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, - FALSE, - (GtkTreeCellDataFunc)_modest_header_view_compact_header_cell_data, - GINT_TO_POINTER(FALSE)); + TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, + FALSE, + (GtkTreeCellDataFunc)_modest_header_view_compact_header_cell_data, + GINT_TO_POINTER((type == TNY_FOLDER_TYPE_OUTBOX)? + MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX: + MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUT)); compact_column = column; break; @@ -443,7 +445,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn NULL); break; case MODEST_HEADER_VIEW_COLUMN_STATUS: - column = get_new_column (_("Status"), renderer_compact_date, TRUE, + column = get_new_column (_("Status"), renderer_compact_date_or_status, TRUE, TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, FALSE, (GtkTreeCellDataFunc)_modest_header_view_status_cell_data,