Holding the pointer over an interface in the main window shows a tooltip
[zeroinstall.git] / impl_list.py
blobb191966436863edb6fc271ff8c7644045235d200
1 import gtk, gobject, os
2 from zeroinstall.injector import model, writer
3 from gui import policy, pretty_size
5 def popup_menu(bev, values, fn):
6 menu = gtk.Menu()
7 for value in values:
8 if value is None:
9 item = gtk.SeparatorMenuItem()
10 else:
11 item = gtk.MenuItem(str(value).capitalize())
12 item.connect('activate', lambda item, v=value: fn(v))
13 item.show()
14 menu.append(item)
15 menu.popup(None, None, None, bev.button, bev.time)
17 rox_filer = 'http://rox.sourceforge.net/2005/interfaces/ROX-Filer'
19 # Columns
20 ITEM = 0
21 ARCH = 1
22 STABILITY = 2
23 VERSION = 3
24 CACHED = 4
25 ID = 5
26 UNUSABLE = 6
28 class ImplementationList(gtk.ScrolledWindow):
29 tree_view = None
30 model = None
32 def __init__(self, interface):
33 gtk.ScrolledWindow.__init__(self, None, None)
34 self.set_shadow_type(gtk.SHADOW_IN)
36 self.model = gtk.ListStore(object, str, str, str,
37 gobject.TYPE_BOOLEAN, str, gobject.TYPE_BOOLEAN)
39 self.tree_view = gtk.TreeView(self.model)
41 text = gtk.CellRendererText()
42 text_strike = gtk.CellRendererText()
43 toggle = gtk.CellRendererToggle()
45 stability = gtk.TreeViewColumn('Stability', text, text = STABILITY)
47 for column in (gtk.TreeViewColumn('Version', text, text = VERSION),
48 stability,
49 gtk.TreeViewColumn('C', toggle, active = CACHED),
50 gtk.TreeViewColumn('Arch', text, text = ARCH),
51 gtk.TreeViewColumn('ID', text_strike, text = ID,
52 strikethrough = UNUSABLE)):
53 self.tree_view.append_column(column)
55 self.add(self.tree_view)
57 def button_press(tree_view, bev):
58 if bev.button not in (1, 3):
59 return False
60 pos = tree_view.get_path_at_pos(int(bev.x), int(bev.y))
61 if not pos:
62 return False
63 path, col, x, y = pos
64 impl = self.model[path][ITEM]
65 if col == stability:
66 upstream = impl.upstream_stability or model.testing
67 choices = model.stability_levels.values()
68 choices.sort()
69 choices.reverse()
70 def set(new):
71 if isinstance(new, model.Stability):
72 impl.user_stability = new
73 else:
74 impl.user_stability = None
75 writer.save_interface(interface)
76 policy.recalculate()
77 popup_menu(bev, ['Unset (%s)' % upstream, None] + choices,
78 set)
79 elif bev.button == 3 and policy.get_cached(impl):
80 def open(item):
81 os.spawnlp(os.P_WAIT, '0launch',
82 '0launch', rox_filer, '-d',
83 policy.get_implementation_path(impl))
84 popup_menu(bev, ['Open cached copy'], open)
85 self.tree_view.connect('button-press-event', button_press)
87 def get_selection(self):
88 return self.tree_view.get_selection()
90 def set_items(self, items):
91 self.model.clear()
92 for item in items:
93 new = self.model.append()
94 self.model[new][ITEM] = item
95 self.model[new][VERSION] = item.get_version()
96 self.model[new][CACHED] = policy.get_cached(item)
97 if item.user_stability:
98 self.model[new][STABILITY] = str(item.user_stability).upper()
99 else:
100 self.model[new][STABILITY] = item.upstream_stability or \
101 model.testing
102 self.model[new][ARCH] = item.arch or 'any'
103 self.model[new][ID] = item.id
104 self.model[new][UNUSABLE] = policy.is_unusable(item)
106 def clear(self):
107 self.model.clear()