diff -r 7beddc62a388 -r 4eeed820fd3a svghmi/gen_index_xhtml.xslt
--- a/svghmi/gen_index_xhtml.xslt Thu Mar 19 11:32:20 2020 +0100
+++ b/svghmi/gen_index_xhtml.xslt Thu Mar 19 19:23:56 2020 +0100
@@ -579,6 +579,8 @@
],
+ offset: 0,
+
indexes: [
@@ -614,6 +616,9 @@
+
+
+
}
,
@@ -621,6 +626,13 @@
+
+ sub: subscribe,
+
+ unsub: unsubscribe,
+
+
+
@@ -1024,8 +1036,6 @@
let d = widget.dispatch;
- console.log(index, idx, idxidx, value);
-
if(typeof(d) == "function" && idxidx == 0){
d.call(widget, value, oldval);
@@ -1372,8 +1382,6 @@
dispatch: function(value) {
- // console.log("Heartbeat" + value);
-
change_hmi_value(heartbeat_index, "+1");
}
@@ -1566,6 +1574,46 @@
+ function unsubscribe(){
+
+ widget = this;
+
+ /* remove subsribers */
+
+ for(let index of widget.indexes){
+
+ let idx = index + widget.offset;
+
+ subscribers[idx].delete(widget);
+
+ }
+
+ widget.offset = 0;
+
+ }
+
+
+
+ function subscribe(new_offset=0){
+
+ widget = this;
+
+ /* set the offset because relative */
+
+ widget.offset = new_offset;
+
+ /* add widget's subsribers */
+
+ for(let index of widget.indexes){
+
+ subscribers[index + new_offset].add(widget);
+
+ }
+
+ }
+
+
+
function switch_subscribed_page(page_name, page_index) {
let old_desc = page_desc[current_subscribed_page];
@@ -1594,150 +1642,100 @@
if(old_desc){
- for(let widget of old_desc.absolute_widgets){
-
- /* remove subsribers */
-
- for(let index of widget.indexes){
-
- subscribers[index].delete(widget);
+ old_desc.absolute_widgets.map(w=>w.unsub());
+
+ old_desc.relative_widgets.map(w=>w.unsub());
+
+ }
+
+ new_desc.absolute_widgets.map(w=>w.sub());
+
+ var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
+
+ new_desc.relative_widgets.map(w=>w.sub(new_offset));
+
+
+
+ update_subscriptions();
+
+
+
+ current_subscribed_page = page_name;
+
+
+
+ requestHMIAnimation();
+
+ }
+
+
+
+ function switch_visible_page(page_name) {
+
+
+
+ let old_desc = page_desc[current_visible_page];
+
+ let new_desc = page_desc[page_name];
+
+
+
+ if(old_desc){
+
+ for(let eltid in old_desc.required_detachables){
+
+ if(!(eltid in new_desc.required_detachables)){
+
+ let [element, parent] = old_desc.required_detachables[eltid];
+
+ parent.removeChild(element);
}
}
- for(let widget of old_desc.relative_widgets){
-
- /* remove subsribers */
-
- for(let index of widget.indexes){
-
- let idx = widget.offset ? index + widget.offset : index;
-
- subscribers[idx].delete(widget);
+ for(let eltid in new_desc.required_detachables){
+
+ if(!(eltid in old_desc.required_detachables)){
+
+ let [element, parent] = new_desc.required_detachables[eltid];
+
+ parent.appendChild(element);
}
- /* lose the offset */
-
- delete widget.offset;
-
}
- }
-
- for(let widget of new_desc.absolute_widgets){
-
- /* add widget's subsribers */
+ }else{
+
+ for(let eltid in new_desc.required_detachables){
+
+ let [element, parent] = new_desc.required_detachables[eltid];
+
+ parent.appendChild(element);
+
+ }
+
+ }
+
+
+
+ for(let widget of chain(new_desc.absolute_widgets,new_desc.relative_widgets)){
for(let index of widget.indexes){
- subscribers[index].add(widget);
+ /* dispatch current cache in newly opened page widgets */
+
+ let cached_val = cache[index];
+
+ if(cached_val != undefined)
+
+ dispatch_value_to_widget(widget, index, cached_val, cached_val);
}
}
- var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
-
- for(let widget of new_desc.relative_widgets){
-
- /* set the offset because relative */
-
- widget.offset = new_offset;
-
- /* add widget's subsribers */
-
- for(let index of widget.indexes){
-
- subscribers[index + new_offset].add(widget);
-
- }
-
- }
-
-
-
- update_subscriptions();
-
-
-
- current_subscribed_page = page_name;
-
-
-
- requestHMIAnimation();
-
- }
-
-
-
- function switch_visible_page(page_name) {
-
-
-
- let old_desc = page_desc[current_visible_page];
-
- let new_desc = page_desc[page_name];
-
-
-
- if(old_desc){
-
- for(let eltid in old_desc.required_detachables){
-
- if(!(eltid in new_desc.required_detachables)){
-
- let [element, parent] = old_desc.required_detachables[eltid];
-
- parent.removeChild(element);
-
- }
-
- }
-
- for(let eltid in new_desc.required_detachables){
-
- if(!(eltid in old_desc.required_detachables)){
-
- let [element, parent] = new_desc.required_detachables[eltid];
-
- parent.appendChild(element);
-
- }
-
- }
-
- }else{
-
- for(let eltid in new_desc.required_detachables){
-
- let [element, parent] = new_desc.required_detachables[eltid];
-
- parent.appendChild(element);
-
- }
-
- }
-
-
-
- for(let widget of chain(new_desc.absolute_widgets,new_desc.relative_widgets)){
-
- for(let index of widget.indexes){
-
- /* dispatch current cache in newly opened page widgets */
-
- 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(" "));