# HG changeset patch # User Olaf Wintermann # Date 1756146806 -7200 # Node ID 011d236c4a05d96970ad1a59987ac0fc5bbc262d # Parent de40bc4811b1f8e12884b87312d5c66eb8e17a78 add alternative UiModel creation functions diff -r de40bc4811b1 -r 011d236c4a05 ui/common/types.c --- 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;icolumns;i++) { + ui_free(ctx, mi->titles[i]); + } cxFree(a, mi->types); cxFree(a, mi->titles); cxFree(a, mi->columnsize); diff -r de40bc4811b1 -r 011d236c4a05 ui/ui/tree.h --- a/ui/ui/tree.h Mon Aug 25 20:01:54 2025 +0200 +++ b/ui/ui/tree.h Mon Aug 25 20:33:26 2025 +0200 @@ -61,6 +61,11 @@ int columns; /* + * current allocation size (internal) + */ + int alloc; + + /* * array of column types * array length is the number of columns */ @@ -247,6 +252,8 @@ * UiModel *model = ui_model(ctx, UI_STRING, "Column 1", UI_STRING, "Column 2", -1); */ UIEXPORT UiModel* ui_model(UiContext *ctx, ...); +UIEXPORT UiModel* ui_model_new(UiContext *ctx); +UIEXPORT void ui_model_add_column(UiContext *ctx, UiModel *model, UiModelType type, const char *title, int width); UIEXPORT UiModel* ui_model_copy(UiContext *ctx, UiModel* model); UIEXPORT void ui_model_free(UiContext *ctx, UiModel *mi);