--- a/svghmi/analyse_widget.xslt Wed Jun 22 11:48:40 2022 +0200
+++ b/svghmi/analyse_widget.xslt Wed Jun 22 11:55:38 2022 +0200
@@ -263,25 +263,7 @@
<xsl:apply-templates mode="actions" select="$fsm"/>
- <xsl:text> if (this.active_elt && this.inactive_elt) {
- <xsl:for-each select="str:split('active inactive')">
- <xsl:text> if(this.display == "</xsl:text>
- <xsl:value-of select="."/>
- <xsl:text> this.</xsl:text>
- <xsl:value-of select="."/>
- <xsl:text>_elt.style.display = "";
- <xsl:text> this.</xsl:text>
- <xsl:value-of select="."/>
- <xsl:text>_elt.style.display = "none";
+ <xsl:text> this.set_activation_state(this.display == "active"); @@ -291,6 +273,8 @@
<xsl:text> this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
+ <xsl:text> this.set_activation_state(undefined); --- a/svghmi/gen_index_xhtml.xslt Wed Jun 22 11:48:40 2022 +0200
+++ b/svghmi/gen_index_xhtml.xslt Wed Jun 22 11:55:38 2022 +0200
@@ -1458,6 +1458,60 @@
+ <xsl:text>function _hide(elt, placeholder){ + <xsl:text> if(elt.parentNode != null) + <xsl:text> placeholder.parentNode.removeChild(elt); + <xsl:text>function _show(elt, placeholder){ + <xsl:text> placeholder.parentNode.insertBefore(elt, placeholder); + <xsl:text>function set_activation_state(eltsub, state){ + <xsl:text> if(eltsub.active_elt_placeholder == undefined){ + <xsl:text> eltsub.active_elt_placeholder = document.createComment(""); + <xsl:text> eltsub.active_elt.parentNode.insertBefore(eltsub.active_elt_placeholder, eltsub.active_elt); + <xsl:text> eltsub.inactive_elt_placeholder = document.createComment(""); + <xsl:text> eltsub.inactive_elt.parentNode.insertBefore(eltsub.inactive_elt_placeholder, eltsub.inactive_elt); + <xsl:text> (state?_show:_hide)(eltsub.active_elt, eltsub.active_elt_placeholder); + <xsl:text> ((state || state==undefined)?_hide:_show)(eltsub.inactive_elt, eltsub.inactive_elt_placeholder); + <xsl:text>function activate_activable(eltsub) { + <xsl:text> set_activation_state(eltsub, true); + <xsl:text>function inactivate_activable(eltsub) { + <xsl:text> set_activation_state(eltsub, false); @@ -1950,27 +2004,13 @@
- <xsl:text> activate_activable(eltsub) {
- <xsl:text> eltsub.inactive.style.display = "none";
- <xsl:text> eltsub.active.style.display = "";
- <xsl:text> inactivate_activable(eltsub) {
- <xsl:text> eltsub.active.style.display = "none";
- <xsl:text> eltsub.inactive.style.display = "";
+ <xsl:text> set_activation_state(state){ + <xsl:text> set_activation_state(this.activable_sub, state); @@ -2088,7 +2128,7 @@
<xsl:value-of select="$subname"/>
- <xsl:text>": id("</xsl:text>
+ <xsl:text>_elt": id("</xsl:text> <xsl:value-of select="$subelt/@id"/>
<xsl:if test="position()!=last()">
@@ -2605,25 +2645,7 @@
<xsl:apply-templates mode="actions" select="$fsm"/>
- <xsl:text> if (this.active_elt && this.inactive_elt) {
- <xsl:for-each select="str:split('active inactive')">
- <xsl:text> if(this.display == "</xsl:text>
- <xsl:value-of select="."/>
- <xsl:text> this.</xsl:text>
- <xsl:value-of select="."/>
- <xsl:text>_elt.style.display = "";
- <xsl:text> this.</xsl:text>
- <xsl:value-of select="."/>
- <xsl:text>_elt.style.display = "none";
+ <xsl:text> this.set_activation_state(this.display == "active"); @@ -2633,6 +2655,8 @@
<xsl:text> this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
+ <xsl:text> this.set_activation_state(undefined); @@ -2652,13 +2676,16 @@
<xsl:template match="widget[@type='Button']" mode="widget_defs">
<xsl:param name="hmi_element"/>
+ <xsl:text> activable_sub:{ <xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
- <xsl:text>active inactive</xsl:text>
+ <xsl:text>/active /inactive</xsl:text> - <xsl:with-param name="mandatory" select="'no'"/>
<xsl:template match="widget[@type='PushButton']" mode="widget_class">
<xsl:text>class </xsl:text>
@@ -2676,13 +2703,16 @@
<xsl:template match="widget[@type='PushButton']" mode="widget_defs">
<xsl:param name="hmi_element"/>
+ <xsl:text> activable_sub:{ <xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
- <xsl:text>active inactive</xsl:text>
+ <xsl:text>/active /inactive</xsl:text> - <xsl:with-param name="mandatory" select="'no'"/>
<xsl:template match="widget[@type='CircularBar']" mode="widget_desc">
@@ -5874,7 +5904,7 @@
<xsl:text> this._shift = this.shift;
- <xsl:text> (this.shift?this.activate_activable:this.inactivate_activable)(this.Shift_sub);
+ <xsl:text> set_activation_state(this.Shift_sub, this.shift); @@ -5882,7 +5912,7 @@
<xsl:text> this._caps = this.caps;
- <xsl:text> (this.caps?this.activate_activable:this.inactivate_activable)(this.CapsLock_sub);
+ <xsl:text> set_activation_state(this.CapsLock_sub, this.caps); @@ -7659,7 +7689,7 @@
<xsl:text> if(choice.parent != undefined){
- <xsl:text> choice.parent.appendChild(choice.elt);
+ <xsl:text> choice.parent.insertBefore(choice.elt,choice.sibling); <xsl:text> choice.parent = undefined;
@@ -7682,8 +7712,10 @@
<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="choices" select="$accepted[regexp:test(@inkscape:label,$regex)]"/> + <xsl:for-each select="$choices"> <xsl:variable name="literal" select="regexp:match(@inkscape:label,$regex)[2]"/>
+ <xsl:variable name="sibling" select="following-sibling::*[not(@id = $choices/@id)][position()=1]"/> <xsl:text> elt:id("</xsl:text>
@@ -7692,6 +7724,18 @@
<xsl:text> parent:undefined,
+ <xsl:when test="count($sibling)=0"> + <xsl:text> sibling:null, + <xsl:text> sibling:id("</xsl:text> + <xsl:value-of select="$sibling/@id"/> <xsl:text> value:</xsl:text>
<xsl:value-of select="$literal"/>
@@ -7851,27 +7895,11 @@
- <xsl:text> activate(val) {
- <xsl:text> let [active, inactive] = val ? ["","none"] : ["none", ""];
- <xsl:text> if (this.active_elt)
- <xsl:text> this.active_elt.style.display = active;
- <xsl:text> if (this.inactive_elt)
- <xsl:text> this.inactive_elt.style.display = inactive;
<xsl:text> // redraw toggle button on screen refresh
- <xsl:text> this.activate(this.state);
+ <xsl:text> this.set_activation_state(this.state); @@ -7879,10 +7907,10 @@
- <xsl:text> this.activate(false);
<xsl:text> this.element.onclick = (evt) => this.on_click(evt);
+ <xsl:text> this.set_activation_state(undefined); @@ -7890,13 +7918,16 @@
<xsl:template match="widget[@type='ToggleButton']" mode="widget_defs">
<xsl:param name="hmi_element"/>
+ <xsl:text> activable_sub:{ <xsl:call-template name="defs_by_labels">
<xsl:with-param name="hmi_element" select="$hmi_element"/>
<xsl:with-param name="labels">
- <xsl:text>active inactive</xsl:text>
+ <xsl:text>/active /inactive</xsl:text> - <xsl:with-param name="mandatory" select="'no'"/>
<xsl:template match="widget[@type='XYGraph']" mode="widget_desc">