Holding the pointer over an interface in the main window shows a tooltip
[zeroinstall.git] / treetips.py
blob86e6c5322a64d66e1d20aa45bc8b42db77277a21
1 import time, gobject, gtk
3 class TreeTips:
4 timeout = None
5 widget = None
6 item = None
7 time = 0
9 def show(self, parent):
10 if self.timeout:
11 gobject.source_remove(self.timeout)
12 self.timeout = None
14 if self.widget:
15 self.widget.destroy()
16 self.widget = None
18 if self.item is None:
19 return
21 self.widget = gtk.Window(gtk.WINDOW_POPUP)
22 self.widget.set_app_paintable(True)
23 self.widget.set_name('gtk-tooltips')
25 self.widget.connect('expose-event', self.tooltip_draw)
27 label = gtk.Label(self.get_tooltip_text(self.item))
28 label.set_padding(4, 2)
29 self.widget.add(label)
30 label.show()
32 w, h = self.widget.size_request()
33 screen = parent.get_screen()
34 root = screen.get_root_window()
35 px, py, mask = gtk.gdk.Window.get_pointer(root)
37 m = gtk.gdk.screen_get_default().get_monitor_at_point(px, py)
39 x = px - w / 2
40 y = py + 12
42 # Test if pointer is over the tooltip window
43 if py >= y and py <= y + h:
44 y = py - h - 2
45 self.widget.move(x, y)
46 self.widget.show()
48 self.widget.connect('destroy', self.tooltip_destroyed)
49 self.time = time.time()
51 def prime(self, parent, item):
52 if item is self.item:
53 return
55 self.hide()
56 assert self.timeout is None
57 self.item = item
59 now = time.time()
60 if now - self.time > 2:
61 delay = 1000
62 else:
63 delay = 100
65 self.timeout = gobject.timeout_add(delay, lambda: self.show(parent))
67 def tooltip_draw(self, widget, ev):
68 widget.window.draw_rectangle(widget.style.fg_gc[widget.state],
69 False, 0, 0,
70 widget.allocation.width - 1,
71 widget.allocation.height - 1)
73 def tooltip_destroyed(self, widget):
74 pass
76 def hide(self):
77 self.item = None
78 self.show(None)