ui/common/types.c

changeset 902
6872b59217a7
parent 875
0575ca45f1bb
child 906
edfdf9776da9
equal deleted inserted replaced
901:884d70e847a3 902:6872b59217a7
38 #include "context.h" 38 #include "context.h"
39 #include "../ui/image.h" 39 #include "../ui/image.h"
40 40
41 static ui_list_init_func default_list_init; 41 static ui_list_init_func default_list_init;
42 static void *default_list_init_userdata; 42 static void *default_list_init_userdata;
43 static ui_list_destroy_func default_list_destroy;
44 static void *default_list_destroy_userdata;
43 45
44 UiObserver* ui_observer_new(ui_callback f, void *data) { 46 UiObserver* ui_observer_new(ui_callback f, void *data) {
45 UiObserver *observer = malloc(sizeof(UiObserver)); 47 UiObserver *observer = malloc(sizeof(UiObserver));
46 observer->callback = f; 48 observer->callback = f;
47 observer->data = data; 49 observer->data = data;
103 list->next = ui_list_next; 105 list->next = ui_list_next;
104 list->get = ui_list_get; 106 list->get = ui_list_get;
105 list->count = ui_list_count; 107 list->count = ui_list_count;
106 } 108 }
107 109
110 void uic_ucx_list_destroy(UiContext *ctx, UiList *list, void *unused) {
111 cxListFree(list->data);
112 ui_free(ctx, list);
113 }
114
108 UiList* ui_list_new(UiContext *ctx, const char *name) { 115 UiList* ui_list_new(UiContext *ctx, const char *name) {
109 return ui_list_new2(ctx, name, default_list_init ? default_list_init : uic_ucx_list_init, default_list_init_userdata); 116 return ui_list_new2(ctx, name, default_list_init ? default_list_init : uic_ucx_list_init, default_list_init_userdata);
110 } 117 }
111 118
112 UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func listinit, void *userdata) { 119 UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func listinit, void *userdata) {
119 } 126 }
120 127
121 return list; 128 return list;
122 } 129 }
123 130
124 void ui_list_free(UiList *list) { 131 void ui_list_free(UiContext *ctx, UiList *list) {
125 cxListFree(list->data); 132 if(!default_list_destroy) {
126 free(list); 133 uic_ucx_list_destroy(ctx, list, NULL);
134 } else {
135 default_list_destroy(ctx, list, default_list_destroy_userdata);
136 }
137
127 } 138 }
128 139
129 void* ui_list_first(UiList *list) { 140 void* ui_list_first(UiList *list) {
130 list->iter = (void*)(intptr_t)0; 141 list->iter = (void*)(intptr_t)0;
131 return cxListAt(list->data, 0); 142 return cxListAt(list->data, 0);
801 void ui_global_list_initializer(ui_list_init_func func, void *userdata) { 812 void ui_global_list_initializer(ui_list_init_func func, void *userdata) {
802 default_list_init = func; 813 default_list_init = func;
803 default_list_init_userdata = userdata; 814 default_list_init_userdata = userdata;
804 } 815 }
805 816
817 void ui_global_list_destructor(ui_list_destroy_func func, void *userdata) {
818 default_list_destroy = func;
819 default_list_destroy_userdata = userdata;
820 }
821
806 void ui_list_class_set_first(UiList *list, void*(*first)(UiList *list)) { 822 void ui_list_class_set_first(UiList *list, void*(*first)(UiList *list)) {
807 list->first = first; 823 list->first = first;
808 } 824 }
809 825
810 void ui_list_class_set_next(UiList *list, void*(*next)(UiList *list)) { 826 void ui_list_class_set_next(UiList *list, void*(*next)(UiList *list)) {

mercurial