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()
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()
31 for x
in self
.known_ifaces
:
34 uri
.connect('changed', self
.update_uri
)
36 self
.version_element
= None # Last <version> child
37 self
.env_element
= None # Last <environment> child
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 '')
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 '')
58 self
.update_element(element
, self
.widgets
)
61 element
= create_element(parent
, 'requires')
62 self
.update_element(element
, self
.widgets
)
65 if r
== g
.RESPONSE_OK
:
67 self
.feed_editor
.update_version_model()
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
81 policy
.network_use
= model
.network_offline
83 impls
= policy
.get_ranked_implementations(policy
.get_interface(uri
))
86 if impl
.id.startswith('/'):
90 cached_impl
= main
.stores
.lookup(impl
.id)
94 for (dirpath
, dirnames
, filenames
) in os
.walk(cached_impl
):
96 if d
in ('.svn', 'CVS'):
98 new
= dirpath
[len(cached_impl
) + 1:]
99 env_insert
.append_text(new
)
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()
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