ui/gtk/list.c

changeset 637
6a2c744fe042
parent 633
4c6ba81d319e
child 643
bed746b98a52
--- 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;

mercurial