43 |
43 |
44 |
44 |
45 static UiContext* global_context; |
45 static UiContext* global_context; |
46 |
46 |
47 void uic_init_global_context(void) { |
47 void uic_init_global_context(void) { |
48 CxMempool *mp = cxBasicMempoolCreate(32); |
48 CxMempool *mp = cxMempoolCreateSimple(32); |
49 global_context = uic_context(NULL, mp); |
49 global_context = uic_context(NULL, mp); |
50 } |
50 } |
51 |
51 |
52 UiContext* ui_global_context(void) { |
52 UiContext* ui_global_context(void) { |
53 return global_context; |
53 return global_context; |
59 ctx->mp = mp; |
59 ctx->mp = mp; |
60 ctx->allocator = mp->allocator; |
60 ctx->allocator = mp->allocator; |
61 ctx->obj = toplevel; |
61 ctx->obj = toplevel; |
62 ctx->vars = cxHashMapCreate(mp->allocator, CX_STORE_POINTERS, 16); |
62 ctx->vars = cxHashMapCreate(mp->allocator, CX_STORE_POINTERS, 16); |
63 |
63 |
64 ctx->documents = cxLinkedListCreate(mp->allocator, cx_cmp_intptr, CX_STORE_POINTERS); |
64 ctx->documents = cxLinkedListCreate(mp->allocator, cx_cmp_ptr, CX_STORE_POINTERS); |
65 ctx->group_widgets = cxLinkedListCreate(mp->allocator, cx_cmp_ptr, sizeof(UiGroupWidget)); |
65 ctx->group_widgets = cxLinkedListCreate(mp->allocator, cx_cmp_ptr, sizeof(UiGroupWidget)); |
66 ctx->groups = cxArrayListCreate(mp->allocator, cx_cmp_int, sizeof(int), 32); |
66 ctx->groups = cxArrayListCreate(mp->allocator, cx_cmp_int, sizeof(int), 32); |
67 |
67 |
68 ctx->attach_document = uic_context_attach_document; |
68 ctx->attach_document = uic_context_attach_document; |
69 ctx->detach_document2 = uic_context_detach_document2; |
69 ctx->detach_document2 = uic_context_detach_document2; |
96 // check if any parent context has an unbound variable with the same name |
96 // check if any parent context has an unbound variable with the same name |
97 // as any document variable |
97 // as any document variable |
98 UiContext *var_ctx = ctx; |
98 UiContext *var_ctx = ctx; |
99 while(var_ctx) { |
99 while(var_ctx) { |
100 if(var_ctx->vars_unbound && cxMapSize(var_ctx->vars_unbound) > 0) { |
100 if(var_ctx->vars_unbound && cxMapSize(var_ctx->vars_unbound) > 0) { |
101 CxIterator i = cxMapIterator(var_ctx->vars_unbound); |
101 CxMapIterator i = cxMapIterator(var_ctx->vars_unbound); |
102 cx_foreach(CxMapEntry*, entry, i) { |
102 cx_foreach(CxMapEntry*, entry, i) { |
103 printf("attach %s\n", entry->key->data); |
103 printf("attach %s\n", entry->key->data); |
104 UiVar *var = entry->value; |
104 UiVar *var = entry->value; |
105 UiVar *docvar = cxMapGet(doc_ctx->vars, *entry->key); |
105 UiVar *docvar = cxMapGet(doc_ctx->vars, *entry->key); |
106 if(docvar) { |
106 if(docvar) { |
114 var_ctx = ctx->parent; |
114 var_ctx = ctx->parent; |
115 } |
115 } |
116 } |
116 } |
117 |
117 |
118 static void uic_context_unbind_vars(UiContext *ctx) { |
118 static void uic_context_unbind_vars(UiContext *ctx) { |
119 CxIterator i = cxMapIterator(ctx->vars); |
119 CxMapIterator mi = cxMapIterator(ctx->vars); |
120 cx_foreach(CxMapEntry*, entry, i) { |
120 cx_foreach(CxMapEntry*, entry, mi) { |
121 UiVar *var = entry->value; |
121 UiVar *var = entry->value; |
122 if(var->from && var->from_ctx) { |
122 if(var->from && var->from_ctx) { |
123 uic_save_var2(var); |
123 uic_save_var2(var); |
124 uic_copy_binding(var, var->from, FALSE); |
124 uic_copy_binding(var, var->from, FALSE); |
125 cxMapPut(var->from_ctx->vars_unbound, *entry->key, var->from); |
125 cxMapPut(var->from_ctx->vars_unbound, *entry->key, var->from); |
126 var->from_ctx = ctx; |
126 var->from_ctx = ctx; |
127 } |
127 } |
128 } |
128 } |
129 |
129 |
130 if(ctx->documents) { |
130 if(ctx->documents) { |
131 i = cxListIterator(ctx->documents); |
131 CxIterator i = cxListIterator(ctx->documents); |
132 cx_foreach(void *, doc, i) { |
132 cx_foreach(void *, doc, i) { |
133 UiContext *subctx = ui_document_context(doc); |
133 UiContext *subctx = ui_document_context(doc); |
134 uic_context_unbind_vars(subctx); |
134 uic_context_unbind_vars(subctx); |
135 } |
135 } |
136 } |
136 } |
469 cxMempoolFree(ctx->mp); |
469 cxMempoolFree(ctx->mp); |
470 } |
470 } |
471 |
471 |
472 |
472 |
473 void ui_set_group(UiContext *ctx, int group) { |
473 void ui_set_group(UiContext *ctx, int group) { |
474 if(cxListFind(ctx->groups, &group) == -1) { |
474 if(!cxListIndexValid(ctx->groups, cxListFind(ctx->groups, &group))) { |
475 cxListAdd(ctx->groups, &group); |
475 cxListAdd(ctx->groups, &group); |
476 } |
476 } |
477 |
477 |
478 // enable/disable group widgets |
478 // enable/disable group widgets |
479 uic_check_group_widgets(ctx); |
479 uic_check_group_widgets(ctx); |