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
This commit is contained in:
Goffi 2010-06-23 17:26:21 +08:00
commit 923d2cd145
2 changed files with 80 additions and 12 deletions

View file

@ -29,6 +29,7 @@ from logging import debug, info, error
import pdb
from twisted.internet import defer
from twisted.words.protocols.jabber import jid
from tools.xml_tools import paramsXml2xmlUI
SAVEFILE_PARAM_XML="/param" #xml parameters template
SAVEFILE_PARAM_DATA="/param" #individual & general parameters; _ind and _gen suffixes will be added
@ -281,6 +282,14 @@ class Param():
return prof_xml
def getParamsUI(self, profile_key='@DEFAULT'):
"""Return a SàT XMLUI for parameters, with given profile"""
profile = self.getProfileName(profile_key)
if not profile:
error(_("Asking params for inexistant profile"))
return ""
param_xml = self.getParams(profile)
return paramsXml2xmlUI(param_xml)
def getParams(self, profile_key='@DEFAULT@'):
"""Construct xml for asked profile
@ -618,8 +627,11 @@ class Memory:
def getParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
return self.params.getParamA(name, category, attr, profile_key)
def getParams(self):
return self.params.getParams()
def getParamsUI(self, profile_key='@DEFAULT@'):
return self.params.getParamsUI(profile_key)
def getParams(self, profile_key='@DEFAULT@'):
return self.params.getParams(profile_key)
def getParamsForCategory(self, category, profile_key='@DEFAULT@'):
return self.params.getParamsForCategory(category, profile_key)

View file

@ -30,13 +30,12 @@ import pdb
def dataForm2xml(form):
"""Take a data form (xep-0004, Wokkel's implementation) and convert it to a SàT xml"""
form_panel = XMLUI("form", "vertical")
form_ui = XMLUI("form", "vertical")
if form.instructions:
form_panel.addText('\n'.join(form.instructions), 'instructions')
form_ui.addText('\n'.join(form.instructions), 'instructions')
form_panel.changeLayout("pairs")
form_ui.changeLayout("pairs")
for field in form.fieldList:
if field.fieldType == 'fixed':
@ -52,12 +51,12 @@ def dataForm2xml(form):
__field_type = "string"
if field.label:
form_panel.addLabel(field.label)
form_ui.addLabel(field.label)
else:
form_panel.addEmpty()
form_ui.addEmpty()
elem = form_panel.addElement(__field_type, field.var, None, field.value, [option.value for option in field.options])
return form_panel.toXml()
elem = form_ui.addElement(__field_type, field.var, None, field.value, [option.value for option in field.options])
return form_ui.toXml()
def tupleList2dataForm(values):
"""convert a list of tuples (name,value) to a wokkel submit data form"""
@ -68,6 +67,36 @@ def tupleList2dataForm(values):
return form
def paramsXml2xmlUI(xml):
"""Convert the xml for parameter to a SàT XML User Interface"""
params_doc = minidom.parseString(xml)
top = params_doc.documentElement
if top.nodeName != 'params':
error(_('INTERNAL ERROR: parameters xml not valid'))
assert(False)
param_ui = XMLUI("param", "tabs")
for category in top.getElementsByTagName("category"):
name = category.getAttribute('name')
if not name:
error(_('INTERNAL ERROR: params categories must have a name'))
assert(False)
param_ui.addCategory(name, 'pairs')
for param in category.getElementsByTagName("param"):
name = param.getAttribute('name')
if not name:
error(_('INTERNAL ERROR: params must have a name'))
assert(False)
type = param.getAttribute('type')
value = param.getAttribute('value') or None
callback = param.getAttribute('callback') or None
param_ui.addLabel(name)
param_ui.addElement(name=name, type=type, value=value, callback=callback)
return param_ui.toXml()
class XMLUI:
"""This class is used to create a user interface (form/window/parameters/etc) using SàT XML"""
@ -170,8 +199,16 @@ class XMLUI:
self.addOptions(options, elem)
if value:
elem.setAttribute('value', value)
def addButton(self, callback, name):
"""Add a button
@param callback: callback which will be called if button is pressed
@param name: name shown on the button"""
elem = self.__createElem('button', name, self.currentLayout)
elem.setAttribute('callback', callback)
def addElement(self, type, name = None, content = None, value = None, options = None):
def addElement(self, type, name = None, content = None, value = None, options = None, callback = None):
"""Convenience method to add element, the params correspond to the ones in addSomething methods"""
if type == 'empty':
self.addEmpty(name)
@ -186,6 +223,9 @@ class XMLUI:
self.addPassword(name, value)
elif type == 'list':
self.addList(options, name, value)
elif type == 'button':
assert(callback and name)
self.addButton(callback, name)
def addOptions(self, options, parent):
"""Add options to a multi-values element (e.g. list)