diff -r 1fcb50af0335 -r 881d0248b3ce svghmi/svghmi.js --- a/svghmi/svghmi.js Thu Mar 26 14:21:52 2020 +0100 +++ b/svghmi/svghmi.js Fri Mar 27 14:25:24 2020 +0100 @@ -3,6 +3,7 @@ var cache = hmitree_types.map(_ignored => undefined); var updates = {}; var need_cache_apply = []; +var jumps_need_update = false; var jump_history = [[default_page, undefined]]; function dispatch_value_to_widget(widget, index, value, oldval) { @@ -93,6 +94,8 @@ widget.apply_cache(); } + if(jumps_need_update) update_jumps(); + apply_updates(); requestAnimationFrameID = null; } @@ -260,6 +263,7 @@ var current_visible_page; var current_subscribed_page; +var current_page_index; function prepare_svg() { for(let eltid in detachable_elements){ @@ -278,7 +282,39 @@ if(page_name == undefined) page_name = current_subscribed_page; - return switch_subscribed_page(page_name, page_index); + + let old_desc = page_desc[current_subscribed_page]; + let new_desc = page_desc[page_name]; + + if(new_desc == undefined){ + /* TODO LOG ERROR */ + return false; + } + + if(page_index == undefined){ + page_index = new_desc.page_index; + } + + if(old_desc){ + 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; + current_page_index = page_index; + + jumps_need_update = true; + + requestHMIAnimation(); + + jump_history.push([page_name, page_index]); + + return true; }; function* chain(a,b){ @@ -364,41 +400,11 @@ foreach_subscribe.call(this,off); update_subscriptions(); need_cache_apply.push(this); + jumps_need_update = true; requestHMIAnimation(); console.log(opstr, new_item_offset); } -function switch_subscribed_page(page_name, page_index) { - let old_desc = page_desc[current_subscribed_page]; - let new_desc = page_desc[page_name]; - - if(new_desc == undefined){ - /* TODO LOG ERROR */ - return false; - } - - if(page_index == undefined){ - page_index = new_desc.page_index; - } - - if(old_desc){ - 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(); - - jump_history.push([page_name, page_index]); - - return true; -} function switch_visible_page(page_name) { @@ -429,6 +435,12 @@ current_visible_page = page_name; }; +function update_jumps() { + page_desc[current_visible_page].jumps.map(w=>w.notify_page_change(current_visible_page,current_page_index)); + jumps_need_update = false; +}; + + // Once connection established ws.onopen = function (evt) { init_widgets();