ui/common/types.c

changeset 629
0385a450c2a6
parent 622
9090faa4094b
child 631
5d745e140ee7
--- 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;
+}

mercurial