[pygtk] Rendering arbitrary widgets in a CellRenderer
Walter Leibbrandt
walter at translate.org.za
Thu May 14 00:20:26 WST 2009
Walter Leibbrandt wrote:
> Hi,
>
> I took another swing at creating a custom cell renderer that can render
> any arbitrary widget in a TreeView. It currently works, albeit with a
> few annoyances. The source is available at
> https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/virtaal/virtaal/views/widgets/cellrendererwidget.py
>
> The widget (retrieved from the TreeView's model) is rendered by wrapping
> it in a gtk.CellEditable, which was the only way I could find to render
> arbitrary widgets. This means that the cell renderer must use the
> editable mode and that the activatable mode is of no use. So the cell is
> currently rendered in one of three states:
> * Unselected: A CellRendererText is emulatedwith the strfunc callable
> supplying the string to render.
> * Selected (not editing): When selecting a row (with the mouse or
> keyboard) the cell is empty. Neither the string or the widget is rendered.
> * Editing: When clicking on the cell (or pressing Enter on it) after it
> has been selected it enters editing mode and displays the appropriate
> widget.
>
> The problem is the second state mentioned above and that brings me to my
> actual question: How can I get CellRenderer to enter editing mode as
> soon as it is selected?
>
> I have tried testing the flags parameter (in on_render) for
> gtk.CELL_RENDERER_SELECTED and then calling self.start_editing() myself.
> I have confirmed that my on_start_editing() is indeed called, but that
> does not seem to be enough to put the cell in editing mode and show the
> widget.
>
> This is has been solved in Virtaal (the application I'm working on), but
> it involved creating a custom TreeModel implementation. This model would
> return True for get_value() calls on the (hard-coded) column number of
> the editable property, only if the internal iterator matched the
> get_value() call's parameter. This is a big hack I'd like to avoid in my
> implementation. For this implementation the CellRenderer is in
> https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/virtaal/virtaal/views/widgets/storeviewwidgets.py
> and the CellEditable is in
> https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/virtaal/virtaal/views/unitview.py
>
> Any insight would be greatly appreciated.
>
> Thanks in advance,
>
>
I've got it working with a hack, but one important problem remains: The
CellRenderer's size is calculated based on the string rendered for
unselected cells. This means that, if the widget rendered in a selected
cell needs more space than the rendered string, it is simply cut off.
The problem (as far as I can tell) seems to arise from the fact that the
widget to render in the cell has not yet been realize()d and thus has no
allocation.
So this is a call to anyone who has implemented a custom cell renderer's
do_get_size() to please take a look at the code and make any
recommendations and/or observations that might help me calculate the
correct size for the cell. The code is at
https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/virtaal/virtaal/views/widgets/cellrendererwidget.py
Thanks in advance,
--
Walter Leibbrandt Software Developer
Recent blogs:
* Conquering the CellRendererWidget
http://www.translate.org.za/blogs/walter/en/content/conquering-cellrendererwidget
More information about the pygtk
mailing list