svghmi/svghmi.js
branchsvghmi
changeset 2870 634b43d69897
parent 2869 d9eb50c015d1
child 2871 ed9b16b33628
equal deleted inserted replaced
2869:d9eb50c015d1 2870:634b43d69897
     3 var cache = hmitree_types.map(_ignored => undefined);
     3 var cache = hmitree_types.map(_ignored => undefined);
     4 var updates = {};
     4 var updates = {};
     5 
     5 
     6 function dispatch_value_to_widget(widget, index, value, oldval) {
     6 function dispatch_value_to_widget(widget, index, value, oldval) {
     7     try {
     7     try {
     8         let idxidx = widget.indexes.indexOf(index);
     8         let idx = widget.offset ? index - widget.offset : index;
       
     9         let idxidx = widget.indexes.indexOf(idx);
     9         let d = widget.dispatch;
    10         let d = widget.dispatch;
       
    11         console.log(index, idx, idxidx, value);
    10         if(typeof(d) == "function" && idxidx == 0){
    12         if(typeof(d) == "function" && idxidx == 0){
    11             d.call(widget, value, oldval);
    13             d.call(widget, value, oldval);
    12         }else if(typeof(d) == "object" && d.length >= idxidx){
    14         }
       
    15         /* TODO deal with multiple paths
       
    16            and dispatch according to index+page_offset */
       
    17         /*else if(typeof(d) == "object" && d.length >= idxidx){
    13             d[idxidx].call(widget, value, oldval);
    18             d[idxidx].call(widget, value, oldval);
    14         }/* else dispatch_0, ..., dispatch_n ? */
    19         }*/
       
    20         /* else dispatch_0, ..., dispatch_n ? */
    15         /*else {
    21         /*else {
    16             throw new Error("Dunno how to dispatch to widget at index = " + index);
    22             throw new Error("Dunno how to dispatch to widget at index = " + index);
    17         }*/
    23         }*/
    18     } catch(err) {
    24     } catch(err) {
    19         console.log(err);
    25         console.log(err);
   255         let [element,parent] = detachable_elements[eltid];
   261         let [element,parent] = detachable_elements[eltid];
   256         parent.removeChild(element);
   262         parent.removeChild(element);
   257     }
   263     }
   258 };
   264 };
   259 
   265 
   260 function switch_page(page_name, root_index) {
   266 function switch_page(page_name, page_index) {
   261     if(current_subscribed_page != current_visible_page){
   267     if(current_subscribed_page != current_visible_page){
   262         /* page switch already going */
   268         /* page switch already going */
   263         /* TODO LOG ERROR */
   269         /* TODO LOG ERROR */
   264         return;
   270         return;
   265     } else if(page_name == current_visible_page){
   271     } else if(page_name == current_visible_page){
   266         /* already in that page */
   272         /* already in that page */
   267         /* TODO LOG ERROR */
   273         /* TODO LOG ERROR */
   268         return;
   274         return;
   269     }
   275     }
   270     switch_subscribed_page(page_name);
   276     switch_subscribed_page(page_name, page_index);
   271 };
   277 };
   272 
   278 
   273 function* chain(a,b){
   279 function* chain(a,b){
   274     yield* a;
   280     yield* a;
   275     yield* b;
   281     yield* b;
   276 };
   282 };
   277 
   283 
   278 function switch_subscribed_page(page_name) {
   284 function switch_subscribed_page(page_name, page_index) {
   279     let old_desc = page_desc[current_subscribed_page];
   285     let old_desc = page_desc[current_subscribed_page];
   280     let new_desc = page_desc[page_name];
   286     let new_desc = page_desc[page_name];
   281 
   287 
   282     if(new_desc == undefined){
   288     if(new_desc == undefined){
   283         /* TODO LOG ERROR */
   289         /* TODO LOG ERROR */
   284         return;
   290         return;
   285     }
   291     }
   286 
   292 
       
   293     if(page_index == undefined){
       
   294         page_index = new_desc.page_index;
       
   295     }
       
   296 
   287     if(old_desc){
   297     if(old_desc){
   288         for(let widget of chain(old_desc.absolute_widgets,old_desc.relative_widgets)){
   298         for(let widget of old_desc.absolute_widgets){
   289             /* remove subsribers */
   299             /* remove subsribers */
   290             for(let index of widget.indexes){
   300             for(let index of widget.indexes){
   291                 subscribers[index].delete(widget);
   301                 subscribers[index].delete(widget);
   292             }
   302             }
   293         }
   303         }
   294     }
   304         for(let widget of old_desc.relative_widgets){
   295     for(let widget of chain(new_desc.absolute_widgets,new_desc.relative_widgets)){
   305             /* remove subsribers */
       
   306             for(let index of widget.indexes){
       
   307                 let idx = widget.offset ? index + widget.offset : index;
       
   308                 subscribers[idx].delete(widget);
       
   309             }
       
   310             /* lose the offset */
       
   311             delete widget.offset;
       
   312         }
       
   313     }
       
   314     for(let widget of new_desc.absolute_widgets){
   296         /* add widget's subsribers */
   315         /* add widget's subsribers */
   297         for(let index of widget.indexes){
   316         for(let index of widget.indexes){
   298             subscribers[index].add(widget);
   317             subscribers[index].add(widget);
       
   318         }
       
   319     }
       
   320     var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
       
   321     for(let widget of new_desc.relative_widgets){
       
   322         /* set the offset because relative */
       
   323         widget.offset = new_offset;
       
   324         /* add widget's subsribers */
       
   325         for(let index of widget.indexes){
       
   326             subscribers[index + new_offset].add(widget);
   299         }
   327         }
   300     }
   328     }
   301 
   329 
   302     update_subscriptions();
   330     update_subscriptions();
   303 
   331