extend ui_getvaluefunc2: add indicator, wether the value should be freed

Thu, 26 Jun 2025 18:28:20 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 26 Jun 2025 18:28:20 +0200
changeset 637
6a2c744fe042
parent 636
4630ddf7a20c
child 638
51adf061e18f

extend ui_getvaluefunc2: add indicator, wether the value should be freed

ui/gtk/list.c file | annotate | diff | comparison | revisions
ui/qt/list.cpp file | annotate | diff | comparison | revisions
ui/qt/model.cpp file | annotate | diff | comparison | revisions
ui/ui/toolkit.h file | annotate | diff | comparison | revisions
--- a/ui/gtk/list.c	Wed Jun 25 23:15:34 2025 +0200
+++ b/ui/gtk/list.c	Thu Jun 26 18:28:20 2025 +0200
@@ -48,9 +48,9 @@
     return column == 0 ? elm : NULL;
 }
 
-static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col) {
+static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) {
     if(model->getvalue2) {
-        return model->getvalue2(list, elm, row, col, model->getvalue2data);
+        return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult);
     } else if(model->getvalue) {
         return model->getvalue(elm, col);
     }
@@ -139,15 +139,15 @@
     UiModel *model = col->listview->model;
     UiModelType type = model->types[col->model_column];
     
-    void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column);
+    UiBool freevalue = FALSE;
+    void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column, &freevalue);
     GtkWidget *child = gtk_list_item_get_child(item);
     
-    bool freevalue = TRUE;
     switch(type) {
+        case UI_STRING_FREE: {
+            freevalue = TRUE;
+        }
         case UI_STRING: {
-            freevalue = FALSE;
-        }
-        case UI_STRING_FREE: {
             gtk_label_set_label(GTK_LABEL(child), data);
             if(freevalue) {
                 free(data);
@@ -169,10 +169,13 @@
             break;
         }
         case UI_ICON_TEXT: {
-            freevalue = FALSE;
+            
         }
         case UI_ICON_TEXT_FREE: {
-            void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1);
+            void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1, &freevalue);
+            if(type == UI_ICON_TEXT_FREE) {
+                freevalue = TRUE;
+            }
             GtkWidget *image = g_object_get_data(G_OBJECT(child), "image");
             GtkWidget *label = g_object_get_data(G_OBJECT(child), "label");
             if(data && image) {
@@ -691,15 +694,18 @@
     // set column values
     int c = 0;
     for(int i=0;i<model->columns;i++,c++) {
-        void *data = model_getvalue(model, list, elm, row, c);
+        UiBool freevalue = FALSE;
+        void *data = model_getvalue(model, list, elm, row, c, &freevalue);
 
         GValue value = G_VALUE_INIT;
         switch(model->types[i]) {
-            case UI_STRING: 
             case UI_STRING_FREE: {
+                freevalue = TRUE;
+            } 
+            case UI_STRING: {
                 g_value_init(&value, G_TYPE_STRING);
                 g_value_set_string(&value, data);
-                if(model->types[i] == UI_STRING_FREE) {
+                if(freevalue) {
                     free(data);
                 }
                 break;
@@ -752,11 +758,12 @@
                 }
 #endif
                 c++;
-
-                char *str = model_getvalue(model, list, elm, row, c);
+                
+                freevalue = FALSE;
+                char *str = model_getvalue(model, list, elm, row, c, &freevalue);
                 g_value_init(&value, G_TYPE_STRING);
                 g_value_set_string(&value, str);
-                if(model->types[i] == UI_ICON_TEXT_FREE) {
+                if(model->types[i] == UI_ICON_TEXT_FREE || freevalue) {
                     free(str);
                 }
                 break;
--- a/ui/qt/list.cpp	Wed Jun 25 23:15:34 2025 +0200
+++ b/ui/qt/list.cpp	Thu Jun 26 18:28:20 2025 +0200
@@ -37,7 +37,7 @@
     return column == 0 ? elm : NULL;
 }
 
-static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata) {
+static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
     ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
     return getvalue(elm, col);
 }
--- a/ui/qt/model.cpp	Wed Jun 25 23:15:34 2025 +0200
+++ b/ui/qt/model.cpp	Thu Jun 26 18:28:20 2025 +0200
@@ -28,9 +28,9 @@
 
 #include "model.h"
 
-static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col) {
+static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) {
     if(model->getvalue2) {
-        return model->getvalue2(list, elm, row, col, model->getvalue2data);
+        return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult);
     } else if(model->getvalue) {
         return model->getvalue(elm, col);
     }
@@ -78,9 +78,14 @@
         UiList *ls = (UiList*)var->value;
         void *rowData = ls->get(ls, index.row());
         if(rowData && getvalue) {
-            void *value = getvalue(ls, rowData, index.row(), 0, getvaluedata);
+            UiBool freeResult = false;
+            void *value = getvalue(ls, rowData, index.row(), 0, getvaluedata, &freeResult);
             if(value) {
-                return QString::fromUtf8((char*)value); 
+                auto qs = QString::fromUtf8((char*)value);
+                if(freeResult) {
+                    free(value);
+                }
+                return qs;
             }
         }
     }
@@ -155,12 +160,17 @@
         void *rowData = ls->get(ls, index.row());
         if(rowData) {
             int col = index.column();
-            void *value = model_getvalue(model, ls, rowData, index.row(), col);
+            UiBool freeResult = false;
+            void *value = model_getvalue(model, ls, rowData, index.row(), col, &freeResult);
             if(value) {
                 UiModelType type = model->types[col];
                 switch(type) {
                     case UI_STRING: {
-                        return QString::fromUtf8((char*)value); 
+                        auto qs = QString::fromUtf8((char*)value);
+                        if(freeResult) {
+                            free(value);
+                        }
+                        return qs;
                     }
                     case UI_STRING_FREE: {
                         QString s = QString::fromUtf8((char*)value);
@@ -172,13 +182,13 @@
                         return QString::number(i);
                     }
                     case UI_ICON: {
-                        break;
+                        break; // TODO
                     }
                     case UI_ICON_TEXT: {
-                        break;
+                        break; // TODO
                     }
                     case UI_ICON_TEXT_FREE: {
-                        break;
+                        break; // TODO
                     }
                 }
             }
--- a/ui/ui/toolkit.h	Wed Jun 25 23:15:34 2025 +0200
+++ b/ui/ui/toolkit.h	Thu Jun 26 18:28:20 2025 +0200
@@ -238,7 +238,7 @@
 typedef void(*ui_callback)(UiEvent*, void*); /* event, user data */
 
 typedef void*(*ui_getvaluefunc)(void *elm, int col);
-typedef void*(*ui_getvaluefunc2)(UiList *list, void *elm, int row, int col, void *userdata);
+typedef void*(*ui_getvaluefunc2)(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult);
 
 typedef int(*ui_threadfunc)(void*);
 

mercurial