1 // svghmi.js |
1 // svghmi.js |
2 |
2 |
3 var cache = hmitree_types.map(_ignored => undefined); |
3 var cache = hmitree_types.map(_ignored => undefined); |
4 var updates = {}; |
4 var updates = {}; |
5 var need_cache_apply = []; |
5 var need_cache_apply = []; |
|
6 var jumps_need_update = false; |
6 var jump_history = [[default_page, undefined]]; |
7 var jump_history = [[default_page, undefined]]; |
7 |
8 |
8 function dispatch_value_to_widget(widget, index, value, oldval) { |
9 function dispatch_value_to_widget(widget, index, value, oldval) { |
9 try { |
10 try { |
10 let idx = widget.offset ? index - widget.offset : index; |
11 let idx = widget.offset ? index - widget.offset : index; |
258 return new_val; |
261 return new_val; |
259 } |
262 } |
260 |
263 |
261 var current_visible_page; |
264 var current_visible_page; |
262 var current_subscribed_page; |
265 var current_subscribed_page; |
|
266 var current_page_index; |
263 |
267 |
264 function prepare_svg() { |
268 function prepare_svg() { |
265 for(let eltid in detachable_elements){ |
269 for(let eltid in detachable_elements){ |
266 let [element,parent] = detachable_elements[eltid]; |
270 let [element,parent] = detachable_elements[eltid]; |
267 parent.removeChild(element); |
271 parent.removeChild(element); |
276 } |
280 } |
277 |
281 |
278 if(page_name == undefined) |
282 if(page_name == undefined) |
279 page_name = current_subscribed_page; |
283 page_name = current_subscribed_page; |
280 |
284 |
281 return switch_subscribed_page(page_name, page_index); |
285 |
|
286 let old_desc = page_desc[current_subscribed_page]; |
|
287 let new_desc = page_desc[page_name]; |
|
288 |
|
289 if(new_desc == undefined){ |
|
290 /* TODO LOG ERROR */ |
|
291 return false; |
|
292 } |
|
293 |
|
294 if(page_index == undefined){ |
|
295 page_index = new_desc.page_index; |
|
296 } |
|
297 |
|
298 if(old_desc){ |
|
299 old_desc.absolute_widgets.map(w=>w.unsub()); |
|
300 old_desc.relative_widgets.map(w=>w.unsub()); |
|
301 } |
|
302 new_desc.absolute_widgets.map(w=>w.sub()); |
|
303 var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index; |
|
304 new_desc.relative_widgets.map(w=>w.sub(new_offset)); |
|
305 |
|
306 update_subscriptions(); |
|
307 |
|
308 current_subscribed_page = page_name; |
|
309 current_page_index = page_index; |
|
310 |
|
311 jumps_need_update = true; |
|
312 |
|
313 requestHMIAnimation(); |
|
314 |
|
315 jump_history.push([page_name, page_index]); |
|
316 |
|
317 return true; |
282 }; |
318 }; |
283 |
319 |
284 function* chain(a,b){ |
320 function* chain(a,b){ |
285 yield* a; |
321 yield* a; |
286 yield* b; |
322 yield* b; |
362 off = this.offset; |
398 off = this.offset; |
363 foreach_unsubscribe.call(this); |
399 foreach_unsubscribe.call(this); |
364 foreach_subscribe.call(this,off); |
400 foreach_subscribe.call(this,off); |
365 update_subscriptions(); |
401 update_subscriptions(); |
366 need_cache_apply.push(this); |
402 need_cache_apply.push(this); |
|
403 jumps_need_update = true; |
367 requestHMIAnimation(); |
404 requestHMIAnimation(); |
368 console.log(opstr, new_item_offset); |
405 console.log(opstr, new_item_offset); |
369 } |
406 } |
370 |
407 |
371 function switch_subscribed_page(page_name, page_index) { |
|
372 let old_desc = page_desc[current_subscribed_page]; |
|
373 let new_desc = page_desc[page_name]; |
|
374 |
|
375 if(new_desc == undefined){ |
|
376 /* TODO LOG ERROR */ |
|
377 return false; |
|
378 } |
|
379 |
|
380 if(page_index == undefined){ |
|
381 page_index = new_desc.page_index; |
|
382 } |
|
383 |
|
384 if(old_desc){ |
|
385 old_desc.absolute_widgets.map(w=>w.unsub()); |
|
386 old_desc.relative_widgets.map(w=>w.unsub()); |
|
387 } |
|
388 new_desc.absolute_widgets.map(w=>w.sub()); |
|
389 var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index; |
|
390 new_desc.relative_widgets.map(w=>w.sub(new_offset)); |
|
391 |
|
392 update_subscriptions(); |
|
393 |
|
394 current_subscribed_page = page_name; |
|
395 |
|
396 requestHMIAnimation(); |
|
397 |
|
398 jump_history.push([page_name, page_index]); |
|
399 |
|
400 return true; |
|
401 } |
|
402 |
408 |
403 function switch_visible_page(page_name) { |
409 function switch_visible_page(page_name) { |
404 |
410 |
405 let old_desc = page_desc[current_visible_page]; |
411 let old_desc = page_desc[current_visible_page]; |
406 let new_desc = page_desc[page_name]; |
412 let new_desc = page_desc[page_name]; |
426 } |
432 } |
427 |
433 |
428 svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); |
434 svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); |
429 current_visible_page = page_name; |
435 current_visible_page = page_name; |
430 }; |
436 }; |
|
437 |
|
438 function update_jumps() { |
|
439 page_desc[current_visible_page].jumps.map(w=>w.notify_page_change(current_visible_page,current_page_index)); |
|
440 jumps_need_update = false; |
|
441 }; |
|
442 |
431 |
443 |
432 // Once connection established |
444 // Once connection established |
433 ws.onopen = function (evt) { |
445 ws.onopen = function (evt) { |
434 init_widgets(); |
446 init_widgets(); |
435 send_reset(); |
447 send_reset(); |