add alternative UiModel creation functions

Mon, 25 Aug 2025 20:33:26 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 25 Aug 2025 20:33:26 +0200
changeset 728
011d236c4a05
parent 727
de40bc4811b1
child 729
81b698792386

add alternative UiModel creation functions

ui/common/types.c file | annotate | diff | comparison | revisions
ui/ui/tree.h file | annotate | diff | comparison | revisions
--- 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);
--- 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);
 

mercurial