LayerSelector: Make import of layer information from CSV independed from mapping-parser code. Use LayerSettings class instead.
This commit is contained in:
		| @@ -577,6 +577,7 @@ void layer_selector_generate_layer_widgets(LayerSelector *selector, GList *libs) | |||||||
| static LayerElement *layer_selector_find_layer_element_in_list(GList *el_list, int layer) | static LayerElement *layer_selector_find_layer_element_in_list(GList *el_list, int layer) | ||||||
| { | { | ||||||
| 	LayerElement *ret = NULL; | 	LayerElement *ret = NULL; | ||||||
|  |  | ||||||
| 	for (; el_list != NULL; el_list = el_list->next) { | 	for (; el_list != NULL; el_list = el_list->next) { | ||||||
| 		if (layer_element_get_layer(LAYER_ELEMENT(el_list->data)) == layer) { | 		if (layer_element_get_layer(LAYER_ELEMENT(el_list->data)) == layer) { | ||||||
| 			ret = LAYER_ELEMENT(el_list->data); | 			ret = LAYER_ELEMENT(el_list->data); | ||||||
| @@ -597,19 +598,18 @@ static LayerElement *layer_selector_find_layer_element_in_list(GList *el_list, i | |||||||
|  * @param self LayerSelector instance |  * @param self LayerSelector instance | ||||||
|  * @param file_name File name to load from |  * @param file_name File name to load from | ||||||
|  */ |  */ | ||||||
| static void layer_selector_load_layer_mapping_from_file(LayerSelector *self, gchar *file_name) | static void layer_selector_load_layer_mapping_from_file(LayerSelector *self, const gchar *file_name) | ||||||
| { | { | ||||||
| 	GFile *file; | 	GFile *file; | ||||||
| 	GFileInputStream *stream; | 	GFileInputStream *stream; | ||||||
| 	GDataInputStream *dstream; | 	GDataInputStream *dstream; | ||||||
| 	LayerElement *le; | 	LayerElement *le; | ||||||
| 	char *name; |  | ||||||
| 	gboolean export; |  | ||||||
| 	int layer; |  | ||||||
| 	GdkRGBA color; |  | ||||||
| 	int result; |  | ||||||
| 	GList *rows; | 	GList *rows; | ||||||
| 	GList *temp; | 	GList *temp; | ||||||
|  | 	GList *layer_infos; | ||||||
|  | 	int status; | ||||||
|  | 	LayerSettings *layer_settings; | ||||||
|  | 	struct layer_info *linfo; | ||||||
|  |  | ||||||
| 	file = g_file_new_for_path(file_name); | 	file = g_file_new_for_path(file_name); | ||||||
| 	stream = g_file_read(file, NULL, NULL); | 	stream = g_file_read(file, NULL, NULL); | ||||||
| @@ -624,30 +624,39 @@ static void layer_selector_load_layer_mapping_from_file(LayerSelector *self, gch | |||||||
| 	/* Reference and remove all rows from box */ | 	/* Reference and remove all rows from box */ | ||||||
| 	for (temp = rows; temp != NULL; temp = temp->next) { | 	for (temp = rows; temp != NULL; temp = temp->next) { | ||||||
| 		le = LAYER_ELEMENT(temp->data); | 		le = LAYER_ELEMENT(temp->data); | ||||||
| 		/* Referencing protets the widget from being deleted when removed */ | 		/* Referencing protects the widget from being deleted when removed */ | ||||||
| 		g_object_ref(G_OBJECT(le)); | 		g_object_ref(G_OBJECT(le)); | ||||||
| 		gtk_container_remove(GTK_CONTAINER(self->list_box), GTK_WIDGET(le)); | 		gtk_container_remove(GTK_CONTAINER(self->list_box), GTK_WIDGET(le)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	while((result = mapping_parser_load_line(dstream, &export, &name, &layer, &color)) >= 0) { | 	/* Load Layer settings. No need to check pointer, will be checked by load csv func. */ | ||||||
| 		/* skip broken line */ | 	layer_settings = layer_settings_new(); | ||||||
| 		if (result == 1) |  | ||||||
|  | 	status = layer_settings_load_from_csv(layer_settings, file_name); | ||||||
|  | 	if (status) | ||||||
|  | 		goto abort_layer_settings; | ||||||
|  |  | ||||||
|  | 	layer_infos = layer_settings_get_layer_info_list(layer_settings); | ||||||
|  | 	if (!layer_infos) | ||||||
|  | 		goto abort_layer_settings; | ||||||
|  |  | ||||||
|  | 	/* Loop over all layer infos read from the CSV file */ | ||||||
|  | 	for (; layer_infos; layer_infos = g_list_next(layer_infos)) { | ||||||
|  | 		linfo = (struct layer_info *)layer_infos->data; | ||||||
|  | 		le = layer_selector_find_layer_element_in_list(rows, linfo->layer); | ||||||
|  | 		if (!le) | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		/* Add rows in the same order as in file */ | 		layer_element_set_name(le, linfo->name); | ||||||
| 		if ((le = layer_selector_find_layer_element_in_list(rows, layer))) { | 		layer_element_set_export(le, (linfo->render ? TRUE : FALSE)); | ||||||
| 			gtk_list_box_insert(self->list_box, GTK_WIDGET(le), -1); | 		layer_element_set_color(le, &linfo->color); | ||||||
|  | 		gtk_container_add(GTK_CONTAINER(self->list_box), GTK_WIDGET(le)); | ||||||
| 			layer_element_set_color(le, &color); |  | ||||||
| 			layer_element_set_export(le, export); |  | ||||||
| 			layer_element_set_name(le, name); |  | ||||||
| 			g_free(name); |  | ||||||
|  |  | ||||||
| 			/* Dereference and remove from list */ |  | ||||||
| 			g_object_unref(G_OBJECT(le)); |  | ||||||
| 		rows = g_list_remove(rows, le); | 		rows = g_list_remove(rows, le); | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
|  | abort_layer_settings: | ||||||
|  | 	/* Destroy layer settings. Not needed for adding remaining elements */ | ||||||
|  | 	g_object_unref(layer_settings); | ||||||
|  |  | ||||||
| 	/* Add remaining elements */ | 	/* Add remaining elements */ | ||||||
| 	for (temp = rows; temp != NULL; temp = temp->next) { | 	for (temp = rows; temp != NULL; temp = temp->next) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user