svghmi/svghmi.js
branchsvghmi
changeset 2903 881d0248b3ce
parent 2902 1fcb50af0335
child 2905 3d7e3866cc51
equal deleted inserted replaced
2902:1fcb50af0335 2903:881d0248b3ce
     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;
    90     }
    91     }
    91 
    92 
    92     while(widget = need_cache_apply.pop()){
    93     while(widget = need_cache_apply.pop()){
    93         widget.apply_cache();
    94         widget.apply_cache();
    94     }
    95     }
       
    96 
       
    97     if(jumps_need_update) update_jumps();
    95 
    98 
    96     apply_updates();
    99     apply_updates();
    97     requestAnimationFrameID = null;
   100     requestAnimationFrameID = null;
    98 }
   101 }
    99 
   102 
   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();