diff src/tools/xml_tools.py @ 805:7c05c39156a2

core (XMLUI), frontends: advancedListContainer part 2:
author Goffi <goffi@goffi.org>
date Tue, 04 Feb 2014 18:21:51 +0100
parents 5174657b3378
children b11df74e49d2
line wrap: on
line diff
--- a/src/tools/xml_tools.py	Tue Feb 04 18:19:32 2014 +0100
+++ b/src/tools/xml_tools.py	Tue Feb 04 18:21:51 2014 +0100
@@ -75,18 +75,15 @@
     if form.instructions:
         form_ui.addText('\n'.join(form.instructions), 'instructions')
 
-    labels = [field for field in form.fieldList if field.label]
-    if labels:
-        # if there is no label, we don't need to use pairs
-        form_ui.changeContainer("pairs")
+    form_ui.changeContainer("pairs")
 
     for field in form.fieldList:
         widget_type, widget_args, widget_kwargs = _dataFormField2XMLUIData(field)
-        if labels:
-            if field.label:
-                form_ui.addLabel(field.label)
-            else:
-                form_ui.addEmpty()
+        label = field.label or field.var
+        if label:
+            form_ui.addLabel(label)
+        else:
+            form_ui.addEmpty()
 
         form_ui.addWidget(widget_type, *widget_args, **widget_kwargs)
 
@@ -151,11 +148,15 @@
     """
     return {key[len(SAT_FORM_PREFIX):]: value for key, value in xmlui_data.iteritems() if key.startswith(SAT_FORM_PREFIX)}
 
+def formEscape(name):
+    """ Return escaped name for forms """
+    return u"%s%s"  % (SAT_FORM_PREFIX, name)
+
 def XMLUIResultToElt(xmlui_data):
     """ Construct result domish.Element from XMLUI result
     @xmlui_data: data returned by frontends for XMLUI form
     """
-    form = data_form.Form('result')
+    form = data_form.Form('submit')
     form.makeFields(XMLUIResult2DataFormResult(xmlui_data))
     return form.toElement()
 
@@ -310,6 +311,11 @@
     def __init__(self, parent):
         assert(isinstance(parent, AdvancedListContainer))
         super(RowElement, self).__init__(parent.xmlui, parent)
+        if parent.next_row_idx is not None:
+            if parent.auto_index:
+                raise exceptions.DataError(_("Can't set row index if auto_index is True"))
+            self.elem.setAttribute('index', parent.next_row_idx)
+            parent.next_row_idx = None
 
 
 class HeaderElement(Element):
@@ -393,12 +399,19 @@
 class AdvancedListContainer(Container):
     type = "advanced_list"
 
-    def __init__(self, xmlui, name=None, headers=None, items=None, columns=None, parent=None):
+    def __init__(self, xmlui, callback_id=None, name=None, headers=None, items=None, columns=None, selectable = 'no', auto_index = False, parent=None):
         """Create an advanced list
         @param headers: optional headers informations
-        @param items: list of Item instances
+        @param callback_id: id of the method to call when selection is done
+        @param items: list of widgets to add (just the first row)
+        @param columns: number of columns in this table, or None to autodetect
+        @param selectable: one of:
+            'no': nothing is done
+            'single': one row can be selected
+        @param auto_index: if True, indexes will be generated by frontends, starting from 0
         @return: created element
         """
+        assert selectable in ('no', 'single')
         if not items and columns is None:
             raise DataError(_("either items or columns need do be filled"))
         if headers is None:
@@ -418,19 +431,33 @@
         if items:
             self.addItems(items)
         self.elem.setAttribute('columns', str(self._columns))
+        if callback_id is not None:
+            self.elem.setAttribute('callback', callback_id)
+        self.elem.setAttribute('selectable', selectable)
+        self.auto_index = auto_index
+        if auto_index:
+            self.elem.setAttribute('auto_index', 'true')
+        self.next_row_idx = None
 
     def addHeaders(self, headers):
         for header in headers:
             self.addHeader(header)
 
     def addHeader(self, header):
-
         pass # TODO
 
     def addItems(self, items):
         for item in items:
             self.append(item)
 
+    def setRowIndex(self, idx):
+        """ Set index for next row
+        index are returned when a row is selected, in data's "index" key
+        @param idx: string index to associate to the next row
+
+        """
+        self.next_row_idx = idx
+
     def append(self, child):
         if isinstance(child, RowElement):
             return super(AdvancedListContainer, self).append(child)