ui/gtk/list.c

changeset 633
4c6ba81d319e
parent 632
8cce45a85942
child 637
6a2c744fe042
--- 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);
     

mercurial