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 |