| 46 |
46 |
| 47 void* ui_strmodel_getvalue(void *elm, int column) { |
47 void* ui_strmodel_getvalue(void *elm, int column) { |
| 48 return column == 0 ? elm : NULL; |
48 return column == 0 ? elm : NULL; |
| 49 } |
49 } |
| 50 |
50 |
| 51 static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col) { |
51 static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) { |
| 52 if(model->getvalue2) { |
52 if(model->getvalue2) { |
| 53 return model->getvalue2(list, elm, row, col, model->getvalue2data); |
53 return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult); |
| 54 } else if(model->getvalue) { |
54 } else if(model->getvalue) { |
| 55 return model->getvalue(elm, col); |
55 return model->getvalue(elm, col); |
| 56 } |
56 } |
| 57 return NULL; |
57 return NULL; |
| 58 } |
58 } |
| 137 |
137 |
| 138 ObjWrapper *obj = gtk_list_item_get_item(item); |
138 ObjWrapper *obj = gtk_list_item_get_item(item); |
| 139 UiModel *model = col->listview->model; |
139 UiModel *model = col->listview->model; |
| 140 UiModelType type = model->types[col->model_column]; |
140 UiModelType type = model->types[col->model_column]; |
| 141 |
141 |
| 142 void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column); |
142 UiBool freevalue = FALSE; |
| |
143 void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column, &freevalue); |
| 143 GtkWidget *child = gtk_list_item_get_child(item); |
144 GtkWidget *child = gtk_list_item_get_child(item); |
| 144 |
145 |
| 145 bool freevalue = TRUE; |
|
| 146 switch(type) { |
146 switch(type) { |
| |
147 case UI_STRING_FREE: { |
| |
148 freevalue = TRUE; |
| |
149 } |
| 147 case UI_STRING: { |
150 case UI_STRING: { |
| 148 freevalue = FALSE; |
|
| 149 } |
|
| 150 case UI_STRING_FREE: { |
|
| 151 gtk_label_set_label(GTK_LABEL(child), data); |
151 gtk_label_set_label(GTK_LABEL(child), data); |
| 152 if(freevalue) { |
152 if(freevalue) { |
| 153 free(data); |
153 free(data); |
| 154 } |
154 } |
| 155 break; |
155 break; |
| 167 gtk_image_set_from_paintable(GTK_IMAGE(child), GDK_PAINTABLE(icon->info)); |
167 gtk_image_set_from_paintable(GTK_IMAGE(child), GDK_PAINTABLE(icon->info)); |
| 168 } |
168 } |
| 169 break; |
169 break; |
| 170 } |
170 } |
| 171 case UI_ICON_TEXT: { |
171 case UI_ICON_TEXT: { |
| 172 freevalue = FALSE; |
172 |
| 173 } |
173 } |
| 174 case UI_ICON_TEXT_FREE: { |
174 case UI_ICON_TEXT_FREE: { |
| 175 void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1); |
175 void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1, &freevalue); |
| |
176 if(type == UI_ICON_TEXT_FREE) { |
| |
177 freevalue = TRUE; |
| |
178 } |
| 176 GtkWidget *image = g_object_get_data(G_OBJECT(child), "image"); |
179 GtkWidget *image = g_object_get_data(G_OBJECT(child), "image"); |
| 177 GtkWidget *label = g_object_get_data(G_OBJECT(child), "label"); |
180 GtkWidget *label = g_object_get_data(G_OBJECT(child), "label"); |
| 178 if(data && image) { |
181 if(data && image) { |
| 179 UiIcon *icon = data; |
182 UiIcon *icon = data; |
| 180 gtk_image_set_from_paintable(GTK_IMAGE(image), GDK_PAINTABLE(icon->info)); |
183 gtk_image_set_from_paintable(GTK_IMAGE(image), GDK_PAINTABLE(icon->info)); |
| 689 |
692 |
| 690 static void update_list_row(GtkListStore *store, GtkTreeIter *iter, UiModel *model, UiList *list, void *elm, int row) { |
693 static void update_list_row(GtkListStore *store, GtkTreeIter *iter, UiModel *model, UiList *list, void *elm, int row) { |
| 691 // set column values |
694 // set column values |
| 692 int c = 0; |
695 int c = 0; |
| 693 for(int i=0;i<model->columns;i++,c++) { |
696 for(int i=0;i<model->columns;i++,c++) { |
| 694 void *data = model_getvalue(model, list, elm, row, c); |
697 UiBool freevalue = FALSE; |
| |
698 void *data = model_getvalue(model, list, elm, row, c, &freevalue); |
| 695 |
699 |
| 696 GValue value = G_VALUE_INIT; |
700 GValue value = G_VALUE_INIT; |
| 697 switch(model->types[i]) { |
701 switch(model->types[i]) { |
| 698 case UI_STRING: |
|
| 699 case UI_STRING_FREE: { |
702 case UI_STRING_FREE: { |
| |
703 freevalue = TRUE; |
| |
704 } |
| |
705 case UI_STRING: { |
| 700 g_value_init(&value, G_TYPE_STRING); |
706 g_value_init(&value, G_TYPE_STRING); |
| 701 g_value_set_string(&value, data); |
707 g_value_set_string(&value, data); |
| 702 if(model->types[i] == UI_STRING_FREE) { |
708 if(freevalue) { |
| 703 free(data); |
709 free(data); |
| 704 } |
710 } |
| 705 break; |
711 break; |
| 706 } |
712 } |
| 707 case UI_INTEGER: { |
713 case UI_INTEGER: { |
| 750 g_value_set_object(&pixbufvalue, icon->pixbuf); |
756 g_value_set_object(&pixbufvalue, icon->pixbuf); |
| 751 gtk_list_store_set_value(store, iter, c, &pixbufvalue); |
757 gtk_list_store_set_value(store, iter, c, &pixbufvalue); |
| 752 } |
758 } |
| 753 #endif |
759 #endif |
| 754 c++; |
760 c++; |
| 755 |
761 |
| 756 char *str = model_getvalue(model, list, elm, row, c); |
762 freevalue = FALSE; |
| |
763 char *str = model_getvalue(model, list, elm, row, c, &freevalue); |
| 757 g_value_init(&value, G_TYPE_STRING); |
764 g_value_init(&value, G_TYPE_STRING); |
| 758 g_value_set_string(&value, str); |
765 g_value_set_string(&value, str); |
| 759 if(model->types[i] == UI_ICON_TEXT_FREE) { |
766 if(model->types[i] == UI_ICON_TEXT_FREE || freevalue) { |
| 760 free(str); |
767 free(str); |
| 761 } |
768 } |
| 762 break; |
769 break; |
| 763 } |
770 } |
| 764 } |
771 } |