# License: Public Domain
# Original Author: John Finlay <finlay at moeraki.com>
# http://www.daa.com.au/pipermail/pygtk/2004-September/008685.html

import gtk
import gobject
import pygtk
pygtk.require('2.0')


PAD = 3


class PixbufTextCellRenderer(gtk.GenericCellRenderer):

    __gproperties__ = {
        "pixbuf": (gobject.TYPE_PYOBJECT, "Pixbuf",
                   "Pixbuf image", gobject.PARAM_READWRITE),
        "text": (gobject.TYPE_STRING, "Text", "Text string", None,
                 gobject.PARAM_READWRITE),
        'background': (gtk.gdk.Color, 'Background',
                       'The background color', gobject.PARAM_READWRITE)
    }

    def __init__(self):
        self.__gobject_init__()
        self.prend = gtk.CellRendererPixbuf()
        self.trend = gtk.CellRendererText()
        self.percent = 0

    def do_set_property(self, pspec, value):
        setattr(self, pspec.name, value)

    def do_get_property(self, pspec):
        return getattr(self, pspec.name)

    def update_properties(self):
        self.trend.set_property('text', self.get_property('text'))
        self.prend.set_property('pixbuf', self.get_property('pixbuf'))
        self.prend.set_property('cell-background-gdk',
                                self.get_property('background'))
        return

    def on_render(self, window, widget, background_area,
                  cell_area, expose_area, flags):
        self.update_properties()
        # ypad = self.get_property('ypad')
        px, py, pw, ph = self.prend.get_size(widget, cell_area)
        px += cell_area.x
        prect = (px, cell_area.y, pw, ph)
        tx, ty, tw, th = self.trend.get_size(widget, cell_area)
        tx = cell_area.x + (cell_area.width - tw) / 2
        ty = cell_area.y + ph + PAD
        trect = (tx, ty, tw, th)
        self.prend.render(window, widget, background_area, prect,
                          expose_area, flags)
        self.trend.render(window, widget, background_area, trect,
                          expose_area, flags)
        return

    def on_get_size(self, widget, cell_area):
        self.update_properties()
        xpad = self.get_property("xpad")
        ypad = self.get_property("ypad")
        xoff, yoff, width, height = self.trend.get_size(widget, cell_area)
        pxoff, pyoff, pwidth, pheight = self.prend.get_size(widget, cell_area)
        height += pheight + PAD + ypad
        width = max(width, pwidth) + xpad * 2
        return xoff, yoff, width, height

gobject.type_register(PixbufTextCellRenderer)