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; |
|
7 var jump_history = [[default_page, undefined]]; |
|
8 |
6 |
9 function dispatch_value_to_widget(widget, index, value, oldval) { |
7 function dispatch_value_to_widget(widget, index, value, oldval) { |
10 try { |
8 try { |
11 let idx = widget.offset ? index - widget.offset : index; |
9 let idx = widget.offset ? index - widget.offset : index; |
12 let idxidx = widget.indexes.indexOf(idx); |
10 let idxidx = widget.indexes.indexOf(idx); |
349 subscribers[index + new_offset].add(this); |
347 subscribers[index + new_offset].add(this); |
350 } |
348 } |
351 need_cache_apply.push(this); |
349 need_cache_apply.push(this); |
352 } |
350 } |
353 |
351 |
354 function foreach_unsubscribe(){ |
|
355 for(let item of this.items){ |
|
356 for(let widget of item) { |
|
357 unsubscribe.call(widget); |
|
358 } |
|
359 } |
|
360 this.offset = 0; |
|
361 } |
|
362 |
|
363 function foreach_widgets_do(new_offset, todo){ |
|
364 this.offset = new_offset; |
|
365 for(let i = 0; i < this.items.length; i++) { |
|
366 let item = this.items[i]; |
|
367 let orig_item_index = this.index_pool[i]; |
|
368 let item_index = this.index_pool[i+this.item_offset]; |
|
369 let item_index_offset = item_index - orig_item_index; |
|
370 for(let widget of item) { |
|
371 todo.call(widget, new_offset + item_index_offset); |
|
372 } |
|
373 } |
|
374 } |
|
375 |
|
376 function foreach_subscribe(new_offset=0){ |
|
377 foreach_widgets_do.call(this, new_offset, subscribe); |
|
378 } |
|
379 |
|
380 function widget_apply_cache() { |
352 function widget_apply_cache() { |
381 for(let index of this.indexes){ |
353 for(let index of this.indexes){ |
382 /* dispatch current cache in newly opened page widgets */ |
354 /* dispatch current cache in newly opened page widgets */ |
383 let realindex = index+this.offset; |
355 let realindex = index+this.offset; |
384 let cached_val = cache[realindex]; |
356 let cached_val = cache[realindex]; |
385 if(cached_val != undefined) |
357 if(cached_val != undefined) |
386 dispatch_value_to_widget(this, realindex, cached_val, cached_val); |
358 dispatch_value_to_widget(this, realindex, cached_val, cached_val); |
387 } |
359 } |
388 } |
360 } |
389 |
361 |
390 function foreach_apply_cache() { |
|
391 foreach_widgets_do.call(this, this.offset, widget_apply_cache); |
|
392 } |
|
393 |
|
394 function foreach_onclick(opstr, evt) { |
|
395 new_item_offset = eval(String(this.item_offset)+opstr) |
|
396 if(new_item_offset + this.items.length > this.index_pool.length) { |
|
397 if(this.item_offset + this.items.length == this.index_pool.length) |
|
398 new_item_offset = 0; |
|
399 else |
|
400 new_item_offset = this.index_pool.length - this.items.length; |
|
401 } else if(new_item_offset < 0) { |
|
402 if(this.item_offset == 0) |
|
403 new_item_offset = this.index_pool.length - this.items.length; |
|
404 else |
|
405 new_item_offset = 0; |
|
406 } |
|
407 this.item_offset = new_item_offset; |
|
408 off = this.offset; |
|
409 foreach_unsubscribe.call(this); |
|
410 foreach_subscribe.call(this,off); |
|
411 update_subscriptions(); |
|
412 need_cache_apply.push(this); |
|
413 jumps_need_update = true; |
|
414 requestHMIAnimation(); |
|
415 } |
|
416 |
|
417 |
|
418 function switch_visible_page(page_name) { |
362 function switch_visible_page(page_name) { |
419 |
363 |
420 let old_desc = page_desc[current_visible_page]; |
364 let old_desc = page_desc[current_visible_page]; |
421 let new_desc = page_desc[page_name]; |
365 let new_desc = page_desc[page_name]; |
422 |
366 |