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