+ // Background
+ drawable.draw_drawable(
+ get_style().fg_gc[Gtk.StateType.NORMAL],
+ background,
+ 0, 0, 0, 0,
+ allocation.width, allocation.height);
+
+ if (is_fisheye)
+ {
+ // Focus lock area
+ drawable.draw_rectangle(style.bg_gc[Gtk.StateType.ACTIVE], true,
+ 0, focus_area_start + focus_info[0].y, allocation.width/2, focus_info[focus_end - focus_first].y);
+
+ // Paint items around focus
+ Gdk.Rectangle cell_area = Gdk.Rectangle();
+ cell_area.x = 0;
+ cell_area.width = allocation.width;
+ for (int idx = 0; idx < focus_info.length; ++idx)
+ {
+ var renderer = renderers[focus_info[idx].renderer];
+ cell_area.y = focus_area_start + focus_info[idx].y;
+ cell_area.height = renderer_sizes[focus_info[idx].renderer];
+
+ Gtk.CellRendererState rflags = 0;
+ if (idx + focus_first == cur_el)
+ {
+ rflags |= Gtk.CellRendererState.SELECTED | Gtk.CellRendererState.FOCUSED;
+ drawable.draw_rectangle(style.bg_gc[Gtk.StateType.SELECTED], true,
+ cell_area.x, cell_area.y, cell_area.width, cell_area.height);
+ }
+
+ renderer.text = label_cache[idx + focus_first];
+ renderer.render((Gdk.Window*)drawable, this,
+ cell_area,
+ cell_area,
+ expose_area,
+ rflags);
+
+ //Gdk.draw_line(drawable, style.fg_gc[itemState], 0, y0, allocation.width, y0);
+ }
+ } else {
+ // Paint all items sequentially
+ var renderer = renderers[renderers.length-1];
+ Gdk.Rectangle cell_area = Gdk.Rectangle();
+ cell_area.x = 0;
+ cell_area.width = allocation.width;
+ cell_area.height = max_renderer_size;
+ for (int idx = 0; idx < label_cache.length; ++idx)
+ {
+ cell_area.y = idx * cell_area.height;
+
+ Gtk.CellRendererState rflags = 0;
+ if (idx == cur_el)
+ {
+ rflags |= Gtk.CellRendererState.SELECTED | Gtk.CellRendererState.FOCUSED;
+ drawable.draw_rectangle(style.bg_gc[Gtk.StateType.SELECTED], true,
+ cell_area.x, cell_area.y, cell_area.width, cell_area.height);
+ }
+
+ renderer.text = label_cache[idx];
+ renderer.render((Gdk.Window*)drawable, this,
+ cell_area,
+ cell_area,
+ expose_area,
+ rflags);
+ }