X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=df8f9a0038fa71a410ea195ec959c6b36ab7a4aa;hp=d4954a37c157cfc74c72985f68fa5e67fb6f4f40;hb=c7d97f3f8158d317bd5fa78fbb91277a1c3b7555;hpb=ea639af2157e18fb439eca4b8cb24d6217daa952 diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index d4954a3..df8f9a0 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -27,10 +27,12 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include #include +#include #include #include #include @@ -39,39 +41,10 @@ #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; */ -/* } */ +typedef enum { + RENDER_CELL_STYLE_DEFAULT=0, + RENDER_CELL_STYLE_GREY +} RenderCellStyle; static const gchar * get_status_string (ModestTnySendQueueStatus status) @@ -109,27 +82,35 @@ get_pixbuf_for_flag (TnyHeaderFlags flag) switch (flag) { case TNY_HEADER_FLAG_DELETED: if (G_UNLIKELY(!deleted_pixbuf)) - deleted_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_DELETED); + deleted_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_DELETED, + MODEST_ICON_SIZE_SMALL); return deleted_pixbuf; case TNY_HEADER_FLAG_SEEN: if (G_UNLIKELY(!seen_pixbuf)) - seen_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_READ); + seen_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_READ, + MODEST_ICON_SIZE_SMALL); return seen_pixbuf; case TNY_HEADER_FLAG_ATTACHMENTS: if (G_UNLIKELY(!attachments_pixbuf)) - attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH); + attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH, + MODEST_ICON_SIZE_SMALL); return attachments_pixbuf; case TNY_HEADER_FLAG_HIGH_PRIORITY: if (G_UNLIKELY(!high_pixbuf)) - high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH_PRIORITY); + high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH, + MODEST_ICON_SIZE_SMALL); return high_pixbuf; case TNY_HEADER_FLAG_LOW_PRIORITY: if (G_UNLIKELY(!low_pixbuf)) - low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW_PRIORITY); + low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW, + MODEST_ICON_SIZE_SMALL); return low_pixbuf; + case TNY_HEADER_FLAG_NORMAL_PRIORITY: + return NULL; default: if (G_UNLIKELY(!unread_pixbuf)) - unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD); + unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD, + MODEST_ICON_SIZE_SMALL); return unread_pixbuf; } } @@ -143,6 +124,36 @@ set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) NULL); } +static void +set_cell_text (GtkCellRenderer *renderer, + const gchar *text, + TnyHeaderFlags flags, + RenderCellStyle style) +{ + PangoWeight weight; + gboolean strikethrough; + + weight = (flags & TNY_HEADER_FLAG_SEEN) ? PANGO_WEIGHT_NORMAL: PANGO_WEIGHT_ULTRABOLD; + strikethrough = (flags & TNY_HEADER_FLAG_DELETED) ? TRUE:FALSE; + g_object_freeze_notify (G_OBJECT (renderer)); + g_object_set (G_OBJECT (renderer), "text", text, NULL); + if (!(flags & TNY_HEADER_FLAG_SEEN)) + g_object_set (G_OBJECT (renderer), "weight", PANGO_WEIGHT_ULTRABOLD, NULL); + if (flags & TNY_HEADER_FLAG_DELETED) + g_object_set (G_OBJECT (renderer), "strikethrough", TRUE, NULL); + switch (style) { + case RENDER_CELL_STYLE_GREY: + g_object_set (G_OBJECT (renderer), + "foreground", "#666666", + "scale", PANGO_SCALE_SMALL, + NULL); + break; + case RENDER_CELL_STYLE_DEFAULT: + break; + } + g_object_thaw_notify (G_OBJECT (renderer)); +} + void _modest_header_view_msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, @@ -198,7 +209,6 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer { TnyHeaderFlags flags; guint date, date_col; - gchar *display_date = NULL; gboolean received = GPOINTER_TO_INT(user_data); if (received) @@ -210,17 +220,17 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, date_col, &date, -1); - - display_date = modest_text_utils_get_display_date (date); - g_object_set (G_OBJECT(renderer), "text", display_date, NULL); - - set_common_flags (renderer, flags); - g_free (display_date); + + set_cell_text (renderer, modest_text_utils_get_display_date (date), + flags, RENDER_CELL_STYLE_DEFAULT); } void -_modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender) +_modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, + GtkCellRenderer *renderer, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gboolean is_sender) { TnyHeaderFlags flags; gchar *address; @@ -236,12 +246,9 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkC TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); - g_object_set (G_OBJECT(renderer), - "text", - modest_text_utils_get_display_address (address), - NULL); + modest_text_utils_get_display_address (address); /* string is changed in-place */ + set_cell_text (renderer, address, flags, RENDER_CELL_STYLE_DEFAULT); g_free (address); - set_common_flags (renderer, flags); } /* * this for both incoming and outgoing mail, depending on the the user_data @@ -252,16 +259,26 @@ void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { - TnyHeaderFlags flags, prior_flags; - gchar *address, *subject, *header; + /* Note that GtkTreeModel is a GtkTreeModelFilter. */ + + /* printf ("DEBUG: %s: tree_model gtype=%s\n", __FUNCTION__, G_OBJECT_TYPE_NAME (tree_model)); */ + + TnyHeaderFlags flags = 0; + gchar *address = NULL; + gchar *subject = NULL; time_t date; - 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, *subject_box = NULL; + TnyHeader *msg_header = NULL; + TnyHeaderFlags prio = 0; + + g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (renderer)); + g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); + recipient_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "recpt-box-renderer")); subject_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "subject-box-renderer")); priority_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "priority-renderer")); @@ -270,14 +287,15 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe recipient_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "recipient-renderer")); date_or_status_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "date-renderer")); - header_mode = GPOINTER_TO_INT (user_data); + ModestHeaderViewCompactHeaderMode header_mode = GPOINTER_TO_INT (user_data); 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, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, - TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, -1); else gtk_tree_model_get (tree_model, iter, @@ -286,10 +304,9 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, - -1); - + -1); /* flags */ - prior_flags = flags & TNY_HEADER_FLAG_PRIORITY; + /* FIXME: we might gain something by doing all the g_object_set's at once */ if (flags & TNY_HEADER_FLAG_ATTACHMENTS) g_object_set (G_OBJECT (attach_cell), "pixbuf", get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS), @@ -297,70 +314,41 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe else g_object_set (G_OBJECT (attach_cell), "pixbuf", NULL, NULL); - if (flags & TNY_HEADER_FLAG_PRIORITY) - g_object_set (G_OBJECT (priority_cell), "pixbuf", - get_pixbuf_for_flag (prior_flags), -/* get_pixbuf_for_flag (flags & TNY_HEADER_FLAG_PRIORITY), */ - NULL); - else - g_object_set (G_OBJECT (priority_cell), "pixbuf", - NULL, NULL); - header = g_markup_printf_escaped ("%s", (subject && strlen (subject)) ? subject : _("mail_va_no_subject")); - g_free (subject); - g_object_set (G_OBJECT (subject_cell), "markup", header, NULL); - g_free (header); - set_common_flags (subject_cell, flags); + if (msg_header) + prio = tny_header_get_priority (msg_header); + g_object_set (G_OBJECT (priority_cell), "pixbuf", + get_pixbuf_for_flag (prio), + NULL); + + set_cell_text (subject_cell, (subject && subject[0] != 0)?subject:_("mail_va_no_subject"), + flags, RENDER_CELL_STYLE_DEFAULT); + g_free (subject); - /* fixme: we hardcode the color to #666666; instead we should use SecundaryTextColour from the + /* FIXME: we hardcode the color to #666666; instead we should use SecondaryTextColour from the * theme (gtkrc file) */ + modest_text_utils_get_display_address (address); /* changed in-place */ + set_cell_text (recipient_cell, address, flags, RENDER_CELL_STYLE_GREY); - header = g_markup_printf_escaped ("%s", modest_text_utils_get_display_address (address)); - g_free (address); - g_object_set (G_OBJECT (recipient_cell), - "markup", header, - "foreground", "#666666", - NULL); - g_free (header); - set_common_flags (recipient_cell, flags); - if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { - ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING; + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; const gchar *status_str = ""; if (msg_header != NULL) { - /* TODO: ask send queue for msg sending status */ -/* status = get_status_of_uid (tny_header_get_message_id (msg_header)); */ - if (prior_flags == TNY_HEADER_FLAG_SUSPENDED_PRIORITY) - status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + status = modest_tny_all_send_queues_get_msg_status (msg_header); + if (status == MODEST_TNY_SEND_QUEUE_SUSPENDED) { + tny_header_set_flag (msg_header, TNY_HEADER_FLAG_SUSPENDED); + } } - 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, - "foreground", "#666666", - 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, - "foreground", "#666666", - NULL); - g_free (tmp_date); - g_free (display_date); + status_str = get_status_string (status); + set_cell_text (date_or_status_cell, status_str, flags, RENDER_CELL_STYLE_GREY); + } else { + set_cell_text (date_or_status_cell, date ? modest_text_utils_get_display_date (date) : "", + flags, RENDER_CELL_STYLE_GREY); } - set_common_flags (date_or_status_cell, flags); + + if (msg_header != NULL) + g_object_unref (msg_header); } @@ -380,8 +368,7 @@ _modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer size_str = modest_text_utils_get_display_size (size); - g_object_set (G_OBJECT(renderer), "text", size_str, NULL); - set_common_flags (renderer, flags); + set_cell_text (renderer, size_str, flags, RENDER_CELL_STYLE_DEFAULT); g_free (size_str); } @@ -391,22 +378,20 @@ _modest_header_view_status_cell_data (GtkTreeViewColumn *column, GtkCellRender GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { - TnyHeaderFlags flags, prior_flags; + TnyHeaderFlags flags; //guint status; gchar *status_str; gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); - - prior_flags = flags & TNY_HEADER_FLAG_PRIORITY; - if (prior_flags == TNY_HEADER_FLAG_SUSPENDED_PRIORITY) + + if (flags & TNY_HEADER_FLAG_SUSPENDED) status_str = g_strdup(_("mcen_li_outbox_suspended")); else status_str = g_strdup(_("mcen_li_outbox_waiting")); - g_object_set (G_OBJECT(renderer), "text", status_str, NULL); - set_common_flags (renderer, flags); + set_cell_text (renderer, status_str, flags, RENDER_CELL_STYLE_DEFAULT); g_free (status_str); }