X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=6cc8e9aaf676318a59ec404bee837a2dddea5310;hb=6cfc86073c3ad33565a50c70fce034e9b3fb0a96;hp=cdb94ae8589f56dfb316cd744a4d74fc7a6e5f5d;hpb=6754695adb4d12d3c2db5f7f819d2d7a78c07334;p=modest diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index cdb94ae..6cc8e9a 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -27,40 +27,86 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include #include +#include +#include +#include +#include #include #include #include +#include +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) { /* optimization */ - static GdkPixbuf *deleted_pixbuf = NULL; - static GdkPixbuf *seen_pixbuf = NULL; - static GdkPixbuf *unread_pixbuf = NULL; - static GdkPixbuf *attachments_pixbuf = NULL; + static GdkPixbuf *deleted_pixbuf = NULL; + static GdkPixbuf *seen_pixbuf = NULL; + static GdkPixbuf *unread_pixbuf = NULL; + static GdkPixbuf *attachments_pixbuf = NULL; + static GdkPixbuf *high_pixbuf = NULL; + static GdkPixbuf *low_pixbuf = NULL; 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, + 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, + 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; } } @@ -69,7 +115,7 @@ static void set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) { g_object_set (G_OBJECT(renderer), - "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800, + "weight", (flags & TNY_HEADER_FLAG_SEEN) ? PANGO_WEIGHT_NORMAL: PANGO_WEIGHT_ULTRABOLD, "strikethrough", (flags & TNY_HEADER_FLAG_DELETED) ? TRUE:FALSE, NULL); } @@ -129,7 +175,6 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer { TnyHeaderFlags flags; guint date, date_col; - gchar *display_date; gboolean received = GPOINTER_TO_INT(user_data); if (received) @@ -141,20 +186,19 @@ _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); + + g_object_set (G_OBJECT(renderer), "text", modest_text_utils_get_display_date (date), + NULL); set_common_flags (renderer, flags); - g_free (display_date); } - 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; @@ -170,11 +214,13 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkC TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); + modest_text_utils_get_display_address (address); /* string is changed in-place */ g_object_set (G_OBJECT(renderer), "text", - modest_text_utils_get_display_address (address), + address, NULL); g_free (address); + set_common_flags (renderer, flags); } /* @@ -186,43 +232,129 @@ void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { - GObject *rendobj; - TnyHeaderFlags flags; - gchar *address, *subject, *header, *display_date; + /* 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; + gchar *header = NULL; time_t date; - gboolean is_incoming; + + GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, + *attach_cell, *priority_cell, + *recipient_box, *subject_box = NULL; + TnyHeader *msg_header = NULL; + gchar *display_date = NULL, *tmp_date = NULL; + TnyHeaderFlags prio = 0; - is_incoming = GPOINTER_TO_INT(user_data); /* GPOINTER_TO_BOOLEAN is not available - * in older versions of glib...*/ - if (is_incoming) + 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")); + 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_or_status_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "date-renderer")); + + 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, 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, - -1); - - rendobj = G_OBJECT(renderer); - display_date = modest_text_utils_get_display_date (date); - header = g_strdup_printf ("%s %s\n%s", - modest_text_utils_get_display_address (address), - display_date, subject); - g_free (address); + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, + -1); + /* flags */ + /* 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), + NULL); + else + g_object_set (G_OBJECT (attach_cell), "pixbuf", + NULL, NULL); + + if (msg_header) + prio = tny_header_get_priority (msg_header); + g_object_set (G_OBJECT (priority_cell), "pixbuf", + get_pixbuf_for_flag (prio), + NULL); + + if (subject && strlen (subject)) { + gchar* escaped_subject = g_markup_escape_text (subject, -1); + g_object_set (G_OBJECT (subject_cell), "markup", + escaped_subject, NULL); + g_free (escaped_subject); + } else { + g_object_set (G_OBJECT (subject_cell), "markup", + _("mail_va_no_subject"), NULL); + } + g_free (subject); - g_free (display_date); + set_common_flags (subject_cell, flags); + + /* 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 */ + header = g_markup_printf_escaped ("%s", + address); + g_free (address); + g_object_set (G_OBJECT (recipient_cell), + "markup", header, + NULL); + g_free (header); + header = NULL; + set_common_flags (recipient_cell, flags); - g_object_set (G_OBJECT(renderer), "text", header, NULL); - set_common_flags (renderer, flags); + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; + const gchar *status_str = ""; + if (msg_header != NULL) { + 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); + 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); + display_date = NULL; + } else { + display_date = g_strdup_printf ("%s", + date ? modest_text_utils_get_display_date (date) : ""); + g_object_set (G_OBJECT (date_or_status_cell), + "markup", display_date, + NULL); + g_free (tmp_date); + tmp_date = NULL; + g_free (display_date); + display_date = NULL; + } - g_free (header); + if (msg_header != NULL) + g_object_unref (msg_header); + + set_common_flags (date_or_status_cell, flags); } @@ -247,3 +379,28 @@ _modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer g_free (size_str); } + +void +_modest_header_view_status_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, + gpointer user_data) +{ + TnyHeaderFlags flags; + //guint status; + gchar *status_str; + + gtk_tree_model_get (tree_model, iter, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, + -1); + + 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); + + g_free (status_str); + } +