Wed, 25 Jun 2025 21:59:36 +0200
add ui_getvaluefunc2 (GTK)
| ui/gtk/list.c | file | annotate | diff | comparison | revisions | |
| ui/ui/toolkit.h | file | annotate | diff | comparison | revisions | |
| ui/ui/tree.h | file | annotate | diff | comparison | revisions |
--- a/ui/gtk/list.c Mon Jun 23 22:04:07 2025 +0200 +++ b/ui/gtk/list.c Wed Jun 25 21:59:36 2025 +0200 @@ -48,6 +48,15 @@ return column == 0 ? elm : NULL; } +static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col) { + if(model->getvalue2) { + return model->getvalue2(list, elm, row, col, model->getvalue2data); + } else if(model->getvalue) { + return model->getvalue(elm, col); + } + return NULL; +} + /* static GtkTargetEntry targetentries[] = { @@ -73,6 +82,7 @@ typedef struct _ObjWrapper { GObject parent_instance; void *data; + int i; } ObjWrapper; typedef struct _ObjWrapperClass { @@ -89,9 +99,10 @@ self->data = NULL; } -ObjWrapper* obj_wrapper_new(void* data) { +ObjWrapper* obj_wrapper_new(void* data, int i) { ObjWrapper *obj = g_object_new(obj_wrapper_get_type(), NULL); obj->data = data; + obj->i = i; return obj; } @@ -122,12 +133,13 @@ static void column_factory_bind( GtkListItemFactory *factory, GtkListItem *item, gpointer userdata) { UiColData *col = userdata; + UiList *list = col->listview->var->value; ObjWrapper *obj = gtk_list_item_get_item(item); UiModel *model = col->listview->model; UiModelType type = model->types[col->model_column]; - void *data = model->getvalue(obj->data, col->data_column); + void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column); GtkWidget *child = gtk_list_item_get_child(item); bool freevalue = TRUE; @@ -160,7 +172,7 @@ freevalue = FALSE; } case UI_ICON_TEXT_FREE: { - void *data2 = model->getvalue(obj->data, col->data_column+1); + void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1); GtkWidget *image = g_object_get_data(G_OBJECT(child), "image"); GtkWidget *label = g_object_get_data(G_OBJECT(child), "label"); if(data && image) { @@ -215,7 +227,13 @@ // to simplify things and share code with ui_table_create, we also // use a UiModel for the listview UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + if(args->getvalue2) { + model->getvalue2 = args->getvalue2; + } else if(args->getvalue) { + model->getvalue = args->getvalue; + } else { + model->getvalue = ui_strmodel_getvalue; + } args->model = model; GListStore *ls = g_list_store_new(G_TYPE_OBJECT); @@ -298,7 +316,13 @@ // to simplify things and share code with ui_tableview_create, we also // use a UiModel for the listview UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + if(args->getvalue2) { + model->getvalue2 = args->getvalue2; + } else if(args->getvalue) { + model->getvalue = args->getvalue; + } else { + model->getvalue = ui_strmodel_getvalue; + } args->model = model; GListStore *ls = g_list_store_new(G_TYPE_OBJECT); @@ -569,9 +593,10 @@ void ui_update_liststore(GListStore *liststore, UiList *list) { g_list_store_remove_all(liststore); + int i = 0; void *elm = list->first(list); while(elm) { - ObjWrapper *obj = obj_wrapper_new(elm); + ObjWrapper *obj = obj_wrapper_new(elm, i++); g_list_store_append(liststore, obj); elm = list->next(list); } @@ -580,7 +605,7 @@ void ui_update_liststore_static(GListStore *liststore, char **elm, size_t nelm) { g_list_store_remove_all(liststore); for(int i=0;i<nelm;i++) { - ObjWrapper *obj = obj_wrapper_new(elm[i]); + ObjWrapper *obj = obj_wrapper_new(elm[i], i); g_list_store_append(liststore, obj); } } @@ -592,7 +617,7 @@ } else { void *value = list->get(list, i); if(value) { - ObjWrapper *obj = obj_wrapper_new(value); + ObjWrapper *obj = obj_wrapper_new(value, i); // TODO: if index i is selected, the selection is lost // is it possible to update the item without removing it? int count = g_list_model_get_n_items(G_LIST_MODEL(view->liststore)); @@ -662,11 +687,11 @@ #else -static void update_list_row(GtkListStore *store, GtkTreeIter *iter, UiModel *model, void *elm) { +static void update_list_row(GtkListStore *store, GtkTreeIter *iter, UiModel *model, UiList *list, void *elm, int row) { // set column values int c = 0; for(int i=0;i<model->columns;i++,c++) { - void *data = model->getvalue(elm, c); + void *data = model_getvalue(model, list, elm, row, c); GValue value = G_VALUE_INIT; switch(model->types[i]) { @@ -728,7 +753,7 @@ #endif c++; - char *str = model->getvalue(elm, c); + char *str = model_getvalue(model, list, elm, row, c); g_value_init(&value, G_TYPE_STRING); g_value_set_string(&value, str); if(model->types[i] == UI_ICON_TEXT_FREE) { @@ -764,12 +789,13 @@ if(list) { void *elm = list->first(list); + int i = 0; while(elm) { // insert new row GtkTreeIter iter; gtk_list_store_insert (store, &iter, -1); - update_list_row(store, &iter, model, elm); + update_list_row(store, &iter, model, list, elm, i++); // next row elm = list->next(list); @@ -803,7 +829,13 @@ #endif UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + if(args->getvalue2) { + model->getvalue2 = args->getvalue2; + } else if(args->getvalue) { + model->getvalue = args->getvalue; + } else { + model->getvalue = ui_strmodel_getvalue; + } UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); @@ -1075,7 +1107,7 @@ GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(view->widget)); GtkTreeIter iter; if(gtk_tree_model_iter_nth_child(store, &iter, NULL, i)) { - update_list_row(GTK_LIST_STORE(store), &iter, view->model, elm); + update_list_row(GTK_LIST_STORE(store), &iter, view->model, list, elm, i); } } } @@ -1106,7 +1138,13 @@ UiObject* current = uic_current_obj(obj); UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + if(args->getvalue2) { + model->getvalue2 = args->getvalue2; + } else if(args->getvalue) { + model->getvalue = args->getvalue; + } else { + model->getvalue = ui_strmodel_getvalue; + } UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
--- a/ui/ui/toolkit.h Mon Jun 23 22:04:07 2025 +0200 +++ b/ui/ui/toolkit.h Wed Jun 25 21:59:36 2025 +0200 @@ -237,7 +237,8 @@ typedef void(*ui_callback)(UiEvent*, void*); /* event, user data */ -typedef void*(*ui_getvaluefunc)(void*, int); +typedef void*(*ui_getvaluefunc)(void *elm, int col); +typedef void*(*ui_getvaluefunc2)(UiList *list, void *elm, int row, int col, void *userdata); typedef int(*ui_threadfunc)(void*);
--- a/ui/ui/tree.h Mon Jun 23 22:04:07 2025 +0200 +++ b/ui/ui/tree.h Wed Jun 25 21:59:36 2025 +0200 @@ -78,12 +78,23 @@ int *columnsize; /* + * void*(*ui_getvaluefunc)(void *elm, int col); + * * function for translating model data to view data - * first argument is the pointer returned by UiList->get or UiTree->get + * first argument is the pointer returned by UiList first|next|get * second argument is the column index * TODO: return */ - void*(*getvalue)(void*, int); + ui_getvaluefunc getvalue; + + /* + * void*(*ui_getvaluefunc2)(UiList *list, void *elm, int row, int col, void *userdata) + * + * alternative for getvalue + */ + ui_getvaluefunc2 getvalue2; + + void *getvalue2data; }; struct UiListCallbacks { @@ -121,6 +132,8 @@ char **static_elements; size_t static_nelm; ui_getvaluefunc getvalue; + ui_getvaluefunc2 getvalue2; + void *getvalue2data; ui_callback onactivate; void* onactivatedata; ui_callback onselection;