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