--- a/ui/common/types.c Mon Jun 16 21:41:55 2025 +0200 +++ b/ui/common/types.c Fri Jun 20 12:01:08 2025 +0200 @@ -38,6 +38,7 @@ #include "context.h" #include "../ui/image.h" +static ui_list_init_func default_list_init; UiObserver* ui_observer_new(ui_callback f, void *data) { @@ -95,20 +96,22 @@ /* --------------------------- UiList --------------------------- */ -UiList* ui_list_new(UiContext *ctx, char *name) { - UiList *list = malloc(sizeof(UiList)); +void uic_ucx_list_init(UiContext *ctx, UiList *list) { + list->data = cxArrayListCreate(ctx->mp->allocator, NULL, CX_STORE_POINTERS, 32); list->first = ui_list_first; list->next = ui_list_next; list->get = ui_list_get; list->count = ui_list_count; - list->observers = NULL; - - list->data = cxArrayListCreate(cxDefaultAllocator, NULL, CX_STORE_POINTERS, 32); - list->iter = NULL; - - list->update = NULL; - list->getselection = NULL; - list->obj = NULL; +} + +UiList* ui_list_new(UiContext *ctx, const char *name) { + return ui_list_new2(ctx, name, default_list_init ? default_list_init : uic_ucx_list_init); +} + +UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func listinit) { + UiList *list = cxMalloc(ctx->mp->allocator, sizeof(UiList)); + memset(list, 0, sizeof(UiList)); + listinit(ctx, list); if(name) { uic_reg_var(ctx, name, UI_VAR_LIST, list); @@ -661,3 +664,33 @@ int ui_get_setop(void) { return ui_set_op; } + +/* ---------------- List initializers and wrapper functions ---------------- */ + +void ui_global_list_initializer(ui_list_init_func func) { + default_list_init = func; +} + +void ui_list_class_set_first(UiList *list, void*(*first)(UiList *list)) { + list->first = first; +} + +void ui_list_class_set_next(UiList *list, void*(*next)(UiList *list)) { + list->next = next; +} + +void ui_list_class_set_get(UiList *list, void*(*get)(UiList *list, int i)) { + list->get = get; +} + +void ui_list_class_set_count(UiList *list, int(*count)(UiList *list)) { + list->count = count; +} + +void ui_list_class_set_data(UiList *list, void *data) { + list->data = data; +} + +void ui_list_class_set_iter(UiList *list, void *iter) { + list->iter = iter; +}