aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_glade.c
diff options
context:
space:
mode:
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.c404
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
44static void gui_glade_clone_menuitem(GtkWidget *menuitem, gpointer user_data);
45
46/*
47 * initializes libglade
48 */
49
50gboolean gui_glade_init(G3DViewer *viewer)
51{
52 return TRUE;
53}
54
55static 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
111gboolean 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 */
210static 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 */
220static 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 */
257gboolean 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
289gboolean 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 */
303GtkWidget *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 */
351gboolean 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 */
366gboolean 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 */
377gboolean 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