ui/gtk/list.c

changeset 637
6a2c744fe042
parent 633
4c6ba81d319e
child 643
bed746b98a52
equal deleted inserted replaced
636:4630ddf7a20c 637:6a2c744fe042
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 }

mercurial