f33c79b28bf6d78cdb17bd8ce13306c8b153fc13
[xonotic/netradiant.git] / contrib / prtview / gtkdlgs.cpp
1 /*
2 PrtView plugin for GtkRadiant
3 Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 //
21 // PrtView dialogs done with GTK+
22 //
23
24 #include <stdio.h>
25 #include "stdafx.h"
26
27 // =============================================================================
28 // Static functions
29
30 static void dialog_button_callback (GtkWidget *widget, gpointer data)
31 {
32   GtkWidget *parent;
33   int *loop, *ret;
34
35   parent = gtk_widget_get_toplevel (widget);
36   loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
37   ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");
38
39   *loop = 0;
40   *ret = (int)data;
41 }
42
43 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
44 {
45   int *loop;
46
47   gtk_widget_hide (widget);
48   loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
49   *loop = 0;
50
51   return TRUE;
52 }
53
54 static void file_sel_callback (GtkWidget *widget, gpointer data)
55 {
56   GtkWidget *parent;
57   int *loop;
58   char **filename;
59  
60   parent = gtk_widget_get_toplevel (widget);
61   loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
62   filename = (char**)g_object_get_data (G_OBJECT (parent), "filename");
63  
64   *loop = 0;
65   if ((int)data == IDOK)
66     *filename = g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (parent)));
67 }
68
69 static void change_clicked (GtkWidget *widget, gpointer data)
70 {
71   GtkWidget* file_sel;
72   char* filename = NULL;
73   int loop = 1;
74
75   file_sel = gtk_file_selection_new ("Locate portal (.prt) file");
76   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->ok_button), "clicked",
77                       GTK_SIGNAL_FUNC (file_sel_callback), GINT_TO_POINTER (IDOK));
78   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->cancel_button), "clicked",
79                       GTK_SIGNAL_FUNC (file_sel_callback), GINT_TO_POINTER (IDCANCEL));
80   gtk_signal_connect (GTK_OBJECT (file_sel), "delete_event",
81                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
82   gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (file_sel));
83
84   g_object_set_data (G_OBJECT (file_sel), "loop", &loop);
85   g_object_set_data (G_OBJECT (file_sel), "filename", &filename);
86   gtk_file_selection_set_filename (GTK_FILE_SELECTION (file_sel), portals.fn);
87
88   gtk_grab_add (file_sel);
89   gtk_widget_show (file_sel);
90
91   while (loop)
92     gtk_main_iteration ();
93
94   gtk_grab_remove (file_sel);
95   gtk_widget_destroy (file_sel);
96
97   if (filename != NULL)
98   {
99     strcpy (portals.fn, filename);
100     gtk_entry_set_text (GTK_ENTRY (data), filename);
101     g_free (filename);
102   }
103 }
104
105 // =============================================================================
106 // LoadPortalFile dialog
107
108 int DoLoadPortalFileDialog ()
109 {
110   GtkWidget *dlg, *vbox, *hbox, *button, *entry, *check2d, *check3d;
111   int loop = 1, ret = IDCANCEL;
112
113   dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
114   gtk_window_set_title (GTK_WINDOW (dlg), "Load .prt");
115   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
116                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
117   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
118                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
119   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
120   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
121
122   vbox = gtk_vbox_new (FALSE, 5);
123   gtk_widget_show (vbox);
124   gtk_container_add (GTK_CONTAINER (dlg), vbox);
125   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
126
127   entry = gtk_entry_new ();
128   gtk_widget_show (entry);
129   gtk_entry_set_editable (GTK_ENTRY (entry), FALSE);
130   gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
131
132   hbox = gtk_hbox_new (FALSE, 5);
133   gtk_widget_show (hbox);
134   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
135
136   check3d = gtk_check_button_new_with_label ("Show 3D");
137   gtk_widget_show (check3d);
138   gtk_box_pack_start (GTK_BOX (hbox), check3d, FALSE, FALSE, 0);
139
140   check2d = gtk_check_button_new_with_label ("Show 2D");
141   gtk_widget_show (check2d);
142   gtk_box_pack_start (GTK_BOX (hbox), check2d, FALSE, FALSE, 0);
143
144   button = gtk_button_new_with_label ("Change");
145   gtk_widget_show (button);
146   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
147   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (change_clicked), entry);
148   gtk_widget_set_usize (button, 60, -2);
149
150   hbox = gtk_hbox_new (FALSE, 5);
151   gtk_widget_show (hbox);
152   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
153
154   button = gtk_button_new_with_label ("Cancel");
155   gtk_widget_show (button);
156   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
157   gtk_signal_connect (GTK_OBJECT (button), "clicked",
158                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
159   gtk_widget_set_usize (button, 60, -2);
160
161   button = gtk_button_new_with_label ("OK");
162   gtk_widget_show (button);
163   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
164   gtk_signal_connect (GTK_OBJECT (button), "clicked",
165                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
166   gtk_widget_set_usize (button, 60, -2);
167
168   char *fn = g_IBSPTable.m_pfnGetMapName();
169   strcpy (portals.fn, fn);
170   fn = strrchr (portals.fn, '.');
171   if (fn != NULL)
172   {
173     *fn = '\0';
174     strcat (portals.fn, ".prt");
175   }
176
177   gtk_entry_set_text (GTK_ENTRY (entry), portals.fn);
178   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check2d), portals.show_2d);
179   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check3d), portals.show_3d);
180
181   gtk_grab_add (dlg);
182   gtk_widget_show (dlg);
183
184   while (loop)
185     gtk_main_iteration ();
186
187   if (ret == IDOK)
188   {
189     portals.Purge();
190
191     portals.show_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check3d));
192     portals.show_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check2d));
193   }
194
195   gtk_grab_remove (dlg);
196   gtk_widget_destroy (dlg);
197
198   return ret;
199 }
200
201 // =============================================================================
202 // About dialog
203
204 void DoAboutDlg ()
205 {
206   GtkWidget *dlg, *hbox, *vbox, *button, *label;
207   int loop = 1, ret = IDCANCEL;
208
209   dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
210   gtk_window_set_title (GTK_WINDOW (dlg), "About Portal Viewer");
211   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
212                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
213   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
214                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
215   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
216   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
217
218   hbox = gtk_hbox_new (FALSE, 10);
219   gtk_widget_show (hbox);
220   gtk_container_add (GTK_CONTAINER (dlg), hbox);
221   gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
222
223   label = gtk_label_new ("Version 1.000\n\n"
224                          "Gtk port by Leonardo Zide\nleo@lokigames.com\n\n"
225                          "Written by Geoffrey DeWan\ngdewan@prairienet.org");
226   gtk_widget_show (label);
227   gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
228   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
229
230   vbox = gtk_vbox_new (FALSE, 0);
231   gtk_widget_show (vbox);
232   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
233
234   button = gtk_button_new_with_label ("OK");
235   gtk_widget_show (button);
236   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
237   gtk_signal_connect (GTK_OBJECT (button), "clicked",
238                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
239   gtk_widget_set_usize (button, 60, -2);
240
241   gtk_grab_add (dlg);
242   gtk_widget_show (dlg);
243
244   while (loop)
245     gtk_main_iteration ();
246
247   gtk_grab_remove (dlg);
248   gtk_widget_destroy (dlg);
249 }
250
251 // =============================================================================
252 // Config dialog
253
254 static int DoColor (COLORREF *c)
255 {
256   GtkWidget* dlg;
257   double clr[3];
258   int loop = 1, ret = IDCANCEL;
259
260   clr[0] = ((double)GetRValue (*c)) / 255.0;
261   clr[1] = ((double)GetGValue (*c)) / 255.0;
262   clr[2] = ((double)GetBValue (*c)) / 255.0;
263
264   dlg = gtk_color_selection_dialog_new ("Choose Color");
265   gtk_color_selection_set_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
266   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
267                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
268   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
269                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
270   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button), "clicked",
271                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
272   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button), "clicked",
273                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
274   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
275   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
276
277   gtk_widget_show(dlg);
278   gtk_grab_add(dlg);
279
280   while (loop)
281     gtk_main_iteration ();
282
283   gtk_color_selection_get_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
284
285   gtk_grab_remove (dlg);
286   gtk_widget_destroy (dlg);
287
288   if (ret == IDOK)
289   {
290     *c = RGB (clr[0]*255, clr[1]*255, clr[2]*255);
291   }
292
293   return ret;
294 }
295
296 static void Set2DText (GtkWidget* label)
297 {
298   char s[40];
299
300   sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
301
302   gtk_label_set_text (GTK_LABEL (label), s);
303 }
304
305 static void Set3DText (GtkWidget* label)
306 {
307   char s[40];
308
309   sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
310
311   gtk_label_set_text (GTK_LABEL (label), s);
312 }
313
314 static void Set3DTransText (GtkWidget* label)
315 {
316   char s[40];
317
318   sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
319
320   gtk_label_set_text (GTK_LABEL (label), s);
321 }
322
323 static void SetClipText (GtkWidget* label)
324 {
325   char s[40];
326
327   sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
328
329   gtk_label_set_text (GTK_LABEL (label), s);
330 }
331
332 static void OnScroll2d (GtkAdjustment *adj, gpointer data)
333 {
334   portals.width_2d = adj->value;
335   Set2DText (GTK_WIDGET (data));
336
337   if(interfaces_started)
338     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
339 }
340
341 static void OnScroll3d (GtkAdjustment *adj, gpointer data)
342 {
343   portals.width_3d = adj->value;
344   Set3DText (GTK_WIDGET (data));
345
346   if(interfaces_started)
347     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
348 }
349
350 static void OnScrollTrans (GtkAdjustment *adj, gpointer data)
351 {
352   portals.trans_3d = adj->value;
353   Set3DTransText (GTK_WIDGET (data));
354
355   if(interfaces_started)
356     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
357 }
358
359 static void OnScrollClip (GtkAdjustment *adj, gpointer data)
360 {
361   portals.clip_range = adj->value;
362   SetClipText (GTK_WIDGET (data));
363
364   if(interfaces_started)
365     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
366 }
367
368 static void OnAntiAlias2d (GtkWidget *widget, gpointer data)
369 {
370   portals.aa_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
371
372   if(interfaces_started)
373     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
374 }
375
376 static void OnConfig2d (GtkWidget *widget, gpointer data)
377 {
378   portals.show_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
379
380   if(interfaces_started)
381     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
382 }
383
384 static void OnColor2d (GtkWidget *widget, gpointer data)
385 {
386   if (DoColor (&portals.color_2d) == IDOK)
387   {
388     portals.FixColors();
389
390     if(interfaces_started)
391       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
392   }
393 }
394
395 static void OnConfig3d (GtkWidget *widget, gpointer data)
396 {
397   portals.show_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
398
399   if(interfaces_started)
400     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
401 }
402
403
404 static void OnAntiAlias3d (GtkWidget *widget, gpointer data)
405 {
406   portals.aa_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
407
408   if(interfaces_started)
409     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
410 }
411
412 static void OnColor3d (GtkWidget *widget, gpointer data)
413 {
414   if (DoColor (&portals.color_3d) == IDOK)
415   {
416     portals.FixColors();
417
418     if(interfaces_started)
419       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
420   }
421 }
422
423 static void OnColorFog (GtkWidget *widget, gpointer data)
424 {
425   if (DoColor (&portals.color_fog) == IDOK)
426   {
427     portals.FixColors();
428
429     if(interfaces_started)
430       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
431   }
432 }
433
434 static void OnFog (GtkWidget *widget, gpointer data)
435 {
436   portals.fog = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
437
438   if(interfaces_started)
439     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
440 }
441
442 static void OnSelchangeZbuffer (GtkWidget *widget, gpointer data)
443 {
444   portals.zbuffer = GPOINTER_TO_INT (data);
445
446   if(interfaces_started)
447     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
448 }
449
450 static void OnPoly (GtkWidget *widget, gpointer data)
451 {
452   portals.polygons = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
453
454   if(interfaces_started)
455     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
456 }
457
458 static void OnLines (GtkWidget *widget, gpointer data)
459 {
460   portals.lines = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
461
462   if(interfaces_started)
463     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
464 }
465
466 static void OnClip (GtkWidget *widget, gpointer data)
467 {
468   portals.clip = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
469
470   if(interfaces_started)
471     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
472 }
473
474 void DoConfigDialog ()
475 {
476   GtkWidget *dlg, *hbox, *vbox, *vbox2, *button, *table, *frame;
477   GtkWidget *lw3slider, *lw3label, *lw2slider, *lw2label, *zlist, *menu, *item;
478   GtkWidget *aa2check, *aa3check, *depthcheck, *linescheck, *polyscheck;
479   GtkWidget *transslider, *translabel, *clipslider, *cliplabel;
480   GtkWidget *show2check, *show3check, *portalcheck;
481   int loop = 1, ret = IDCANCEL;
482   GtkObject *adj;
483
484   dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
485   gtk_window_set_title (GTK_WINDOW (dlg), "Portal Viewer Configuration");
486   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
487                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
488   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
489                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
490   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
491   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
492
493   vbox = gtk_vbox_new (FALSE, 5);
494   gtk_widget_show (vbox);
495   gtk_container_add (GTK_CONTAINER (dlg), vbox);
496   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
497
498   frame = gtk_frame_new ("3D View");
499   gtk_widget_show (frame);
500   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
501
502   vbox2 = gtk_vbox_new (FALSE, 5);
503   gtk_widget_show (vbox2);
504   gtk_container_add (GTK_CONTAINER (frame), vbox2);
505   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
506
507   hbox = gtk_hbox_new (FALSE, 5);
508   gtk_widget_show (hbox);
509   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
510
511   adj = gtk_adjustment_new (portals.width_3d, 2, 40, 1, 1, 1);
512   lw3slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
513   gtk_widget_show (lw3slider);
514   gtk_box_pack_start (GTK_BOX (hbox), lw3slider, TRUE, TRUE, 0);
515   gtk_scale_set_draw_value (GTK_SCALE (lw3slider), FALSE);
516
517   lw3label = gtk_label_new ("");
518   gtk_widget_show (lw3label);
519   gtk_box_pack_start (GTK_BOX (hbox), lw3label, FALSE, TRUE, 0);
520   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll3d), lw3label);
521
522   table = gtk_table_new (2, 4, FALSE);
523   gtk_widget_show (table);
524   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
525   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
526   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
527
528   button = gtk_button_new_with_label ("Color");
529   gtk_widget_show (button);
530   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 0, 1,
531                     (GtkAttachOptions) (GTK_FILL),
532                     (GtkAttachOptions) (0), 0, 0);
533   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor3d), NULL);
534
535   button = gtk_button_new_with_label ("Depth Color");
536   gtk_widget_show (button);
537   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
538                     (GtkAttachOptions) (GTK_FILL),
539                     (GtkAttachOptions) (0), 0, 0);
540   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColorFog), NULL);
541
542   aa3check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
543   gtk_widget_show (aa3check);
544   gtk_table_attach (GTK_TABLE (table), aa3check, 1, 4, 0, 1,
545                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
546                     (GtkAttachOptions) (0), 0, 0);
547   gtk_signal_connect (GTK_OBJECT (aa3check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias3d), NULL);
548
549   depthcheck = gtk_check_button_new_with_label ("Depth Cue");
550   gtk_widget_show (depthcheck);
551   gtk_table_attach (GTK_TABLE (table), depthcheck, 1, 2, 1, 2,
552                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
553                     (GtkAttachOptions) (0), 0, 0);
554   gtk_signal_connect (GTK_OBJECT (depthcheck), "toggled", GTK_SIGNAL_FUNC (OnFog), NULL);
555
556   linescheck = gtk_check_button_new_with_label ("Lines");
557   gtk_widget_show (linescheck);
558   gtk_table_attach (GTK_TABLE (table), linescheck, 2, 3, 1, 2,
559                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
560                     (GtkAttachOptions) (0), 0, 0);
561   gtk_signal_connect (GTK_OBJECT (linescheck), "toggled", GTK_SIGNAL_FUNC (OnLines), NULL);
562
563   polyscheck = gtk_check_button_new_with_label ("Polygons");
564   gtk_widget_show (polyscheck);
565   gtk_table_attach (GTK_TABLE (table), polyscheck, 3, 4, 1, 2,
566                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
567                     (GtkAttachOptions) (0), 0, 0);
568   gtk_signal_connect (GTK_OBJECT (polyscheck), "toggled", GTK_SIGNAL_FUNC (OnPoly), NULL);
569
570   zlist = gtk_option_menu_new ();
571   gtk_widget_show (zlist);
572   gtk_box_pack_start (GTK_BOX (vbox2), zlist, TRUE, FALSE, 0);
573
574   menu = gtk_menu_new ();
575   gtk_widget_show (menu);
576   gtk_option_menu_set_menu (GTK_OPTION_MENU (zlist), menu);
577
578   item = gtk_menu_item_new_with_label ("Z-Buffer Test and Write (recommended for solid or no polygons)");
579   gtk_widget_show (item);
580   gtk_signal_connect (GTK_OBJECT (item), "activate",
581                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (0));
582   gtk_menu_append (GTK_MENU (menu), item);
583
584   item = gtk_menu_item_new_with_label ("Z-Buffer Test Only (recommended for transparent polygons)");
585   gtk_widget_show (item);
586   gtk_signal_connect (GTK_OBJECT (item), "activate",
587                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (1));
588   gtk_menu_append (GTK_MENU (menu), item);
589
590   item = gtk_menu_item_new_with_label ("Z-Buffer Off");
591   gtk_widget_show (item);
592   gtk_signal_connect (GTK_OBJECT (item), "activate",
593                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (2));
594   gtk_menu_append (GTK_MENU (menu), item);
595
596   table = gtk_table_new (2, 2, FALSE);
597   gtk_widget_show (table);
598   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
599   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
600   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
601
602   adj = gtk_adjustment_new (portals.trans_3d, 0, 100, 1, 1, 1);
603   transslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
604   gtk_widget_show (transslider);
605   gtk_table_attach (GTK_TABLE (table), transslider, 0, 1, 0, 1,
606                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
607                     (GtkAttachOptions) (0), 0, 0);
608   gtk_scale_set_draw_value (GTK_SCALE (transslider), FALSE);
609
610   translabel = gtk_label_new ("");
611   gtk_widget_show (translabel);
612   gtk_table_attach (GTK_TABLE (table), translabel, 1, 2, 0, 1,
613                     (GtkAttachOptions) (GTK_FILL),
614                     (GtkAttachOptions) (0), 0, 0);
615   gtk_misc_set_alignment (GTK_MISC (translabel), 0.0, 0.0);
616   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollTrans), translabel);
617
618   adj = gtk_adjustment_new (portals.clip_range, 1, 128, 1, 1, 1);
619   clipslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
620   gtk_widget_show (clipslider);
621   gtk_table_attach (GTK_TABLE (table), clipslider, 0, 1, 1, 2,
622                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
623                     (GtkAttachOptions) (0), 0, 0);
624   gtk_scale_set_draw_value (GTK_SCALE (clipslider), FALSE);
625
626   cliplabel = gtk_label_new ("");
627   gtk_widget_show (cliplabel);
628   gtk_table_attach (GTK_TABLE (table), cliplabel, 1, 2, 1, 2,
629                     (GtkAttachOptions) (GTK_FILL),
630                     (GtkAttachOptions) (0), 0, 0);
631   gtk_misc_set_alignment (GTK_MISC (cliplabel), 0.0, 0.0);
632   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollClip), cliplabel);
633
634   hbox = gtk_hbox_new (TRUE, 5);
635   gtk_widget_show (hbox);
636   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
637
638   show3check = gtk_check_button_new_with_label ("Show");
639   gtk_widget_show (show3check);
640   gtk_box_pack_start (GTK_BOX (hbox), show3check, TRUE, TRUE, 0);
641   gtk_signal_connect (GTK_OBJECT (show3check), "toggled", GTK_SIGNAL_FUNC (OnConfig3d), NULL);
642
643   portalcheck = gtk_check_button_new_with_label ("Portal cubic clipper");
644   gtk_widget_show (portalcheck);
645   gtk_box_pack_start (GTK_BOX (hbox), portalcheck, TRUE, TRUE, 0);
646   gtk_signal_connect (GTK_OBJECT (portalcheck), "toggled", GTK_SIGNAL_FUNC (OnClip), NULL);
647
648   frame = gtk_frame_new ("2D View");
649   gtk_widget_show (frame);
650   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
651
652   vbox2 = gtk_vbox_new (FALSE, 5);
653   gtk_widget_show (vbox2);
654   gtk_container_add (GTK_CONTAINER (frame), vbox2);
655   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
656
657   hbox = gtk_hbox_new (FALSE, 5);
658   gtk_widget_show (hbox);
659   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
660
661   adj = gtk_adjustment_new (portals.width_2d, 2, 40, 1, 1, 1);
662   lw2slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
663   gtk_widget_show (lw2slider);
664   gtk_box_pack_start (GTK_BOX (hbox), lw2slider, TRUE, TRUE, 0);
665   gtk_scale_set_draw_value (GTK_SCALE (lw2slider), FALSE);
666
667   lw2label = gtk_label_new ("");
668   gtk_widget_show (lw2label);
669   gtk_box_pack_start (GTK_BOX (hbox), lw2label, FALSE, TRUE, 0);
670   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll2d), lw2label);
671
672   hbox = gtk_hbox_new (FALSE, 5);
673   gtk_widget_show (hbox);
674   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
675
676   button = gtk_button_new_with_label ("Color");
677   gtk_widget_show (button);
678   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
679   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor2d), NULL);
680   gtk_widget_set_usize (button, 60, -2);
681
682   aa2check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
683   gtk_widget_show (aa2check);
684   gtk_box_pack_start (GTK_BOX (hbox), aa2check, TRUE, TRUE, 0);
685   gtk_signal_connect (GTK_OBJECT (aa2check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias2d), NULL);
686
687   hbox = gtk_hbox_new (FALSE, 5);
688   gtk_widget_show (hbox);
689   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
690
691   show2check = gtk_check_button_new_with_label ("Show");
692   gtk_widget_show (show2check);
693   gtk_box_pack_start (GTK_BOX (hbox), show2check, FALSE, FALSE, 0);
694   gtk_signal_connect (GTK_OBJECT (show2check), "toggled", GTK_SIGNAL_FUNC (OnConfig2d), NULL);
695
696   hbox = gtk_hbox_new (FALSE, 5);
697   gtk_widget_show (hbox);
698   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
699
700   button = gtk_button_new_with_label ("OK");
701   gtk_widget_show (button);
702   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
703   gtk_signal_connect (GTK_OBJECT (button), "clicked",
704                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
705   gtk_widget_set_usize (button, 60, -2);
706
707   // initialize dialog
708   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show2check), portals.show_2d);
709   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa2check), portals.aa_2d);
710   Set2DText (lw2label);
711
712   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show3check), portals.show_3d);
713   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (depthcheck), portals.fog);
714   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (polyscheck), portals.polygons);
715   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linescheck), portals.lines);
716   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa3check), portals.aa_3d);
717   gtk_option_menu_set_history (GTK_OPTION_MENU (zlist), portals.zbuffer);
718   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (portalcheck), portals.clip);
719
720   Set3DText (lw3label);
721   Set3DTransText (translabel);
722   SetClipText (cliplabel);
723
724   gtk_grab_add (dlg);
725   gtk_widget_show (dlg);
726
727   while (loop)
728     gtk_main_iteration ();
729
730   gtk_grab_remove (dlg);
731   gtk_widget_destroy (dlg);
732 }