aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_infowin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/others/mimesh/g3dviewer-0.2.99.4/src/gui_infowin.c')
-rw-r--r--src/others/mimesh/g3dviewer-0.2.99.4/src/gui_infowin.c451
1 files changed, 451 insertions, 0 deletions
diff --git a/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_infowin.c b/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_infowin.c
new file mode 100644
index 0000000..841e47c
--- /dev/null
+++ b/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_infowin.c
@@ -0,0 +1,451 @@
1/* $Id: gui_infowin.c 36 2006-05-08 20:10:44Z mmmaddd $ */
2
3/*
4 G3DViewer - 3D object viewer
5
6 Copyright (C) 2005, 2006 Markus Dahms <mad@automagically.de>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21*/
22
23#ifdef HAVE_CONFIG_H
24# include <config.h>
25#endif
26
27#include <stdlib.h>
28#include <string.h>
29
30#include <gtk/gtk.h>
31
32#include "main.h"
33#include "glarea.h"
34
35enum _columns
36{
37 COL_TYPE,
38 COL_TITLE,
39 COL_ICON,
40 COL_VALUE,
41 COL_CHECK,
42 COL_SHOWHIDE,
43 COL_POINTER,
44 N_COLUMNS
45};
46
47enum _types
48{
49 TYPE_OBJECT,
50 TYPE_MATERIAL,
51 TYPE_TEXTURE,
52 TYPE_PROPERTY,
53 TYPE_FOLDER,
54 N_TYPES
55};
56
57enum _icons
58{
59 ICON_MODEL,
60 ICON_OBJECT,
61 ICON_MATERIAL,
62 ICON_TEXTURE,
63 ICON_PROPERTY,
64 N_ICONS
65};
66
67static GtkTreeStore *gui_infowin_create_model(void);
68static gboolean gui_infowin_clean(G3DViewer *viewer);
69static gboolean gui_infowin_create_columns(GtkWidget *treeview,
70 GtkTreeModel *model, G3DViewer *viewer);
71
72gboolean gui_infowin_initialize(G3DViewer *viewer, GtkWidget *treeview)
73{
74 GtkTreeStore *treestore;
75 GtkTreeSelection *select;
76 GtkTreeIter iter;
77
78 treestore = gui_infowin_create_model();
79 gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),
80 GTK_TREE_MODEL(treestore));
81 viewer->info.treestore = treestore;
82
83 if(gui_infowin_create_columns(treeview, GTK_TREE_MODEL(treestore),
84 viewer) == FALSE)
85 return FALSE;
86
87 /* selection */
88 select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
89 gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
90
91 /* initial nodes */
92 gtk_tree_store_append(treestore, &iter, NULL);
93
94 /* load icons */
95 viewer->interface.icons = g_new0(GdkPixbuf *, N_ICONS);
96 viewer->interface.icons[ICON_MODEL] =
97 gdk_pixbuf_new_from_file(
98 DATA_DIR "/pixmaps/icon16_model.xpm", NULL);
99 viewer->interface.icons[ICON_OBJECT] =
100 gdk_pixbuf_new_from_file(
101 DATA_DIR "/pixmaps/icon16_object.png", NULL);
102 viewer->interface.icons[ICON_MATERIAL] =
103 gdk_pixbuf_new_from_file(
104 DATA_DIR "/pixmaps/icon16_material.xpm", NULL);
105 viewer->interface.icons[ICON_TEXTURE] =
106 gdk_pixbuf_new_from_file(
107 DATA_DIR "/pixmaps/icon16_texture.xpm", NULL);
108 viewer->interface.icons[ICON_PROPERTY] =
109 gdk_pixbuf_new_from_file(
110 DATA_DIR "/pixmaps/icon16_property.png", NULL);
111
112 return TRUE;
113}
114
115void gui_infowin_cleanup(G3DViewer *viewer)
116{
117 gint32 i;
118
119 gui_infowin_clean(NULL);
120
121 /* cleanup icons */
122 for(i = 0; i < N_ICONS; i ++)
123 gdk_pixbuf_unref(viewer->interface.icons[i]);
124
125 g_free(viewer->interface.icons);
126}
127
128/****************************************************************************/
129
130static GtkTreeStore *gui_infowin_create_model(void)
131{
132 GtkTreeStore *treestore;
133
134 treestore = gtk_tree_store_new(N_COLUMNS,
135 G_TYPE_INT, /* type of node */
136 G_TYPE_STRING, /* title */
137 GDK_TYPE_PIXBUF, /* pixbuf pointer */
138 G_TYPE_STRING, /* number */
139 G_TYPE_BOOLEAN, /* show checkbox */
140 G_TYPE_BOOLEAN, /* show/hide object */
141 G_TYPE_POINTER /* custom pointer (object, etc.) */
142 );
143
144 return treestore;
145}
146
147static void gui_infowin_object_hide_cb(GtkCellRendererToggle *renderer,
148 gchar *pathstr, gpointer data)
149{
150 GtkTreePath *path;
151 GtkTreeIter iter;
152 GtkTreeModel *model;
153 gboolean toggle_item;
154 G3DViewer *viewer;
155 G3DObject *object;
156 gpointer ptr;
157
158 model = g_object_get_data(G_OBJECT(renderer), "model");
159 viewer = g_object_get_data(G_OBJECT(renderer), "viewer");
160
161 g_assert(model);
162 g_assert(viewer);
163
164 path = gtk_tree_path_new_from_string(pathstr);
165 gtk_tree_model_get_iter(model, &iter, path);
166
167 gtk_tree_model_get(model, &iter,
168 COL_SHOWHIDE, &toggle_item,
169 COL_POINTER, &ptr,
170 -1);
171 object = (G3DObject *)ptr;
172
173#if DEBUG > 3
174 g_printerr("D: gui_infowin_object_hide_cb: object=0x%p (%i)\n", object,
175 toggle_item);
176#endif
177
178 gtk_tree_path_free(path);
179
180 if(object == NULL) return;
181
182 toggle_item ^= 1;
183 object->hide = !toggle_item;
184
185 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, COL_SHOWHIDE,
186 toggle_item, -1);
187
188 glarea_update(viewer->interface.glarea);
189}
190
191static gboolean gui_infowin_create_columns(GtkWidget *treeview,
192 GtkTreeModel *model, G3DViewer *viewer)
193{
194 GtkCellRenderer *renderer;
195 GtkTreeViewColumn *column;
196
197 /* visibility column */
198 renderer = gtk_cell_renderer_toggle_new();
199 g_object_set_data(G_OBJECT(renderer), "model", model);
200 g_object_set_data(G_OBJECT(renderer), "viewer", viewer);
201 g_signal_connect(G_OBJECT(renderer), "toggled",
202 G_CALLBACK(gui_infowin_object_hide_cb), NULL);
203 column = gtk_tree_view_column_new_with_attributes("Show",
204 renderer,
205 "active", COL_SHOWHIDE,
206 "visible", COL_CHECK,
207 "activatable", COL_CHECK,
208 NULL);
209 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
210
211 /* title column */
212 column = gtk_tree_view_column_new();
213
214 /* title column: icon */
215 renderer = gtk_cell_renderer_pixbuf_new();
216 gtk_tree_view_column_pack_start(column, renderer, FALSE);
217 gtk_tree_view_column_set_attributes(column, renderer,
218 "pixbuf", COL_ICON,
219 NULL);
220
221 /* title column: text */
222 renderer = gtk_cell_renderer_text_new();
223 gtk_tree_view_column_pack_start(column, renderer, TRUE);
224 gtk_tree_view_column_set_attributes(column, renderer,
225 "text", COL_TITLE,
226 NULL);
227
228 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
229 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
230
231 /* value column */
232 renderer = gtk_cell_renderer_text_new();
233 column = gtk_tree_view_column_new_with_attributes("Value",
234 renderer,
235 "text", COL_VALUE,
236 NULL);
237 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
238
239 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
240
241 return TRUE;
242}
243
244
245static gboolean gui_infowin_remove_children(GtkTreeStore *treestore,
246 GtkTreeIter *iter_parent)
247{
248 GtkTreeIter iter_child;
249 gint n, i;
250
251 n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(treestore),
252 iter_parent);
253 gtk_tree_model_iter_children(GTK_TREE_MODEL(treestore),
254 &iter_child, iter_parent);
255
256 for(i = 0; i < n; i ++)
257 {
258 gui_infowin_remove_children(treestore, &iter_child);
259 gtk_tree_store_remove(treestore, &iter_child);
260 }
261
262 return TRUE;
263}
264
265static gboolean gui_infowin_clean(G3DViewer *viewer)
266{
267 gui_infowin_remove_children(viewer->info.treestore, NULL);
268
269 return TRUE;
270}
271
272static gboolean add_texture(G3DViewer *viewer, GtkTreeIter *parentiter,
273 G3DImage *texture)
274{
275 GtkTreeIter iter;
276
277 if(texture)
278 {
279 gtk_tree_store_append(viewer->info.treestore, &iter, parentiter);
280 gtk_tree_store_set(viewer->info.treestore, &iter,
281 COL_TYPE, TYPE_TEXTURE,
282 COL_TITLE, texture->name,
283 COL_VALUE, "",
284 COL_CHECK, FALSE,
285 COL_ICON, viewer->interface.icons[ICON_TEXTURE],
286 -1);
287
288 return TRUE;
289 }
290
291 return FALSE;
292}
293
294static gboolean add_materials(G3DViewer *viewer, GtkTreeIter *parentiter,
295 GSList *materials)
296{
297 GSList *mlist;
298 GtkTreeIter iter1, iter2;
299 G3DMaterial *material;
300 gchar *matname, *stmp;
301
302 mlist = materials;
303 while(mlist != NULL)
304 {
305 material = (G3DMaterial *)mlist->data;
306
307 if(material->name && strlen(material->name))
308 matname = material->name;
309 else
310 matname = _("(unnamed material)");
311
312 gtk_tree_store_append(viewer->info.treestore, &iter1, parentiter);
313 gtk_tree_store_set(viewer->info.treestore, &iter1,
314 COL_TYPE, TYPE_MATERIAL,
315 COL_TITLE, matname,
316 COL_ICON, viewer->interface.icons[ICON_MATERIAL],
317 COL_VALUE, "",
318 COL_CHECK, FALSE,
319 -1);
320
321 add_texture(viewer, &iter1, material->tex_image);
322
323 /* material properties */
324 stmp = g_strdup_printf("#%02X%02X%02X",
325 (gint)(material->r * 255),
326 (gint)(material->g * 255),
327 (gint)(material->b * 255));
328 gtk_tree_store_append(viewer->info.treestore, &iter2, &iter1);
329 gtk_tree_store_set(viewer->info.treestore, &iter2,
330 COL_TYPE, TYPE_PROPERTY,
331 COL_TITLE, _("color"),
332 COL_VALUE, stmp,
333 COL_CHECK, FALSE,
334 COL_ICON, viewer->interface.icons[ICON_PROPERTY],
335 -1);
336 g_free(stmp);
337
338 /* next material */
339 mlist = mlist->next;
340 }
341
342 return TRUE;
343}
344
345static gboolean add_objects(G3DViewer *viewer, GtkTreeIter *parentiter,
346 GSList *objects)
347{
348 GtkTreeIter iter, iter2;
349 G3DObject *object;
350 gchar *stmp;
351
352 while(objects != NULL)
353 {
354 object = (G3DObject *)objects->data;
355
356 /* object node */
357 gtk_tree_store_append(viewer->info.treestore, &iter, parentiter);
358 gtk_tree_store_set(viewer->info.treestore, &iter,
359 COL_TYPE, TYPE_OBJECT,
360 COL_TITLE, object->name,
361 COL_ICON, viewer->interface.icons[ICON_OBJECT],
362 COL_VALUE, "",
363 COL_CHECK, TRUE,
364 COL_SHOWHIDE, TRUE,
365 COL_POINTER, object,
366 -1);
367
368 /* sub-objects */
369 add_objects(viewer, &iter, object->objects);
370
371 /* texture image */
372 add_texture(viewer, &iter, object->tex_image);
373
374 /* vertices */
375 stmp = g_strdup_printf("%d", object->vertex_count);
376 gtk_tree_store_append(viewer->info.treestore, &iter2, &iter);
377 gtk_tree_store_set(viewer->info.treestore, &iter2,
378 COL_TYPE, TYPE_PROPERTY,
379 COL_TITLE, _("number of vertices"),
380 COL_VALUE, stmp,
381 COL_CHECK, FALSE,
382 COL_ICON, viewer->interface.icons[ICON_PROPERTY],
383 -1);
384 g_free(stmp);
385
386 /* faces */
387 stmp = g_strdup_printf("%d", g_slist_length(object->faces));
388 gtk_tree_store_append(viewer->info.treestore, &iter2, &iter);
389 gtk_tree_store_set(viewer->info.treestore, &iter2,
390 COL_TYPE, TYPE_PROPERTY,
391 COL_TITLE, _("number of faces"),
392 COL_VALUE, stmp,
393 COL_CHECK, FALSE,
394 COL_ICON, viewer->interface.icons[ICON_PROPERTY],
395 -1);
396 g_free(stmp);
397
398 /* materials */
399 stmp = g_strdup_printf("%d", g_slist_length(object->materials));
400 gtk_tree_store_append(viewer->info.treestore, &iter2, &iter);
401 gtk_tree_store_set(viewer->info.treestore, &iter2,
402 COL_TYPE, TYPE_PROPERTY,
403 COL_TITLE, _("number of materials"),
404 COL_VALUE, stmp,
405 COL_CHECK, FALSE,
406 COL_ICON, viewer->interface.icons[ICON_PROPERTY],
407 -1);
408 g_free(stmp);
409
410 /* add object-specific materials */
411 add_materials(viewer, &iter, object->materials);
412
413 objects = objects->next;
414 }
415
416 return TRUE;
417}
418
419gboolean gui_infowin_update(G3DViewer *viewer)
420{
421 GtkTreeIter rootiter;
422 gchar *stmp, *basename;
423
424 /* clear tree */
425 gui_infowin_clean(viewer);
426
427 if(viewer->model == NULL) return FALSE;
428
429 basename = g_path_get_basename(viewer->model->filename);
430 stmp = g_strdup_printf("%s: %s", _("model"), basename);
431 gtk_tree_store_append(viewer->info.treestore, &rootiter, NULL);
432 gtk_tree_store_set(viewer->info.treestore, &rootiter,
433 COL_TYPE, TYPE_FOLDER,
434 COL_TITLE, stmp,
435 COL_VALUE, "",
436 COL_CHECK, FALSE,
437 COL_ICON, viewer->interface.icons[ICON_MODEL],
438 -1);
439 g_free(basename);
440 g_free(stmp);
441
442 if(viewer->model == NULL) return FALSE;
443
444 /* append objects */
445 add_objects(viewer, &rootiter, viewer->model->objects);
446
447 /* add global materials */
448 add_materials(viewer, &rootiter, viewer->model->materials);
449
450 return TRUE;
451}