diff options
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.c | 451 |
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 | |||
35 | enum _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 | |||
47 | enum _types | ||
48 | { | ||
49 | TYPE_OBJECT, | ||
50 | TYPE_MATERIAL, | ||
51 | TYPE_TEXTURE, | ||
52 | TYPE_PROPERTY, | ||
53 | TYPE_FOLDER, | ||
54 | N_TYPES | ||
55 | }; | ||
56 | |||
57 | enum _icons | ||
58 | { | ||
59 | ICON_MODEL, | ||
60 | ICON_OBJECT, | ||
61 | ICON_MATERIAL, | ||
62 | ICON_TEXTURE, | ||
63 | ICON_PROPERTY, | ||
64 | N_ICONS | ||
65 | }; | ||
66 | |||
67 | static GtkTreeStore *gui_infowin_create_model(void); | ||
68 | static gboolean gui_infowin_clean(G3DViewer *viewer); | ||
69 | static gboolean gui_infowin_create_columns(GtkWidget *treeview, | ||
70 | GtkTreeModel *model, G3DViewer *viewer); | ||
71 | |||
72 | gboolean 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 | |||
115 | void 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 | |||
130 | static 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 | |||
147 | static 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 | |||
191 | static 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 | |||
245 | static 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 | |||
265 | static gboolean gui_infowin_clean(G3DViewer *viewer) | ||
266 | { | ||
267 | gui_infowin_remove_children(viewer->info.treestore, NULL); | ||
268 | |||
269 | return TRUE; | ||
270 | } | ||
271 | |||
272 | static 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 | |||
294 | static 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 | |||
345 | static 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 | |||
419 | gboolean 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 | } | ||