ui/common/context.c

changeset 471
063a9f29098c
parent 440
7c4b9cba09ca
child 474
971dd0f3a117
equal deleted inserted replaced
470:118e2386d5b4 471:063a9f29098c
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);

mercurial