comparison tools/xml_tools.py @ 105:d2630fba8dfd

params to XMLUI tools - xml_tools: new paramsXml2xmlUI method, for conversion from params xml to User Interface XML - xml_tools: new addButton method - bridge: new method getParamsUI
author Goffi <goffi@goffi.org>
date Wed, 23 Jun 2010 17:26:21 +0800
parents 5458ac1380cc
children 138d82f64b6f
comparison
equal deleted inserted replaced
104:5458ac1380cc 105:d2630fba8dfd
28 28
29 29
30 def dataForm2xml(form): 30 def dataForm2xml(form):
31 """Take a data form (xep-0004, Wokkel's implementation) and convert it to a SàT xml""" 31 """Take a data form (xep-0004, Wokkel's implementation) and convert it to a SàT xml"""
32 32
33 form_panel = XMLUI("form", "vertical") 33 form_ui = XMLUI("form", "vertical")
34
35 34
36 if form.instructions: 35 if form.instructions:
37 form_panel.addText('\n'.join(form.instructions), 'instructions') 36 form_ui.addText('\n'.join(form.instructions), 'instructions')
38 37
39 form_panel.changeLayout("pairs") 38 form_ui.changeLayout("pairs")
40 39
41 for field in form.fieldList: 40 for field in form.fieldList:
42 if field.fieldType == 'fixed': 41 if field.fieldType == 'fixed':
43 __field_type = 'text' 42 __field_type = 'text'
44 elif field.fieldType == 'text-single': 43 elif field.fieldType == 'text-single':
50 else: 49 else:
51 error (u"FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType) 50 error (u"FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType)
52 __field_type = "string" 51 __field_type = "string"
53 52
54 if field.label: 53 if field.label:
55 form_panel.addLabel(field.label) 54 form_ui.addLabel(field.label)
56 else: 55 else:
57 form_panel.addEmpty() 56 form_ui.addEmpty()
58 57
59 elem = form_panel.addElement(__field_type, field.var, None, field.value, [option.value for option in field.options]) 58 elem = form_ui.addElement(__field_type, field.var, None, field.value, [option.value for option in field.options])
60 return form_panel.toXml() 59 return form_ui.toXml()
61 60
62 def tupleList2dataForm(values): 61 def tupleList2dataForm(values):
63 """convert a list of tuples (name,value) to a wokkel submit data form""" 62 """convert a list of tuples (name,value) to a wokkel submit data form"""
64 form = data_form.Form('submit') 63 form = data_form.Form('submit')
65 for value in values: 64 for value in values:
66 field = data_form.Field(var=value[0], value=value[1]) 65 field = data_form.Field(var=value[0], value=value[1])
67 form.addField(field) 66 form.addField(field)
68 67
69 return form 68 return form
69
70 def paramsXml2xmlUI(xml):
71 """Convert the xml for parameter to a SàT XML User Interface"""
72 params_doc = minidom.parseString(xml)
73 top = params_doc.documentElement
74 if top.nodeName != 'params':
75 error(_('INTERNAL ERROR: parameters xml not valid'))
76 assert(False)
77 param_ui = XMLUI("param", "tabs")
78 for category in top.getElementsByTagName("category"):
79 name = category.getAttribute('name')
80 if not name:
81 error(_('INTERNAL ERROR: params categories must have a name'))
82 assert(False)
83 param_ui.addCategory(name, 'pairs')
84 for param in category.getElementsByTagName("param"):
85 name = param.getAttribute('name')
86 if not name:
87 error(_('INTERNAL ERROR: params must have a name'))
88 assert(False)
89 type = param.getAttribute('type')
90 value = param.getAttribute('value') or None
91 callback = param.getAttribute('callback') or None
92 param_ui.addLabel(name)
93 param_ui.addElement(name=name, type=type, value=value, callback=callback)
94
95 return param_ui.toXml()
96
97
98
70 99
71 class XMLUI: 100 class XMLUI:
72 """This class is used to create a user interface (form/window/parameters/etc) using SàT XML""" 101 """This class is used to create a user interface (form/window/parameters/etc) using SàT XML"""
73 102
74 def __init__(self, panel_type, layout="vertical"): 103 def __init__(self, panel_type, layout="vertical"):
168 assert (options) 197 assert (options)
169 elem = self.__createElem('list', name, self.currentLayout) 198 elem = self.__createElem('list', name, self.currentLayout)
170 self.addOptions(options, elem) 199 self.addOptions(options, elem)
171 if value: 200 if value:
172 elem.setAttribute('value', value) 201 elem.setAttribute('value', value)
173 202
174 def addElement(self, type, name = None, content = None, value = None, options = None): 203 def addButton(self, callback, name):
204 """Add a button
205 @param callback: callback which will be called if button is pressed
206 @param name: name shown on the button"""
207 elem = self.__createElem('button', name, self.currentLayout)
208 elem.setAttribute('callback', callback)
209
210
211 def addElement(self, type, name = None, content = None, value = None, options = None, callback = None):
175 """Convenience method to add element, the params correspond to the ones in addSomething methods""" 212 """Convenience method to add element, the params correspond to the ones in addSomething methods"""
176 if type == 'empty': 213 if type == 'empty':
177 self.addEmpty(name) 214 self.addEmpty(name)
178 elif type == 'text': 215 elif type == 'text':
179 assert(content) 216 assert(content)
184 self.addString(name, value) 221 self.addString(name, value)
185 elif type == 'password': 222 elif type == 'password':
186 self.addPassword(name, value) 223 self.addPassword(name, value)
187 elif type == 'list': 224 elif type == 'list':
188 self.addList(options, name, value) 225 self.addList(options, name, value)
226 elif type == 'button':
227 assert(callback and name)
228 self.addButton(callback, name)
189 229
190 def addOptions(self, options, parent): 230 def addOptions(self, options, parent):
191 """Add options to a multi-values element (e.g. list) 231 """Add options to a multi-values element (e.g. list)
192 @param parent: multi-values element""" 232 @param parent: multi-values element"""
193 for option in options: 233 for option in options: