Changeset 47
- Timestamp:
- 11/06/07 17:48:45
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/configure.ac (modified) (1 diff)
- trunk/src/Makefile.am (modified) (2 diffs)
- trunk/src/modest-widgets (added)
- trunk/src/modest-widgets/Makefile.am (added)
- trunk/src/modest-widgets/README (added)
- trunk/src/modest-widgets/modest-hbox-cell-renderer.c (added)
- trunk/src/modest-widgets/modest-hbox-cell-renderer.h (added)
- trunk/src/modest-widgets/modest-vbox-cell-renderer.c (added)
- trunk/src/modest-widgets/modest-vbox-cell-renderer.h (added)
- trunk/src/tmut-folder-view.c (modified) (5 diffs)
- trunk/src/tmut-main.c (modified) (1 diff)
- trunk/src/tmut-msg-creator.c (modified) (1 diff)
- trunk/src/tmut-shared.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r42 r47 1 2007-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 1 8 2007-11-05 Philip Van Hoof <pvanhoof@gnome.org> 2 9 trunk/configure.ac
r33 r47 39 39 po/Makefile.in 40 40 src/Makefile 41 src/modest-widgets/Makefile 41 42 ]) 42 43 trunk/src/Makefile.am
r39 r47 1 INCLUDES = $(TMUT_CFLAGS) -DGNOMEDESKTOP 1 SUBDIRS = modest-widgets . 2 INCLUDES = $(TMUT_CFLAGS) -DGNOMEDESKTOP \ 3 -I$(top_srcdir)/src/modest-widgets 2 4 3 5 bin_PROGRAMS = tmut … … 28 30 29 31 30 tmut_LDFLAGS = $(TMUT_LIBS) 32 tmut_LDFLAGS = $(TMUT_LIBS) \ 33 $(top_builddir)/src/modest-widgets/libmodestwidgets.a 31 34 trunk/src/tmut-folder-view.c
r40 r47 35 35 #include <tny-simple-list.h> 36 36 37 #include <modest-vbox-cell-renderer.h> 38 #include <modest-hbox-cell-renderer.h> 39 40 #include <string.h> 41 37 42 static GObjectClass *parent_class = NULL; 38 43 … … 396 401 397 402 403 static void 404 header_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 } 398 465 399 466 static void … … 406 473 GtkTreeSelection *select; 407 474 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; 408 479 409 480 priv->account_store = NULL; … … 426 497 427 498 gtk_tree_view_set_headers_visible (priv->headers_treeview, FALSE); 499 gtk_tree_view_set_show_expanders (priv->headers_treeview, FALSE); 500 428 501 gtk_tree_view_set_rules_hint (priv->headers_treeview, TRUE); 429 502 gtk_tree_view_set_fixed_height_mode (priv->headers_treeview, TRUE); … … 431 504 gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->headers_treeview)); 432 505 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 436 545 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 546 gtk_tree_view_column_set_resizable (column, FALSE); 547 437 548 gtk_tree_view_append_column (GTK_TREE_VIEW(priv->headers_treeview), column); 438 549 trunk/src/tmut-main.c
r42 r47 76 76 return 0; 77 77 } 78 79 80 gchar * 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 283 283 284 284 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 a295 * 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 304 285 void 305 286 tmut_msg_creator_add_attachment (TMutMsgCreator *self, TnyMimePart *part) trunk/src/tmut-shared.h
r42 r47 12 12 extern GHashTable *send_queues; 13 13 14 gchar *_get_readable_date (time_t mtime); 15 14 16 #endif
