Thu, 26 Jun 2025 18:28:20 +0200
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*);