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