El mi�, 03-09-2003 a las 21:34, Abel Daniel escribi�:
> Hi!
> 
> As a beginner pygtk user, I'm trying to make a TreeView which has
> multi-line cells. Each node would contain about 1-4 lines of text. If
> I were to use a gtk.CellRendererText, only 1 line would be visible,
> and the user would have to scroll horizontally to see the rest of the
> text. I want the full text to be visible, by having it wrap if it is
> more than one line.
> 
> The best solution would be using a TextView as a CellRenderer. But it
> looks like normal widgets can't be used like that. (Is there a reason
> for this? One would think that CellRenderers would be very similar to
> normal widgets.)
> 
> So I guess my best bet is making a custom CellRenderer. I thought
> something like this would work:
> 
> ---8<--------
> import pygtk
> pygtk.require('2.0')
> 
> import gtk
> import gobject
> import pango
> 
> class MyCellRenderer(gtk.GenericCellRenderer):
>     def __init__(self):
>         self.__gobject_init__()
>     def on_render(self, window, widget, background_area,
>                   cell_area, expose_area, flags):
>         context = widget.get_pango_context()
>         layout = pango.Layout(context)
>         layout.set_text(long_string)
>         layout.set_wrap(gtk.WRAP_CHAR)
>         layout.set_width(cell_area.width)
>         widget.style.paint_layout(window, gtk.STATE_NORMAL, gtk.TRUE,
>                                   cell_area, widget, 'footext',
>                                   cell_area.x, cell_area.y,
>                                   layout)
> 
>     def on_get_size(self, widget, cell_area):
>         return 0,0,100,100 # return something big enough
> 
> gobject.type_register(MyCellRenderer)
> 
> class Tree(gtk.TreeView):
>     def __init__(self):
>         self.store = gtk.ListStore(gobject.TYPE_STRING,
>                                    gobject.TYPE_PYOBJECT)
>         gtk.TreeView.__init__(self)
>         self.set_size_request(300, 200)
>         self.set_model(self.store)
>         self.set_headers_visible(gtk.TRUE)
> 
>         rend = gtk.CellRendererText()
>         column = gtk.TreeViewColumn('First', rend, text=0)
>         self.append_column(column)
> 
>         rend = MyCellRenderer()
>         column = gtk.TreeViewColumn('Second', rend)
>         self.append_column(column)        
> 
>     def insert(self, name):
>         iter = self.store.append()
>         self.store.set(iter,
>                        0, name)
> 
> long_string="""long-long string for testing asdf asdf asdf asdf adsf asdf asdf
>  asdasdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf
> """
> w = gtk.Window()
> w.set_position(gtk.WIN_POS_CENTER)
> w.connect('delete-event', gtk.mainquit)
> t = Tree()
> t.insert('baz')
> w.add(t)
> w.show_all()
> gtk.main()
> 
> ---8<-----------
> 
> The immedate problem is that layout.set_width() apparently expects
> something other than pixels. If I do layout.set_width(200000),
> get_pixel_size() will return a width of 195 pixels. I couldn't find
> anything in the documentation about the units set_width() expects or
> how to convert number of pixels to it.
> Where is this documented, and how could I handle the conversion?
> 
> Even if I somehow manage to convert pixels to this unit system, I will
> have another problem:
> I want the width of the text to adjust to the width of the TreeView
> widget. The height of the text should adjust to the amount of text in
> that given node. The problem is, that as I understand it, the
> CellRenderer has to calculate the size needed in on_get_size(). But I
> couldn't find a way to get the size of the TreeWidget (or rather, the
> size left for the cell after indentation, the little icon showing
> expandedness, etc.) in that method. cell_area is None there. I can
> access the width of the cell from on_render(), (it seems to be
> cell_area.width)  but I don't see a way to change the height of the
> cell there. 

I think you should check if cell_area is None in your on_get_size()
method because IIRC only the first time that is called it is None. I
don't know why btw.

Maybe this link can help you:

http://www.daa.com.au/pipermail/pygtk/2003-January/004239.html

It is a custom cell renderer implemented by one of the PyGTK masters

Regards

Lorenzo Gil Sanchez


_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to