diff options
Diffstat (limited to 'src/others/mimesh/g3dviewer-0.2.99.4/src/gui_glade.c')
-rw-r--r-- | src/others/mimesh/g3dviewer-0.2.99.4/src/gui_glade.c | 404 |
1 files changed, 404 insertions, 0 deletions
diff --git a/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_glade.c b/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_glade.c new file mode 100644 index 0000000..7f7fddd --- /dev/null +++ b/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_glade.c | |||
@@ -0,0 +1,404 @@ | |||
1 | /* $Id: gui_glade.c 58 2006-11-05 19:21:04Z 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 | #include <gtk/gtkgl.h> | ||
32 | #include <glade/glade-xml.h> | ||
33 | |||
34 | #include <g3d/plugins.h> | ||
35 | |||
36 | #include "main.h" | ||
37 | #include "model.h" | ||
38 | #include "glarea.h" | ||
39 | |||
40 | #include "gui_glade.h" | ||
41 | #include "gui_infowin.h" | ||
42 | #include "gui_log.h" | ||
43 | |||
44 | static void gui_glade_clone_menuitem(GtkWidget *menuitem, gpointer user_data); | ||
45 | |||
46 | /* | ||
47 | * initializes libglade | ||
48 | */ | ||
49 | |||
50 | gboolean gui_glade_init(G3DViewer *viewer) | ||
51 | { | ||
52 | return TRUE; | ||
53 | } | ||
54 | |||
55 | static void gui_glade_add_open_filters(G3DViewer *viewer) | ||
56 | { | ||
57 | GtkWidget *opendialog; | ||
58 | GtkFileFilter *filter; | ||
59 | GSList *plugins; | ||
60 | G3DPlugin *plugin; | ||
61 | gchar *name, *exts, **ext, *glob, *tmp; | ||
62 | |||
63 | opendialog = glade_xml_get_widget(viewer->interface.xml, "open_dialog"); | ||
64 | |||
65 | /* "all files" filter */ | ||
66 | filter = gtk_file_filter_new(); | ||
67 | gtk_file_filter_set_name(filter, _("all files")); | ||
68 | gtk_file_filter_add_pattern(filter, "*"); | ||
69 | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(opendialog), filter); | ||
70 | |||
71 | /* FIXME: evil hack? */ | ||
72 | plugins = viewer->g3dcontext->plugins; | ||
73 | while(plugins) | ||
74 | { | ||
75 | plugin = (G3DPlugin *)plugins->data; | ||
76 | plugins = plugins->next; | ||
77 | |||
78 | if(plugin->type != G3D_PLUGIN_IMPORT) continue; | ||
79 | |||
80 | filter = gtk_file_filter_new(); | ||
81 | exts = g_strjoinv(", ", plugin->extensions); | ||
82 | if(strlen(exts) > 30) | ||
83 | { | ||
84 | tmp = exts; | ||
85 | exts = g_strdup_printf("%.*s...", 30, tmp); | ||
86 | g_free(tmp); | ||
87 | } | ||
88 | name = g_strdup_printf("%s (%s)", plugin->name, exts); | ||
89 | gtk_file_filter_set_name(filter, name); | ||
90 | g_free(name); | ||
91 | g_free(exts); | ||
92 | |||
93 | ext = plugin->extensions; | ||
94 | while(ext && *ext) | ||
95 | { | ||
96 | glob = g_strdup_printf("*.%s", *ext); | ||
97 | gtk_file_filter_add_pattern(filter, glob); | ||
98 | g_free(glob); | ||
99 | |||
100 | ext ++; | ||
101 | } | ||
102 | |||
103 | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(opendialog), filter); | ||
104 | } | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * loads interface from .glade file | ||
109 | */ | ||
110 | |||
111 | gboolean gui_glade_load(G3DViewer *viewer) | ||
112 | { | ||
113 | GladeXML *xml; | ||
114 | GtkWidget *window, *widget, *popupmenu, *glarea, *statusbar; | ||
115 | gint i; | ||
116 | static const gchar *viewer_widgets[] = { | ||
117 | "main_window", | ||
118 | "mi_file_open", | ||
119 | "mi_properties", | ||
120 | "mi_screenshot", | ||
121 | "mi_show_menubar", | ||
122 | "mi_show_toolbar", | ||
123 | "mi_fullscreen", | ||
124 | "mi_zoomfit", | ||
125 | "mi_wireframe", | ||
126 | "mi_specular", | ||
127 | "mi_shininess", | ||
128 | "mi_textures", | ||
129 | "mi_twosided", | ||
130 | "mi_bgcolor", | ||
131 | "mi_info", | ||
132 | "tb_file_open", | ||
133 | "tb_properties", | ||
134 | "tb_zoomfit", | ||
135 | "tb_screenshot", | ||
136 | "tb_log_clear", | ||
137 | "tb_log_save", | ||
138 | "cs_background", | ||
139 | "gtkglext1", | ||
140 | NULL }; | ||
141 | |||
142 | /* load main window from xml */ | ||
143 | xml = glade_xml_new(DATA_DIR "/glade/g3dviewer.glade", | ||
144 | NULL, NULL); | ||
145 | |||
146 | viewer->interface.xml = xml; | ||
147 | |||
148 | glade_xml_signal_autoconnect(xml); | ||
149 | window = glade_xml_get_widget(xml, "main_window"); | ||
150 | |||
151 | /* connect glarea (TODO: remove link) */ | ||
152 | glarea = glade_xml_get_widget(xml, "gtkglext1"); | ||
153 | viewer->interface.glarea = glarea; | ||
154 | |||
155 | /* connect viewer pointer to objects */ | ||
156 | i = 0; | ||
157 | while(viewer_widgets[i] != NULL) | ||
158 | { | ||
159 | widget = glade_xml_get_widget(xml, viewer_widgets[i]); | ||
160 | if(widget) | ||
161 | { | ||
162 | #if DEBUG > 1 | ||
163 | g_printerr("D: viewer_widgets[%d]: %s\n", i, viewer_widgets[i]); | ||
164 | #endif | ||
165 | g_object_set_data(G_OBJECT(widget), "viewer", viewer); | ||
166 | } | ||
167 | i ++; | ||
168 | } | ||
169 | |||
170 | /* initialize infowin */ | ||
171 | gui_infowin_initialize(viewer, glade_xml_get_widget(xml, "proptree")); | ||
172 | |||
173 | /* connect main menu to glarea */ | ||
174 | popupmenu = gtk_menu_new(); | ||
175 | gtk_container_foreach( | ||
176 | GTK_CONTAINER(glade_xml_get_widget(xml, "menu_main")), | ||
177 | gui_glade_clone_menuitem, | ||
178 | popupmenu); | ||
179 | g_object_set_data(G_OBJECT(viewer->interface.glarea), "menu", | ||
180 | popupmenu); | ||
181 | gtk_widget_show_all(popupmenu); | ||
182 | |||
183 | /* get statusbar context id */ | ||
184 | statusbar = glade_xml_get_widget(viewer->interface.xml, "statusbar"); | ||
185 | viewer->interface.status_context_id = gtk_statusbar_get_context_id( | ||
186 | GTK_STATUSBAR(statusbar), "default"); | ||
187 | |||
188 | /* update "open" dialog */ | ||
189 | gui_glade_add_open_filters(viewer); | ||
190 | |||
191 | /* initialize log */ | ||
192 | gui_log_initialize(viewer, glade_xml_get_widget(xml, "logtree")); | ||
193 | g_log_set_handler("LibG3D", G_LOG_LEVEL_MASK, gui_log_handler, viewer); | ||
194 | |||
195 | /* show main window */ | ||
196 | viewer->interface.window = window; | ||
197 | gtk_widget_show_all(window); | ||
198 | |||
199 | /* hide progress bar */ | ||
200 | gui_glade_update_progress_bar_cb(0.0, FALSE, viewer); | ||
201 | |||
202 | glarea_update(viewer->interface.glarea); | ||
203 | |||
204 | return TRUE; | ||
205 | } | ||
206 | |||
207 | /* | ||
208 | * custom log handler to suppress warning in gui_glade_clone_menuitem | ||
209 | */ | ||
210 | static void gui_glade_null_logger(const gchar *log_domain, | ||
211 | GLogLevelFlags log_level, | ||
212 | const gchar *message, gpointer unused_data) | ||
213 | { | ||
214 | ; /* do nothing */ | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * clones one main menu item and attaches it to a popup menu | ||
219 | */ | ||
220 | static void gui_glade_clone_menuitem(GtkWidget *menuitem, gpointer user_data) | ||
221 | { | ||
222 | GtkWidget *menu, *newmi; | ||
223 | GList *children; | ||
224 | const gchar *label; | ||
225 | |||
226 | menu = (GtkWidget *)user_data; | ||
227 | |||
228 | children = gtk_container_get_children(GTK_CONTAINER(menuitem)); | ||
229 | if(children) | ||
230 | { | ||
231 | label = gtk_label_get_text(GTK_LABEL(g_list_nth_data(children, 0))); | ||
232 | } | ||
233 | else return; | ||
234 | |||
235 | #if DEBUG > 1 | ||
236 | g_printerr("D: label: %s\n", label); | ||
237 | #endif | ||
238 | newmi = gtk_menu_item_new_with_label(label); | ||
239 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), newmi); | ||
240 | |||
241 | /* disable warning */ | ||
242 | g_log_set_default_handler(gui_glade_null_logger, NULL); | ||
243 | |||
244 | /* this normally generates a warning: | ||
245 | * gtk_menu_attach_to_widget(): menu already attached to GtkMenuItem | ||
246 | */ | ||
247 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(newmi), | ||
248 | gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem))); | ||
249 | |||
250 | /* reenable logging */ | ||
251 | g_log_set_default_handler(g_log_default_handler, NULL); | ||
252 | } | ||
253 | |||
254 | /* | ||
255 | * show "open" dialog | ||
256 | */ | ||
257 | gboolean gui_glade_open_dialog(G3DViewer *viewer) | ||
258 | { | ||
259 | GtkWidget *opendialog; | ||
260 | gchar *filename; | ||
261 | gint retval; | ||
262 | |||
263 | opendialog = glade_xml_get_widget(viewer->interface.xml, "open_dialog"); | ||
264 | |||
265 | retval = gtk_dialog_run(GTK_DIALOG(opendialog)); | ||
266 | gtk_widget_hide(opendialog); | ||
267 | if(retval == GTK_RESPONSE_OK) | ||
268 | { | ||
269 | filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(opendialog)); | ||
270 | |||
271 | if(viewer->filename) | ||
272 | g_free(viewer->filename); | ||
273 | viewer->filename = filename; | ||
274 | |||
275 | retval = model_load(viewer); | ||
276 | |||
277 | glarea_update(viewer->interface.glarea); | ||
278 | |||
279 | return retval; | ||
280 | } | ||
281 | |||
282 | return FALSE; | ||
283 | } | ||
284 | |||
285 | /* | ||
286 | * show text in status bar | ||
287 | */ | ||
288 | |||
289 | gboolean gui_glade_status(G3DViewer *viewer, const gchar *text) | ||
290 | { | ||
291 | GtkWidget *statusbar; | ||
292 | |||
293 | statusbar = glade_xml_get_widget(viewer->interface.xml, "statusbar"); | ||
294 | gtk_statusbar_push(GTK_STATUSBAR(statusbar), | ||
295 | viewer->interface.status_context_id, text); | ||
296 | |||
297 | return TRUE; | ||
298 | } | ||
299 | |||
300 | /* | ||
301 | * create GL widget (called from libglade) | ||
302 | */ | ||
303 | GtkWidget *gui_glade_create_glwidget(void) | ||
304 | { | ||
305 | GtkWidget *glarea; | ||
306 | GdkGLConfig *glconfig; | ||
307 | |||
308 | glconfig = gdk_gl_config_new_by_mode( | ||
309 | GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); | ||
310 | |||
311 | if(glconfig == NULL) | ||
312 | { | ||
313 | glconfig = gdk_gl_config_new_by_mode( | ||
314 | GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | | ||
315 | GDK_GL_MODE_ALPHA | GDK_GL_MODE_DOUBLE); | ||
316 | } | ||
317 | |||
318 | if(glconfig == NULL) return NULL; | ||
319 | |||
320 | glarea = gtk_drawing_area_new(); | ||
321 | gtk_widget_set_gl_capability(glarea, glconfig, NULL, TRUE, | ||
322 | GDK_GL_RGBA_TYPE); | ||
323 | |||
324 | if(glarea == NULL) return NULL; | ||
325 | |||
326 | gtk_widget_set_events(glarea, | ||
327 | GDK_EXPOSURE_MASK | | ||
328 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | | ||
329 | GDK_SCROLL_MASK | | ||
330 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); | ||
331 | |||
332 | g_signal_connect(G_OBJECT(glarea), "scroll_event", | ||
333 | GTK_SIGNAL_FUNC(glarea_scroll), NULL); | ||
334 | g_signal_connect(G_OBJECT(glarea), "expose_event", | ||
335 | GTK_SIGNAL_FUNC(glarea_expose), NULL); | ||
336 | g_signal_connect(G_OBJECT(glarea), "motion_notify_event", | ||
337 | GTK_SIGNAL_FUNC(glarea_motion_notify), NULL); | ||
338 | g_signal_connect(G_OBJECT(glarea), "button_press_event", | ||
339 | GTK_SIGNAL_FUNC(glarea_button_pressed), NULL); | ||
340 | g_signal_connect(G_OBJECT(glarea), "configure_event", | ||
341 | GTK_SIGNAL_FUNC(glarea_configure), NULL); | ||
342 | g_signal_connect(G_OBJECT(glarea), "destroy_event", | ||
343 | GTK_SIGNAL_FUNC(glarea_destroy), NULL); | ||
344 | |||
345 | return glarea; | ||
346 | } | ||
347 | |||
348 | /* | ||
349 | * set background color callback (G3DSetBgColorFunc) | ||
350 | */ | ||
351 | gboolean gui_glade_set_bgcolor_cb( | ||
352 | gfloat r, gfloat g, gfloat b, gfloat a, | ||
353 | gpointer user_data) | ||
354 | { | ||
355 | G3DViewer *viewer; | ||
356 | |||
357 | viewer = (G3DViewer *)user_data; | ||
358 | g_assert(viewer); | ||
359 | |||
360 | return TRUE; | ||
361 | } | ||
362 | |||
363 | /* | ||
364 | * update interface callback (G3DUpdateInterfaceFunc) | ||
365 | */ | ||
366 | gboolean gui_glade_update_interface_cb(gpointer user_data) | ||
367 | { | ||
368 | while(gtk_events_pending()) | ||
369 | gtk_main_iteration(); | ||
370 | |||
371 | return TRUE; | ||
372 | } | ||
373 | |||
374 | /* | ||
375 | * update progress bar callback (G3DUpdateProgressBarFunc) | ||
376 | */ | ||
377 | gboolean gui_glade_update_progress_bar_cb(gfloat percentage, | ||
378 | gboolean show, gpointer user_data) | ||
379 | { | ||
380 | G3DViewer *viewer; | ||
381 | GtkWidget *pbar; | ||
382 | gchar *text; | ||
383 | |||
384 | viewer = (G3DViewer *)user_data; | ||
385 | g_assert(viewer); | ||
386 | |||
387 | pbar = glade_xml_get_widget(viewer->interface.xml, "main_progressbar"); | ||
388 | g_assert(pbar); | ||
389 | |||
390 | gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar), percentage); | ||
391 | |||
392 | text = g_strdup_printf("%.1f%%", percentage * 100); | ||
393 | gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar), text); | ||
394 | g_free(text); | ||
395 | |||
396 | if(show) | ||
397 | gtk_widget_show(pbar); | ||
398 | else | ||
399 | gtk_widget_hide(pbar); | ||
400 | |||
401 | gui_glade_update_interface_cb(user_data); | ||
402 | return TRUE; | ||
403 | } | ||
404 | |||