# HG changeset patch # User Goffi # Date 1508131304 -7200 # Node ID e50aee5caf3367548af6f5a9c336906732c37370 # Parent 825608d4eaf887693136266fd93b5b6f812e2eb9 frontends (xmlui): new _xmlui_for_name attribute: _xmlui_for_name is an attribute which can be set to Label widgets to indicate the name of the linked widget. This attribute is set automatically for LabelContainer. data argument in _parseChilds is now a dict (or None) diff -r 825608d4eaf8 -r e50aee5caf33 frontends/src/tools/xmlui.py --- a/frontends/src/tools/xmlui.py Mon Oct 16 07:18:07 2017 +0200 +++ b/frontends/src/tools/xmlui.py Mon Oct 16 07:21:44 2017 +0200 @@ -368,8 +368,10 @@ @param _xmlui_parent: widget container with '_xmluiAppend' method @param current_node: element from which childs will be parsed @param wanted: list of tag names that can be present in the childs to be SàT XMLUI compliant - @param data: additionnal data which are needed in some cases + @param data(None, dict): additionnal data which are needed in some cases """ + if data is None: + data = {} for node in current_node.childNodes: if wanted and not node.nodeName in wanted: raise InvalidXMLUI('Unexpected node: [%s]' % node.nodeName) @@ -382,7 +384,7 @@ self.main_cont = _xmlui_parent if type_ == "tabs": cont = self.widget_factory.createTabsContainer(_xmlui_parent) - self._parseChilds(_xmlui_parent, node, ('tab',), cont) + self._parseChilds(_xmlui_parent, node, ('tab',), {'tabs_cont': cont}) elif type_ == "vertical": cont = self.widget_factory.createVerticalContainer(_xmlui_parent) self._parseChilds(cont, node, ('widget', 'container')) @@ -391,7 +393,7 @@ self._parseChilds(cont, node, ('widget', 'container')) elif type_ == "label": cont = self.widget_factory.createLabelContainer(_xmlui_parent) - self._parseChilds(cont, node, ('widget', 'container')) + self._parseChilds(cont, node, ('widget', 'container'), {'current_label': None}) elif type_ == "advanced_list": try: columns = int(node.getAttribute('columns')) @@ -427,20 +429,21 @@ name = node.getAttribute('name') label = node.getAttribute('label') selected = C.bool(node.getAttribute('selected') or C.BOOL_FALSE) - if not name or not isinstance(data, TabsContainer): + if not name or not 'tabs_cont' in data: raise InvalidXMLUI if self.type == 'param': self._current_category = name #XXX: awful hack because params need category and we don't keep parent - tab_cont = data + tab_cont = data['tabs_cont'] new_tab = tab_cont._xmluiAddTab(label or name, selected) self._parseChilds(new_tab, node, ('widget', 'container')) elif node.nodeName == 'row': try: index = str(data['index']) + except KeyError: + index = node.getAttribute('index') or None + else: data['index'] += 1 - except TypeError: - index = node.getAttribute('index') or None _xmlui_parent._xmluiAddRow(index) self._parseChilds(_xmlui_parent, node, ('widget', 'container')) @@ -454,10 +457,14 @@ value = node.getAttribute("value") if node.hasAttribute('value') else u'' if type_=="empty": ctrl = self.widget_factory.createEmptyWidget(_xmlui_parent) + if 'current_label' in data: + data['current_label'] = None elif type_=="text": ctrl = self.widget_factory.createTextWidget(_xmlui_parent, value) elif type_=="label": ctrl = self.widget_factory.createLabelWidget(_xmlui_parent, value) + if 'current_label' in data: + data['current_label'] = ctrl elif type_=="jid": ctrl = self.widget_factory.createJidWidget(_xmlui_parent, value) elif type_=="divider": @@ -515,8 +522,8 @@ callback = node.getAttribute("internal_callback") or None if callback: fields = [field.getAttribute('name') for field in node.getElementsByTagName("internal_field")] - data = self.getInternalCallbackData(callback, node) - ctrl._xmlui_param_internal = (callback, fields, data) + cb_data = self.getInternalCallbackData(callback, node) + ctrl._xmlui_param_internal = (callback, fields, cb_data) if type_ == 'button': ctrl._xmluiOnClick(self.onChangeInternal) else: @@ -524,6 +531,10 @@ ctrl._xmlui_name = name _xmlui_parent._xmluiAppend(ctrl) + if 'current_label' in data and not isinstance(ctrl, LabelWidget): + # this key is set in LabelContainer, when present + # we can associate the label with the widget it is labelling + data['current_label']._xmlui_for_name = name else: raise NotImplementedError(_('Unknown tag [%s]') % node.nodeName)