beremiz

Parents 63b9a37b73c7
Children 68ac5bf43525
SVGHMI - prepare page with cached data when switching. This prevents values that do not change and that was already subscribed in previous page from keeping undefined.
--- a/svghmi/gen_index_xhtml.xslt Tue Oct 29 11:18:58 2019 +0100
+++ b/svghmi/gen_index_xhtml.xslt Wed Oct 30 15:17:05 2019 +0100
@@ -344,6 +344,38 @@
</xsl:text>
<xsl:text>
</xsl:text>
+ <xsl:text>function dispatch_value_to_widget(widget, index, value, oldval) {
+</xsl:text>
+ <xsl:text> let idxidx = widget.indexes.indexOf(index);
+</xsl:text>
+ <xsl:text> if(idxidx == -1){
+</xsl:text>
+ <xsl:text> throw new Error("Dispatching to widget not interested, should not happen.");
+</xsl:text>
+ <xsl:text> }
+</xsl:text>
+ <xsl:text> let d = widget.dispatch;
+</xsl:text>
+ <xsl:text> if(typeof(d) == "function" &amp;&amp; idxidx == 0){
+</xsl:text>
+ <xsl:text> return d.call(widget, value, oldval);
+</xsl:text>
+ <xsl:text> }else if(typeof(d) == "object" &amp;&amp; d.length &gt;= idxidx){
+</xsl:text>
+ <xsl:text> return d[idxidx].call(widget, value, oldval);
+</xsl:text>
+ <xsl:text> }/* else dispatch_0, ..., dispatch_n ? */
+</xsl:text>
+ <xsl:text> /*else {
+</xsl:text>
+ <xsl:text> throw new Error("Dunno how to dispatch to widget at index = " + index);
+</xsl:text>
+ <xsl:text> }*/
+</xsl:text>
+ <xsl:text>}
+</xsl:text>
+ <xsl:text>
+</xsl:text>
<xsl:text>function dispatch_value(index, value) {
</xsl:text>
<xsl:text> let widgets = subscribers[index];
@@ -360,31 +392,7 @@
</xsl:text>
<xsl:text> for(let widget of widgets){
</xsl:text>
- <xsl:text> let idxidx = widget.indexes.indexOf(index);
-</xsl:text>
- <xsl:text> if(idxidx == -1){
-</xsl:text>
- <xsl:text> throw new Error("Dispatching to widget not interested, should not happen.");
-</xsl:text>
- <xsl:text> }
-</xsl:text>
- <xsl:text> let d = widget.dispatch;
-</xsl:text>
- <xsl:text> if(typeof(d) == "function" &amp;&amp; idxidx == 0){
-</xsl:text>
- <xsl:text> return d.call(widget, value, oldval);
-</xsl:text>
- <xsl:text> }else if(typeof(d) == "object" &amp;&amp; d.length &gt;= idxidx){
-</xsl:text>
- <xsl:text> return d[idxidx].call(widget, value, oldval);
-</xsl:text>
- <xsl:text> }/* else dispatch_0, ..., dispatch_n ? */
-</xsl:text>
- <xsl:text> /*else {
-</xsl:text>
- <xsl:text> throw new Error("Dunno how to dispatch to widget at index = " + index);
-</xsl:text>
- <xsl:text> }*/
+ <xsl:text> dispatch_value_to_widget(widget, index, value, oldval);
</xsl:text>
<xsl:text> }
</xsl:text>
@@ -726,12 +734,22 @@
</xsl:text>
<xsl:text> subscribers[index].add(widget);
</xsl:text>
+ <xsl:text> let cached_val = cache[index];
+</xsl:text>
+ <xsl:text> if(cached_val != undefined)
+</xsl:text>
+ <xsl:text> dispatch_value_to_widget(widget, index, cached_val, cached_val);
+</xsl:text>
+ <xsl:text>
+</xsl:text>
<xsl:text> }
</xsl:text>
<xsl:text> }
</xsl:text>
<xsl:text> svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
</xsl:text>
+ <xsl:text> // TODO dispatch current cache in newly opened page
+</xsl:text>
<xsl:text> }
</xsl:text>
<xsl:text> current_page = page_name;
--- a/svghmi/svghmi.js Tue Oct 29 11:18:58 2019 +0100
+++ b/svghmi/svghmi.js Wed Oct 30 15:17:05 2019 +0100
@@ -2,6 +2,22 @@
var cache = hmitree_types.map(_ignored => undefined);
+function dispatch_value_to_widget(widget, index, value, oldval) {
+ let idxidx = widget.indexes.indexOf(index);
+ if(idxidx == -1){
+ throw new Error("Dispatching to widget not interested, should not happen.");
+ }
+ let d = widget.dispatch;
+ if(typeof(d) == "function" && idxidx == 0){
+ return d.call(widget, value, oldval);
+ }else if(typeof(d) == "object" && d.length >= idxidx){
+ return d[idxidx].call(widget, value, oldval);
+ }/* else dispatch_0, ..., dispatch_n ? */
+ /*else {
+ throw new Error("Dunno how to dispatch to widget at index = " + index);
+ }*/
+}
+
function dispatch_value(index, value) {
let widgets = subscribers[index];
@@ -10,19 +26,7 @@
if(widgets.size > 0) {
for(let widget of widgets){
- let idxidx = widget.indexes.indexOf(index);
- if(idxidx == -1){
- throw new Error("Dispatching to widget not interested, should not happen.");
- }
- let d = widget.dispatch;
- if(typeof(d) == "function" && idxidx == 0){
- return d.call(widget, value, oldval);
- }else if(typeof(d) == "object" && d.length >= idxidx){
- return d[idxidx].call(widget, value, oldval);
- }/* else dispatch_0, ..., dispatch_n ? */
- /*else {
- throw new Error("Dunno how to dispatch to widget at index = " + index);
- }*/
+ dispatch_value_to_widget(widget, index, value, oldval);
}
}
};
@@ -193,6 +197,10 @@
for(let widget of new_desc.widgets){
for(let index of widget.indexes){
subscribers[index].add(widget);
+ let cached_val = cache[index];
+ if(cached_val != undefined)
+ dispatch_value_to_widget(widget, index, cached_val, cached_val);
+
}
}
svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));