]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/prtview/ConfigDialog.cpp
* use CMD_SEP in sample plugin (minor cleanup)
[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 // ConfigDialog.cpp : implementation file
21 //
22
23 #include "stdafx.h"
24 #include <stdio.h>
25
26 #ifdef _DEBUG
27 #define new DEBUG_NEW
28 #undef THIS_FILE
29 //static char THIS_FILE[] = __FILE__;
30 #endif
31
32 /////////////////////////////////////////////////////////////////////////////
33 // CConfigDialog dialog
34
35 #ifdef GTK_PLUGIN
36
37 static void dialog_button_callback (GtkWidget *widget, gpointer data)
38 {
39   GtkWidget *parent;
40   int *loop, *ret;
41
42   parent = gtk_widget_get_toplevel (widget);
43   loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
44   ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");
45
46   *loop = 0;
47   *ret = (int)data;
48 }
49
50 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
51 {
52   int *loop;
53
54   gtk_widget_hide (widget);
55   loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
56   *loop = 0;
57
58   return TRUE;
59 }
60
61 // =============================================================================
62 // Color selection dialog
63
64 static int DoColor (COLORREF *c)
65 {
66   GtkWidget* dlg;
67   double clr[3];
68   int loop = 1, ret = IDCANCEL;
69
70   clr[0] = ((double)GetRValue (*c)) / 255.0;
71   clr[1] = ((double)GetGValue (*c)) / 255.0;
72   clr[2] = ((double)GetBValue (*c)) / 255.0;
73
74   dlg = gtk_color_selection_dialog_new ("Choose Color");
75   gtk_color_selection_set_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
76   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
77                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
78   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
79                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
80   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button), "clicked",
81                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
82   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button), "clicked",
83                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
84   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
85   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
86
87   gtk_widget_show(dlg);
88   gtk_grab_add(dlg);
89
90   while (loop)
91     gtk_main_iteration ();
92
93   gtk_color_selection_get_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
94
95   gtk_grab_remove (dlg);
96   gtk_widget_destroy (dlg);
97
98   if (ret == IDOK)
99   {
100     *c = RGB (clr[0]*255, clr[1]*255, clr[2]*255);
101   }
102
103   return ret;
104 }
105
106 static void Set2DText (GtkWidget* label)
107 {
108   char s[40];
109
110   sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
111
112   gtk_label_set_text (GTK_LABEL (label), s);
113 }
114
115 static void Set3DText (GtkWidget* label)
116 {
117   char s[40];
118
119   sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
120
121   gtk_label_set_text (GTK_LABEL (label), s);
122 }
123
124 static void Set3DTransText (GtkWidget* label)
125 {
126   char s[40];
127
128   sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
129
130   gtk_label_set_text (GTK_LABEL (label), s);
131 }
132
133 static void SetClipText (GtkWidget* label)
134 {
135   char s[40];
136
137   sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
138
139   gtk_label_set_text (GTK_LABEL (label), s);
140 }
141
142 static void OnScroll2d (GtkAdjustment *adj, gpointer data)
143 {
144   portals.width_2d = adj->value;
145   Set2DText (GTK_WIDGET (data));
146
147   if(interfaces_started)
148     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
149 }
150
151 static void OnScroll3d (GtkAdjustment *adj, gpointer data)
152 {
153   portals.width_3d = adj->value;
154   Set3DText (GTK_WIDGET (data));
155
156   if(interfaces_started)
157     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
158 }
159
160 static void OnScrollTrans (GtkAdjustment *adj, gpointer data)
161 {
162   portals.trans_3d = adj->value;
163   Set3DTransText (GTK_WIDGET (data));
164
165   if(interfaces_started)
166     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
167 }
168
169 static void OnScrollClip (GtkAdjustment *adj, gpointer data)
170 {
171   portals.clip_range = adj->value;
172   SetClipText (GTK_WIDGET (data));
173
174   if(interfaces_started)
175     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
176 }
177
178 static void OnAntiAlias2d (GtkWidget *widget, gpointer data)
179 {
180   portals.aa_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
181
182   if(interfaces_started)
183     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
184 }
185
186 static void OnConfig2d (GtkWidget *widget, gpointer data)
187 {
188   portals.show_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
189
190   if(interfaces_started)
191     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
192 }
193
194 static void OnColor2d (GtkWidget *widget, gpointer data)
195 {
196   if (DoColor (&portals.color_2d) == IDOK)
197   {
198     portals.FixColors();
199
200     if(interfaces_started)
201       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
202   }
203 }
204
205 static void OnConfig3d (GtkWidget *widget, gpointer data)
206 {
207   portals.show_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
208
209   if(interfaces_started)
210     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
211 }
212
213
214 static void OnAntiAlias3d (GtkWidget *widget, gpointer data)
215 {
216   portals.aa_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
217
218   if(interfaces_started)
219     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
220 }
221
222 static void OnColor3d (GtkWidget *widget, gpointer data)
223 {
224   if (DoColor (&portals.color_3d) == IDOK)
225   {
226     portals.FixColors();
227
228     if(interfaces_started)
229       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
230   }
231 }
232
233 static void OnColorFog (GtkWidget *widget, gpointer data)
234 {
235   if (DoColor (&portals.color_fog) == IDOK)
236   {
237     portals.FixColors();
238
239     if(interfaces_started)
240       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
241   }
242 }
243
244 static void OnFog (GtkWidget *widget, gpointer data)
245 {
246   portals.fog = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
247
248   if(interfaces_started)
249     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
250 }
251
252 static void OnSelchangeZbuffer (GtkWidget *widget, gpointer data)
253 {
254   portals.zbuffer = GPOINTER_TO_INT (data);
255
256   if(interfaces_started)
257     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
258 }
259
260 static void OnPoly (GtkWidget *widget, gpointer data)
261 {
262   portals.polygons = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
263
264   if(interfaces_started)
265     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
266 }
267
268 static void OnLines (GtkWidget *widget, gpointer data)
269 {
270   portals.lines = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
271
272   if(interfaces_started)
273     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
274 }
275
276 static void OnClip (GtkWidget *widget, gpointer data)
277 {
278   portals.clip = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
279
280   if(interfaces_started)
281     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
282 }
283
284 void DoConfigDialog ()
285 {
286   GtkWidget *dlg, *hbox, *vbox, *vbox2, *button, *table, *frame;
287   GtkWidget *lw3slider, *lw3label, *lw2slider, *lw2label, *zlist, *menu, *item;
288   GtkWidget *aa2check, *aa3check, *depthcheck, *linescheck, *polyscheck;
289   GtkWidget *transslider, *translabel, *clipslider, *cliplabel;
290   GtkWidget *show2check, *show3check, *portalcheck;
291   int loop = 1, ret = IDCANCEL;
292   GtkObject *adj;
293
294   dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
295   gtk_window_set_title (GTK_WINDOW (dlg), "Portal Viewer Configuration");
296   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
297                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
298   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
299                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
300   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
301   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
302
303   vbox = gtk_vbox_new (FALSE, 5);
304   gtk_widget_show (vbox);
305   gtk_container_add (GTK_CONTAINER (dlg), vbox);
306   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
307
308   frame = gtk_frame_new ("3D View");
309   gtk_widget_show (frame);
310   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
311
312   vbox2 = gtk_vbox_new (FALSE, 5);
313   gtk_widget_show (vbox2);
314   gtk_container_add (GTK_CONTAINER (frame), vbox2);
315   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
316
317   hbox = gtk_hbox_new (FALSE, 5);
318   gtk_widget_show (hbox);
319   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
320
321   adj = gtk_adjustment_new (portals.width_3d, 2, 40, 1, 1, 1);
322   lw3slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
323   gtk_widget_show (lw3slider);
324   gtk_box_pack_start (GTK_BOX (hbox), lw3slider, TRUE, TRUE, 0);
325   gtk_scale_set_draw_value (GTK_SCALE (lw3slider), FALSE);
326
327   lw3label = gtk_label_new ("");
328   gtk_widget_show (lw3label);
329   gtk_box_pack_start (GTK_BOX (hbox), lw3label, FALSE, TRUE, 0);
330   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll3d), lw3label);
331
332   table = gtk_table_new (2, 4, FALSE);
333   gtk_widget_show (table);
334   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
335   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
336   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
337
338   button = gtk_button_new_with_label ("Color");
339   gtk_widget_show (button);
340   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 0, 1,
341                     (GtkAttachOptions) (GTK_FILL),
342                     (GtkAttachOptions) (0), 0, 0);
343   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor3d), NULL);
344
345   button = gtk_button_new_with_label ("Depth Color");
346   gtk_widget_show (button);
347   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
348                     (GtkAttachOptions) (GTK_FILL),
349                     (GtkAttachOptions) (0), 0, 0);
350   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColorFog), NULL);
351
352   aa3check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
353   gtk_widget_show (aa3check);
354   gtk_table_attach (GTK_TABLE (table), aa3check, 1, 4, 0, 1,
355                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
356                     (GtkAttachOptions) (0), 0, 0);
357   gtk_signal_connect (GTK_OBJECT (aa3check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias3d), NULL);
358
359   depthcheck = gtk_check_button_new_with_label ("Depth Cue");
360   gtk_widget_show (depthcheck);
361   gtk_table_attach (GTK_TABLE (table), depthcheck, 1, 2, 1, 2,
362                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
363                     (GtkAttachOptions) (0), 0, 0);
364   gtk_signal_connect (GTK_OBJECT (depthcheck), "toggled", GTK_SIGNAL_FUNC (OnFog), NULL);
365
366   linescheck = gtk_check_button_new_with_label ("Lines");
367   gtk_widget_show (linescheck);
368   gtk_table_attach (GTK_TABLE (table), linescheck, 2, 3, 1, 2,
369                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
370                     (GtkAttachOptions) (0), 0, 0);
371   gtk_signal_connect (GTK_OBJECT (linescheck), "toggled", GTK_SIGNAL_FUNC (OnLines), NULL);
372
373   polyscheck = gtk_check_button_new_with_label ("Polygons");
374   gtk_widget_show (polyscheck);
375   gtk_table_attach (GTK_TABLE (table), polyscheck, 3, 4, 1, 2,
376                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
377                     (GtkAttachOptions) (0), 0, 0);
378   gtk_signal_connect (GTK_OBJECT (polyscheck), "toggled", GTK_SIGNAL_FUNC (OnPoly), NULL);
379
380   zlist = gtk_option_menu_new ();
381   gtk_widget_show (zlist);
382   gtk_box_pack_start (GTK_BOX (vbox2), zlist, TRUE, FALSE, 0);
383
384   menu = gtk_menu_new ();
385   gtk_widget_show (menu);
386   gtk_option_menu_set_menu (GTK_OPTION_MENU (zlist), menu);
387
388   item = gtk_menu_item_new_with_label ("Z-Buffer Test and Write (recommended for solid or no polygons)");
389   gtk_widget_show (item);
390   gtk_signal_connect (GTK_OBJECT (item), "activate",
391                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (0));
392   gtk_menu_append (GTK_MENU (menu), item);
393
394   item = gtk_menu_item_new_with_label ("Z-Buffer Test Only (recommended for transparent polygons)");
395   gtk_widget_show (item);
396   gtk_signal_connect (GTK_OBJECT (item), "activate",
397                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (1));
398   gtk_menu_append (GTK_MENU (menu), item);
399
400   item = gtk_menu_item_new_with_label ("Z-Buffer Off");
401   gtk_widget_show (item);
402   gtk_signal_connect (GTK_OBJECT (item), "activate",
403                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (2));
404   gtk_menu_append (GTK_MENU (menu), item);
405
406   table = gtk_table_new (2, 2, FALSE);
407   gtk_widget_show (table);
408   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
409   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
410   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
411
412   adj = gtk_adjustment_new (portals.trans_3d, 0, 100, 1, 1, 1);
413   transslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
414   gtk_widget_show (transslider);
415   gtk_table_attach (GTK_TABLE (table), transslider, 0, 1, 0, 1,
416                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
417                     (GtkAttachOptions) (0), 0, 0);
418   gtk_scale_set_draw_value (GTK_SCALE (transslider), FALSE);
419
420   translabel = gtk_label_new ("");
421   gtk_widget_show (translabel);
422   gtk_table_attach (GTK_TABLE (table), translabel, 1, 2, 0, 1,
423                     (GtkAttachOptions) (GTK_FILL),
424                     (GtkAttachOptions) (0), 0, 0);
425   gtk_misc_set_alignment (GTK_MISC (translabel), 0.0, 0.0);
426   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollTrans), translabel);
427
428   adj = gtk_adjustment_new (portals.clip_range, 1, 128, 1, 1, 1);
429   clipslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
430   gtk_widget_show (clipslider);
431   gtk_table_attach (GTK_TABLE (table), clipslider, 0, 1, 1, 2,
432                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
433                     (GtkAttachOptions) (0), 0, 0);
434   gtk_scale_set_draw_value (GTK_SCALE (clipslider), FALSE);
435
436   cliplabel = gtk_label_new ("");
437   gtk_widget_show (cliplabel);
438   gtk_table_attach (GTK_TABLE (table), cliplabel, 1, 2, 1, 2,
439                     (GtkAttachOptions) (GTK_FILL),
440                     (GtkAttachOptions) (0), 0, 0);
441   gtk_misc_set_alignment (GTK_MISC (cliplabel), 0.0, 0.0);
442   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollClip), cliplabel);
443
444   hbox = gtk_hbox_new (TRUE, 5);
445   gtk_widget_show (hbox);
446   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
447
448   show3check = gtk_check_button_new_with_label ("Show");
449   gtk_widget_show (show3check);
450   gtk_box_pack_start (GTK_BOX (hbox), show3check, TRUE, TRUE, 0);
451   gtk_signal_connect (GTK_OBJECT (show3check), "toggled", GTK_SIGNAL_FUNC (OnConfig3d), NULL);
452
453   portalcheck = gtk_check_button_new_with_label ("Portal cubic clipper");
454   gtk_widget_show (portalcheck);
455   gtk_box_pack_start (GTK_BOX (hbox), portalcheck, TRUE, TRUE, 0);
456   gtk_signal_connect (GTK_OBJECT (portalcheck), "toggled", GTK_SIGNAL_FUNC (OnClip), NULL);
457
458   frame = gtk_frame_new ("2D View");
459   gtk_widget_show (frame);
460   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
461
462   vbox2 = gtk_vbox_new (FALSE, 5);
463   gtk_widget_show (vbox2);
464   gtk_container_add (GTK_CONTAINER (frame), vbox2);
465   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
466
467   hbox = gtk_hbox_new (FALSE, 5);
468   gtk_widget_show (hbox);
469   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
470
471   adj = gtk_adjustment_new (portals.width_2d, 2, 40, 1, 1, 1);
472   lw2slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
473   gtk_widget_show (lw2slider);
474   gtk_box_pack_start (GTK_BOX (hbox), lw2slider, TRUE, TRUE, 0);
475   gtk_scale_set_draw_value (GTK_SCALE (lw2slider), FALSE);
476
477   lw2label = gtk_label_new ("");
478   gtk_widget_show (lw2label);
479   gtk_box_pack_start (GTK_BOX (hbox), lw2label, FALSE, TRUE, 0);
480   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll2d), lw2label);
481
482   hbox = gtk_hbox_new (FALSE, 5);
483   gtk_widget_show (hbox);
484   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
485
486   button = gtk_button_new_with_label ("Color");
487   gtk_widget_show (button);
488   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
489   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor2d), NULL);
490   gtk_widget_set_usize (button, 60, -2);
491
492   aa2check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
493   gtk_widget_show (aa2check);
494   gtk_box_pack_start (GTK_BOX (hbox), aa2check, TRUE, TRUE, 0);
495   gtk_signal_connect (GTK_OBJECT (aa2check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias2d), NULL);
496
497   hbox = gtk_hbox_new (FALSE, 5);
498   gtk_widget_show (hbox);
499   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
500
501   show2check = gtk_check_button_new_with_label ("Show");
502   gtk_widget_show (show2check);
503   gtk_box_pack_start (GTK_BOX (hbox), show2check, FALSE, FALSE, 0);
504   gtk_signal_connect (GTK_OBJECT (show2check), "toggled", GTK_SIGNAL_FUNC (OnConfig2d), NULL);
505
506   hbox = gtk_hbox_new (FALSE, 5);
507   gtk_widget_show (hbox);
508   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
509
510   button = gtk_button_new_with_label ("OK");
511   gtk_widget_show (button);
512   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
513   gtk_signal_connect (GTK_OBJECT (button), "clicked",
514                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
515   gtk_widget_set_usize (button, 60, -2);
516
517   // initialize dialog
518   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show2check), portals.show_2d);
519   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa2check), portals.aa_2d);
520   Set2DText (lw2label);
521
522   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show3check), portals.show_3d);
523   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (depthcheck), portals.fog);
524   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (polyscheck), portals.polygons);
525   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linescheck), portals.lines);
526   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa3check), portals.aa_3d);
527   gtk_option_menu_set_history (GTK_OPTION_MENU (zlist), portals.zbuffer);
528   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (portalcheck), portals.clip);
529
530   Set3DText (lw3label);
531   Set3DTransText (translabel);
532   SetClipText (cliplabel);
533
534   gtk_grab_add (dlg);
535   gtk_widget_show (dlg);
536
537   while (loop)
538     gtk_main_iteration ();
539
540   gtk_grab_remove (dlg);
541   gtk_widget_destroy (dlg);
542 }
543
544 #else // GTK_PLUGIN
545
546 CConfigDialog::CConfigDialog(CWnd* pParent /*=NULL*/)
547         : CDialog(CConfigDialog::IDD, pParent)
548 {
549         //{{AFX_DATA_INIT(CConfigDialog)
550         //}}AFX_DATA_INIT
551 }
552
553
554 void CConfigDialog::DoDataExchange(CDataExchange* pDX)
555 {
556         CDialog::DoDataExchange(pDX);
557         //{{AFX_DATA_MAP(CConfigDialog)
558         DDX_Control(pDX, IDC_CLIP, m_clip_ctrl);
559         DDX_Control(pDX, IDC_CUBIC, m_cubic_ctrl);
560         DDX_Control(pDX, IDC_SCROLL_CUBIC, m_scroll_cubic_ctrl);
561         DDX_Control(pDX, IDC_LINES, m_line_ctrl);
562         DDX_Control(pDX, IDC_SCROLL_3D_TRANS, m_scroll_3d_trans_ctrl);
563         DDX_Control(pDX, IDC_3D_TRANS, m_3d_trans_ctrl);
564         DDX_Control(pDX, IDC_POLY, m_poly_ctrl);
565         DDX_Control(pDX, IDC_FOG, m_fog_ctrl);
566         DDX_Control(pDX, IDC_ZBUFFER, m_z_ctrl);
567         DDX_Control(pDX, IDC_SCROLL_3D_WIDTH, m_scroll_3d_width_ctrl);
568         DDX_Control(pDX, IDC_ANTI_ALIAS_3D, m_aa_3d_ctrl);
569         DDX_Control(pDX, IDC_3D_WIDTH, m_3d_width_ctrl);
570         DDX_Control(pDX, IDC_ANTI_ALIAS_2D, m_aa_2d_ctrl);
571         DDX_Control(pDX, IDC_SCROLL_2D_WIDTH, m_scroll_2d_width_ctrl);
572         DDX_Control(pDX, IDC_2D_WIDTH, m_2d_width_ctrl);
573         DDX_Control(pDX, IDC_CONFIG_3D, m_3d_ctrl);
574         DDX_Control(pDX, IDC_CONFIG_2D, m_2d_ctrl);
575         //}}AFX_DATA_MAP
576 }
577
578
579 BEGIN_MESSAGE_MAP(CConfigDialog, CDialog)
580         //{{AFX_MSG_MAP(CConfigDialog)
581         ON_WM_HSCROLL()
582         ON_BN_CLICKED(IDC_ANTI_ALIAS_2D, OnAntiAlias2d)
583         ON_BN_CLICKED(IDC_CONFIG_2D, OnConfig2d)
584         ON_BN_CLICKED(IDC_CONFIG_3D, OnConfig3d)
585         ON_BN_CLICKED(IDC_COLOR_2D, OnColor2d)
586         ON_BN_CLICKED(IDC_ANTI_ALIAS_3D, OnAntiAlias3d)
587         ON_BN_CLICKED(IDC_COLOR_3D, OnColor3d)
588         ON_BN_CLICKED(IDC_COLOR_FOG, OnColorFog)
589         ON_BN_CLICKED(IDC_FOG, OnFog)
590         ON_CBN_SELCHANGE(IDC_ZBUFFER, OnSelchangeZbuffer)
591         ON_BN_CLICKED(IDC_POLY, OnPoly)
592         ON_BN_CLICKED(IDC_LINES, OnLines)
593         ON_BN_CLICKED(IDC_CLIP, OnClip)
594         //}}AFX_MSG_MAP
595 END_MESSAGE_MAP()
596
597 /////////////////////////////////////////////////////////////////////////////
598 // CConfigDialog message handlers
599
600 void CConfigDialog::Set2DText()
601 {
602         char s[40];
603
604         sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
605
606         m_2d_width_ctrl.SetWindowText(s);
607 }
608
609 void CConfigDialog::Set3DText()
610 {
611         char s[40];
612
613         sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
614
615         m_3d_width_ctrl.SetWindowText(s);
616 }
617
618 void CConfigDialog::Set3DTransText()
619 {
620         char s[40];
621
622         sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
623
624         m_3d_trans_ctrl.SetWindowText(s);
625 }
626
627 void CConfigDialog::SetClipText()
628 {
629         char s[40];
630
631         sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
632
633         m_cubic_ctrl.SetWindowText(s);
634 }
635
636 qboolean CConfigDialog::OnInitDialog() 
637 {
638         CDialog::OnInitDialog();
639
640         m_2d_ctrl.SetCheck(portals.show_2d);
641         m_aa_2d_ctrl.SetCheck(portals.aa_2d);
642         Set2DText();
643
644         m_scroll_2d_width_ctrl.SetScrollRange(2, 40, FALSE);
645         m_scroll_2d_width_ctrl.SetScrollPos((int)portals.width_2d, TRUE);
646
647         m_3d_ctrl.SetCheck(portals.show_3d);
648         m_fog_ctrl.SetCheck(portals.fog);
649         m_poly_ctrl.SetCheck(portals.polygons);
650         m_line_ctrl.SetCheck(portals.lines);
651         m_aa_3d_ctrl.SetCheck(portals.aa_3d);
652         m_z_ctrl.SetCurSel(portals.zbuffer);
653         m_clip_ctrl.SetCheck(portals.clip);
654
655         Set3DText();
656         Set3DTransText();
657         SetClipText();
658
659         m_scroll_3d_width_ctrl.SetScrollRange(2, 40, FALSE);
660         m_scroll_3d_width_ctrl.SetScrollPos((int)portals.width_3d, TRUE);
661         m_scroll_3d_trans_ctrl.SetScrollRange(0, 100, FALSE);
662         m_scroll_3d_trans_ctrl.SetScrollPos((int)portals.trans_3d, TRUE);
663         m_scroll_cubic_ctrl.SetScrollRange(1, 128, FALSE);
664         m_scroll_cubic_ctrl.SetScrollPos((int)portals.clip_range, TRUE);
665         
666         return TRUE;  // return TRUE unless you set the focus to a control
667                       // EXCEPTION: OCX Property Pages should return FALSE
668 }
669
670 void CConfigDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
671 {
672         float *adj;
673         float scr_min, scr_max, scr_big;
674
675         if(nSBCode == SB_THUMBPOSITION)
676         {
677                 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
678                 return;
679         }
680
681         if(pScrollBar == &m_scroll_2d_width_ctrl)
682         {
683                 scr_min = 2.0f;
684                 scr_max = 40.0f;
685                 scr_big = 4.0f;
686
687                 adj = &portals.width_2d;
688         }
689         else if(pScrollBar == &m_scroll_3d_width_ctrl)
690         {
691                 scr_min = 2.0f;
692                 scr_max = 40.0f;
693                 scr_big = 4.0f;
694
695                 adj = &portals.width_3d;
696         }
697         else if(pScrollBar == &m_scroll_3d_trans_ctrl)
698         {
699                 scr_min = 0.0f;
700                 scr_max = 100.0f;
701                 scr_big = 10.0f;
702
703                 adj = &portals.trans_3d;
704         }
705         else if(pScrollBar == &m_scroll_cubic_ctrl)
706         {
707                 scr_min = 1.0f;
708                 scr_max = 128.0f;
709                 scr_big = 8.0f;
710
711                 adj = &portals.clip_range;
712         }
713         else
714         {
715                 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
716                 return;
717         }
718
719         switch(nSBCode)
720         {
721         case SB_LEFT:
722                 *adj = scr_min;
723                 pScrollBar->SetScrollPos((int)scr_min, TRUE);
724                 break;
725         case SB_RIGHT:
726                 *adj = scr_max;
727                 pScrollBar->SetScrollPos((int)scr_max, TRUE);
728                 break;
729         case SB_LINELEFT:
730                 *adj -= 1.0f;
731                 
732                 if(*adj < scr_min)
733                         *adj = scr_min;
734
735                 pScrollBar->SetScrollPos((int)(*adj), TRUE);
736
737                 break;
738         case SB_LINERIGHT:
739                 *adj += 1.0f;
740                 
741                 if(*adj > scr_max)
742                         *adj = scr_max;
743
744                 pScrollBar->SetScrollPos((int)(*adj), TRUE);
745
746                 break;
747         case SB_PAGELEFT:
748                 *adj -= scr_big;
749                 
750                 if(*adj < scr_min)
751                         *adj = scr_min;
752
753                 pScrollBar->SetScrollPos((int)(*adj), TRUE);
754
755                 break;
756         case SB_PAGERIGHT:
757                 *adj += scr_big;
758                 
759                 if(*adj > scr_max)
760                         *adj = scr_max;
761
762                 pScrollBar->SetScrollPos((int)(*adj), TRUE);
763
764                 break;
765         case SB_THUMBTRACK:
766                 *adj = (float)nPos;
767
768                 break;
769         case SB_ENDSCROLL:
770                 pScrollBar->SetScrollPos((int)(*adj), TRUE);
771
772                 break;
773         default:
774                 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
775         }
776
777         if(pScrollBar == &m_scroll_2d_width_ctrl)
778         {
779                 Set2DText();
780
781                 if(interfaces_started)
782                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
783         }
784         else if(pScrollBar == &m_scroll_3d_width_ctrl)
785         {
786                 Set3DText();
787
788                 if(interfaces_started)
789                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
790         }
791         else if(pScrollBar == &m_scroll_3d_trans_ctrl)
792         {
793                 Set3DTransText();
794
795                 if(interfaces_started)
796                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
797         }
798         else if(pScrollBar == &m_scroll_cubic_ctrl)
799         {
800                 SetClipText();
801
802                 if(interfaces_started)
803                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
804         }
805 }
806
807 void CConfigDialog::OnAntiAlias2d() 
808 {
809         portals.aa_2d = m_aa_2d_ctrl.GetCheck();
810
811         if(interfaces_started)
812                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
813 }
814
815 void CConfigDialog::OnConfig2d() 
816 {
817         portals.show_2d = m_2d_ctrl.GetCheck();
818
819         if(interfaces_started)
820                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
821 }
822
823 void CConfigDialog::OnColor2d() 
824 {
825         CColorDialog dlg(portals.color_2d, CC_ANYCOLOR, this);
826
827         if(dlg.DoModal() == IDOK)
828         {
829                 portals.color_2d = dlg.GetColor();
830
831                 portals.FixColors();
832
833                 if(interfaces_started)
834                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
835         }
836 }
837
838 void CConfigDialog::OnConfig3d() 
839 {
840         portals.show_3d = m_3d_ctrl.GetCheck();
841
842         if(interfaces_started)
843                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
844 }
845
846
847 void CConfigDialog::OnAntiAlias3d() 
848 {
849         portals.aa_3d = m_aa_3d_ctrl.GetCheck();
850
851         if(interfaces_started)
852                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
853 }
854
855 void CConfigDialog::OnColor3d() 
856 {
857         CColorDialog dlg(portals.color_3d, CC_ANYCOLOR, this);
858
859         if(dlg.DoModal() == IDOK)
860         {
861                 portals.color_3d = dlg.GetColor();
862
863                 portals.FixColors();
864
865                 if(interfaces_started)
866                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
867         }
868 }
869
870 void CConfigDialog::OnColorFog() 
871 {
872         CColorDialog dlg(portals.color_fog, CC_ANYCOLOR, this);
873
874         if(dlg.DoModal() == IDOK)
875         {
876                 portals.color_fog = dlg.GetColor();
877
878                 portals.FixColors();
879
880                 if(interfaces_started)
881                         g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
882         }
883 }
884
885 void CConfigDialog::OnFog() 
886 {
887         portals.fog = m_fog_ctrl.GetCheck();
888
889         if(interfaces_started)
890                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
891 }
892
893 void CConfigDialog::OnSelchangeZbuffer() 
894 {
895         portals.zbuffer = m_z_ctrl.GetCurSel();
896
897         if(interfaces_started)
898                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
899 }
900
901 void CConfigDialog::OnPoly() 
902 {
903         portals.polygons = m_poly_ctrl.GetCheck();
904
905         if(interfaces_started)
906                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
907 }
908
909 void CConfigDialog::OnLines() 
910 {
911         portals.lines = m_line_ctrl.GetCheck();
912
913         if(interfaces_started)
914                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
915 }
916
917 void CConfigDialog::OnClip() 
918 {
919         portals.clip = m_clip_ctrl.GetCheck();
920
921         if(interfaces_started)
922                 g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
923 }
924
925 #endif // GTK_PLUGIN