[Xfce4-commits] <postler:master> Pre-calculate size of message renderers

Christian Dywan noreply at xfce.org
Fri May 27 20:32:04 CEST 2011


Updating branch refs/heads/master
         to 6d0948be12de384ed3030250b7b6037e39f9c71c (commit)
       from 4e508068eb054f8102664e27025bde21f87249b2 (commit)

commit 6d0948be12de384ed3030250b7b6037e39f9c71c
Author: Christian Dywan <christian at 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);
+}
+



More information about the Xfce4-commits mailing list