Purge gtk_container_add
[xonotic/netradiant.git] / contrib / prtview / ConfigDialog.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 #include "ConfigDialog.h"
21 #include <stdio.h>
22 #include <gtk/gtk.h>
23 #include <uilib/uilib.h>
24 #include "gtkutil/pointer.h"
25
26 #include "iscenegraph.h"
27
28 #include "prtview.h"
29 #include "portals.h"
30
31 static void dialog_button_callback( GtkWidget *widget, gpointer data ){
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 = gpointer_to_int( data );
41 }
42
43 static gint dialog_delete_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
44         int *loop;
45
46         gtk_widget_hide( widget );
47         loop = (int*)g_object_get_data( G_OBJECT( widget ), "loop" );
48         *loop = 0;
49
50         return TRUE;
51 }
52
53 // =============================================================================
54 // Color selection dialog
55
56 static int DoColor( PackedColour *c ){
57         GtkWidget* dlg;
58         GdkColor clr;
59         int loop = 1, ret = IDCANCEL;
60
61         clr.red = (guint16) (GetRValue(*c) * (65535 / 255));
62         clr.blue = (guint16) (GetGValue(*c) * (65535 / 255));
63         clr.green = (guint16) (GetBValue(*c) * (65535 / 255));
64
65         dlg = gtk_color_selection_dialog_new( "Choose Color" );
66         gtk_color_selection_set_current_color( GTK_COLOR_SELECTION( gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dlg)) ), &clr );
67         g_signal_connect( GTK_OBJECT( dlg ), "delete_event",
68                                                 G_CALLBACK( dialog_delete_callback ), NULL );
69         g_signal_connect( GTK_OBJECT( dlg ), "destroy",
70                                                 G_CALLBACK( gtk_widget_destroy ), NULL );
71
72         GtkWidget *ok_button, *cancel_button;
73         g_object_get(dlg, "ok-button", &ok_button, "cancel-button", &cancel_button, nullptr);
74
75         g_signal_connect( GTK_OBJECT(ok_button), "clicked",
76                                                 G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
77         g_signal_connect( GTK_OBJECT(cancel_button), "clicked",
78                                                 G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
79         g_object_set_data( G_OBJECT( dlg ), "loop", &loop );
80         g_object_set_data( G_OBJECT( dlg ), "ret", &ret );
81
82         gtk_widget_show( dlg );
83         gtk_grab_add( dlg );
84
85         while ( loop )
86                 gtk_main_iteration();
87
88         gtk_color_selection_get_current_color( GTK_COLOR_SELECTION( gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dlg)) ), &clr );
89
90         gtk_grab_remove( dlg );
91         gtk_widget_destroy( dlg );
92
93         if ( ret == IDOK ) {
94                 *c = RGB( clr.red / (65535 / 255), clr.green / (65535 / 255), clr.blue / (65535 / 255));
95         }
96
97         return ret;
98 }
99
100 static void Set2DText( GtkWidget* label ){
101         char s[40];
102
103         sprintf( s, "Line Width = %6.3f", portals.width_2d * 0.5f );
104
105         gtk_label_set_text( GTK_LABEL( label ), s );
106 }
107
108 static void Set3DText( GtkWidget* label ){
109         char s[40];
110
111         sprintf( s, "Line Width = %6.3f", portals.width_3d * 0.5f );
112
113         gtk_label_set_text( GTK_LABEL( label ), s );
114 }
115
116 static void Set3DTransText( GtkWidget* label ){
117         char s[40];
118
119         sprintf( s, "Polygon transparency = %d%%", (int)portals.trans_3d );
120
121         gtk_label_set_text( GTK_LABEL( label ), s );
122 }
123
124 static void SetClipText( GtkWidget* label ){
125         char s[40];
126
127         sprintf( s, "Cubic clip range = %d", (int)portals.clip_range * 64 );
128
129         gtk_label_set_text( GTK_LABEL( label ), s );
130 }
131
132 static void OnScroll2d( GtkAdjustment *adj, gpointer data ){
133         portals.width_2d = static_cast<float>( gtk_adjustment_get_value(adj) );
134         Set2DText( GTK_WIDGET( data ) );
135
136         Portals_shadersChanged();
137         SceneChangeNotify();
138 }
139
140 static void OnScroll3d( GtkAdjustment *adj, gpointer data ){
141         portals.width_3d = static_cast<float>( gtk_adjustment_get_value(adj) );
142         Set3DText( GTK_WIDGET( data ) );
143
144         SceneChangeNotify();
145 }
146
147 static void OnScrollTrans( GtkAdjustment *adj, gpointer data ){
148         portals.trans_3d = static_cast<float>( gtk_adjustment_get_value(adj) );
149         Set3DTransText( GTK_WIDGET( data ) );
150
151         SceneChangeNotify();
152 }
153
154 static void OnScrollClip( GtkAdjustment *adj, gpointer data ){
155         portals.clip_range = static_cast<float>( gtk_adjustment_get_value(adj) );
156         SetClipText( GTK_WIDGET( data ) );
157
158         SceneChangeNotify();
159 }
160
161 static void OnAntiAlias2d( GtkWidget *widget, gpointer data ){
162         portals.aa_2d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ? true : false;
163
164         Portals_shadersChanged();
165
166         SceneChangeNotify();
167 }
168
169 static void OnConfig2d( GtkWidget *widget, gpointer data ){
170         portals.show_2d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ? true : false;
171
172         SceneChangeNotify();
173 }
174
175 static void OnColor2d( GtkWidget *widget, gpointer data ){
176         if ( DoColor( &portals.color_2d ) == IDOK ) {
177                 Portals_shadersChanged();
178
179                 SceneChangeNotify();
180         }
181 }
182
183 static void OnConfig3d( GtkWidget *widget, gpointer data ){
184         portals.show_3d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ? true : false;
185
186         SceneChangeNotify();
187 }
188
189
190 static void OnAntiAlias3d( GtkWidget *widget, gpointer data ){
191         portals.aa_3d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ? true : false;
192
193         Portals_shadersChanged();
194         SceneChangeNotify();
195 }
196
197 static void OnColor3d( GtkWidget *widget, gpointer data ){
198         if ( DoColor( &portals.color_3d ) == IDOK ) {
199                 Portals_shadersChanged();
200
201                 SceneChangeNotify();
202         }
203 }
204
205 static void OnColorFog( GtkWidget *widget, gpointer data ){
206         if ( DoColor( &portals.color_fog ) == IDOK ) {
207                 Portals_shadersChanged();
208
209                 SceneChangeNotify();
210         }
211 }
212
213 static void OnFog( GtkWidget *widget, gpointer data ){
214         portals.fog = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ? true : false;
215
216         Portals_shadersChanged();
217         SceneChangeNotify();
218 }
219
220 static void OnSelchangeZbuffer( GtkWidget *widget, gpointer data ){
221         portals.zbuffer = gpointer_to_int( data );
222
223         Portals_shadersChanged();
224         SceneChangeNotify();
225 }
226
227 static void OnPoly( GtkWidget *widget, gpointer data ){
228         portals.polygons = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
229
230         SceneChangeNotify();
231 }
232
233 static void OnLines( GtkWidget *widget, gpointer data ){
234         portals.lines = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
235
236         SceneChangeNotify();
237 }
238
239 static void OnClip( GtkWidget *widget, gpointer data ){
240         portals.clip = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ? true : false;
241
242         SceneChangeNotify();
243 }
244
245 void DoConfigDialog(){
246         GtkWidget *hbox, *button, *table;
247         GtkWidget *lw3slider, *lw3label, *lw2slider, *lw2label, *item;
248         GtkWidget *aa2check, *aa3check, *depthcheck, *linescheck, *polyscheck;
249         GtkWidget *transslider, *translabel, *clipslider, *cliplabel;
250         GtkWidget *show2check, *show3check, *portalcheck;
251         int loop = 1, ret = IDCANCEL;
252
253         auto dlg = ui::Window( ui::window_type::TOP );
254         gtk_window_set_title( GTK_WINDOW( dlg ), "Portal Viewer Configuration" );
255         g_signal_connect( GTK_OBJECT( dlg ), "delete_event",
256                                                 G_CALLBACK( dialog_delete_callback ), NULL );
257         g_signal_connect( GTK_OBJECT( dlg ), "destroy",
258                                                 G_CALLBACK( gtk_widget_destroy ), NULL );
259         g_object_set_data( G_OBJECT( dlg ), "loop", &loop );
260         g_object_set_data( G_OBJECT( dlg ), "ret", &ret );
261
262         auto vbox = ui::VBox( FALSE, 5 );
263         vbox.show();
264         dlg.add(vbox);
265         gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
266
267         auto frame = ui::Frame( "3D View" );
268         frame.show();
269         gtk_box_pack_start( GTK_BOX( vbox ), frame, TRUE, TRUE, 0 );
270
271         auto vbox2 = ui::VBox( FALSE, 5 );
272         vbox2.show();
273         frame.add(vbox2);
274         gtk_container_set_border_width( GTK_CONTAINER( vbox2 ), 5 );
275
276         hbox = ui::HBox( FALSE, 5 );
277         gtk_widget_show( hbox );
278         gtk_box_pack_start( GTK_BOX( vbox2 ), hbox, TRUE, TRUE, 0 );
279
280         auto adj = ui::Adjustment( portals.width_3d, 2, 40, 1, 1, 0 );
281         lw3slider = ui::HScale( adj );
282         gtk_widget_show( lw3slider );
283         gtk_box_pack_start( GTK_BOX( hbox ), lw3slider, TRUE, TRUE, 0 );
284         gtk_scale_set_draw_value( GTK_SCALE( lw3slider ), FALSE );
285
286         lw3label = ui::Label( "" );
287         gtk_widget_show( lw3label );
288         gtk_box_pack_start( GTK_BOX( hbox ), lw3label, FALSE, TRUE, 0 );
289         g_signal_connect( GTK_OBJECT(adj), "value_changed", G_CALLBACK( OnScroll3d ), lw3label );
290
291         table = ui::Table( 2, 4, FALSE );
292         gtk_widget_show( table );
293         gtk_box_pack_start( GTK_BOX( vbox2 ), table, TRUE, TRUE, 0 );
294         gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
295         gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
296
297         button = ui::Button( "Color" );
298         gtk_widget_show( button );
299         gtk_table_attach( GTK_TABLE( table ), button, 0, 1, 0, 1,
300                                           (GtkAttachOptions) ( GTK_FILL ),
301                                           (GtkAttachOptions) ( 0 ), 0, 0 );
302         g_signal_connect( GTK_OBJECT( button ), "clicked", G_CALLBACK( OnColor3d ), NULL );
303
304         button = ui::Button( "Depth Color" );
305         gtk_widget_show( button );
306         gtk_table_attach( GTK_TABLE( table ), button, 0, 1, 1, 2,
307                                           (GtkAttachOptions) ( GTK_FILL ),
308                                           (GtkAttachOptions) ( 0 ), 0, 0 );
309         g_signal_connect( GTK_OBJECT( button ), "clicked", G_CALLBACK( OnColorFog ), NULL );
310
311         aa3check = ui::CheckButton( "Anti-Alias (May not work on some video cards)" );
312         gtk_widget_show( aa3check );
313         gtk_table_attach( GTK_TABLE( table ), aa3check, 1, 4, 0, 1,
314                                           (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
315                                           (GtkAttachOptions) ( 0 ), 0, 0 );
316         g_signal_connect( GTK_OBJECT( aa3check ), "toggled", G_CALLBACK( OnAntiAlias3d ), NULL );
317
318         depthcheck = ui::CheckButton( "Depth Cue" );
319         gtk_widget_show( depthcheck );
320         gtk_table_attach( GTK_TABLE( table ), depthcheck, 1, 2, 1, 2,
321                                           (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
322                                           (GtkAttachOptions) ( 0 ), 0, 0 );
323         g_signal_connect( GTK_OBJECT( depthcheck ), "toggled", G_CALLBACK( OnFog ), NULL );
324
325         linescheck = ui::CheckButton( "Lines" );
326         gtk_widget_show( linescheck );
327         gtk_table_attach( GTK_TABLE( table ), linescheck, 2, 3, 1, 2,
328                                           (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
329                                           (GtkAttachOptions) ( 0 ), 0, 0 );
330         g_signal_connect( GTK_OBJECT( linescheck ), "toggled", G_CALLBACK( OnLines ), NULL );
331
332         polyscheck = ui::CheckButton( "Polygons" );
333         gtk_widget_show( polyscheck );
334         gtk_table_attach( GTK_TABLE( table ), polyscheck, 3, 4, 1, 2,
335                                           (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
336                                           (GtkAttachOptions) ( 0 ), 0, 0 );
337         g_signal_connect( GTK_OBJECT( polyscheck ), "toggled", G_CALLBACK( OnPoly ), NULL );
338
339         auto zlist = ui::ComboBoxText();
340         gtk_widget_show( zlist );
341         gtk_box_pack_start( GTK_BOX( vbox2 ), zlist, TRUE, FALSE, 0 );
342
343         gtk_combo_box_text_append_text(zlist, "Z-Buffer Test and Write (recommended for solid or no polygons)");
344         gtk_combo_box_text_append_text(zlist, "Z-Buffer Test Only (recommended for transparent polygons)");
345         gtk_combo_box_text_append_text(zlist, "Z-Buffer Off");
346
347         g_signal_connect(G_OBJECT(zlist), "changed", G_CALLBACK(+[](GtkComboBox *self, void *) {
348                 OnSelchangeZbuffer(GTK_WIDGET(self), GINT_TO_POINTER(gtk_combo_box_get_active(self)));
349         }), nullptr);
350
351         table = ui::Table( 2, 2, FALSE );
352         gtk_widget_show( table );
353         gtk_box_pack_start( GTK_BOX( vbox2 ), table, TRUE, TRUE, 0 );
354         gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
355         gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
356
357         adj = ui::Adjustment( portals.trans_3d, 0, 100, 1, 1, 0 );
358         transslider = ui::HScale( adj );
359         gtk_widget_show( transslider );
360         gtk_table_attach( GTK_TABLE( table ), transslider, 0, 1, 0, 1,
361                                           (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
362                                           (GtkAttachOptions) ( 0 ), 0, 0 );
363         gtk_scale_set_draw_value( GTK_SCALE( transslider ), FALSE );
364
365         translabel = ui::Label( "" );
366         gtk_widget_show( translabel );
367         gtk_table_attach( GTK_TABLE( table ), translabel, 1, 2, 0, 1,
368                                           (GtkAttachOptions) ( GTK_FILL ),
369                                           (GtkAttachOptions) ( 0 ), 0, 0 );
370         gtk_misc_set_alignment( GTK_MISC( translabel ), 0.0, 0.0 );
371         g_signal_connect( GTK_OBJECT(adj), "value_changed", G_CALLBACK( OnScrollTrans ), translabel );
372
373         adj = ui::Adjustment( portals.clip_range, 1, 128, 1, 1, 0 );
374         clipslider = ui::HScale( adj );
375         gtk_widget_show( clipslider );
376         gtk_table_attach( GTK_TABLE( table ), clipslider, 0, 1, 1, 2,
377                                           (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
378                                           (GtkAttachOptions) ( 0 ), 0, 0 );
379         gtk_scale_set_draw_value( GTK_SCALE( clipslider ), FALSE );
380
381         cliplabel = ui::Label( "" );
382         gtk_widget_show( cliplabel );
383         gtk_table_attach( GTK_TABLE( table ), cliplabel, 1, 2, 1, 2,
384                                           (GtkAttachOptions) ( GTK_FILL ),
385                                           (GtkAttachOptions) ( 0 ), 0, 0 );
386         gtk_misc_set_alignment( GTK_MISC( cliplabel ), 0.0, 0.0 );
387         g_signal_connect( GTK_OBJECT(adj), "value_changed", G_CALLBACK( OnScrollClip ), cliplabel );
388
389         hbox = ui::HBox( TRUE, 5 );
390         gtk_widget_show( hbox );
391         gtk_box_pack_start( GTK_BOX( vbox2 ), hbox, TRUE, FALSE, 0 );
392
393         show3check = ui::CheckButton( "Show" );
394         gtk_widget_show( show3check );
395         gtk_box_pack_start( GTK_BOX( hbox ), show3check, TRUE, TRUE, 0 );
396         g_signal_connect( GTK_OBJECT( show3check ), "toggled", G_CALLBACK( OnConfig3d ), NULL );
397
398         portalcheck = ui::CheckButton( "Portal cubic clipper" );
399         gtk_widget_show( portalcheck );
400         gtk_box_pack_start( GTK_BOX( hbox ), portalcheck, TRUE, TRUE, 0 );
401         g_signal_connect( GTK_OBJECT( portalcheck ), "toggled", G_CALLBACK( OnClip ), NULL );
402
403         frame = ui::Frame( "2D View" );
404         gtk_widget_show( frame );
405         gtk_box_pack_start( GTK_BOX( vbox ), frame, TRUE, TRUE, 0 );
406
407         vbox2 = ui::VBox( FALSE, 5 );
408         vbox2.show();
409         frame.add(vbox2);
410         gtk_container_set_border_width( GTK_CONTAINER( vbox2 ), 5 );
411
412         hbox = ui::HBox( FALSE, 5 );
413         gtk_widget_show( hbox );
414         gtk_box_pack_start( GTK_BOX( vbox2 ), hbox, TRUE, FALSE, 0 );
415
416         adj = ui::Adjustment( portals.width_2d, 2, 40, 1, 1, 0 );
417         lw2slider = ui::HScale( adj );
418         gtk_widget_show( lw2slider );
419         gtk_box_pack_start( GTK_BOX( hbox ), lw2slider, TRUE, TRUE, 0 );
420         gtk_scale_set_draw_value( GTK_SCALE( lw2slider ), FALSE );
421
422         lw2label = ui::Label( "" );
423         gtk_widget_show( lw2label );
424         gtk_box_pack_start( GTK_BOX( hbox ), lw2label, FALSE, TRUE, 0 );
425         g_signal_connect( GTK_OBJECT(adj), "value_changed", G_CALLBACK( OnScroll2d ), lw2label );
426
427         hbox = ui::HBox( FALSE, 5 );
428         gtk_widget_show( hbox );
429         gtk_box_pack_start( GTK_BOX( vbox2 ), hbox, TRUE, FALSE, 0 );
430
431         button = ui::Button( "Color" );
432         gtk_widget_show( button );
433         gtk_box_pack_start( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
434         g_signal_connect( GTK_OBJECT( button ), "clicked", G_CALLBACK( OnColor2d ), NULL );
435         gtk_widget_set_size_request( button, 60, -1 );
436
437         aa2check = ui::CheckButton( "Anti-Alias (May not work on some video cards)" );
438         gtk_widget_show( aa2check );
439         gtk_box_pack_start( GTK_BOX( hbox ), aa2check, TRUE, TRUE, 0 );
440         g_signal_connect( GTK_OBJECT( aa2check ), "toggled", G_CALLBACK( OnAntiAlias2d ), NULL );
441
442         hbox = ui::HBox( FALSE, 5 );
443         gtk_widget_show( hbox );
444         gtk_box_pack_start( GTK_BOX( vbox2 ), hbox, TRUE, FALSE, 0 );
445
446         show2check = ui::CheckButton( "Show" );
447         gtk_widget_show( show2check );
448         gtk_box_pack_start( GTK_BOX( hbox ), show2check, FALSE, FALSE, 0 );
449         g_signal_connect( GTK_OBJECT( show2check ), "toggled", G_CALLBACK( OnConfig2d ), NULL );
450
451         hbox = ui::HBox( FALSE, 5 );
452         gtk_widget_show( hbox );
453         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
454
455         button = ui::Button( "OK" );
456         gtk_widget_show( button );
457         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
458         g_signal_connect( GTK_OBJECT( button ), "clicked",
459                                                 G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
460         gtk_widget_set_size_request( button, 60, -1 );
461
462         // initialize dialog
463         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( show2check ), portals.show_2d );
464         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( aa2check ), portals.aa_2d );
465         Set2DText( lw2label );
466
467         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( show3check ), portals.show_3d );
468         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( depthcheck ), portals.fog );
469         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( polyscheck ), portals.polygons );
470         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( linescheck ), portals.lines );
471         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( aa3check ), portals.aa_3d );
472         gtk_combo_box_set_active(zlist, portals.zbuffer);
473         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( portalcheck ), portals.clip );
474
475         Set3DText( lw3label );
476         Set3DTransText( translabel );
477         SetClipText( cliplabel );
478
479         gtk_grab_add( dlg );
480         gtk_widget_show( dlg );
481
482         while ( loop )
483                 gtk_main_iteration();
484
485         gtk_grab_remove( dlg );
486         gtk_widget_destroy( dlg );
487 }