openclonk/src/mape/mattexview.c

186 lines
4.3 KiB
C

/*
* mape - C4 Landscape.txt editor
*
* Copyright (c) 2005-2009, Armin Burgmeier
*
* Distributed under the terms of the ISC license; see accompanying file
* "COPYING" for details.
*
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
* See accompanying file "TRADEMARK" for details.
*
* To redistribute this file separately, substitute the full license texts
* for the above references.
*/
#include <stdlib.h>
#include <gtk/gtk.h>
#include "mape/material.h"
#include "mape/texture.h"
#include "mape/fileicon.h"
#include "mape/iconview.h"
#include "mape/mattexview.h"
MapeMatTexView* mape_mat_tex_view_new(MapeFileIconSet* icon_set,
GError** error)
{
MapeMatTexView* view;
view = malloc(sizeof(MapeMatTexView) );
view->mat_map = NULL;
view->tex_map = NULL;
view->icon_set = icon_set;
view->view_mat = mape_icon_view_new(error);
if(view->view_mat == NULL)
{
free(view);
return NULL;
}
view->view_tex = mape_icon_view_new(error);
if(view->view_tex == NULL)
{
mape_icon_view_destroy(view->view_mat);
free(view);
return NULL;
}
view->notebook = gtk_notebook_new();
gtk_notebook_append_page(
GTK_NOTEBOOK(view->notebook),
view->view_mat->window,
NULL
);
gtk_notebook_set_tab_label_text(
GTK_NOTEBOOK(view->notebook),
view->view_mat->window,
"Materials"
);
gtk_notebook_append_page(
GTK_NOTEBOOK(view->notebook),
view->view_tex->window,
NULL
);
gtk_notebook_set_tab_label_text(
GTK_NOTEBOOK(view->notebook),
view->view_tex->window,
"Textures"
);
gtk_widget_set_size_request(view->notebook, -1, 150);
gtk_widget_show(view->notebook);
return view;
}
void mape_mat_tex_view_destroy(MapeMatTexView* view)
{
if(view->mat_map != NULL)
g_object_unref(view->mat_map);
if(view->tex_map != NULL)
g_object_unref(view->tex_map);
mape_icon_view_destroy(view->view_mat);
mape_icon_view_destroy(view->view_tex);
free(view);
}
gboolean mape_mat_tex_view_reload(MapeMatTexView* view,
MapeTextureMap* new_tex_map,
MapeGroup* base_group,
gboolean overload_materials,
gboolean overload_textures,
MapeGroup* overload_from,
GError** error)
{
MapeMaterialMap* new_mat_map;
MapeFileIcon* icon;
const MapeMaterial* mat;
unsigned int i;
new_mat_map = mape_material_map_new();
if(!mape_material_map_load(new_mat_map, base_group, error))
{
g_object_unref(new_mat_map);
return FALSE;
}
if(overload_materials && overload_from != NULL)
{
if(!mape_material_map_load(new_mat_map, overload_from, error))
{
g_object_unref(new_mat_map);
return FALSE;
}
}
if(!mape_texture_map_load_textures(new_tex_map, base_group, error))
{
g_object_unref(new_mat_map);
return FALSE;
}
if(overload_textures && overload_from != NULL)
{
if(!mape_texture_map_load_textures(new_tex_map, overload_from, error))
{
g_object_unref(new_mat_map);
return FALSE;
}
}
/* Load the texture map again, because now that we have materials
* and textures loaded, we can actually assign the indices in the
* texture map. */
if (!mape_texture_map_load_map(new_tex_map, base_group, error))
{
g_object_unref(new_mat_map);
return FALSE;
}
mape_material_map_set_default_textures(new_mat_map, new_tex_map);
if(view->mat_map != NULL) g_object_unref(view->mat_map);
if(view->tex_map != NULL) g_object_unref(view->tex_map);
view->mat_map = new_mat_map; view->tex_map = new_tex_map;
g_object_ref(new_tex_map);
mape_icon_view_clear(view->view_mat);
for(i = 0; i < mape_material_map_get_material_count(new_mat_map); ++ i)
{
mat = mape_material_map_get_material(new_mat_map, i);
icon = mape_file_icon_set_lookup(
view->icon_set,
MAPE_FILE_ICON_C4MATERIAL
);
mape_icon_view_add(
view->view_mat,
mape_file_icon_get(icon),
mape_material_get_name(mat)
);
}
mape_icon_view_clear(view->view_tex);
for(i = 0; i < mape_texture_map_get_texture_count(new_tex_map); ++ i)
{
mape_icon_view_add(
view->view_tex,
mape_texture_map_lookup_texture(
new_tex_map,
mape_texture_map_get_texture_name(new_tex_map, i)
),
mape_texture_map_get_texture_name(new_tex_map, i)
);
}
return TRUE;
}