| 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)) { |