Updates for changes in injector.
[zeroinstall.git] / iface_browser.py
blob719a23ebfab986a87a519a822f71b85ff166355f
1 import gtk
3 from model import Interface
4 import properties
5 import reader
6 from policy import policy
8 class InterfaceBrowser(gtk.ScrolledWindow):
9 model = None
10 root = None
11 edit_properties = None
13 INTERFACE = 0
14 INTERFACE_NAME = 1
15 VERSION = 2
16 SUMMARY = 3
18 def __init__(self, root):
19 assert isinstance(root, Interface)
20 self.root = root
21 self.edit_properties = gtk.Action('edit_properties',
22 'Interface Properties...',
23 'Set which implementation of this interface to use.',
24 gtk.STOCK_PROPERTIES)
25 self.edit_properties.set_property('sensitive', False)
27 gtk.ScrolledWindow.__init__(self)
28 self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
29 self.set_shadow_type(gtk.SHADOW_IN)
31 self.model = gtk.TreeStore(object, str, str, str)
32 self.tree_view = tree_view = gtk.TreeView(self.model)
34 text = gtk.CellRendererText()
36 column = gtk.TreeViewColumn(_('Interface'), text,
37 text = InterfaceBrowser.INTERFACE_NAME)
38 tree_view.append_column(column)
40 column = gtk.TreeViewColumn(_('Version'), text,
41 text = InterfaceBrowser.VERSION)
42 tree_view.append_column(column)
44 column = gtk.TreeViewColumn(_('Description'), text,
45 text = InterfaceBrowser.SUMMARY)
46 tree_view.append_column(column)
48 self.add(tree_view)
49 tree_view.show()
51 tree_view.set_enable_search(True)
53 selection = tree_view.get_selection()
55 def sel_changed(sel):
56 store, iter = sel.get_selected()
57 self.edit_properties.set_property('sensitive', iter != None)
58 selection.connect('changed', sel_changed)
60 def button_press(tree_view, bev):
61 if bev.button != 1 or bev.type != gtk.gdk._2BUTTON_PRESS:
62 return False
63 pos = tree_view.get_path_at_pos(int(bev.x), int(bev.y))
64 if not pos:
65 return False
66 path, col, x, y = pos
67 properties.edit(self.model[path][InterfaceBrowser.INTERFACE])
68 tree_view.connect('button-press-event', button_press)
70 def edit_selected(action):
71 store, iter = selection.get_selected()
72 assert iter
73 properties.edit(self.model[iter][InterfaceBrowser.INTERFACE])
74 self.edit_properties.connect('activate', edit_selected)
76 self.connect('destroy', lambda s: policy.watchers.remove(self.build_tree))
77 policy.watchers.append(self.build_tree)
79 policy.recalculate()
81 def build_tree(self):
82 self.model.clear()
83 parent = None
84 def add_node(parent, iface):
85 iter = self.model.append(parent)
86 self.model[iter][InterfaceBrowser.INTERFACE] = iface
87 self.model[iter][InterfaceBrowser.INTERFACE_NAME] = iface.get_name()
88 self.model[iter][InterfaceBrowser.SUMMARY] = iface.summary
90 impl = policy.implementation.get(iface, None)
91 if impl:
92 self.model[iter][InterfaceBrowser.VERSION] = impl.get_version()
93 for child in impl.dependencies.values():
94 add_node(iter, policy.get_interface(child.interface))
95 else:
96 self.model[iter][InterfaceBrowser.VERSION] = '(choose)'
97 add_node(None, self.root)
98 self.tree_view.expand_all()