Allow adding a binding to a requirement.
[0publish-gui.git] / requires.py
blob9790ba322f3213474505e0a1ef2160123284aca6
1 import rox, os
2 import gtk.glade
4 import main
5 from xmltools import *
7 from rox import g
9 from zeroinstall.zerostore import NotStored
10 from zeroinstall.injector import model
11 from zeroinstall.injector.policy import Policy
13 def get_combo_value(combo):
14 i = combo.get_active()
15 m = combo.get_model()
16 return m[i][0]
18 class Requires:
19 def __init__(self, feed_editor, parent, element = None):
20 self.feed_editor = feed_editor
21 self.element = element
23 self.widgets = gtk.glade.XML(main.gladefile, 'requires')
25 uri = self.widgets.get_widget('requires_uri')
26 stream = os.popen('0launch --list')
27 self.known_ifaces = [line.strip() for line in stream if not line.startswith('/')]
28 self.known_ifaces.sort()
29 stream.close()
31 for x in self.known_ifaces:
32 uri.append_text(x)
34 uri.connect('changed', self.update_uri)
36 self.version_element = None # Last <version> child
37 self.env_element = None # Last <environment> child
39 if element:
40 main.combo_set_text(uri, element.getAttribute('interface'))
42 for child in child_elements(element):
43 if child.namespaceURI != XMLNS_INTERFACE: continue
44 if child.localName == 'version':
45 self.version_element = child
46 elif child.localName == 'environment':
47 self.env_element = child
49 if self.version_element:
50 self.widgets.get_widget('before').set_text(self.version_element.getAttribute('before') or '')
51 self.widgets.get_widget('not_before').set_text(self.version_element.getAttribute('not-before') or '')
52 if self.env_element:
53 for x in ['name', 'insert']:
54 main.combo_set_text(self.widgets.get_widget('env_' + x), self.env_element.getAttribute(x))
55 self.widgets.get_widget('env_default').set_text(self.env_element.getAttribute('default') or '')
57 def ok():
58 self.update_element(element, self.widgets)
59 else:
60 def ok():
61 element = create_element(parent, 'requires')
62 self.update_element(element, self.widgets)
64 def resp(dialog, r):
65 if r == g.RESPONSE_OK:
66 ok()
67 self.feed_editor.update_version_model()
68 dialog.destroy()
70 dialog = self.widgets.get_widget('requires')
71 dialog.connect('response', resp)
73 def update_uri(self, combo):
74 env_insert = self.widgets.get_widget('env_insert')
75 env_insert.get_model().clear()
77 uri = combo.get_active_text()
78 if uri not in self.known_ifaces: return
80 policy = Policy(uri)
81 policy.network_use = model.network_offline
82 policy.freshness = 0
83 impls = policy.get_ranked_implementations(policy.get_interface(uri))
85 for impl in impls:
86 if impl.id.startswith('/'):
87 cached_impl = impl.id
88 else:
89 try:
90 cached_impl = main.stores.lookup(impl.id)
91 except NotStored, ex:
92 cached_impl = None
93 if cached_impl:
94 for (dirpath, dirnames, filenames) in os.walk(cached_impl):
95 for d in dirnames[:]:
96 if d in ('.svn', 'CVS'):
97 dirnames.remove(d)
98 new = dirpath[len(cached_impl) + 1:]
99 env_insert.append_text(new)
100 break
102 def update_element(self, element, widgets):
103 element.setAttribute('interface', widgets.get_widget('requires_uri').get_active_text())
105 before = widgets.get_widget('before').get_text() or None
106 not_before = widgets.get_widget('not_before').get_text() or None
108 if before: model.parse_version(before)
109 if not_before: model.parse_version(not_before)
111 if before or not_before:
112 if not self.version_element:
113 self.version_element = create_element(element, 'version')
114 set_or_remove(self.version_element, 'before', before)
115 set_or_remove(self.version_element, 'not-before', not_before)
116 elif self.version_element:
117 remove_element(self.version_element)
118 self.version_element = None
120 env_name = widgets.get_widget('env_name').get_active_text()
121 env_insert = widgets.get_widget('env_insert').get_active_text()
122 env_default = widgets.get_widget('env_default').get_text()
124 if env_name:
125 if not self.env_element:
126 self.env_element = create_element(element, 'environment')
127 self.env_element.setAttribute('name', env_name)
128 self.env_element.setAttribute('insert', env_insert)
129 set_or_remove(self.env_element, 'default', env_default)
130 elif env_insert or env_default:
131 raise Exception('Missing environment variable name!')
132 elif self.env_element:
133 remove_element(self.env_element)
134 self.env_element = None