core (XMLUI), frontends: advancedListContainer part 2:

This commit is contained in:
Goffi 2014-02-04 18:21:51 +01:00
commit 18aeb3a6aa

View file

@ -177,6 +177,10 @@ class XMLUI(object):
self._main_cont = None
self.constructUI(xml_data)
def escape(self, name):
""" return escaped name for forms """
return u"%s%s" % (Const.SAT_FORM_PREFIX, name)
@property
def main_cont(self):
return self._main_cont
@ -220,8 +224,18 @@ class XMLUI(object):
columns = int(node.getAttribute('columns'))
except (TypeError, ValueError):
raise DataError("Invalid columns")
cont = self.widget_factory.createAdvancedListContainer(parent, columns)
self._parseChilds(cont, node, ('row',))
selectable = node.getAttribute('selectable') or 'no'
auto_index = node.getAttribute('auto_index') == 'true'
data = {'index': 0} if auto_index else None
cont = self.widget_factory.createAdvancedListContainer(parent, columns, selectable)
callback_id = node.getAttribute("callback") or None
if callback_id is not None:
if selectable == 'no':
raise ValueError("can't have selectable=='no' and callback_id at the same time")
cont._xmlui_callback_id = callback_id
cont._xmluiOnSelect(self.onAdvListSelect)
self._parseChilds(cont, node, ('row',), data)
else:
warning(_("Unknown container [%s], using default one") % type_)
cont = self.widget_factory.createVerticalContainer(parent)
@ -246,7 +260,12 @@ class XMLUI(object):
self._parseChilds(new_tab, node, ('widget', 'container'))
elif node.nodeName == 'row':
parent._xmluiAddRow()
try:
index = str(data['index'])
data['index'] += 1
except TypeError:
index = node.getAttribute('index') or None
parent._xmluiAddRow(index)
self._parseChilds(parent, node, ('widget', 'container'))
elif node.nodeName == "widget":
@ -299,11 +318,11 @@ class XMLUI(object):
try:
ctrl._xmluiOnChange(self.onParamChange)
ctrl._param_category = self._current_category
ctrl._param_name = name.split(Const.SAT_PARAM_SEPARATOR)[1]
except AttributeError:
if not isinstance(ctrl, (EmptyWidget, TextWidget)):
warning(_("No change listener on [%s]" % ctrl))
ctrl._xmlui_name = name
parent._xmluiAppend(ctrl)
else:
@ -351,6 +370,25 @@ class XMLUI(object):
assert(self.type == "param")
self.param_changed.add(ctrl)
def onAdvListSelect(self, ctrl):
data = {}
widgets = ctrl._xmluiGetSelectedWidgets()
for wid in widgets:
try:
name = self.escape(wid._xmlui_name)
value = wid._xmluiGetValue()
ret[name] = value
except AttributeError:
pass
idx = ctrl._xmluiGetSelectedIndex()
if idx is not None:
data['index'] = idx
callback_id = ctrl._xmlui_callback_id
if callback_id is None:
warning(_("No callback_id found"))
return
self.host.launchAction(callback_id, data, profile_key = self.host.profile)
def onButtonPress(self, button):
""" Called when an XMLUI button is clicked
Launch the action associated to the button
@ -360,11 +398,12 @@ class XMLUI(object):
callback_id, fields = button._xmlui_param_id
data = {}
for field in fields:
escaped = self.escape(field)
ctrl = self.ctrl_list[field]
if isinstance(ctrl['control'], ListWidget):
data[field] = u'\t'.join(ctrl['control']._xmluiGetSelected())
data[escaped] = u'\t'.join(ctrl['control']._xmluiGetSelected())
else:
data[field] = ctrl['control']._xmluiGetValue()
data[escaped] = ctrl['control']._xmluiGetValue()
self.host.launchAction(callback_id, data, profile_key = self.host.profile)
def onFormSubmitted(self, ignore=None):
@ -374,7 +413,7 @@ class XMLUI(object):
"""
selected_values = []
for ctrl_name in self.ctrl_list:
escaped = u"%s%s" % (Const.SAT_FORM_PREFIX, ctrl_name)
escaped = self.escape(ctrl_name)
ctrl = self.ctrl_list[ctrl_name]
if isinstance(ctrl['control'], ListWidget):
selected_values.append((escaped, u'\t'.join(ctrl['control']._xmluiGetSelectedValues())))
@ -407,6 +446,7 @@ class XMLUI(object):
value = u'\t'.join(ctrl._xmluiGetSelectedValues())
else:
value = ctrl._xmluiGetValue()
self.host.bridge.setParam(ctrl._param_name, value, ctrl._param_category,
param_name = ctr._xmlui_name.split(Const.SAT_PARAM_SEPARATOR)[1]
self.host.bridge.setParam(param_name, value, ctrl._param_category,
profile_key=self.host.profile)
self._xmluiClose()