# HG changeset patch # User Edouard Tisserant # Date 1617285658 -7200 # Node ID ec365ef396b1ff3facfe5cece44904890751de08 # Parent cc0ecc5e918f55707ed0f0278c8249fd78d5ddf0 SVGHMI: Ensure that when widgets are nested in HMI:Switch widget, their sub-elements are taken as switch's choice in case their label match the syntax. diff -r cc0ecc5e918f -r ec365ef396b1 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Thu Apr 01 15:57:06 2021 +0200 +++ b/svghmi/gen_index_xhtml.xslt Thu Apr 01 16:00:58 2021 +0200 @@ -6715,7 +6715,10 @@ <xsl:text> choices: [ </xsl:text> <xsl:variable name="regex" select="'^("[^"].*"|\-?[0-9]+|false|true)(#.*)?$'"/> - <xsl:for-each select="$result_svg_ns//*[@id = $hmi_element/@id]//*[regexp:test(@inkscape:label,$regex)]"> + <xsl:variable name="subelts" select="$result_widgets[@id = $hmi_element/@id]//*"/> + <xsl:variable name="subwidgets" select="$subelts//*[@id = $hmi_widgets/@id]"/> + <xsl:variable name="accepted" select="$subelts[not(ancestor-or-self::*/@id = $subwidgets/@id)]"/> + <xsl:for-each select="$accepted[regexp:test(@inkscape:label,$regex)]"> <xsl:variable name="literal" select="regexp:match(@inkscape:label,$regex)[2]"/> <xsl:text> { </xsl:text> @@ -6770,15 +6773,7 @@ </xsl:text> <xsl:text> //toggle state and apply </xsl:text> - <xsl:text> if (this.state) { -</xsl:text> - <xsl:text> this.state = 0; -</xsl:text> - <xsl:text> } else { -</xsl:text> - <xsl:text> this.state = 1; -</xsl:text> - <xsl:text> } + <xsl:text> this.state = this.state ? false : true; </xsl:text> <xsl:text> this.apply_hmi_value(0, this.state); </xsl:text> @@ -6792,23 +6787,27 @@ </xsl:text> <xsl:text> </xsl:text> + <xsl:text> activate(val) { +</xsl:text> + <xsl:text> let [active, inactive] = val ? ["none",""] : ["", "none"]; +</xsl:text> + <xsl:text> if (this.active_elt) +</xsl:text> + <xsl:text> this.active_elt.style.display = active; +</xsl:text> + <xsl:text> if (this.inactive_elt) +</xsl:text> + <xsl:text> this.inactive_elt.style.display = inactive; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> <xsl:text> animate(){ </xsl:text> - <xsl:text> // redraw toggle button on screen refresh -</xsl:text> - <xsl:text> if (this.state) { -</xsl:text> - <xsl:text> this.active_elt.setAttribute("style", this.active_style); -</xsl:text> - <xsl:text> this.inactive_elt.setAttribute("style", "display:none"); -</xsl:text> - <xsl:text> } else { -</xsl:text> - <xsl:text> this.inactive_elt.setAttribute("style", this.inactive_style); -</xsl:text> - <xsl:text> this.active_elt.setAttribute("style", "display:none"); -</xsl:text> - <xsl:text> } + <xsl:text> // redraw toggle button on screen refresh +</xsl:text> + <xsl:text> this.activate(this.state); </xsl:text> <xsl:text> } </xsl:text> @@ -6816,23 +6815,9 @@ </xsl:text> <xsl:text> init() { </xsl:text> - <xsl:text> this.active_style = this.active_elt ? this.active_elt.style.cssText : undefined; -</xsl:text> - <xsl:text> this.inactive_style = this.inactive_elt ? this.inactive_elt.style.cssText : undefined; -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> if (this.active_style && this.inactive_style) { -</xsl:text> - <xsl:text> this.active_elt.setAttribute("style", "display:none"); -</xsl:text> - <xsl:text> this.inactive_elt.setAttribute("style", this.inactive_style); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> this.element.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_click(evt)"); + <xsl:text> this.activate(false); +</xsl:text> + <xsl:text> this.element.onclick = (evt) => this.on_click(evt); </xsl:text> <xsl:text> } </xsl:text> @@ -6848,8 +6833,6 @@ </xsl:with-param> <xsl:with-param name="mandatory" select="'no'"/> </xsl:call-template> - <xsl:text> -</xsl:text> </xsl:template> <xsl:template match="/"> <xsl:comment> diff -r cc0ecc5e918f -r ec365ef396b1 svghmi/widget_switch.ysl2 --- a/svghmi/widget_switch.ysl2 Thu Apr 01 15:57:06 2021 +0200 +++ b/svghmi/widget_switch.ysl2 Thu Apr 01 16:00:58 2021 +0200 @@ -20,7 +20,12 @@ param "hmi_element"; | choices: [ const "regex",!"'^(\"[^\"].*\"|\-?[0-9]+|false|true)(#.*)?$'"!; - foreach "$result_svg_ns//*[@id = $hmi_element/@id]//*[regexp:test(@inkscape:label,$regex)]" { + + const "subelts", "$result_widgets[@id = $hmi_element/@id]//*"; + const "subwidgets", "$subelts//*[@id = $hmi_widgets/@id]"; + const "accepted", "$subelts[not(ancestor-or-self::*/@id = $subwidgets/@id)]"; + + foreach "$accepted[regexp:test(@inkscape:label,$regex)]" { const "literal", "regexp:match(@inkscape:label,$regex)[2]"; | { | elt:id("«@id»"), diff -r cc0ecc5e918f -r ec365ef396b1 tests/svghmi/svghmi_0@svghmi/svghmi.svg --- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg Thu Apr 01 15:57:06 2021 +0200 +++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg Thu Apr 01 16:00:58 2021 +0200 @@ -128,9 +128,9 @@ inkscape:current-layer="hmi0" showgrid="false" units="px" - inkscape:zoom="0.42177815" - inkscape:cx="1614.7137" - inkscape:cy="168.68416" + inkscape:zoom="1.1929688" + inkscape:cx="772.0138" + inkscape:cy="-68.272506" inkscape:window-width="1600" inkscape:window-height="836" inkscape:window-x="0" @@ -2575,6 +2575,152 @@ style="fill:#8667bf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round" id="path3447" inkscape:connector-curvature="0" /> + <g + inkscape:label="HMI:Switch@/TARGETPRESSURE" + id="g991-3" + transform="matrix(0.5,0,0,0.5,699.09791,793.95217)" + style="stroke-width:2"> + <g + id="g1091-3" + inkscape:label="4" + transform="translate(-136.52022,250.47452)" + style="stroke-width:2"> + <path + inkscape:transform-center-x="14.956371" + inkscape:transform-center-y="-3.6154501e-05" + d="m 622.6459,-170.03172 -51.81035,0 25.90517,-44.86908 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="14.956361" + sodipodi:r1="29.912722" + sodipodi:cy="-184.98808" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path981-1" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" + transform="matrix(0,-2.0000001,1.9999999,0,1034.195,1298.6541)" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="661.09552" + y="111.05016" + id="text1059-7"><tspan + sodipodi:role="line" + id="tspan1057-5" + x="661.09552" + y="111.05016" + style="stroke-width:1px">4</tspan></text> + </g> + <g + id="g1096-9" + inkscape:label="3" + transform="translate(-136.52022,250.47452)" + style="stroke-width:2"> + <path + inkscape:transform-center-x="14.956364" + transform="rotate(-90,746.45698,-44.543641)" + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path979-6" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="-216.2599" + sodipodi:r1="59.825443" + sodipodi:r2="29.912722" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 648.55108,-186.34718 -103.62071,0 51.81035,-89.73817 z" + inkscape:transform-center-y="-5.9989963e-06" /> + <text + id="text1063-2" + y="111.05016" + x="565.25018" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="565.25018" + id="tspan1061-1" + sodipodi:role="line">3</tspan></text> + </g> + <g + id="g1076-7" + inkscape:label="2" + transform="translate(-416.52022,170.47452)" + style="stroke-width:2"> + <path + inkscape:transform-center-x="-14.956365" + transform="matrix(0,-1,-1,0,1043.9134,701.91334)" + inkscape:transform-center-y="-5.5023185e-06" + d="m 648.55108,135.08534 -103.62071,0 51.81035,-89.738161 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="29.912722" + sodipodi:r1="59.825443" + sodipodi:cy="105.17262" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path985-8" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" /> + <text + id="text1067-5" + y="111.05016" + x="925.82605" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="925.82605" + id="tspan1065-7" + sodipodi:role="line">2</tspan></text> + </g> + <g + id="g1081-4" + inkscape:label="1" + transform="translate(-416.52022,170.47452)" + style="stroke-width:2"> + <path + inkscape:transform-center-x="-14.956349" + transform="matrix(0,-2.0000001,-1.9999999,0,1122.1514,1298.6541)" + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path987-1" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="136.44444" + sodipodi:r1="29.912722" + sodipodi:r2="14.956361" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 622.6459,151.4008 -51.81035,0 25.90517,-44.86908 z" + inkscape:transform-center-y="-3.3040441e-05" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="842.71497" + y="111.05016" + id="text1071-8"><tspan + sodipodi:role="line" + id="tspan1069-5" + x="842.71497" + y="111.05016" + style="stroke-width:1px">1</tspan></text> + </g> + </g> </g> </g> <g @@ -7172,4 +7318,47 @@ x="1569.0527" y="594.56055" style="fill:#ffffff;fill-opacity:1;stroke-width:0.25px">page node</tspan></text> + <g + transform="matrix(0.57180538,0,0,0.57180538,165.58244,517.80347)" + id="g443-9" + inkscape:label="HMI:ToggleButton@/PUMP0/BOOLIN" + style="stroke-width:1"> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect5492-7" + width="245.44583" + height="95.723877" + x="971.96545" + y="594.82263" + ry="23.930969" + inkscape:label="inactive" + rx="23.930969" /> + <rect + rx="23.930969" + inkscape:label="active" + ry="23.930969" + y="594.82263" + x="971.96545" + height="95.723877" + width="245.44583" + id="rect433-5" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#fdfdfd;fill-opacity:1;fill-rule:nonzero;stroke:#ffd0b2;stroke-width:28.60938263;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <g + style="stroke-width:1" + inkscape:label="text" + id="g952-3"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="1090.7626" + y="656.98151" + id="text950-8" + inkscape:label="setting_jmp"><tspan + sodipodi:role="line" + id="tspan948-8" + x="1090.7626" + y="656.98151" + style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px">up</tspan></text> + </g> + </g> </svg>