ui/common/types.c

changeset 728
011d236c4a05
parent 693
3e1cd004da0a
child 737
ac7f0869e8ae
--- a/ui/common/types.c	Mon Aug 25 20:01:54 2025 +0200
+++ b/ui/common/types.c	Mon Aug 25 20:33:26 2025 +0200
@@ -220,6 +220,7 @@
     va_end(ap);
     
     size_t len = cxListSize(cols);
+    info->alloc = len;
     info->columns = len;
     info->types = ui_calloc(ctx, len, sizeof(UiModelType));
     info->titles = ui_calloc(ctx, len, sizeof(char*));
@@ -229,7 +230,7 @@
     CxIterator iter = cxListIterator(cols);
     cx_foreach(UiColumn*, c, iter) {
         info->types[i] = c->type;
-        info->titles[i] = c->name;
+        info->titles[i] = ui_strdup(ctx, c->name);
         i++;
     }
     cxListFree(cols);
@@ -237,6 +238,30 @@
     return info;
 }
 
+#define UI_MODEL_DEFAULT_ALLOC_SIZE 16
+
+UiModel* ui_model_new(UiContext *ctx) {
+    UiModel *info = ui_calloc(ctx, 1, sizeof(UiModel));
+    info->alloc = UI_MODEL_DEFAULT_ALLOC_SIZE;
+    info->types = ui_calloc(ctx, UI_MODEL_DEFAULT_ALLOC_SIZE, sizeof(UiModelType));
+    info->titles = ui_calloc(ctx, UI_MODEL_DEFAULT_ALLOC_SIZE, sizeof(char*));
+    info->columnsize = ui_calloc(ctx, UI_MODEL_DEFAULT_ALLOC_SIZE, sizeof(int));
+    return info;
+}
+
+void ui_model_add_column(UiContext *ctx, UiModel *model, UiModelType type, const char *title, int width) {
+    if(model->columns >= model->alloc) {
+        model->alloc += UI_MODEL_DEFAULT_ALLOC_SIZE;
+        model->types = ui_realloc(ctx, model->types, model->alloc * sizeof(UiModelType));
+        model->titles = ui_realloc(ctx, model->titles, model->alloc * sizeof(char*));
+        model->columnsize = ui_realloc(ctx, model->columnsize, model->alloc * sizeof(int));
+    }
+    model->types[model->columns] = type;
+    model->titles[model->columns] = ui_strdup(ctx, title);
+    model->columnsize[model->columns] = width;
+    model->columns++;
+}
+
 UiModel* ui_model_copy(UiContext *ctx, UiModel* model) {
     const CxAllocator* a = ctx ? ctx->allocator : cxDefaultAllocator;
 
@@ -258,6 +283,9 @@
 
 void ui_model_free(UiContext *ctx, UiModel *mi) {
     const CxAllocator* a = ctx ? ctx->allocator : cxDefaultAllocator;
+    for(int i=0;i<mi->columns;i++) {
+        ui_free(ctx, mi->titles[i]);
+    }
     cxFree(a, mi->types);
     cxFree(a, mi->titles);
     cxFree(a, mi->columnsize);

mercurial