Moved treetips into zeroinstall.gtkui.
[zeroinstall/zeroinstall-rsl.git] / zeroinstall / gtkui / treetips.py
blob9008117e3885529ca7623f1558cdb42b7ff7450d
1 # Copyright (C) 2008, Thomas Leonard
2 # See the README file for details, or visit http://0install.net.
4 import time, gobject, gtk
6 class TreeTips:
7 timeout = None
8 widget = None
9 item = None
10 time = 0
12 def show(self, parent):
13 if self.timeout:
14 gobject.source_remove(self.timeout)
15 self.timeout = None
17 if self.widget:
18 self.widget.destroy()
19 self.widget = None
21 if self.item is None:
22 return
24 text = self.get_tooltip_text(self.item)
25 if not text:
26 return
28 self.widget = gtk.Window(gtk.WINDOW_POPUP)
29 self.widget.set_app_paintable(True)
30 self.widget.set_name('gtk-tooltips')
32 self.widget.connect('expose-event', self.tooltip_draw)
34 label = gtk.Label(text)
35 label.set_line_wrap(True)
36 label.set_padding(4, 2)
37 self.widget.add(label)
38 label.show()
40 w, h = self.widget.size_request()
41 if hasattr(parent, 'get_screen'):
42 screen = parent.get_screen()
43 root = screen.get_root_window()
44 else:
45 root = gtk.gdk.get_default_root_window()
46 px, py, mask = gtk.gdk.Window.get_pointer(root)
48 #m = gtk.gdk.screen_get_default().get_monitor_at_point(px, py)
50 x = px - w / 2
51 y = py + 12
53 # Test if pointer is over the tooltip window
54 if py >= y and py <= y + h:
55 y = py - h - 2
56 self.widget.move(x, y)
57 self.widget.show()
59 self.widget.connect('destroy', self.tooltip_destroyed)
60 self.time = time.time()
62 def prime(self, parent, item):
63 self.hide()
64 assert self.timeout is None
65 self.item = item
67 now = time.time()
68 if now - self.time > 2:
69 delay = 1000
70 else:
71 delay = 100
73 self.timeout = gobject.timeout_add(delay, lambda: self.show(parent))
75 def tooltip_draw(self, widget, ev):
76 widget.window.draw_rectangle(widget.style.fg_gc[widget.state],
77 False, 0, 0,
78 widget.allocation.width - 1,
79 widget.allocation.height - 1)
81 def tooltip_destroyed(self, widget):
82 pass
84 def hide(self):
85 self.item = None
86 self.show(None)
88 def get_tooltip_text(self, item):
89 "Override in subclasses."
90 return str(item)