# HG changeset patch # User Edouard Tisserant <edouard.tisserant@gmail.com> # Date 1589122869 -7200 # Node ID b5dccd0d99ac0591681496d6325b67238309260f # Parent 15bebe9a2806a86d88a20aa2207fb85590a78c45 SVGHMI: clean up dead code, update generated xslt. diff -r 15bebe9a2806 -r b5dccd0d99ac svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Sun May 10 16:36:41 2020 +0200 +++ b/svghmi/gen_index_xhtml.xslt Sun May 10 17:01:09 2020 +0200 @@ -784,69 +784,54 @@ <xsl:template mode="hmi_elements" match="svg:*"> <xsl:variable name="widget" select="func:widget(@id)"/> <xsl:variable name="eltid" select="@id"/> + <xsl:variable name="args"> + <xsl:for-each select="$widget/arg"> + <xsl:text>"</xsl:text> + <xsl:value-of select="@value"/> + <xsl:text>"</xsl:text> + <xsl:if test="position()!=last()"> + <xsl:text>,</xsl:text> + </xsl:if> + </xsl:for-each> + </xsl:variable> + <xsl:variable name="indexes"> + <xsl:for-each select="$widget/path"> + <xsl:choose> + <xsl:when test="not(@index)"> + <xsl:message terminate="no"> + <xsl:text>Widget </xsl:text> + <xsl:value-of select="$widget/@type"/> + <xsl:text> id="</xsl:text> + <xsl:value-of select="$eltid"/> + <xsl:text>" : No match for path "</xsl:text> + <xsl:value-of select="@value"/> + <xsl:text>" in HMI tree</xsl:text> + </xsl:message> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@index"/> + <xsl:if test="position()!=last()"> + <xsl:text>,</xsl:text> + </xsl:if> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </xsl:variable> <xsl:text> "</xsl:text> <xsl:value-of select="@id"/> <xsl:text>": new </xsl:text> <xsl:value-of select="$widget/@type"/> - <xsl:text>Widget ({ -</xsl:text> - <xsl:text> args: [ -</xsl:text> - <xsl:for-each select="$widget/arg"> - <xsl:text> "</xsl:text> - <xsl:value-of select="@value"/> - <xsl:text>"</xsl:text> - <xsl:if test="position()!=last()"> - <xsl:text>,</xsl:text> - </xsl:if> - <xsl:text> -</xsl:text> - </xsl:for-each> - <xsl:text> ], -</xsl:text> - <xsl:text> offset: 0, -</xsl:text> - <xsl:text> indexes: [ -</xsl:text> - <xsl:for-each select="$widget/path"> - <xsl:choose> - <xsl:when test="not(@index)"> - <xsl:message terminate="no"> - <xsl:text>Widget </xsl:text> - <xsl:value-of select="$widget/@type"/> - <xsl:text> id="</xsl:text> - <xsl:value-of select="$eltid"/> - <xsl:text>" : No match for path "</xsl:text> - <xsl:value-of select="@value"/> - <xsl:text>" in HMI tree</xsl:text> - </xsl:message> - </xsl:when> - <xsl:otherwise> - <xsl:text> </xsl:text> - <xsl:value-of select="@index"/> - <xsl:text> /* </xsl:text> - <xsl:value-of select="@value"/> - <xsl:text> */ </xsl:text> - <xsl:if test="position()!=last()"> - <xsl:text>,</xsl:text> - </xsl:if> - <xsl:text> -</xsl:text> - </xsl:otherwise> - </xsl:choose> - </xsl:for-each> - <xsl:text> ], -</xsl:text> - <xsl:text> element: id("</xsl:text> + <xsl:text>Widget ("</xsl:text> <xsl:value-of select="@id"/> - <xsl:text>"), + <xsl:text>",[</xsl:text> + <xsl:value-of select="$args"/> + <xsl:text>],[</xsl:text> + <xsl:value-of select="$indexes"/> + <xsl:text>],{ </xsl:text> <xsl:apply-templates mode="widget_defs" select="$widget"> <xsl:with-param name="hmi_element" select="."/> </xsl:apply-templates> - <xsl:apply-templates mode="widget_subscribe" select="$widget"> - <xsl:with-param name="hmi_element" select="."/> - </xsl:apply-templates> <xsl:text> })</xsl:text> <xsl:if test="position()!=last()"> <xsl:text>,</xsl:text> @@ -885,12 +870,78 @@ </xsl:text> <xsl:text>class Widget { </xsl:text> - <xsl:text> constructor(members){ + <xsl:text> constructor(elt_id,args,indexes,members){ +</xsl:text> + <xsl:text> this.element = id(elt_id); +</xsl:text> + <xsl:text> this.args = args; +</xsl:text> + <xsl:text> this.indexes = indexes; +</xsl:text> + <xsl:text> this.offset = 0; </xsl:text> <xsl:text> Object.keys(members).forEach(prop => this[prop]=members[prop]); </xsl:text> <xsl:text> } </xsl:text> + <xsl:text> unsub(){ +</xsl:text> + <xsl:text> /* remove subsribers */ +</xsl:text> + <xsl:text> for(let index of this.indexes){ +</xsl:text> + <xsl:text> let idx = index + this.offset; +</xsl:text> + <xsl:text> subscribers[idx].delete(this); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> this.offset = 0; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> sub(new_offset=0){ +</xsl:text> + <xsl:text> /* set the offset because relative */ +</xsl:text> + <xsl:text> this.offset = new_offset; +</xsl:text> + <xsl:text> /* add this's subsribers */ +</xsl:text> + <xsl:text> for(let index of this.indexes){ +</xsl:text> + <xsl:text> subscribers[index + new_offset].add(this); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> need_cache_apply.push(this); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> apply_cache() { +</xsl:text> + <xsl:text> for(let index of this.indexes){ +</xsl:text> + <xsl:text> /* dispatch current cache in newly opened page widgets */ +</xsl:text> + <xsl:text> let realindex = index+this.offset; +</xsl:text> + <xsl:text> let cached_val = cache[realindex]; +</xsl:text> + <xsl:text> if(cached_val != undefined) +</xsl:text> + <xsl:text> dispatch_value_to_widget(this, realindex, cached_val, cached_val); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> <xsl:text>} </xsl:text> <xsl:text> @@ -941,15 +992,6 @@ <xsl:text> </xsl:text> </xsl:template> - <xsl:template mode="widget_subscribe" match="widget"> - <xsl:text> sub: subscribe, -</xsl:text> - <xsl:text> unsub: unsubscribe, -</xsl:text> - <xsl:text> apply_cache: widget_apply_cache, -</xsl:text> - </xsl:template> - <xsl:template mode="widget_subscribe" match="widget[@type='Page']"/> <xsl:template name="defs_by_labels"> <xsl:param name="labels" select="''"/> <xsl:param name="mandatory" select="'yes'"/> @@ -1825,135 +1867,114 @@ </xsl:text> <xsl:text> item_offset: 0, </xsl:text> - <xsl:text> on_click: foreach_onclick, -</xsl:text> - </xsl:template> - <xsl:template mode="widget_subscribe" match="widget[@type='ForEach']"> - <xsl:text> sub: foreach_subscribe, -</xsl:text> - <xsl:text> unsub: foreach_unsubscribe, -</xsl:text> - <xsl:text> apply_cache: foreach_apply_cache, -</xsl:text> - </xsl:template> - <definitions:foreach/> - <xsl:template match="definitions:foreach"> - <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 foreach_unsubscribe(){ -</xsl:text> - <xsl:text> for(let item of this.items){ -</xsl:text> - <xsl:text> for(let widget of item) { -</xsl:text> - <xsl:text> unsubscribe.call(widget); + </xsl:template> + <xsl:template mode="widget_class" match="widget[@type='ForEach']"> + <xsl:text>class ForEachWidget extends Widget{ +</xsl:text> + <xsl:text> unsub(){ +</xsl:text> + <xsl:text> for(let item of this.items){ +</xsl:text> + <xsl:text> for(let widget of item) { +</xsl:text> + <xsl:text> widget.unsub(); +</xsl:text> + <xsl:text> } </xsl:text> <xsl:text> } </xsl:text> + <xsl:text> this.offset = 0; +</xsl:text> <xsl:text> } </xsl:text> - <xsl:text> this.offset = 0; + <xsl:text> +</xsl:text> + <xsl:text> foreach_widgets_do(new_offset, todo){ +</xsl:text> + <xsl:text> this.offset = new_offset; +</xsl:text> + <xsl:text> for(let i = 0; i < this.items.length; i++) { +</xsl:text> + <xsl:text> let item = this.items[i]; +</xsl:text> + <xsl:text> let orig_item_index = this.index_pool[i]; +</xsl:text> + <xsl:text> let item_index = this.index_pool[i+this.item_offset]; +</xsl:text> + <xsl:text> let item_index_offset = item_index - orig_item_index; +</xsl:text> + <xsl:text> for(let widget of item) { +</xsl:text> + <xsl:text> todo(widget).call(widget, new_offset + item_index_offset); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> sub(new_offset=0){ +</xsl:text> + <xsl:text> this.foreach_widgets_do(new_offset, w=>w.sub); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> apply_cache() { +</xsl:text> + <xsl:text> this.foreach_widgets_do(this.offset, w=>w.apply_cache); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> on_click(opstr, evt) { +</xsl:text> + <xsl:text> let new_item_offset = eval(String(this.item_offset)+opstr); +</xsl:text> + <xsl:text> if(new_item_offset + this.items.length > this.index_pool.length) { +</xsl:text> + <xsl:text> if(this.item_offset + this.items.length == this.index_pool.length) +</xsl:text> + <xsl:text> new_item_offset = 0; +</xsl:text> + <xsl:text> else +</xsl:text> + <xsl:text> new_item_offset = this.index_pool.length - this.items.length; +</xsl:text> + <xsl:text> } else if(new_item_offset < 0) { +</xsl:text> + <xsl:text> if(this.item_offset == 0) +</xsl:text> + <xsl:text> new_item_offset = this.index_pool.length - this.items.length; +</xsl:text> + <xsl:text> else +</xsl:text> + <xsl:text> new_item_offset = 0; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> this.item_offset = new_item_offset; +</xsl:text> + <xsl:text> this.unsub(); +</xsl:text> + <xsl:text> this.sub(this.offset); +</xsl:text> + <xsl:text> update_subscriptions(); +</xsl:text> + <xsl:text> need_cache_apply.push(this); +</xsl:text> + <xsl:text> jumps_need_update = true; +</xsl:text> + <xsl:text> requestHMIAnimation(); +</xsl:text> + <xsl:text> } </xsl:text> <xsl:text>} </xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function foreach_widgets_do(new_offset, todo){ -</xsl:text> - <xsl:text> this.offset = new_offset; -</xsl:text> - <xsl:text> for(let i = 0; i < this.items.length; i++) { -</xsl:text> - <xsl:text> let item = this.items[i]; -</xsl:text> - <xsl:text> let orig_item_index = this.index_pool[i]; -</xsl:text> - <xsl:text> let item_index = this.index_pool[i+this.item_offset]; -</xsl:text> - <xsl:text> let item_index_offset = item_index - orig_item_index; -</xsl:text> - <xsl:text> for(let widget of item) { -</xsl:text> - <xsl:text> todo.call(widget, new_offset + item_index_offset); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function foreach_subscribe(new_offset=0){ -</xsl:text> - <xsl:text> foreach_widgets_do.call(this, new_offset, subscribe); -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function foreach_apply_cache() { -</xsl:text> - <xsl:text> foreach_widgets_do.call(this, this.offset, widget_apply_cache); -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function foreach_onclick(opstr, evt) { -</xsl:text> - <xsl:text> new_item_offset = eval(String(this.item_offset)+opstr) -</xsl:text> - <xsl:text> if(new_item_offset + this.items.length > this.index_pool.length) { -</xsl:text> - <xsl:text> if(this.item_offset + this.items.length == this.index_pool.length) -</xsl:text> - <xsl:text> new_item_offset = 0; -</xsl:text> - <xsl:text> else -</xsl:text> - <xsl:text> new_item_offset = this.index_pool.length - this.items.length; -</xsl:text> - <xsl:text> } else if(new_item_offset < 0) { -</xsl:text> - <xsl:text> if(this.item_offset == 0) -</xsl:text> - <xsl:text> new_item_offset = this.index_pool.length - this.items.length; -</xsl:text> - <xsl:text> else -</xsl:text> - <xsl:text> new_item_offset = 0; -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> this.item_offset = new_item_offset; -</xsl:text> - <xsl:text> off = this.offset; -</xsl:text> - <xsl:text> foreach_unsubscribe.call(this); -</xsl:text> - <xsl:text> foreach_subscribe.call(this,off); -</xsl:text> - <xsl:text> update_subscriptions(); -</xsl:text> - <xsl:text> need_cache_apply.push(this); -</xsl:text> - <xsl:text> jumps_need_update = true; -</xsl:text> - <xsl:text> requestHMIAnimation(); -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> -</xsl:text> </xsl:template> <xsl:template mode="widget_defs" match="widget[@type='Input']"> <xsl:param name="hmi_element"/> @@ -2180,45 +2201,22 @@ <xsl:text> this.inactive_elt_style = this.inactive_elt.getAttribute("style"); </xsl:text> </xsl:if> - <xsl:if test="$have_disability"> - <xsl:text> this.disabled_elt_style = this.disabled_elt.getAttribute("style"); -</xsl:text> - </xsl:if> - <xsl:text> }, -</xsl:text> - </xsl:template> - <xsl:template mode="widget_subscribe" match="widget[@type='Jump']"> - <xsl:param name="hmi_element"/> - <xsl:variable name="activity"> - <xsl:call-template name="jump_widget_activity"> - <xsl:with-param name="hmi_element" select="$hmi_element"/> - </xsl:call-template> - </xsl:variable> - <xsl:variable name="have_activity" select="string-length($activity)>0"/> - <xsl:variable name="disability"> - <xsl:call-template name="jump_widget_disability"> - <xsl:with-param name="hmi_element" select="$hmi_element"/> - </xsl:call-template> - </xsl:variable> - <xsl:variable name="have_disability" select="$have_activity and string-length($disability)>0"/> <xsl:choose> <xsl:when test="$have_disability"> - <xsl:text> sub: subscribe, -</xsl:text> - <xsl:text> unsub: unsubscribe, -</xsl:text> - <xsl:text> apply_cache: widget_apply_cache, + <xsl:text> this.disabled_elt_style = this.disabled_elt.getAttribute("style"); </xsl:text> </xsl:when> <xsl:otherwise> - <xsl:text> sub: function(){}, -</xsl:text> - <xsl:text> unsub: function(){}, -</xsl:text> - <xsl:text> apply_cache: function(){}, + <xsl:text> this.sub = function(){}; +</xsl:text> + <xsl:text> this.unsub = function(){}; +</xsl:text> + <xsl:text> this.apply_cache = function(){}; </xsl:text> </xsl:otherwise> </xsl:choose> + <xsl:text> }, +</xsl:text> </xsl:template> <xsl:template mode="per_page_widget_template" match="widget[@type='Jump']"> <xsl:param name="page_desc"/> @@ -3344,74 +3342,6 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text>function* chain(a,b){ -</xsl:text> - <xsl:text> yield* a; -</xsl:text> - <xsl:text> yield* b; -</xsl:text> - <xsl:text>}; -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function unsubscribe(){ -</xsl:text> - <xsl:text> /* remove subsribers */ -</xsl:text> - <xsl:text> for(let index of this.indexes){ -</xsl:text> - <xsl:text> let idx = index + this.offset; -</xsl:text> - <xsl:text> subscribers[idx].delete(this); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> this.offset = 0; -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function subscribe(new_offset=0){ -</xsl:text> - <xsl:text> /* set the offset because relative */ -</xsl:text> - <xsl:text> this.offset = new_offset; -</xsl:text> - <xsl:text> /* add this's subsribers */ -</xsl:text> - <xsl:text> for(let index of this.indexes){ -</xsl:text> - <xsl:text> subscribers[index + new_offset].add(this); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> need_cache_apply.push(this); -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text>function widget_apply_cache() { -</xsl:text> - <xsl:text> for(let index of this.indexes){ -</xsl:text> - <xsl:text> /* dispatch current cache in newly opened page widgets */ -</xsl:text> - <xsl:text> let realindex = index+this.offset; -</xsl:text> - <xsl:text> let cached_val = cache[realindex]; -</xsl:text> - <xsl:text> if(cached_val != undefined) -</xsl:text> - <xsl:text> dispatch_value_to_widget(this, realindex, cached_val, cached_val); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text>} -</xsl:text> - <xsl:text> -</xsl:text> <xsl:text>function switch_visible_page(page_name) { </xsl:text> <xsl:text> diff -r 15bebe9a2806 -r b5dccd0d99ac svghmi/widgets_common.ysl2 --- a/svghmi/widgets_common.ysl2 Sun May 10 16:36:41 2020 +0200 +++ b/svghmi/widgets_common.ysl2 Sun May 10 17:01:09 2020 +0200 @@ -38,7 +38,6 @@ | "«@id»": new «$widget/@type»Widget ("«@id»",[«$args»],[«$indexes»],{ apply "$widget", mode="widget_defs" with "hmi_element","."; - apply "$widget", mode="widget_subscribe" with "hmi_element","."; | })`if "position()!=last()" > ,` } @@ -124,13 +123,6 @@ | } } - -// default : normal subscribing -template "widget", mode="widget_subscribe" { -} -// page aren't subscribers -template "widget[@type='Page']", mode="widget_subscribe"; - function "defs_by_labels" { param "labels","''"; param "mandatory","'yes'";