Updating branch refs/heads/master to 6d0948be12de384ed3030250b7b6037e39f9c71c (commit) from 4e508068eb054f8102664e27025bde21f87249b2 (commit)
commit 6d0948be12de384ed3030250b7b6037e39f9c71c Author: Christian Dywan <christ...@twotoasts.de> Date: Wed May 25 01:19:46 2011 +0200 Pre-calculate size of message renderers Otherwise the treeview enforces loading of all rows which goes against lazy loading of messages. postler/postler-cellrenderertoggle.vala | 52 +++++++++++++++++++++++++------ postler/postler-messages.vala | 16 +++++++++ postler/postler.vapi | 10 ++++++ 3 files changed, 68 insertions(+), 10 deletions(-) diff --git a/postler/postler-cellrenderertoggle.vala b/postler/postler-cellrenderertoggle.vala index aed6356..ccd23ea 100644 --- a/postler/postler-cellrenderertoggle.vala +++ b/postler/postler-cellrenderertoggle.vala @@ -17,12 +17,37 @@ public class Postler.CellRendererToggle : Gtk.CellRendererToggle { } public override void get_size (Gtk.Widget widget, Gdk.Rectangle? cell_area, out int x_offset, out int y_offset, out int width, out int height) { - if (&x_offset != null) x_offset = 0; - if (&y_offset != null) - y_offset = cell_area != null ? cell_area.height / 3 : 0; - if (&width != null && &height != null) - Gtk.icon_size_lookup_for_settings (widget.get_settings (), - Gtk.IconSize.MENU, out width, out height); + + int icon_width, icon_height; + int xpad, ypad; + Gtk.icon_size_lookup_for_settings (widget.get_settings (), + Gtk.IconSize.MENU, out icon_width, out icon_height); + Gtk.cell_renderer_get_padding (this, out xpad, out ypad); + icon_width += xpad * 2; + icon_height += ypad * 2; + + if (cell_area != null) { + if (&x_offset != null) { + x_offset = (int)((widget.get_direction () == Gtk.TextDirection.RTL + ? (1.0 - xalign) : xalign) * (cell_area.width - icon_width)); + x_offset = int.max (x_offset, 0); + } + if (&y_offset != null) { + y_offset = (int)(yalign * (cell_area.height - icon_height)); + y_offset = int.max (y_offset, 0); + } + } + else { + if (&x_offset != null) + x_offset = 0; + if (&y_offset != null) + y_offset = 0; + } + + if (&width != null) + width = icon_width; + if (&height != null) + height = icon_height; } public override void render (Gdk.Window window, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, @@ -32,10 +57,7 @@ public class Postler.CellRendererToggle : Gtk.CellRendererToggle { Gdk.cairo_rectangle (context, expose_area); Gdk.cairo_rectangle (context, background_area); - int x, y; Gdk.Pixbuf? icon = null; - - window.get_pointer (out x, out y, null); /* if (expose_area.intersect (cell_area, null) */ if (Gdk.rectangle_intersect (expose_area, cell_area, null) && (flags & Gtk.CellRendererState.PRELIT) != 0 @@ -46,8 +68,18 @@ public class Postler.CellRendererToggle : Gtk.CellRendererToggle { icon = widget.render_icon (stock_id, Gtk.IconSize.MENU, null); } if (icon != null) { + Gdk.Rectangle rect; + int xpad, ypad; + get_size (widget, cell_area, + out rect.x, out rect.y, out rect.width, out rect.height); + Gtk.cell_renderer_get_padding (this, out xpad, out ypad); + rect = new Gdk.Rectangle (); + rect.x += cell_area.x + xpad; + rect.y += cell_area.y + ypad; + rect.width -= xpad * 2; + rect.height -= ypad * 2; Gdk.cairo_set_source_pixbuf (context, icon, - cell_area.x, cell_area.y + cell_area.height / 3); + rect.x, rect.y); context.fill (); } } diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala index e14eabc..cc330bf 100644 --- a/postler/postler-messages.vala +++ b/postler/postler-messages.vala @@ -203,26 +203,42 @@ public class Postler.Messages : Gtk.TreeView { drag_data_get.connect (on_drag_data_get); this.accounts = accounts; + set_fixed_height_mode (true); store = new Gtk.TreeStore (2, typeof (Message), typeof (string)); set_search_equal_func (search_inline); get_selection ().set_mode (Gtk.SelectionMode.MULTIPLE); get_selection ().changed.connect (selection_changed); + var column = new Gtk.TreeViewColumn (); + column.set_sizing (Gtk.TreeViewColumnSizing.FIXED); column.set_title (_("Flagged")); var renderer_flag = new Postler.CellRendererToggle (); column.pack_start (renderer_flag, true); column.set_cell_data_func (renderer_flag, render_flag); renderer_flag.toggled.connect (renderer_flag_toggled); insert_column (column, -1); + int cell_width, xpad; + column.cell_get_size (null, null, null, out cell_width, null); + Gtk.cell_renderer_get_padding (renderer_flag, out xpad, null); + column.set_fixed_width (cell_width + xpad * 4); + column = new Gtk.TreeViewColumn (); + column.set_sizing (Gtk.TreeViewColumnSizing.FIXED); column.set_title (_("Status")); var renderer_status = new Postler.CellRendererToggle (); column.pack_start (renderer_status, true); column.set_cell_data_func (renderer_status, render_status); renderer_status.toggled.connect (renderer_status_toggled); + insert_column (column, -1); + column.cell_get_size (null, null, null, out cell_width, null); + Gtk.cell_renderer_get_padding (renderer_flag, out xpad, null); + column.set_fixed_width (cell_width + xpad * 4); + column = new Gtk.TreeViewColumn (); + column.set_sizing (Gtk.TreeViewColumnSizing.FIXED); column.set_title (_("Subject")); var renderer_text = new Gtk.CellRendererText (); + renderer_text.set_fixed_height_from_font (2); column.pack_start (renderer_text, true); column.set_cell_data_func (renderer_text, render_subject); insert_column (column, -1); diff --git a/postler/postler.vapi b/postler/postler.vapi index 929932e..edf6461 100644 --- a/postler/postler.vapi +++ b/postler/postler.vapi @@ -28,3 +28,13 @@ namespace Gdk { out Gdk.Rectangle dest); } +[CCode (cprefix = "Gtk", lower_case_cprefix = "gtk_")] +namespace Gtk { + [CCode (cname = "gtk_cell_renderer_get_padding", cheader_filename = "gtk/gtk.h")] + public static void cell_renderer_get_padding (Gtk.CellRenderer renderer, + out int xpad, out int ypad); + [CCode (cname = "gtk_cell_renderer_get_alignment", cheader_filename = "gtk/gtk.h")] + public static void cell_renderer_get_alignment (Gtk.CellRenderer renderer, + out float xalign, out int yalign); +} + _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits