Updating branch refs/heads/master to 43696960ac253c24b6b061e0d6feaf032e43488a (commit) from 021bb94b348f3c2eb5573e1d320c84d174fbd4f5 (commit)
commit 43696960ac253c24b6b061e0d6feaf032e43488a Author: Christian Dywan <christ...@twotoasts.de> Date: Sat Jun 5 18:09:55 2010 +0200 Display message columns lazily in render callbacks postler/postler-messages.vala | 153 ++++++++++++++++++++++++++++------------- 1 files changed, 104 insertions(+), 49 deletions(-) diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala index 00a1182..9fbefc6 100644 --- a/postler/postler-messages.vala +++ b/postler/postler-messages.vala @@ -28,8 +28,8 @@ public class Postler.Messages : Gtk.TreeView { STATUS, ATTACHMENT, SUBJECT, + WEIGHT, FROM, - DATE, SIZE, LOCATION, TIMESTAMP @@ -47,10 +47,84 @@ public class Postler.Messages : Gtk.TreeView { selected_location = location; } + void render_subject (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, + Gtk.TreeModel model, Gtk.TreeIter iter) { + string charset, subject; + int weight = Pango.Weight.NORMAL; + var renderer = cell as Gtk.CellRendererText; + + if (!rich_rows) { + model.get (iter, Columns.SUBJECT, out subject, + Columns.WEIGHT, out weight, + -1); + renderer.text = parse_encoded (subject, out charset); + renderer.weight = weight; + return; + } + + string from; + time_t timestamp; + int64 size; + model.get (iter, Columns.SUBJECT, out subject, + Columns.WEIGHT, out weight, + Columns.SIZE, out size, + Columns.TIMESTAMP, out timestamp, + Columns.FROM, out from, + -1); + + subject = Markup.escape_text (parse_encoded (subject, out charset)); + renderer.markup = ("<span weight=\"%d\">%s</span> <small>%s</small>\n" + + "<small><tt>%s </tt></small> %s").printf ( + weight, subject, + format_size_for_display (size), + GLib.Time.local (timestamp).format ("%x %X"), + parse_address (parse_encoded (from, out charset))[0]); + } + + void render_from (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, + Gtk.TreeModel model, Gtk.TreeIter iter) { + var renderer = cell as Gtk.CellRendererText; + + if (rich_rows) + renderer.text = ""; + else { + string from; + model.get (iter, Columns.FROM, out from, -1); + string charset; + renderer.text = parse_address (parse_encoded (from, out charset))[0]; + } + } + + void render_date (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, + Gtk.TreeModel model, Gtk.TreeIter iter) { + var renderer = cell as Gtk.CellRendererText; + + if (rich_rows) + renderer.text = ""; + else { + time_t timestamp; + model.get (iter, Columns.TIMESTAMP, out timestamp, -1); + renderer.text = GLib.Time.local (timestamp).format ("%x %X"); + } + } + + void render_size (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, + Gtk.TreeModel model, Gtk.TreeIter iter) { + var renderer = cell as Gtk.CellRendererText; + + if (rich_rows) + renderer.text = ""; + else { + int64 size; + model.get (iter, Columns.SIZE, out size, -1); + renderer.text = format_size_for_display (size); + } + } + public Messages () { store = new Gtk.TreeStore (9, typeof (string), typeof (string), - typeof (string), typeof (string), typeof (string), - typeof (string), typeof (string), typeof (string), typeof (ulong)); + typeof (string), typeof (string), typeof (int), typeof (string), + typeof (int64), typeof (string), typeof (ulong)); sort = new Gtk.TreeModelSort.with_model (store); set_model (sort); set_search_column (Columns.SUBJECT); /* FIXME doesn't work atm */ @@ -62,14 +136,14 @@ public class Postler.Messages : Gtk.TreeView { new Gtk.CellRendererPixbuf (), "stock-id", Columns.STATUS, null); insert_column_with_attributes (-1, _("Attachment"), new Gtk.CellRendererPixbuf (), "stock-id", Columns.ATTACHMENT, null); - insert_column_with_attributes (-1, _("Subject"), - new Gtk.CellRendererText (), "markup", Columns.SUBJECT, null); - insert_column_with_attributes (-1, _("From"), - new Gtk.CellRendererText (), "text", Columns.FROM, null); - insert_column_with_attributes (-1, _("Date"), - new Gtk.CellRendererText (), "text", Columns.DATE, null); - insert_column_with_attributes (-1, _("Size"), - new Gtk.CellRendererText (), "text", Columns.SIZE, null); + insert_column_with_data_func (-1, _("Subject"), + new Gtk.CellRendererText (), render_subject); + insert_column_with_data_func (-1, _("From"), + new Gtk.CellRendererText (), render_from); + insert_column_with_data_func (-1, _("Date"), + new Gtk.CellRendererText (), render_date); + insert_column_with_data_func (-1, _("Size"), + new Gtk.CellRendererText (), render_size); unowned Gtk.BindingSet binding_set = Gtk.BindingSet.by_class (get_class ()); Gtk.BindingEntry.add_signal (binding_set, @@ -309,9 +383,8 @@ public class Postler.Messages : Gtk.TreeView { continue; } - string subject = _("(No subject)"); - string from = _("(Unknown)"); - string date = _("(No date)"); + string subject = null; + string from = null; time_t timestamp = 0; var contents = folder_dir.resolve_relative_path (name); try { @@ -330,14 +403,22 @@ public class Postler.Messages : Gtk.TreeView { skip = true; break; } - if (field == "subject") + if (field == "subject") { subject = parts[1].strip (); + if (from != null && timestamp != 0) + break; + } else if (field == to_or_from) { - string from_charset = null; - from = parse_encoded (parts[1], out from_charset); + from = parts[1]; + if (subject != null && timestamp != 0) + break; + } + else if (field == "date") { + var parsed = new Soup.Date.from_string (parts[1]); + timestamp = parsed != null ? (time_t)parsed.to_time_t () : 0; + if (subject != null && from != null) + break; } - else if (field == "date") - date = format_date (parts[1], now, out timestamp); } if (skip) continue; @@ -346,41 +427,15 @@ public class Postler.Messages : Gtk.TreeView { contents.get_path (), contents_error.message); } - string charset = null; - string real_subject = parse_encoded (subject, out charset); - real_subject = GLib.Markup.escape_text (real_subject); - - if (rich_rows) { - store.insert_with_values (out account_iter, null, -1, - Columns.FLAGGED, flagged, - Columns.STATUS, status, - Columns.ATTACHMENT, null, - Columns.SUBJECT, - ("<span weight=\"%d\">%s</span> <small>%s</small>\n" + - "<small><tt>%s </tt></small> %s").printf ( - font_weight, - real_subject, - format_size_for_display (info.get_size ()), - date, - parse_address (from)[0]), - Columns.FROM, null, - Columns.DATE, null, - Columns.TIMESTAMP, timestamp, - Columns.LOCATION, contents.get_path (), - -1); - continue; - } - store.insert_with_values (out account_iter, null, -1, Columns.FLAGGED, flagged, Columns.STATUS, status, Columns.ATTACHMENT, null, - Columns.SUBJECT, "<span weight=\"%d\">%s</span>".printf ( - font_weight, real_subject), - Columns.FROM, parse_address (from)[0], - Columns.DATE, date, + Columns.SUBJECT, subject != null ? subject : _("No subject"), + Columns.WEIGHT, font_weight, + Columns.FROM, from != null ? from : _("Unknown"), Columns.TIMESTAMP, timestamp, - Columns.SIZE, format_size_for_display (info.get_size ()), + Columns.SIZE, info.get_size (), Columns.LOCATION, contents.get_path (), -1); } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits