Changeset 47

Show
Ignore:
Timestamp:
11/06/07 17:48:45
Author:
pvanhoof
Message:

2007-11-06 Philip Van Hoof <pvanhoof@gnome.org>

        • The rows of the TMutFolderView are now a bit more nice. Code reused

from the Modest project.

        • The date-to-string function now takes into account today, and

displays just the time if we're trying to display a date/time of today.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r42 r47  
     12007-11-06  Philip Van Hoof  <pvanhoof@gnome.org> 
     2 
     3        * The rows of the TMutFolderView are now a bit more nice. Code reused 
     4        from the Modest project. 
     5        * The date-to-string function now takes into account today, and 
     6        displays just the time if we're trying to display a date/time of today. 
     7 
    182007-11-05  Philip Van Hoof  <pvanhoof@gnome.org> 
    29 
  • trunk/configure.ac

    r33 r47  
    3939po/Makefile.in 
    4040src/Makefile 
     41src/modest-widgets/Makefile 
    4142]) 
    4243 
  • trunk/src/Makefile.am

    r39 r47  
    1 INCLUDES = $(TMUT_CFLAGS) -DGNOMEDESKTOP 
     1SUBDIRS = modest-widgets . 
     2INCLUDES = $(TMUT_CFLAGS) -DGNOMEDESKTOP \ 
     3        -I$(top_srcdir)/src/modest-widgets 
    24 
    35bin_PROGRAMS = tmut 
     
    2830          
    2931 
    30 tmut_LDFLAGS = $(TMUT_LIBS) 
     32tmut_LDFLAGS = $(TMUT_LIBS) \ 
     33        $(top_builddir)/src/modest-widgets/libmodestwidgets.a 
    3134 
  • trunk/src/tmut-folder-view.c

    r40 r47  
    3535#include <tny-simple-list.h> 
    3636 
     37#include <modest-vbox-cell-renderer.h> 
     38#include <modest-hbox-cell-renderer.h> 
     39 
     40#include <string.h> 
     41 
    3742static GObjectClass *parent_class = NULL; 
    3843 
     
    396401 
    397402 
     403static void 
     404header_view_compact_header_cell_data (GtkTreeViewColumn *column,  GtkCellRenderer *renderer, 
     405                        GtkTreeModel *tree_model,  GtkTreeIter *iter,  gpointer user_data) 
     406{ 
     407        TnyHeaderFlags flags = 0; 
     408        gchar *address = NULL; 
     409        gchar *subject = NULL; 
     410        gchar *header = NULL; 
     411        time_t date; 
     412        GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, 
     413                *recipient_box, *subject_box = NULL; 
     414        TnyHeader *msg_header = NULL; 
     415        gchar *display_date = NULL, *tmp_date = NULL; 
     416        TnyHeaderFlags prio = 0; 
     417 
     418        recipient_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "recpt-box-renderer")); 
     419        subject_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "subject-box-renderer")); 
     420        subject_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "subject-renderer")); 
     421        recipient_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "recipient-renderer")); 
     422        date_or_status_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "date-renderer")); 
     423 
     424        gtk_tree_model_get (tree_model, iter, 
     425                        TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, 
     426                        TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN,  &address, 
     427                        TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, 
     428                        TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, 
     429                        TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, 
     430                        -1); 
     431 
     432        if (subject && strlen (subject)) { 
     433                gchar* escaped_subject = g_markup_escape_text (subject, -1); 
     434                g_object_set (G_OBJECT (subject_cell), "markup", 
     435                        escaped_subject, NULL); 
     436                g_free (escaped_subject); 
     437        } else  
     438                g_object_set (G_OBJECT (subject_cell), "markup", 
     439                        _("No subject"), NULL); 
     440 
     441        g_free (subject); 
     442 
     443        header = g_markup_printf_escaped ("<span size='small' foreground='#666666'>%s</span>", 
     444                        address); 
     445        g_free (address); 
     446 
     447        g_object_set (G_OBJECT (recipient_cell), 
     448                        "markup", header, NULL); 
     449        g_free (header); 
     450 
     451        header = NULL; 
     452        display_date = g_strdup_printf ("<span size='small' foreground='#666666'>%s</span>", 
     453                                        date ? _get_readable_date (date) : ""); 
     454        g_object_set (G_OBJECT (date_or_status_cell), 
     455                      "markup", display_date, 
     456                      NULL); 
     457        g_free (tmp_date); 
     458        tmp_date = NULL; 
     459        g_free (display_date); 
     460        display_date = NULL; 
     461 
     462        if (msg_header != NULL) 
     463                g_object_unref (msg_header); 
     464} 
    398465 
    399466static void 
     
    406473        GtkTreeSelection *select; 
    407474        GtkWidget *widget, *sw; 
     475 
     476        GtkCellRenderer *renderer_compact_header, *renderer_recpt_box,  
     477                *renderer_subject, *renderer_subject_box, *renderer_recpt, 
     478                *renderer_compact_date_or_status; 
    408479 
    409480        priv->account_store = NULL; 
     
    426497 
    427498        gtk_tree_view_set_headers_visible (priv->headers_treeview, FALSE); 
     499        gtk_tree_view_set_show_expanders (priv->headers_treeview, FALSE); 
     500 
    428501        gtk_tree_view_set_rules_hint (priv->headers_treeview, TRUE); 
    429502        gtk_tree_view_set_fixed_height_mode (priv->headers_treeview, TRUE); 
     
    431504        gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->headers_treeview)); 
    432505 
    433         renderer = gtk_cell_renderer_text_new (); 
    434         column = gtk_tree_view_column_new_with_attributes (_("Subject"), renderer, 
    435                         "text", TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, NULL); 
     506 
     507        renderer_compact_header = modest_vbox_cell_renderer_new (); 
     508        renderer_subject_box = modest_hbox_cell_renderer_new (); 
     509        renderer_recpt_box = modest_hbox_cell_renderer_new (); 
     510        renderer_recpt = gtk_cell_renderer_text_new (); 
     511        renderer_subject = gtk_cell_renderer_text_new (); 
     512        renderer_compact_date_or_status  = gtk_cell_renderer_text_new (); 
     513 
     514        modest_vbox_cell_renderer_append (MODEST_VBOX_CELL_RENDERER (renderer_compact_header), renderer_subject_box, FALSE); 
     515        modest_vbox_cell_renderer_append (MODEST_VBOX_CELL_RENDERER (renderer_compact_header), renderer_recpt_box, FALSE); 
     516        modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_subject_box), renderer_subject, TRUE); 
     517        modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_recpt_box), renderer_recpt, TRUE); 
     518        modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_recpt_box), renderer_compact_date_or_status, FALSE); 
     519 
     520        g_object_set_data (G_OBJECT (renderer_compact_header), "subject-box-renderer", renderer_subject_box); 
     521        g_object_set_data (G_OBJECT (renderer_compact_header), "recpt-box-renderer", renderer_recpt_box); 
     522        g_object_set_data (G_OBJECT (renderer_subject_box), "subject-renderer", renderer_subject); 
     523        g_object_set_data (G_OBJECT (renderer_recpt_box), "recipient-renderer", renderer_recpt); 
     524        g_object_set_data (G_OBJECT (renderer_recpt_box), "date-renderer", renderer_compact_date_or_status); 
     525 
     526        g_object_set (G_OBJECT (renderer_subject_box), "yalign", 0.0, NULL); 
     527        gtk_cell_renderer_set_fixed_size (renderer_subject_box, -1, 15); 
     528        gtk_cell_renderer_set_fixed_size (renderer_recpt_box, -1, 15); 
     529        g_object_set (G_OBJECT (renderer_recpt_box), "yalign", 0.0, NULL); 
     530 
     531        g_object_set (G_OBJECT (renderer_subject), 
     532                "ellipsize", PANGO_ELLIPSIZE_END, "yalign", 0.0, NULL); 
     533        g_object_set (G_OBJECT (renderer_recpt), 
     534                "ellipsize", PANGO_ELLIPSIZE_END, "yalign", 0.0, NULL); 
     535        g_object_set(G_OBJECT(renderer_compact_date_or_status), 
     536                "xalign", 0.0, "yalign", 0.0, NULL); 
     537 
     538        renderer = renderer_compact_header; 
     539 
     540        column = gtk_tree_view_column_new_with_attributes (_("Subject"), renderer, NULL); 
     541 
     542        gtk_tree_view_column_set_cell_data_func(column, renderer, header_view_compact_header_cell_data, 
     543                                NULL, NULL); 
     544 
    436545        gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 
     546        gtk_tree_view_column_set_resizable (column, FALSE); 
     547 
    437548        gtk_tree_view_append_column (GTK_TREE_VIEW(priv->headers_treeview), column); 
    438549 
  • trunk/src/tmut-main.c

    r42 r47  
    7676        return 0; 
    7777} 
     78 
     79 
     80gchar * 
     81_get_readable_date (time_t mtime) 
     82{ 
     83        time_t now; 
     84        struct tm file_time; 
     85 
     86        /**  
     87         * We reuse a static char. Now hold your breath and listen. This is not 
     88         * wrong and I'll explain why: each component that uses this function 
     89         * is called from the Gtk+ context. The Gtk+ context can never run in 
     90         * parallel with another context because Gtk+ is locked using its 
     91         * gdk_threads_enter/leave lock. This means that there's always at most 
     92         * one thread doing Gtk+ things. This means that this function does not 
     93         * have to be thread safe. And that means that we can have a static  
     94         * buffer that we'll play with. Else we could also do a pthread_once  
     95         * or something.  
     96         * 
     97         * I here the children cry things like: waaayyyy?? Well the reason is to 
     98         * avoid a malloc(). This stuff happens quite often. If we can reuse one 
     99         * buffer each time, that's fine! The GtkTreeView (if this time that is 
     100         * consumer)  makes its own copy. Same for any other Gtk+ component that 
     101         * accepts strings (like a GtkEntry or a GtkLabel). It will make its own 
     102         * copy anyway! If we are going to copy here, that's two copies rather  
     103         * than just the one copy in Gtk+ that we have no control over. 
     104         **/ 
     105 
     106        static gchar readable_date[64]; 
     107 
     108        gsize readable_date_size; 
     109        int days_now, days_then; 
     110 
     111        gmtime_r (&mtime, &file_time); 
     112        now = time (NULL);  
     113 
     114        /* The idea is that if the amount of days is not the same, we display 
     115         * the full date. Else we just display the time. Note that there's a 
     116         * hidden bug in this: days_then is the remote timezone, days_now is the 
     117         * local timezone. At some point we should fix this! */ 
     118 
     119        days_now = now / (24*60*60); 
     120        days_then = mtime / (24*60*60); 
     121 
     122        /* I think we can fix this using localtime_r */ 
     123 
     124        if (days_now == days_then) {  
     125                /* Translator: this date-format is the date format for when creating a 
     126                 * reply of a message if the date is today */ 
     127                readable_date_size = strftime (readable_date, 63, _("%X"), &file_time); 
     128        } else {  
     129                /* Translator: this date-format is the date format for when creating a 
     130                 * reply of a message if the date is not today */ 
     131                readable_date_size = strftime (readable_date, 63, _("%x"), &file_time); 
     132        } 
     133 
     134        if (readable_date_size > 0) 
     135                return readable_date; 
     136 
     137        return NULL; 
     138} 
  • trunk/src/tmut-msg-creator.c

    r46 r47  
    283283 
    284284 
    285 static gchar * 
    286 _get_readable_date (time_t file_time_raw) 
    287 { 
    288         struct tm file_time; 
    289         static gchar readable_date[64]; 
    290         gsize readable_date_size; 
    291  
    292         gmtime_r (&file_time_raw, &file_time); 
    293  
    294         /* Translator: this date-format is the date format for when creating a 
    295          * reply of a message. */ 
    296         readable_date_size = strftime (readable_date, 63, _("%Y-%m-%d, %-I:%M %p"), &file_time); 
    297  
    298         if (readable_date_size > 0) 
    299                 return readable_date; 
    300  
    301         return NULL; 
    302 } 
    303  
    304285void  
    305286tmut_msg_creator_add_attachment (TMutMsgCreator *self, TnyMimePart *part) 
  • trunk/src/tmut-shared.h

    r42 r47  
    1212extern GHashTable *send_queues; 
    1313 
     14gchar *_get_readable_date (time_t mtime); 
     15 
    1416#endif