--- 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:value-of select="@value"/> + <xsl:if test="position()!=last()"> + <xsl:variable name="indexes"> + <xsl:for-each select="$widget/path"> + <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:value-of select="@index"/> + <xsl:if test="position()!=last()"> <xsl:value-of select="@id"/>
<xsl:text>": new </xsl:text>
<xsl:value-of select="$widget/@type"/>
- <xsl:for-each select="$widget/arg">
- <xsl:text> "</xsl:text>
- <xsl:value-of select="@value"/>
- <xsl:if test="position()!=last()">
- <xsl:for-each select="$widget/path">
- <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:value-of select="@index"/>
- <xsl:text> /* </xsl:text>
- <xsl:value-of select="@value"/>
- <xsl:text> */ </xsl:text>
- <xsl:if test="position()!=last()">
- <xsl:text> element: id("</xsl:text>
+ <xsl:text>Widget ("</xsl:text> <xsl:value-of select="@id"/>
+ <xsl:text>",[</xsl:text> + <xsl:value-of select="$args"/> + <xsl:text>],[</xsl:text> + <xsl:value-of select="$indexes"/> <xsl:apply-templates mode="widget_defs" select="$widget">
<xsl:with-param name="hmi_element" select="."/>
- <xsl:apply-templates mode="widget_subscribe" select="$widget">
- <xsl:with-param name="hmi_element" select="."/>
<xsl:if test="position()!=last()">
@@ -885,12 +870,78 @@
- <xsl:text> constructor(members){
+ <xsl:text> constructor(elt_id,args,indexes,members){ + <xsl:text> this.element = id(elt_id); + <xsl:text> this.args = args; + <xsl:text> this.indexes = indexes; + <xsl:text> this.offset = 0; <xsl:text> Object.keys(members).forEach(prop => this[prop]=members[prop]);
+ <xsl:text> /* remove subsribers */ + <xsl:text> for(let index of this.indexes){ + <xsl:text> let idx = index + this.offset; + <xsl:text> subscribers[idx].delete(this); + <xsl:text> this.offset = 0; + <xsl:text> sub(new_offset=0){ + <xsl:text> /* set the offset because relative */ + <xsl:text> this.offset = new_offset; + <xsl:text> /* add this's subsribers */ + <xsl:text> for(let index of this.indexes){ + <xsl:text> subscribers[index + new_offset].add(this); + <xsl:text> need_cache_apply.push(this); + <xsl:text> apply_cache() { + <xsl:text> for(let index of this.indexes){ + <xsl:text> /* dispatch current cache in newly opened page widgets */ + <xsl:text> let realindex = index+this.offset; + <xsl:text> let cached_val = cache[realindex]; + <xsl:text> if(cached_val != undefined) + <xsl:text> dispatch_value_to_widget(this, realindex, cached_val, cached_val); @@ -941,15 +992,6 @@
- <xsl:template mode="widget_subscribe" match="widget">
- <xsl:text> sub: subscribe,
- <xsl:text> unsub: unsubscribe,
- <xsl:text> apply_cache: widget_apply_cache,
- <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> item_offset: 0,
- <xsl:text> on_click: foreach_onclick,
- <xsl:template mode="widget_subscribe" match="widget[@type='ForEach']">
- <xsl:text> sub: foreach_subscribe,
- <xsl:text> unsub: foreach_unsubscribe,
- <xsl:text> apply_cache: foreach_apply_cache,
- <xsl:template match="definitions:foreach">
- <xsl:text>/* </xsl:text>
- <xsl:value-of select="local-name()"/>
+ <xsl:template mode="widget_class" match="widget[@type='ForEach']"> + <xsl:text>class ForEachWidget extends Widget{ + <xsl:text> for(let item of this.items){ + <xsl:text> for(let widget of item) { + <xsl:text> widget.unsub(); + <xsl:text> this.offset = 0; - <xsl:text>function foreach_unsubscribe(){
- <xsl:text> for(let item of this.items){
- <xsl:text> for(let widget of item) {
- <xsl:text> unsubscribe.call(widget);
+ <xsl:text> foreach_widgets_do(new_offset, todo){ + <xsl:text> this.offset = new_offset; + <xsl:text> for(let i = 0; i < this.items.length; i++) { + <xsl:text> let item = this.items[i]; + <xsl:text> let orig_item_index = this.index_pool[i]; + <xsl:text> let item_index = this.index_pool[i+this.item_offset]; + <xsl:text> let item_index_offset = item_index - orig_item_index; + <xsl:text> for(let widget of item) { + <xsl:text> todo(widget).call(widget, new_offset + item_index_offset); - <xsl:text> this.offset = 0;
+ <xsl:text> sub(new_offset=0){ + <xsl:text> this.foreach_widgets_do(new_offset, w=>w.sub); + <xsl:text> apply_cache() { + <xsl:text> this.foreach_widgets_do(this.offset, w=>w.apply_cache); - <xsl:text>function foreach_widgets_do(new_offset, todo){
- <xsl:text> this.offset = new_offset;
- <xsl:text> for(let i = 0; i < this.items.length; i++) {
- <xsl:text> let item = this.items[i];
- <xsl:text> let orig_item_index = this.index_pool[i];
- <xsl:text> let item_index = this.index_pool[i+this.item_offset];
- <xsl:text> let item_index_offset = item_index - orig_item_index;
- <xsl:text> for(let widget of item) {
- <xsl:text> todo.call(widget, new_offset + item_index_offset);
+ <xsl:text> on_click(opstr, evt) { + <xsl:text> let new_item_offset = eval(String(this.item_offset)+opstr); + <xsl:text> if(new_item_offset + this.items.length > this.index_pool.length) { + <xsl:text> if(this.item_offset + this.items.length == this.index_pool.length) + <xsl:text> new_item_offset = 0; + <xsl:text> new_item_offset = this.index_pool.length - this.items.length; + <xsl:text> } else if(new_item_offset < 0) { + <xsl:text> if(this.item_offset == 0) + <xsl:text> new_item_offset = this.index_pool.length - this.items.length; + <xsl:text> new_item_offset = 0; + <xsl:text> this.item_offset = new_item_offset; + <xsl:text> this.unsub(); + <xsl:text> this.sub(this.offset); + <xsl:text> update_subscriptions(); + <xsl:text> need_cache_apply.push(this); + <xsl:text> jumps_need_update = true; + <xsl:text> requestHMIAnimation();
- <xsl:text>function foreach_subscribe(new_offset=0){
- <xsl:text> foreach_widgets_do.call(this, new_offset, subscribe);
- <xsl:text>function foreach_apply_cache() {
- <xsl:text> foreach_widgets_do.call(this, this.offset, widget_apply_cache);
- <xsl:text>function foreach_onclick(opstr, evt) {
- <xsl:text> new_item_offset = eval(String(this.item_offset)+opstr)
- <xsl:text> if(new_item_offset + this.items.length > this.index_pool.length) {
- <xsl:text> if(this.item_offset + this.items.length == this.index_pool.length)
- <xsl:text> new_item_offset = 0;
- <xsl:text> new_item_offset = this.index_pool.length - this.items.length;
- <xsl:text> } else if(new_item_offset < 0) {
- <xsl:text> if(this.item_offset == 0)
- <xsl:text> new_item_offset = this.index_pool.length - this.items.length;
- <xsl:text> new_item_offset = 0;
- <xsl:text> this.item_offset = new_item_offset;
- <xsl:text> off = this.offset;
- <xsl:text> foreach_unsubscribe.call(this);
- <xsl:text> foreach_subscribe.call(this,off);
- <xsl:text> update_subscriptions();
- <xsl:text> need_cache_apply.push(this);
- <xsl:text> jumps_need_update = true;
- <xsl:text> requestHMIAnimation();
<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:if test="$have_disability">
- <xsl:text> this.disabled_elt_style = this.disabled_elt.getAttribute("style");
- <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: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:variable name="have_disability" select="$have_activity and string-length($disability)>0"/>
<xsl:when test="$have_disability">
- <xsl:text> sub: subscribe,
- <xsl:text> unsub: unsubscribe,
- <xsl:text> apply_cache: widget_apply_cache,
+ <xsl:text> this.disabled_elt_style = this.disabled_elt.getAttribute("style"); - <xsl:text> sub: function(){},
- <xsl:text> unsub: function(){},
- <xsl:text> apply_cache: function(){},
+ <xsl:text> this.sub = function(){}; + <xsl:text> this.unsub = function(){}; + <xsl:text> this.apply_cache = function(){}; <xsl:template mode="per_page_widget_template" match="widget[@type='Jump']">
<xsl:param name="page_desc"/>
@@ -3344,74 +3342,6 @@
- <xsl:text>function* chain(a,b){
- <xsl:text>function unsubscribe(){
- <xsl:text> /* remove subsribers */
- <xsl:text> for(let index of this.indexes){
- <xsl:text> let idx = index + this.offset;
- <xsl:text> subscribers[idx].delete(this);
- <xsl:text> this.offset = 0;
- <xsl:text>function subscribe(new_offset=0){
- <xsl:text> /* set the offset because relative */
- <xsl:text> this.offset = new_offset;
- <xsl:text> /* add this's subsribers */
- <xsl:text> for(let index of this.indexes){
- <xsl:text> subscribers[index + new_offset].add(this);
- <xsl:text> need_cache_apply.push(this);
- <xsl:text>function widget_apply_cache() {
- <xsl:text> for(let index of this.indexes){
- <xsl:text> /* dispatch current cache in newly opened page widgets */
- <xsl:text> let realindex = index+this.offset;
- <xsl:text> let cached_val = cache[realindex];
- <xsl:text> if(cached_val != undefined)
- <xsl:text> dispatch_value_to_widget(this, realindex, cached_val, cached_val);
<xsl:text>function switch_visible_page(page_name) {
--- 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 "mandatory","'yes'";