[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