2 PrtView plugin for GtkRadiant
3 Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com
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.
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.
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
20 #include "ConfigDialog.h"
23 #include <uilib/uilib.h>
24 #include "gtkutil/pointer.h"
26 #include "iscenegraph.h"
31 static void dialog_button_callback(ui::Widget widget, gpointer data)
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");
40 *ret = gpointer_to_int(data);
43 static gint dialog_delete_callback(ui::Widget widget, GdkEvent *event, gpointer data)
46 int *loop = (int *) g_object_get_data(G_OBJECT(widget), "loop");
51 // =============================================================================
52 // Color selection dialog
54 static int DoColor(PackedColour *c)
57 int loop = 1, ret = IDCANCEL;
59 clr.red = (guint16) (GetRValue(*c) * (65535 / 255));
60 clr.blue = (guint16) (GetGValue(*c) * (65535 / 255));
61 clr.green = (guint16) (GetBValue(*c) * (65535 / 255));
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);
69 GtkWidget *ok_button, *cancel_button;
70 g_object_get(dlg, "ok-button", &ok_button, "cancel-button", &cancel_button, nullptr);
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);
84 gtk_color_selection_get_current_color(
85 GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dlg))), &clr);
91 *c = RGB(clr.red / (65535 / 255), clr.green / (65535 / 255), clr.blue / (65535 / 255));
97 static void Set2DText(ui::Widget label)
101 sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
103 gtk_label_set_text(GTK_LABEL(label), s);
106 static void Set3DText(ui::Widget label)
110 sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
112 gtk_label_set_text(GTK_LABEL(label), s);
115 static void Set3DTransText(ui::Widget label)
119 sprintf(s, "Polygon transparency = %d%%", (int) portals.trans_3d);
121 gtk_label_set_text(GTK_LABEL(label), s);
124 static void SetClipText(ui::Widget label)
128 sprintf(s, "Cubic clip range = %d", (int) portals.clip_range * 64);
130 gtk_label_set_text(GTK_LABEL(label), s);
133 static void OnScroll2d(ui::Adjustment adj, gpointer data)
135 portals.width_2d = static_cast<float>( gtk_adjustment_get_value(adj));
136 Set2DText(ui::Widget::from(data));
138 Portals_shadersChanged();
142 static void OnScroll3d(ui::Adjustment adj, gpointer data)
144 portals.width_3d = static_cast<float>( gtk_adjustment_get_value(adj));
145 Set3DText(ui::Widget::from(data));
150 static void OnScrollTrans(ui::Adjustment adj, gpointer data)
152 portals.trans_3d = static_cast<float>( gtk_adjustment_get_value(adj));
153 Set3DTransText(ui::Widget::from(data));
158 static void OnScrollClip(ui::Adjustment adj, gpointer data)
160 portals.clip_range = static_cast<float>( gtk_adjustment_get_value(adj));
161 SetClipText(ui::Widget::from(data));
166 static void OnAntiAlias2d(ui::Widget widget, gpointer data)
168 portals.aa_2d = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false;
170 Portals_shadersChanged();
175 static void OnConfig2d(ui::Widget widget, gpointer data)
177 portals.show_2d = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false;
182 static void OnColor2d(ui::Widget widget, gpointer data)
184 if (DoColor(&portals.color_2d) == IDOK) {
185 Portals_shadersChanged();
191 static void OnConfig3d(ui::Widget widget, gpointer data)
193 portals.show_3d = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false;
199 static void OnAntiAlias3d(ui::Widget widget, gpointer data)
201 portals.aa_3d = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false;
203 Portals_shadersChanged();
207 static void OnColor3d(ui::Widget widget, gpointer data)
209 if (DoColor(&portals.color_3d) == IDOK) {
210 Portals_shadersChanged();
216 static void OnColorFog(ui::Widget widget, gpointer data)
218 if (DoColor(&portals.color_fog) == IDOK) {
219 Portals_shadersChanged();
225 static void OnFog(ui::Widget widget, gpointer data)
227 portals.fog = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false;
229 Portals_shadersChanged();
233 static void OnSelchangeZbuffer(ui::Widget widget, gpointer data)
235 portals.zbuffer = gpointer_to_int(data);
237 Portals_shadersChanged();
241 static void OnPoly(ui::Widget widget, gpointer data)
243 portals.polygons = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
248 static void OnLines(ui::Widget widget, gpointer data)
250 portals.lines = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
255 static void OnClip(ui::Widget widget, gpointer data)
257 portals.clip = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false;
262 void DoConfigDialog()
264 int loop = 1, ret = IDCANCEL;
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);
275 auto vbox = ui::VBox(FALSE, 5);
278 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
280 auto frame = ui::Frame("3D View");
282 vbox.pack_start(frame, TRUE, TRUE, 0);
284 auto vbox2 = ui::VBox(FALSE, 5);
287 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5);
289 auto hbox = ui::HBox(FALSE, 5);
291 vbox2.pack_start(hbox, TRUE, TRUE, 0);
293 auto adj = ui::Adjustment(portals.width_3d, 2, 40, 1, 1, 0);
294 auto lw3slider = ui::HScale(adj);
296 hbox.pack_start(lw3slider, TRUE, TRUE, 0);
297 gtk_scale_set_draw_value(GTK_SCALE(lw3slider), FALSE);
299 auto lw3label = ui::Label("");
301 hbox.pack_start(lw3label, FALSE, TRUE, 0);
302 adj.connect("value_changed", G_CALLBACK(OnScroll3d), lw3label);
304 auto table = ui::Table(2, 4, FALSE);
306 vbox2.pack_start(table, TRUE, TRUE, 0);
307 gtk_table_set_row_spacings(table, 5);
308 gtk_table_set_col_spacings(table, 5);
310 auto button = ui::Button("Color");
312 table.attach(button, {0, 1, 0, 1}, {GTK_FILL, 0});
313 button.connect("clicked", G_CALLBACK(OnColor3d), NULL);
315 button = ui::Button("Depth Color");
317 table.attach(button, {0, 1, 1, 2}, {GTK_FILL, 0});
318 button.connect("clicked", G_CALLBACK(OnColorFog), NULL);
320 auto aa3check = ui::CheckButton("Anti-Alias (May not work on some video cards)");
322 table.attach(aa3check, {1, 4, 0, 1}, {GTK_EXPAND | GTK_FILL, 0});
323 aa3check.connect("toggled", G_CALLBACK(OnAntiAlias3d), NULL);
325 auto depthcheck = ui::CheckButton("Depth Cue");
327 table.attach(depthcheck, {1, 2, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
328 depthcheck.connect("toggled", G_CALLBACK(OnFog), NULL);
330 auto linescheck = ui::CheckButton("Lines");
332 table.attach(linescheck, {2, 3, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
333 linescheck.connect("toggled", G_CALLBACK(OnLines), NULL);
335 auto polyscheck = ui::CheckButton("Polygons");
337 table.attach(polyscheck, {3, 4, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
338 polyscheck.connect("toggled", G_CALLBACK(OnPoly), NULL);
340 auto zlist = ui::ComboBoxText(ui::New);
342 vbox2.pack_start(zlist, TRUE, FALSE, 0);
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");
348 zlist.connect("changed", G_CALLBACK(+[](ui::ComboBox self, void *) {
349 OnSelchangeZbuffer(self, GINT_TO_POINTER(gtk_combo_box_get_active(self)));
352 table = ui::Table(2, 2, FALSE);
354 vbox2.pack_start(table, TRUE, TRUE, 0);
355 gtk_table_set_row_spacings(table, 5);
356 gtk_table_set_col_spacings(table, 5);
358 adj = ui::Adjustment(portals.trans_3d, 0, 100, 1, 1, 0);
359 auto transslider = ui::HScale(adj);
361 table.attach(transslider, {0, 1, 0, 1}, {GTK_EXPAND | GTK_FILL, 0});
362 gtk_scale_set_draw_value(GTK_SCALE(transslider), FALSE);
364 auto translabel = ui::Label("");
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);
370 adj = ui::Adjustment(portals.clip_range, 1, 128, 1, 1, 0);
371 auto clipslider = ui::HScale(adj);
373 table.attach(clipslider, {0, 1, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
374 gtk_scale_set_draw_value(GTK_SCALE(clipslider), FALSE);
376 auto cliplabel = ui::Label("");
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);
382 hbox = ui::HBox(TRUE, 5);
384 vbox2.pack_start(hbox, TRUE, FALSE, 0);
386 auto show3check = ui::CheckButton("Show");
388 hbox.pack_start(show3check, TRUE, TRUE, 0);
389 show3check.connect("toggled", G_CALLBACK(OnConfig3d), NULL);
391 auto portalcheck = ui::CheckButton("Portal cubic clipper");
393 hbox.pack_start(portalcheck, TRUE, TRUE, 0);
394 portalcheck.connect("toggled", G_CALLBACK(OnClip), NULL);
396 frame = ui::Frame("2D View");
398 vbox.pack_start(frame, TRUE, TRUE, 0);
400 vbox2 = ui::VBox(FALSE, 5);
403 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5);
405 hbox = ui::HBox(FALSE, 5);
407 vbox2.pack_start(hbox, TRUE, FALSE, 0);
409 adj = ui::Adjustment(portals.width_2d, 2, 40, 1, 1, 0);
410 auto lw2slider = ui::HScale(adj);
412 hbox.pack_start(lw2slider, TRUE, TRUE, 0);
413 gtk_scale_set_draw_value(GTK_SCALE(lw2slider), FALSE);
415 auto lw2label = ui::Label("");
417 hbox.pack_start(lw2label, FALSE, TRUE, 0);
418 adj.connect("value_changed", G_CALLBACK(OnScroll2d), lw2label);
420 hbox = ui::HBox(FALSE, 5);
422 vbox2.pack_start(hbox, TRUE, FALSE, 0);
424 button = ui::Button("Color");
426 hbox.pack_start(button, FALSE, FALSE, 0);
427 button.connect("clicked", G_CALLBACK(OnColor2d), NULL);
428 button.dimensions(60, -1);
430 auto aa2check = ui::CheckButton("Anti-Alias (May not work on some video cards)");
432 hbox.pack_start(aa2check, TRUE, TRUE, 0);
433 aa2check.connect("toggled", G_CALLBACK(OnAntiAlias2d), NULL);
435 hbox = ui::HBox(FALSE, 5);
437 vbox2.pack_start(hbox, TRUE, FALSE, 0);
439 auto show2check = ui::CheckButton("Show");
441 hbox.pack_start(show2check, FALSE, FALSE, 0);
442 show2check.connect("toggled", G_CALLBACK(OnConfig2d), NULL);
444 hbox = ui::HBox(FALSE, 5);
446 vbox.pack_start(hbox, FALSE, FALSE, 0);
448 button = ui::Button("OK");
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);
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);
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);
469 Set3DTransText(translabel);
470 SetClipText(cliplabel);
476 gtk_main_iteration();
479 gtk_grab_remove(dlg);