160 cxListDestroy(ls); |
160 cxListDestroy(ls); |
161 } |
161 } |
162 |
162 |
163 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { |
163 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { |
164 UiVar *var = cxMapGet(ctx->vars, key); |
164 UiVar *var = cxMapGet(ctx->vars, key); |
165 if(!var) { |
165 if(!var && ctx->documents) { |
166 CxIterator i = cxListIterator(ctx->documents); |
166 CxIterator i = cxListIterator(ctx->documents); |
167 cx_foreach(void *, doc, i) { |
167 cx_foreach(void *, doc, i) { |
168 UiContext *subctx = ui_document_context(doc); |
168 UiContext *subctx = ui_document_context(doc); |
169 var = ctx_getvar(subctx, key); |
169 var = ctx_getvar(subctx, key); |
170 if(var) { |
170 if(var) { |
341 t->setextent(t, t->extent); |
344 t->setextent(t, t->extent); |
342 t->setrange(t, t->min, t->max); |
345 t->setrange(t, t->min, t->max); |
343 t->set(t, t->value); |
346 t->set(t, t->value); |
344 break; |
347 break; |
345 } |
348 } |
|
349 case UI_VAR_GENERIC: { |
|
350 UiGeneric *f = fromvalue; |
|
351 UiGeneric *t = to->value; |
|
352 if(!f->obj) break; |
|
353 uic_generic_copy(f, t); |
|
354 t->set(t, t->value, t->type); |
|
355 break; |
|
356 } |
346 } |
357 } |
347 } |
358 } |
348 |
359 |
349 void uic_save_var2(UiVar *var) { |
360 void uic_save_var2(UiVar *var) { |
350 switch(var->type) { |
361 switch(var->type) { |
353 case UI_VAR_DOUBLE: uic_double_save(var->value); break; |
364 case UI_VAR_DOUBLE: uic_double_save(var->value); break; |
354 case UI_VAR_STRING: uic_string_save(var->value); break; |
365 case UI_VAR_STRING: uic_string_save(var->value); break; |
355 case UI_VAR_TEXT: uic_text_save(var->value); break; |
366 case UI_VAR_TEXT: uic_text_save(var->value); break; |
356 case UI_VAR_LIST: break; |
367 case UI_VAR_LIST: break; |
357 case UI_VAR_RANGE: uic_range_save(var->value); break; |
368 case UI_VAR_RANGE: uic_range_save(var->value); break; |
|
369 case UI_VAR_GENERIC: uic_generic_save(var->value); break; |
358 } |
370 } |
359 } |
371 } |
360 |
372 |
361 void uic_unbind_var(UiVar *var) { |
373 void uic_unbind_var(UiVar *var) { |
362 switch(var->type) { |
374 switch(var->type) { |
365 case UI_VAR_DOUBLE: uic_double_unbind(var->value); break; |
377 case UI_VAR_DOUBLE: uic_double_unbind(var->value); break; |
366 case UI_VAR_STRING: uic_string_unbind(var->value); break; |
378 case UI_VAR_STRING: uic_string_unbind(var->value); break; |
367 case UI_VAR_TEXT: uic_text_unbind(var->value); break; |
379 case UI_VAR_TEXT: uic_text_unbind(var->value); break; |
368 case UI_VAR_LIST: uic_list_unbind(var->value); break; |
380 case UI_VAR_LIST: uic_list_unbind(var->value); break; |
369 case UI_VAR_RANGE: uic_range_unbind(var->value); break; |
381 case UI_VAR_RANGE: uic_range_unbind(var->value); break; |
|
382 case UI_VAR_GENERIC: uic_generic_unbind(var->value); break; |
370 } |
383 } |
371 } |
384 } |
372 |
385 |
373 void uic_reg_var(UiContext *ctx, char *name, UiVarType type, void *value) { |
386 void uic_reg_var(UiContext *ctx, char *name, UiVarType type, void *value) { |
374 // TODO: do we need/want this? Why adding vars to a context after |
387 // TODO: do we need/want this? Why adding vars to a context after |
526 } |
539 } |
527 |
540 |
528 cxListAdd(ctx->group_widgets, &gw); |
541 cxListAdd(ctx->group_widgets, &gw); |
529 } |
542 } |
530 |
543 |
|
544 UIEXPORT void *ui_ctx_allocator(UiContext *ctx) { |
|
545 return (void*) ctx ? ctx->allocator : NULL; |
|
546 } |
|
547 |
531 void* ui_malloc(UiContext *ctx, size_t size) { |
548 void* ui_malloc(UiContext *ctx, size_t size) { |
532 return ctx ? cxMalloc(ctx->allocator, size) : NULL; |
549 return ctx ? cxMalloc(ctx->allocator, size) : NULL; |
533 } |
550 } |
534 |
551 |
535 void* ui_calloc(UiContext *ctx, size_t nelem, size_t elsize) { |
552 void* ui_calloc(UiContext *ctx, size_t nelem, size_t elsize) { |