svghmi/svghmi.js
branchsvghmi
changeset 2942 b07ad97e6019
parent 2921 2670f5c53caf
child 2951 506fe9272660
equal deleted inserted replaced
2941:ef13a4007538 2942:b07ad97e6019
     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 
   441     }
   385     }
   442 
   386 
   443     svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
   387     svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
   444     current_visible_page = page_name;
   388     current_visible_page = page_name;
   445 };
   389 };
   446 
       
   447 function update_jumps() {
       
   448     page_desc[current_visible_page].jumps.map(w=>w.notify_page_change(current_visible_page,current_page_index));
       
   449     jumps_need_update = false;
       
   450 };
       
   451 
       
   452 
   390 
   453 // Once connection established
   391 // Once connection established
   454 ws.onopen = function (evt) {
   392 ws.onopen = function (evt) {
   455     init_widgets();
   393     init_widgets();
   456     send_reset();
   394     send_reset();