[pygtk] Coordinates of a TreeView cell
Jiri Bajer
sarimak at seznam.cz
Sat Aug 22 14:41:01 WST 2009
Sorry for the noise, I've finally managed to do the trick and posted the
result in PyGTK FAQ as #13.56 in hope my solution could be reused in the
future. See http://faq.pygtk.org/index.py?req=all#13.56 for details.
The main trick was to use cell_area instead of background_area and
forget about all tree <-> widget conversions. I've also added code for
keeping the popup window within toplevel window's allocation that
leverages x and y coords from TreeView.get_visible_rect() - they show
how much is the TreeView scrolled, (0,0) means no scroll.
Is there any good tutorial discussing the different coordinate systems
and conversions among them - with special focus on TreeView? I wasn't
able to find anything useful and discovering the right combination (even
with the official docs, tutorials and several code examples from this
list) took me several days. B-(
Jirka
On Fri, 2009-08-21 at 21:55 +0200, Jiri Bajer wrote:
> Hi,
>
> I'm trying to create my own TreeView's CellRenderer for a calendar and
> have troubles with proper positioning of popup for editing the date.
>
> My class CellRendererDate is derived from gtk.CellRendererText - during
> its do_start_editing() method I create a gtk.Dialog without decorations
> and with transient set to None containing a gtk.Calendar. I try to
> position it below the edited cell and there I got stuck.
>
> I add coordinates of cell_background argument of do_start_editing to
> TreeView's get_bin_window().get_origin() to count the position of popup
> and it works fine unless I shrink the main window and scroll the
> TreeView. Since cell_background ignores scroll the popup is shifted.
>
> I've tried to juggle with widget_to_tree_coords() and vice versa but got
> lost. Both unconverted and converted coordinates are do not fit. B-(
>
> Could anyone please give me an advice how to take the scrolling of
> TreeView into account properly? Big thanks in advance!
>
> Jiri Bajer
>
> PS: The reason I'm creating my own popup instead of using gtk.Editable
> and returning it from do_start_editing() is that:
>
> 1) gtk.Calendar does not implement gtk.Editable interface
>
> 2) gtk.Calendar is bigger than the cell and thus I'm not able to render
> it over the cells
>
> 3) I would like to reuse the same code for multiline text renderer -
> CellRendererText would inflate the cell if the text has more than one
> line
>
> Code snippet (uninteresting parts omitted):
>
> class CellRendererDate(gtk.CellRendererText):
>
> def do_start_editing(self, event, treeview, path, background_area,
> cell_area, flags):
> self.calendar_window = gtk.Dialog(parent=treeview.get_toplevel())
> ...
> self.calendar.show()
> self.calendar_window.realize()
> ...
> (tree_x, tree_y) = treeview.get_bin_window().get_origin()
> (bg_x, bg_y) = treeview.widget_to_tree_coords(background_area.x,
> background_area.y)
> self.calendar_window.move(tree_x + bg_x, tree_y + bg_y)
> ...
> return None
>
>
> _______________________________________________
> pygtk mailing list pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://faq.pygtk.org/
More information about the pygtk
mailing list