--- a/svghmi/analyse_widget.xslt Tue Mar 18 15:58:34 2025 +0100
+++ b/svghmi/analyse_widget.xslt Tue Mar 18 15:59:13 2025 +0100
@@ -2,7 +2,7 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:str="http://exslt.org/strings" xmlns:func="http://exslt.org/functions" xmlns:svg="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" extension-element-prefixes="ns func exsl regexp str dyn" exclude-result-prefixes="ns func exsl regexp str dyn svg inkscape">
<xsl:output method="xml"/>
<xsl:variable name="indexed_hmitree" select="/.."/>
- <xsl:variable name="pathregex" select="'^(\w+=)?([^,=]+)([-.\d,]*)$'"/>
+ <xsl:variable name="pathregex" select="'^(\w+=)?([^,=]+)([-.\w,]*)$'"/> <xsl:variable name="newline">
--- a/svghmi/gen_dnd_widget_svg.xslt Tue Mar 18 15:58:34 2025 +0100
+++ b/svghmi/gen_dnd_widget_svg.xslt Tue Mar 18 15:59:13 2025 +0100
@@ -4,7 +4,7 @@
<xsl:variable name="hmi_elements" select="//svg:*[starts-with(@inkscape:label, 'HMI:')]"/>
<xsl:variable name="widgetparams" select="ns:GetWidgetParams()"/>
<xsl:variable name="indexed_hmitree" select="/.."/>
- <xsl:variable name="pathregex" select="'^(\w+=)?([^,=]+)([-.\d,]*)$'"/>
+ <xsl:variable name="pathregex" select="'^(\w+=)?([^,=]+)([-.\w,]*)$'"/> <xsl:variable name="newline">
--- a/svghmi/gen_index_xhtml.xslt Tue Mar 18 15:58:34 2025 +0100
+++ b/svghmi/gen_index_xhtml.xslt Tue Mar 18 15:59:13 2025 +0100
@@ -138,7 +138,7 @@
- <xsl:variable name="pathregex" select="'^(\w+=)?([^,=]+)([-.\d,]*)$'"/>
+ <xsl:variable name="pathregex" select="'^(\w+=)?([^,=]+)([-.\w,]*)$'"/> <xsl:variable name="newline">
@@ -1390,11 +1390,11 @@
<xsl:if test="@min and @max">
- <xsl:text>minmax:[</xsl:text>
+ <xsl:text>minmax:["</xsl:text> <xsl:value-of select="@min"/>
- <xsl:text>, </xsl:text>
+ <xsl:text>", "</xsl:text> <xsl:value-of select="@max"/>
+ <xsl:text>"]</xsl:text> @@ -1448,40 +1448,73 @@
<xsl:value-of select="$enable_expr"/>
+ <xsl:text> var_assignments: [], + <xsl:text> assignment_idx: { + <xsl:for-each select="$widget/path"> + <xsl:variable name="varid" select="generate-id()"/> + <xsl:if test="@assign"> + <xsl:for-each select="$widget/path[@assign]"> + <xsl:if test="$varid = generate-id()"> + <xsl:text> "</xsl:text> + <xsl:value-of select="@assign"/> + <xsl:text>":</xsl:text> + <xsl:value-of select="position()-1"/> + <xsl:if test="position()!=last()"> + <xsl:text> varnum_assignments: [ + <xsl:for-each select="$widget/path"> + <xsl:variable name="varid" select="generate-id()"/> + <xsl:when test="@assign"> + <xsl:for-each select="$widget/path[@assign]"> + <xsl:if test="$varid = generate-id()"> + <xsl:value-of select="position()-1"/> + <xsl:text> undefined</xsl:text> + <xsl:if test="position()!=last()"> <xsl:if test="$widget/@enable_expr">
- <xsl:text> enable_assignments: [],
<xsl:text> compute_enable: function(value, oldval, varnum) {
<xsl:text> let result = false;
- <xsl:for-each select="$widget/path">
- <xsl:variable name="varid" select="generate-id()"/>
- <xsl:variable name="varnum" select="position()-1"/>
- <xsl:if test="@assign">
- <xsl:for-each select="$widget/path[@assign]">
- <xsl:if test="$varid = generate-id()">
- <xsl:text> if(varnum == </xsl:text>
- <xsl:value-of select="$varnum"/>
- <xsl:text>) this.enable_assignments[</xsl:text>
- <xsl:value-of select="position()-1"/>
- <xsl:text> let </xsl:text>
- <xsl:value-of select="@assign"/>
- <xsl:text> = this.enable_assignments[</xsl:text>
- <xsl:value-of select="position()-1"/>
- <xsl:text> if(</xsl:text>
- <xsl:value-of select="@assign"/>
- <xsl:text> == undefined) break;
+ <xsl:for-each select="$widget/path[@assign]"> + <xsl:text> let </xsl:text> + <xsl:value-of select="@assign"/> + <xsl:text> = this.var_assignments[</xsl:text> + <xsl:value-of select="position()-1"/> + <xsl:text> if(</xsl:text> + <xsl:value-of select="@assign"/> + <xsl:text> == undefined) break; <xsl:text> result = </xsl:text>
<xsl:value-of select="$widget/@enable_expr"/>
@@ -1998,7 +2031,25 @@
<xsl:text> if(minmax !== undefined && typeof new_val == "number") {
- <xsl:text> let [min,max] = minmax;
+ <xsl:text> let [min,max] = minmax.map(token => { + <xsl:text> const num = Number(token); + <xsl:text> if(!isNaN(num) && isFinite(num)){ + <xsl:text> let idx = this.assignment_idx[token]; + <xsl:text> if(idx != undefined) + <xsl:text> return this.var_assignments[idx]; <xsl:text> if(new_val < min){
@@ -2282,23 +2333,37 @@
<xsl:text> do_dispatch(value, oldval, varnum) {
- <xsl:text> if(this.dispatch) try {
- <xsl:text> this.dispatch(value, oldval, varnum);
- <xsl:text> } catch(err) {
- <xsl:text> console.log(err);
- <xsl:text> if(this.enable_expr) try {
- <xsl:text> this.compute_enable(value, oldval, varnum);
- <xsl:text> } catch(err) {
- <xsl:text> console.log(err);
+ <xsl:text> if(this.enable_expr || this.dispatch){ + <xsl:text> let idx = this.varnum_assignments[varnum]; + <xsl:text> if(idx != undefined) + <xsl:text> this.var_assignments[idx] = value; + <xsl:text> if(this.dispatch) try { + <xsl:text> this.dispatch(value, oldval, varnum); + <xsl:text> } catch(err) { + <xsl:text> console.log(err); + <xsl:text> if(idx != undefined && this.enable_expr) try { + <xsl:text> this.compute_enable(value, oldval, varnum); + <xsl:text> } catch(err) { + <xsl:text> console.log(err); @@ -5091,7 +5156,9 @@
- <xsl:text> dispatch: function(value) {
+ <xsl:text> dispatch: function(value, oldval, varnum) { + <xsl:text> if(varnum != 0) return; <xsl:if test="$have_value or $have_edit">