tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:

- we need to update urwid_satext to revision 79
                          - no more "value" attribute value in the "list" element, use
                            HTML-style "select" attribute in the "option" elements instead
                          - /!\ param saving do not handle multiple values yet!
This commit is contained in:
souliane 2014-04-01 21:21:13 +02:00
commit 608e2ba9fa
3 changed files with 82 additions and 39 deletions

View file

@ -102,13 +102,13 @@ class PrimitivusTextBoxWidget(xmlui.TextBoxWidget, sat_widgets.AdvancedEdit, Pri
sat_widgets.AdvancedEdit.__init__(self, edit_text=value, multiline=True)
def _xmluiGetValue(self):
return self.getValue()
return self.get_edit_text()
class PrimitivusBoolWidget(xmlui.BoolWidget, urwid.CheckBox, PrimitivusEvents):
def __init__(self, parent, state):
urwid.CheckBox.__init__(self, '', state = state)
urwid.CheckBox.__init__(self, '', state=state)
def _xmluiGetValue(self):
return "true" if self.get_state() else "false"
@ -122,12 +122,16 @@ class PrimitivusButtonWidget(xmlui.ButtonWidget, sat_widgets.CustomButton, Primi
class PrimitivusListWidget(xmlui.ListWidget, sat_widgets.List, PrimitivusEvents):
def __init__(self, parent, options, flags):
def __init__(self, parent, options, selected, flags):
sat_widgets.List.__init__(self, options=options, style=flags)
self._xmluiSelectValues(selected)
def _xmluiSelectValue(self, value):
return self.selectValue(value)
def _xmluiSelectValues(self, values):
return self.selectValues(values)
def _xmluiGetSelectedValues(self):
return [option.value for option in self.getSelectedValues()]

View file

@ -301,16 +301,16 @@ class XMLUI(object):
elif type_=="bool":
ctrl = self.widget_factory.createBoolWidget(parent, value=='true')
self.ctrl_list[name] = ({'type':type_, 'control':ctrl})
elif type_=="list":
style=[] if node.getAttribute("multi")=='yes' else ['single']
elif type_ == "list":
style = [] if node.getAttribute("multi") == 'yes' else ['single']
_options = [(option.getAttribute("value"), option.getAttribute("label")) for option in node.getElementsByTagName("option")]
ctrl = self.widget_factory.createListWidget(parent, _options, style)
ctrl._xmluiSelectValue(node.getAttribute("value"))
self.ctrl_list[name] = ({'type':type_, 'control':ctrl})
_selected = [option.getAttribute("value") for option in node.getElementsByTagName("option") if option.getAttribute('selected') == 'true']
ctrl = self.widget_factory.createListWidget(parent, _options, _selected, style)
self.ctrl_list[name] = ({'type': type_, 'control': ctrl})
elif type_=="button":
callback_id = node.getAttribute("callback")
ctrl = self.widget_factory.createButtonWidget(parent, value, self.onButtonPress)
ctrl._xmlui_param_id = (callback_id,[field.getAttribute('name') for field in node.getElementsByTagName("field_back")])
ctrl._xmlui_param_id = (callback_id, [field.getAttribute('name') for field in node.getElementsByTagName("field_back")])
else:
print(_("FIXME FIXME FIXME: widget type [%s] is not implemented") % type_)
raise NotImplementedError(_("FIXME FIXME FIXME: type [%s] is not implemented") % type_)
@ -408,7 +408,7 @@ class XMLUI(object):
escaped = self.escape(field)
ctrl = self.ctrl_list[field]
if isinstance(ctrl['control'], ListWidget):
data[escaped] = u'\t'.join(ctrl['control']._xmluiGetSelected())
data[escaped] = u'\t'.join(ctrl['control']._xmluiGetSelectedValues())
else:
data[escaped] = ctrl['control']._xmluiGetValue()
self._xmluiLaunchAction(callback_id, data)

View file

@ -122,14 +122,16 @@ class ButtonWidget(EventWidget, WixWidget, xmlui.ButtonWidget, wx.Button):
self._xmlui_click_callback(event.GetEventObject())
event.Skip()
class ListWidget(EventWidget, WixWidget, xmlui.ListWidget, wx.ListBox):
_xmlui_change_event = wx.EVT_LISTBOX
def __init__(self, parent, options, flags):
def __init__(self, parent, options, selected, flags):
styles = wx.LB_MULTIPLE if not 'single' in flags else wx.LB_SINGLE
wx.ListBox.__init__(self, parent, -1, choices=[option[1] for option in options], style=styles)
self._xmlui_attr_map = {label: value for value, label in options}
self._xmlui_proportion = 1
self._xmluiSelectValues(selected)
def _xmluiSelectValue(self, value):
try:
@ -140,6 +142,10 @@ class ListWidget(EventWidget, WixWidget, xmlui.ListWidget, wx.ListBox):
for idx in xrange(self.GetCount()):
self.SetSelection(idx, self.GetString(idx) == label)
def _xmluiSelectValues(self, values):
for value in values:
self._xmluiSelectValue(value)
def _xmluiGetSelectedValues(self):
ret = []
labels = [self.GetString(idx) for idx in self.GetSelections()]