# HG changeset patch # User Edouard Tisserant <edouard.tisserant@gmail.com> # Date 1633049675 -7200 # Node ID b16e9561a3c1e6a9e4feec196203c5aab618648c # Parent 819b0bdfa705ce55fdf13432b69435667cd15ce2 SVGHMI: update generated xslt (List related changes) diff -r 819b0bdfa705 -r b16e9561a3c1 svghmi/analyse_widget.xslt --- a/svghmi/analyse_widget.xslt Fri Oct 01 02:52:25 2021 +0200 +++ b/svghmi/analyse_widget.xslt Fri Oct 01 02:54:35 2021 +0200 @@ -339,9 +339,11 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text>It needs "text" (svg:text), "box" (svg:rect), "button" (svg:*), -</xsl:text> - <xsl:text>and "highlight" (svg:rect) labeled elements. + <xsl:text>It needs "text" (svg:text or svg:use referring to svg:text), +</xsl:text> + <xsl:text>"box" (svg:rect), "button" (svg:*), and "highlight" (svg:rect) +</xsl:text> + <xsl:text>labeled elements. </xsl:text> <xsl:text> </xsl:text> @@ -353,11 +355,19 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text>When only one argument is given, and argment contains "#langs" then list of -</xsl:text> - <xsl:text>texts is automatically set to the list of human-readable languages supported -</xsl:text> - <xsl:text>by this HMI. + <xsl:text>When only one argument is given and argment contains "#langs" then list of +</xsl:text> + <xsl:text>texts is automatically set to the human-readable list of supported +</xsl:text> + <xsl:text>languages by this HMI. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>If "text" labeled element is of type svg:use and refers to a svg:text +</xsl:text> + <xsl:text>element part of a TextList widget, no argument is expected. In that case +</xsl:text> + <xsl:text>list of texts is set to TextList content. </xsl:text> </longdesc> <shortdesc> @@ -529,6 +539,30 @@ <type> <xsl:value-of select="@type"/> </type> + <longdesc> + <xsl:text>List widget is a svg:group, list items are labeled elements +</xsl:text> + <xsl:text>in that group. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>To use a List, clone (svg:use) one of the items inside the widget that +</xsl:text> + <xsl:text>expects a List. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>Positions of items are relative to each other, and they must all be in the +</xsl:text> + <xsl:text>same place. In order to make editing easier it is therefore recommanded to +</xsl:text> + <xsl:text>make stacked clones of svg elements spread nearby the list. +</xsl:text> + </longdesc> + <shortdesc> + <xsl:text>A named list of named graphical elements</xsl:text> + </shortdesc> + <arg name="listname"/> </xsl:template> <xsl:template match="widget[@type='Meter']" mode="widget_desc"> <type> @@ -634,6 +668,58 @@ <xsl:text>value to compare to labels</xsl:text> </path> </xsl:template> + <xsl:template match="widget[@type='TextList']" mode="widget_desc"> + <type> + <xsl:value-of select="@type"/> + </type> + <longdesc> + <xsl:text>TextList widget is a svg:group, list items are labeled elements +</xsl:text> + <xsl:text>in that group. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>To use a TextList, clone (svg:use) one of the items inside the widget +</xsl:text> + <xsl:text>that expects a TextList. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>In this list, (translated) text content is what matters. Nevertheless +</xsl:text> + <xsl:text>text style of the cloned item will be applied in client widget. +</xsl:text> + </longdesc> + <shortdesc> + <xsl:text>A named list of ordered texts </xsl:text> + </shortdesc> + <arg name="listname"/> + </xsl:template> + <xsl:template match="widget[@type='TextStyleList']" mode="widget_desc"> + <type> + <xsl:value-of select="@type"/> + </type> + <longdesc> + <xsl:text>TextStyleList widget is a svg:group, list items are labeled elements +</xsl:text> + <xsl:text>in that group. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>To use a TextStyleList, clone (svg:use) one of the items inside the widget +</xsl:text> + <xsl:text>that expects a TextStyleList. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>In this list, only style matters. Text content is ignored. +</xsl:text> + </longdesc> + <shortdesc> + <xsl:text>A named list of named texts</xsl:text> + </shortdesc> + <arg name="listname"/> + </xsl:template> <xsl:template match="widget[@type='ToggleButton']" mode="widget_desc"> <type> <xsl:value-of select="@type"/> diff -r 819b0bdfa705 -r b16e9561a3c1 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Fri Oct 01 02:52:25 2021 +0200 +++ b/svghmi/gen_index_xhtml.xslt Fri Oct 01 02:54:35 2021 +0200 @@ -432,6 +432,29 @@ <xsl:variable name="candidates" select="$geometry[@Id != $elt/@id]"/> <func:result select="$candidates[(@Id = $groups/@id and (func:intersect($g, .) = 9)) or (not(@Id = $groups/@id) and (func:intersect($g, .) > 0 ))]"/> </func:function> + <xsl:variable name="hmi_lists_descs" select="$parsed_widgets/widget[@type = 'List']"/> + <xsl:variable name="hmi_lists" select="$hmi_elements[@id = $hmi_lists_descs/@id]"/> + <xsl:variable name="hmi_textlists_descs" select="$parsed_widgets/widget[@type = 'TextList']"/> + <xsl:variable name="hmi_textlists" select="$hmi_elements[@id = $hmi_textlists_descs/@id]"/> + <xsl:variable name="hmi_textstylelists_descs" select="$parsed_widgets/widget[@type = 'TextStyleList']"/> + <xsl:variable name="hmi_textstylelists" select="$hmi_elements[@id = $hmi_textstylelists_descs/@id]"/> + <xsl:variable name="textstylelist_related"> + <xsl:for-each select="$hmi_textstylelists"> + <list> + <xsl:attribute name="listid"> + <xsl:value-of select="@id"/> + </xsl:attribute> + <xsl:for-each select="func:refered_elements(.)"> + <elt> + <xsl:attribute name="eltid"> + <xsl:value-of select="@id"/> + </xsl:attribute> + </elt> + </xsl:for-each> + </list> + </xsl:for-each> + </xsl:variable> + <xsl:variable name="textstylelist_related_ns" select="exsl:node-set($textstylelist_related)"/> <xsl:variable name="hmi_pages_descs" select="$parsed_widgets/widget[@type = 'Page']"/> <xsl:variable name="hmi_pages" select="$hmi_elements[@id = $hmi_pages_descs/@id]"/> <xsl:variable name="default_page"> @@ -526,9 +549,7 @@ </xsl:choose> </func:function> <xsl:variable name="required_page_elements" select="func:required_elements($hmi_pages | $keypads)/ancestor-or-self::svg:*"/> - <xsl:variable name="hmi_lists_descs" select="$parsed_widgets/widget[@type = 'List']"/> - <xsl:variable name="hmi_lists" select="$hmi_elements[@id = $hmi_lists_descs/@id]"/> - <xsl:variable name="required_list_elements" select="func:refered_elements($hmi_lists[@id = $required_page_elements/@id])"/> + <xsl:variable name="required_list_elements" select="func:refered_elements(($hmi_lists | $hmi_textlists)[@id = $required_page_elements/@id])"/> <xsl:variable name="required_elements" select="$defs | $required_list_elements | $required_page_elements"/> <xsl:variable name="discardable_elements" select="//svg:*[not(@id = $required_elements/@id)]"/> <func:function name="func:sumarized_elements"> @@ -1883,6 +1904,17 @@ </xsl:otherwise> </xsl:choose> </func:function> + <func:function name="func:reverse"> + <xsl:param name="content"/> + <xsl:choose> + <xsl:when test="count($content) > 0"> + <func:result select="func:reverse($content[position() > 1]) | $content[1]"/> + </xsl:when> + <xsl:otherwise> + <func:result select="/.."/> + </xsl:otherwise> + </xsl:choose> + </func:function> <xsl:template match="widget[@type='Animate']" mode="widget_class"> <xsl:text>class </xsl:text> <xsl:text>AnimateWidget</xsl:text> @@ -3715,9 +3747,11 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text>It needs "text" (svg:text), "box" (svg:rect), "button" (svg:*), -</xsl:text> - <xsl:text>and "highlight" (svg:rect) labeled elements. + <xsl:text>It needs "text" (svg:text or svg:use referring to svg:text), +</xsl:text> + <xsl:text>"box" (svg:rect), "button" (svg:*), and "highlight" (svg:rect) +</xsl:text> + <xsl:text>labeled elements. </xsl:text> <xsl:text> </xsl:text> @@ -3729,11 +3763,19 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text>When only one argument is given, and argment contains "#langs" then list of -</xsl:text> - <xsl:text>texts is automatically set to the list of human-readable languages supported -</xsl:text> - <xsl:text>by this HMI. + <xsl:text>When only one argument is given and argment contains "#langs" then list of +</xsl:text> + <xsl:text>texts is automatically set to the human-readable list of supported +</xsl:text> + <xsl:text>languages by this HMI. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>If "text" labeled element is of type svg:use and refers to a svg:text +</xsl:text> + <xsl:text>element part of a TextList widget, no argument is expected. In that case +</xsl:text> + <xsl:text>list of texts is set to TextList content. </xsl:text> </longdesc> <shortdesc> @@ -3759,6 +3801,8 @@ </xsl:text> <xsl:text> init() { </xsl:text> + <xsl:text> this.init_specific(); +</xsl:text> <xsl:text> this.button_elt.onclick = this.on_button_click.bind(this); </xsl:text> <xsl:text> // Save original size of rectangle @@ -3849,7 +3893,7 @@ </xsl:text> <xsl:text> // if valid selection resolve content </xsl:text> - <xsl:text> display_str = this.content[value]; + <xsl:text> display_str = gettext(this.content[value]); </xsl:text> <xsl:text> this.last_selection = value; </xsl:text> @@ -4061,7 +4105,7 @@ </xsl:text> <xsl:text> let span=spans[c]; </xsl:text> - <xsl:text> span.textContent = item; + <xsl:text> span.textContent = gettext(item); </xsl:text> <xsl:text> let sel = c; </xsl:text> @@ -4193,7 +4237,7 @@ </xsl:text> <xsl:text> }else{ </xsl:text> - <xsl:text> span.textContent = this.content[i]; + <xsl:text> span.textContent = gettext(this.content[i]); </xsl:text> <xsl:text> let sel = i; </xsl:text> @@ -4411,16 +4455,54 @@ <xsl:call-template name="defs_by_labels"> <xsl:with-param name="hmi_element" select="$hmi_element"/> <xsl:with-param name="labels"> - <xsl:text>text box button highlight</xsl:text> + <xsl:text>box button highlight</xsl:text> </xsl:with-param> </xsl:call-template> - <xsl:text> content:</xsl:text> + <xsl:variable name="text_elt" select="$hmi_element//*[@inkscape:label='text'][1]"/> + <xsl:text>init_specific: function() { +</xsl:text> <xsl:choose> <xsl:when test="count(arg) = 1 and arg[1]/@value = '#langs'"> - <xsl:text>langs</xsl:text> + <xsl:text> this.text_elt = id("</xsl:text> + <xsl:value-of select="$text_elt/@id"/> + <xsl:text>"); +</xsl:text> + <xsl:text> this.content = langs; +</xsl:text> + </xsl:when> + <xsl:when test="count(arg) = 0"> + <xsl:if test="not($text_elt[self::svg:use])"> + <xsl:message terminate="yes"> + <xsl:text>No argrument for HMI:DropDown widget id="</xsl:text> + <xsl:value-of select="$hmi_element/@id"/> + <xsl:text>" and "text" labeled element is not a svg:use element</xsl:text> + </xsl:message> + </xsl:if> + <xsl:variable name="real_text_elt" select="$result_widgets[@id = $hmi_element/@id]//*[@original=$text_elt/@id]/svg:text"/> + <xsl:text> this.text_elt = id("</xsl:text> + <xsl:value-of select="$real_text_elt/@id"/> + <xsl:text>"); +</xsl:text> + <xsl:variable name="from_list_id" select="substring-after($text_elt/@xlink:href,'#')"/> + <xsl:variable name="from_list" select="$hmi_textlists[(@id | */@id) = $from_list_id]"/> + <xsl:if test="count($from_list) = 0"> + <xsl:message terminate="yes"> + <xsl:text>HMI:DropDown widget id="</xsl:text> + <xsl:value-of select="$hmi_element/@id"/> + <xsl:text>" "text" labeled element does not point to a svg:text owned by a HMI:List widget</xsl:text> + </xsl:message> + </xsl:if> + <xsl:text> this.content = hmi_widgets["</xsl:text> + <xsl:value-of select="$from_list/@id"/> + <xsl:text>"].texts; +</xsl:text> </xsl:when> <xsl:otherwise> - <xsl:text>[ + <xsl:text> this.text_elt = id("</xsl:text> + <xsl:value-of select="$text_elt/@id"/> + <xsl:text>"); +</xsl:text> + <xsl:text> this.content = [ </xsl:text> <xsl:for-each select="arg"> <xsl:text>"</xsl:text> @@ -4428,10 +4510,36 @@ <xsl:text>", </xsl:text> </xsl:for-each> - <xsl:text> ]</xsl:text> + <xsl:text> ]; +</xsl:text> </xsl:otherwise> </xsl:choose> - <xsl:text>, + <xsl:text>} +</xsl:text> + </xsl:template> + <declarations:DropDown/> + <xsl:template match="declarations:DropDown"> + <xsl:text> +</xsl:text> + <xsl:text>/* </xsl:text> + <xsl:value-of select="local-name()"/> + <xsl:text> */ +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>function gettext(o) { +</xsl:text> + <xsl:text> if(typeof(o) == "string"){ +</xsl:text> + <xsl:text> return o; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> return svg_text_to_multiline(o); +</xsl:text> + <xsl:text>}; +</xsl:text> + <xsl:text> </xsl:text> </xsl:template> <xsl:template match="widget[@type='ForEach']" mode="widget_desc"> @@ -5116,25 +5224,6 @@ <xsl:text>.</xsl:text> </xsl:message> </xsl:template> - <xsl:variable name="hmi_textstylelists_descs" select="$parsed_widgets/widget[@type = 'TextStyleList']"/> - <xsl:variable name="hmi_textstylelists" select="$hmi_elements[@id = $hmi_textstylelists_descs/@id]"/> - <xsl:variable name="textstylelist_related"> - <xsl:for-each select="$hmi_textstylelists"> - <list> - <xsl:attribute name="listid"> - <xsl:value-of select="@id"/> - </xsl:attribute> - <xsl:for-each select="func:refered_elements(.)"> - <elt> - <xsl:attribute name="eltid"> - <xsl:value-of select="@id"/> - </xsl:attribute> - </elt> - </xsl:for-each> - </list> - </xsl:for-each> - </xsl:variable> - <xsl:variable name="textstylelist_related_ns" select="exsl:node-set($textstylelist_related)"/> <func:function name="func:json_expressions"> <xsl:param name="expressions"/> <xsl:param name="label"/> @@ -6009,6 +6098,30 @@ <type> <xsl:value-of select="@type"/> </type> + <longdesc> + <xsl:text>List widget is a svg:group, list items are labeled elements +</xsl:text> + <xsl:text>in that group. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>To use a List, clone (svg:use) one of the items inside the widget that +</xsl:text> + <xsl:text>expects a List. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>Positions of items are relative to each other, and they must all be in the +</xsl:text> + <xsl:text>same place. In order to make editing easier it is therefore recommanded to +</xsl:text> + <xsl:text>make stacked clones of svg elements spread nearby the list. +</xsl:text> + </longdesc> + <shortdesc> + <xsl:text>A named list of named graphical elements</xsl:text> + </shortdesc> + <arg name="listname"/> </xsl:template> <xsl:template match="widget[@type='List']" mode="widget_defs"> <xsl:param name="hmi_element"/> @@ -6025,25 +6138,6 @@ <xsl:text> }, </xsl:text> </xsl:template> - <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs"> - <xsl:param name="hmi_element"/> - </xsl:template> - <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs"> - <xsl:param name="hmi_element"/> - <xsl:text> styles: { -</xsl:text> - <xsl:for-each select="$hmi_element/*[@inkscape:label]"> - <xsl:variable name="style" select="func:refered_elements(.)[self::svg:text]/@style"/> - <xsl:text> </xsl:text> - <xsl:value-of select="@inkscape:label"/> - <xsl:text>: "</xsl:text> - <xsl:value-of select="$style"/> - <xsl:text>", -</xsl:text> - </xsl:for-each> - <xsl:text> }, -</xsl:text> - </xsl:template> <xsl:template match="widget[@type='Meter']" mode="widget_desc"> <type> <xsl:value-of select="@type"/> @@ -7332,6 +7426,87 @@ <xsl:text> ], </xsl:text> </xsl:template> + <xsl:template match="widget[@type='TextList']" mode="widget_desc"> + <type> + <xsl:value-of select="@type"/> + </type> + <longdesc> + <xsl:text>TextList widget is a svg:group, list items are labeled elements +</xsl:text> + <xsl:text>in that group. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>To use a TextList, clone (svg:use) one of the items inside the widget +</xsl:text> + <xsl:text>that expects a TextList. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>In this list, (translated) text content is what matters. Nevertheless +</xsl:text> + <xsl:text>text style of the cloned item will be applied in client widget. +</xsl:text> + </longdesc> + <shortdesc> + <xsl:text>A named list of ordered texts </xsl:text> + </shortdesc> + <arg name="listname"/> + </xsl:template> + <xsl:template match="widget[@type='TextList']" mode="widget_defs"> + <xsl:param name="hmi_element"/> + <xsl:text> texts: [ +</xsl:text> + <xsl:for-each select="func:refered_elements($hmi_element/*[@inkscape:label])[self::svg:text]"> + <xsl:text> id("</xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>"), +</xsl:text> + </xsl:for-each> + <xsl:text> ].reverse(), +</xsl:text> + </xsl:template> + <xsl:template match="widget[@type='TextStyleList']" mode="widget_desc"> + <type> + <xsl:value-of select="@type"/> + </type> + <longdesc> + <xsl:text>TextStyleList widget is a svg:group, list items are labeled elements +</xsl:text> + <xsl:text>in that group. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>To use a TextStyleList, clone (svg:use) one of the items inside the widget +</xsl:text> + <xsl:text>that expects a TextStyleList. +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>In this list, only style matters. Text content is ignored. +</xsl:text> + </longdesc> + <shortdesc> + <xsl:text>A named list of named texts</xsl:text> + </shortdesc> + <arg name="listname"/> + </xsl:template> + <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs"> + <xsl:param name="hmi_element"/> + <xsl:text> styles: { +</xsl:text> + <xsl:for-each select="$hmi_element/*[@inkscape:label]"> + <xsl:variable name="style" select="func:refered_elements(.)[self::svg:text]/@style"/> + <xsl:text> </xsl:text> + <xsl:value-of select="@inkscape:label"/> + <xsl:text>: "</xsl:text> + <xsl:value-of select="$style"/> + <xsl:text>", +</xsl:text> + </xsl:for-each> + <xsl:text> }, +</xsl:text> + </xsl:template> <xsl:template match="widget[@type='ToggleButton']" mode="widget_desc"> <type> <xsl:value-of select="@type"/>