1 """Add tooltips to a TreeView."""
2 # Copyright (C) 2008, Thomas Leonard
3 # See the README file for details, or visit http://0install.net.
5 import time
, gobject
, gtk
8 """This object allows you to set location-dependent tooltips on a TreeView.
9 Connect your TreeView's leave-notify-event to the L{hide} method.
10 In your motion-notify-event handler, call L{prime} when the pointer moves
11 to an area with a new message. The message will be shown after a delay.
12 If calculation of the message is expensive, override L{get_tooltip_text}
20 def show(self
, parent
):
22 gobject
.source_remove(self
.timeout
)
32 text
= self
.get_tooltip_text()
36 self
.widget
= gtk
.Window(gtk
.WINDOW_POPUP
)
37 self
.widget
.set_app_paintable(True)
38 self
.widget
.set_name('gtk-tooltips')
40 self
.widget
.connect('expose-event', self
.tooltip_draw
)
42 label
= gtk
.Label(text
)
43 label
.set_line_wrap(True)
44 label
.set_padding(4, 2)
45 self
.widget
.add(label
)
48 w
, h
= self
.widget
.size_request()
49 if hasattr(parent
, 'get_screen'):
50 screen
= parent
.get_screen()
51 root
= screen
.get_root_window()
53 root
= gtk
.gdk
.get_default_root_window()
54 px
, py
, mask
= gtk
.gdk
.Window
.get_pointer(root
)
56 #m = gtk.gdk.screen_get_default().get_monitor_at_point(px, py)
61 # Test if pointer is over the tooltip window
62 if py
>= y
and py
<= y
+ h
:
64 self
.widget
.move(x
, y
)
67 self
.widget
.connect('destroy', self
.tooltip_destroyed
)
68 self
.time
= time
.time()
70 def prime(self
, parent
, item
):
71 """Call this whenever the pointer moves to an area with a different
73 @param parent: the TreeView widget
74 @param item: the text to display
75 @see L{get_tooltip_text}"""
77 assert self
.timeout
is None
81 if now
- self
.time
> 2:
86 self
.timeout
= gobject
.timeout_add(delay
, lambda: self
.show(parent
))
88 def tooltip_draw(self
, widget
, ev
):
89 widget
.window
.draw_rectangle(widget
.style
.fg_gc
[widget
.state
],
91 widget
.allocation
.width
- 1,
92 widget
.allocation
.height
- 1)
94 def tooltip_destroyed(self
, widget
):
98 """Hide the tooltip, if any.
99 Sets L{item} to None."""
103 def get_tooltip_text(self
):
104 """"Converts the object passed to L{prime} to a string for display.
105 The default implementation just calls C{str}, but subclasses can override it.
106 @return: the tooltip message"""
107 return str(self
.item
)