diff -r e120d6985a2f -r 36f78f6cfabd svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Mon Mar 09 13:43:34 2020 +0100 +++ b/svghmi/gen_index_xhtml.xslt Tue Mar 10 13:57:29 2020 +0100 @@ -625,8 +625,6 @@ var updates = {}; - var page_switch = null; - function dispatch_value_to_widget(widget, index, value, oldval) { @@ -761,11 +759,9 @@ function animate() { - if(page_switch != null){ - - do_switch_page(page_switch); - - page_switch=null; + if(current_subscribed_page != current_visible_page){ + + switch_visible_page(current_subscribed_page); } @@ -783,6 +779,8 @@ } + requestAnimationFrameID = null; + } @@ -791,15 +789,11 @@ function requestHMIAnimation() { - if(requestAnimationFrameID != null){ - - window.cancelAnimationFrame(requestAnimationFrameID); - - requestAnimationFrameID = null; - - } - - requestAnimationFrameID = window.requestAnimationFrame(animate); + if(requestAnimationFrameID == null){ + + requestAnimationFrameID = window.requestAnimationFrame(animate); + + } } @@ -865,7 +859,7 @@ // register for rendering on next frame, since there are updates - window.requestAnimationFrame(animate); + requestHMIAnimation(); } catch(err) { @@ -1115,7 +1109,9 @@ - var current_page; + var current_visible_page; + + var current_subscribed_page; @@ -1135,77 +1131,153 @@ function switch_page(page_name) { - page_switch = page_name; - - window.requestAnimationFrame(animate); + if(current_subscribed_page != current_visible_page){ + + /* page switch already going */ + + /* TODO LOG ERROR */ + + return; + + } else if(page_name == current_visible_page){ + + /* already in that page */ + + /* TODO LOG ERROR */ + + return; + + } + + switch_subscribed_page(page_name); + + }; + + + + function switch_subscribed_page(page_name) { + + let old_desc = page_desc[current_subscribed_page]; + + let new_desc = page_desc[page_name]; + + + + if(new_desc == undefined){ + + /* TODO LOG ERROR */ + + return; + + } + + + + if(old_desc){ + + for(let widget of old_desc.widgets){ + + /* remove subsribers */ + + for(let index of widget.indexes){ + + subscribers[index].delete(widget); + + } + + } + + } + + for(let widget of new_desc.widgets){ + + /* add widget's subsribers */ + + for(let index of widget.indexes){ + + subscribers[index].add(widget); + + } + + } + + + + update_subscriptions(); + + + + current_subscribed_page = page_name; + + + + requestHMIAnimation(); } - function do_switch_page(page_name) { - - let old_desc = page_desc[current_page]; + function switch_visible_page(page_name) { + + + + let old_desc = page_desc[current_visible_page]; let new_desc = page_desc[page_name]; - if(new_desc == undefined){ - - /* TODO LOG ERROR */ - - return; - - } - - - if(old_desc){ - for(let widget of old_desc.widgets){ - - /* remove subsribers */ - - for(let index of widget.indexes){ - - subscribers[index].delete(widget); + 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 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){ - if(!(eltid in old_desc.required_detachables)){ - - let [element, parent] = new_desc.required_detachables[eltid]; - - parent.appendChild(element); - - } + 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 new_desc.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); } @@ -1213,35 +1285,9 @@ - for(let widget of new_desc.widgets){ - - /* add widget's subsribers */ - - 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); - - } - - } - - - svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); - current_page = page_name; - - - - window.setTimeout(update_subscriptions,0); + current_visible_page = page_name; };