ui/gtk/model.c

changeset 40
caa0df8ed095
parent 35
3e8b5c9b4033
child 41
394f3b06dba1
--- a/ui/gtk/model.c	Thu May 15 20:06:28 2014 +0200
+++ b/ui/gtk/model.c	Thu May 15 21:48:53 2014 +0200
@@ -97,13 +97,40 @@
     instance->stamp = g_random_int();
 }
 
-UiListModel* ui_list_model_new(UiListPtr *list, ui_model_getvalue_f getvalue) {
+static GType ui_gtk_type(UiModelType type) {
+    switch(type) {
+        case UI_STRING: return G_TYPE_STRING;
+        case UI_INTEGER: return G_TYPE_INT;
+    }
+    return G_TYPE_INVALID;
+}
+
+static void ui_model_set_value(UiModelType type, void *data, GValue *value) {
+    switch(type) {
+        case UI_STRING: {
+            value->g_type = G_TYPE_STRING;
+            g_value_set_string(value, data);
+            return;
+        }
+        case UI_INTEGER: {
+            value->g_type = G_TYPE_INT;
+            int *i = data;
+            g_value_set_int(value, *i);
+            return;
+        }
+    }
+    value->g_type = G_TYPE_INVALID; 
+}
+
+UiListModel* ui_list_model_new(UiListPtr *list, UiModelInfo *info) {
     UiListModel *model = g_object_new(list_model_type, NULL);
+    model->info = info;
     model->list = list;
-    model->getvalue = getvalue;
     model->columntypes = malloc(sizeof(GType));
-    model->numcolumns = 1;
-    model->columntypes[0] = G_TYPE_STRING;
+    model->numcolumns = info->columns;
+    for(int i=0;i<info->columns;i++) {
+        model->columntypes[i] = ui_gtk_type(info->types[i]);
+    }
     return model;
 }
 
@@ -204,15 +231,15 @@
     
     // TODO: return correct value from column
     
-    value->g_type = G_TYPE_STRING;
+    //value->g_type = G_TYPE_STRING;
     list->iter = iter->user_data;
     //list->index = (int)(intptr_t)iter->user_data2;
     //list->current = iter->user_data3;
-    if(model->getvalue) {
-        char *str = model->getvalue(iter->user_data3, column);
-        g_value_set_string(value, str);
+    if(model->info->getvalue) {
+        void *data = model->info->getvalue(iter->user_data3, column);
+        ui_model_set_value(model->info->types[column], data, value);
     } else {
-        g_value_set_string(value, iter->user_data3);
+        value->g_type = G_TYPE_INVALID;
     }
 }
 

mercurial