# HG changeset patch # User Edouard Tisserant # Date 1583163029 -3600 # Node ID e38654ec628155a4b38155ff11ccffc0fa903dc7 # Parent bb89a2fbb4e02f554c002f09964ce4b28680a288 SVGHMI: detach/re-attach elements required by pages on page switch This is meant to optimize performances with large drawings leading to long restyle or reflow. diff -r bb89a2fbb4e0 -r e38654ec6281 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Mon Mar 02 16:25:35 2020 +0100 +++ b/svghmi/gen_index_xhtml.xslt Mon Mar 02 16:30:29 2020 +0100 @@ -336,18 +336,18 @@ - " + " ": { - type: " + type: " ", - args: [ + args: [ - " + " " @@ -356,9 +356,9 @@ - ], - - indexes: [ + ], + + indexes: [ @@ -372,7 +372,7 @@ - + , @@ -382,16 +382,16 @@ - ], - - element: id(" + ], + + element: id(" "), - } + } , @@ -411,7 +411,7 @@ var hmitree_types = [ - /* + /* @@ -433,11 +433,11 @@ " - " : {element: id(" + ":[id(" - "), parent:id(" + "), id(" - ")} + ")] , @@ -964,114 +964,110 @@ function prepare_svg() { - /* set everybody hidden initially for better performance */ - - for(let widget in hmi_widgets){ - - if(widget.element != undefined) - - widget.element.style.display = "none"; + for(let eltid in detachable_elements){ + + let [element,parent] = detachable_elements[eltid]; + + parent.removeChild(element); } - /*for(let name in page_desc){ - - if(name != new_desc){ - - page_desc[name].widget.element.style.display = "none"; + }; + + + + function switch_page(page_name) { + + let old_desc = page_desc[current_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); } - }*/ - - }; - - - - function switch_page(page_name) { - - let old_desc = page_desc[current_page]; - - let new_desc = page_desc[page_name]; - - - - if(new_desc == undefined){ - - /* TODO LOG ERROR */ - - return; + } + + 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); + + } } - if(old_desc){ - - for(let widget of old_desc.widgets){ - - - - /* hide widget */ - - if(widget.element != undefined) - - widget.element.style.display = "none"; - - - - /* 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); + + /* 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); } - old_desc.widget.element.style.display = "none"; - } - for(let widget of new_desc.widgets){ - - - - /* unhide widget */ - - if(widget.element != undefined) - - widget.element.style.display = "inline"; - - - - /* 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); - - } - - } - - - - new_desc.widget.element.style.display = "inline"; - - - svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); current_page = page_name; diff -r bb89a2fbb4e0 -r e38654ec6281 svghmi/gen_index_xhtml.ysl2 --- a/svghmi/gen_index_xhtml.ysl2 Mon Mar 02 16:25:35 2020 +0100 +++ b/svghmi/gen_index_xhtml.ysl2 Mon Mar 02 16:30:29 2020 +0100 @@ -523,7 +523,7 @@ | var detachable_elements = { foreach "$detachable_elements"{ - | "«@id»" : {element: id("«@id»"), parent:id("«../@id»")}`if "position()!=last()" > ,` + | "«@id»":[id("«@id»"), id("«../@id»")]`if "position()!=last()" > ,` } | } diff -r bb89a2fbb4e0 -r e38654ec6281 svghmi/svghmi.js --- a/svghmi/svghmi.js Mon Mar 02 16:25:35 2020 +0100 +++ b/svghmi/svghmi.js Mon Mar 02 16:30:29 2020 +0100 @@ -218,16 +218,10 @@ var current_page; function prepare_svg() { - /* set everybody hidden initially for better performance */ - for(let widget in hmi_widgets){ - if(widget.element != undefined) - widget.element.style.display = "none"; - } - /*for(let name in page_desc){ - if(name != new_desc){ - page_desc[name].widget.element.style.display = "none"; - } - }*/ + for(let eltid in detachable_elements){ + let [element,parent] = detachable_elements[eltid]; + parent.removeChild(element); + } }; function switch_page(page_name) { @@ -241,25 +235,31 @@ if(old_desc){ for(let widget of old_desc.widgets){ - - /* hide widget */ - if(widget.element != undefined) - widget.element.style.display = "none"; - /* remove subsribers */ for(let index of widget.indexes){ subscribers[index].delete(widget); } } - old_desc.widget.element.style.display = "none"; + 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 new_desc.widgets){ - - /* unhide widget */ - if(widget.element != undefined) - widget.element.style.display = "inline"; - /* add widget's subsribers */ for(let index of widget.indexes){ subscribers[index].add(widget); @@ -270,8 +270,6 @@ } } - new_desc.widget.element.style.display = "inline"; - svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); current_page = page_name;