2 Copyright (c) 2001, Loki software, inc.
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
8 Redistributions of source code must retain the above copyright notice, this list
9 of conditions and the following disclaimer.
11 Redistributions in binary form must reproduce the above copyright notice, this
12 list of conditions and the following disclaimer in the documentation and/or
13 other materials provided with the distribution.
15 Neither the name of Loki software nor the names of its contributors may be used
16 to endorse or promote products derived from this software without specific prior
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
23 DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 // Some small dialogs that don't need much
34 // Leonardo Zide (leo@lokigames.com)
38 #include <gdk/gdkkeysyms.h>
40 #include <glib/gi18n.h>
43 #include <gdk/gdkwin32.h>
50 // =============================================================================
51 // Color selection dialog
53 qboolean DoColor (int iIndex)
55 static bool bColorOpen = false;
59 Sys_FPrintf(SYS_WRN, "DoColor dialog is already open\n");
65 if (color_dialog (g_pParentWnd->m_pWidget, g_qeglobals.d_savedinfo.colors[iIndex]))
68 ** scale colors so that at least one component is at 1.0F
69 ** if this is meant to select an entity color
71 if (iIndex == COLOR_ENTITY)
75 if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )
76 largest = g_qeglobals.d_savedinfo.colors[iIndex][0];
77 if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )
78 largest = g_qeglobals.d_savedinfo.colors[iIndex][1];
79 if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )
80 largest = g_qeglobals.d_savedinfo.colors[iIndex][2];
82 if ( largest == 0.0F )
84 g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;
85 g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;
86 g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;
90 float scaler = 1.0F / largest;
92 g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;
93 g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;
94 g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;
98 Sys_UpdateWindows (W_ALL);
108 // =============================================================================
109 // Project settings dialog
111 static void UpdateBSPCommandList (GtkWidget *dialog);
113 static void DoProjectAddEdit (bool edit, GtkWidget *parent)
115 GtkWidget *dlg, *vbox, *hbox, *label, *table, *button;
116 GtkWidget *cmd, *text;
117 int loop = 1, ret = IDCANCEL;
119 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
121 gtk_window_set_title (GTK_WINDOW (dlg), _("Edit Command"));
123 gtk_window_set_title (GTK_WINDOW (dlg), _("Add Command"));
124 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
125 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
126 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
127 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
128 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
129 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
131 vbox = gtk_vbox_new (FALSE, 5);
132 gtk_widget_show (vbox);
133 gtk_container_add (GTK_CONTAINER (dlg), vbox);
134 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
136 table = gtk_table_new (2, 2, FALSE);
137 gtk_widget_show (table);
138 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
139 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
140 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
142 label = gtk_label_new (_("Menu text"));
143 gtk_widget_show (label);
144 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
145 (GtkAttachOptions) (GTK_FILL),
146 (GtkAttachOptions) (0), 0, 0);
147 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
149 label = gtk_label_new (_("Command"));
150 gtk_widget_show (label);
151 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
152 (GtkAttachOptions) (GTK_FILL),
153 (GtkAttachOptions) (0), 0, 0);
154 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
156 text = gtk_entry_new ();
157 g_object_set_data (G_OBJECT (dlg), "text", text);
158 gtk_widget_show (text);
159 gtk_table_attach (GTK_TABLE (table), text, 1, 2, 0, 1,
160 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
161 (GtkAttachOptions) (0), 0, 0);
162 gtk_widget_set_usize (text, 300, -2);
164 cmd = gtk_entry_new ();
165 g_object_set_data (G_OBJECT (dlg), "cmd", cmd);
166 gtk_widget_show (cmd);
167 gtk_table_attach (GTK_TABLE (table), cmd, 1, 2, 1, 2,
168 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
169 (GtkAttachOptions) (0), 0, 0);
170 gtk_widget_set_usize (cmd, 300, -2);
172 hbox = gtk_hbox_new (FALSE, 5);
173 gtk_widget_show (hbox);
174 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
176 button = gtk_button_new_with_label (_("OK"));
177 gtk_widget_show (button);
178 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
179 gtk_signal_connect (GTK_OBJECT (button), "clicked",
180 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
181 gtk_widget_set_usize (button, 60, -2);
183 button = gtk_button_new_with_label (_("Cancel"));
184 gtk_widget_show (button);
185 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
186 gtk_signal_connect (GTK_OBJECT (button), "clicked",
187 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
188 gtk_widget_set_usize (button, 60, -2);
192 GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(parent), "view"));
193 GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
196 if(gtk_tree_selection_get_selected(selection, &model, &iter))
199 gtk_tree_model_get(model, &iter, 0, &key, -1);
200 const char* value = ValueForKey (g_qeglobals.d_project_entity, key);
201 gtk_entry_set_text (GTK_ENTRY (text), key);
202 gtk_entry_set_text (GTK_ENTRY (cmd), value);
208 gtk_widget_show (dlg);
211 gtk_main_iteration ();
215 const char* key = gtk_entry_get_text (GTK_ENTRY (text));
216 const char* value = gtk_entry_get_text (GTK_ENTRY (cmd));
218 if (strlen (key) <= 0 || strlen (value) <= 0)
220 Sys_Printf ("Command not added\n");
226 SetKeyValue (g_qeglobals.d_project_entity, key, value);
231 if (key[0] == 'b' && key[1] == 's' && key[2] == 'p')
233 SetKeyValue (g_qeglobals.d_project_entity, key, value);
237 Sys_Printf ("BSP commands must be preceded by \"bsp\"");
240 UpdateBSPCommandList (parent);
244 gtk_grab_remove (dlg);
245 gtk_widget_destroy (dlg);
248 static void UpdateBSPCommandList (GtkWidget *dialog)
250 GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT(dialog), "bsp_commands"));
252 gtk_list_store_clear(store);
254 for(epair_t* ep = g_qeglobals.d_project_entity->epairs; ep != NULL; ep = ep->next)
256 if(ep->key[0] == 'b' && ep->key[1] == 's' && ep->key[2] == 'p')
259 gtk_list_store_append(store, &iter);
260 gtk_list_store_set(store, &iter, 0, ep->key, -1);
265 static void project_add (GtkWidget *widget, gpointer data)
267 GtkWidget *dlg = GTK_WIDGET (data);
268 DoProjectAddEdit (false, dlg);
269 UpdateBSPCommandList (dlg);
272 static void project_change (GtkWidget *widget, gpointer data)
274 GtkWidget *dlg = GTK_WIDGET (data);
275 DoProjectAddEdit (true, dlg);
276 UpdateBSPCommandList (dlg);
279 static void project_remove (GtkWidget *widget, gpointer data)
281 GtkWidget* project = GTK_WIDGET(data);
283 GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(project), "view"));
284 GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
287 if(gtk_tree_selection_get_selected(selection, &model, &iter))
290 gtk_tree_model_get(model, &iter, 0, &key, -1);
291 DeleteKey (g_qeglobals.d_project_entity, key);
294 char* index = gtk_tree_model_get_string_from_iter(model, &iter);
295 Sys_Printf ("Selected %s\n", index);
298 UpdateBSPCommandList(project);
303 static const char* sQ3ComboItem = "Quake III Arena";
304 static const char* sTAComboItem = "Quake III: Team Arena";
305 static const char* sModComboItem = "Custom Quake III modification";
306 static const char* sWolfComboItem = "Return To Castle Wolfenstein";
307 static const char* sWolfModComboItem = "Custom RTCW modification";
308 static const char* sHLComboItem = "Half-life";
309 static const char* sHLModComboItem = "Custom Half-life modification";
311 static const char* sWolfSPCombo = "Single Player mapping mode";
312 static const char* sWolfMPCombo = "Multiplayer mapping mode";
315 // HARD-CODED ET HACK
316 static const char* sETComboItem = "Wolfenstein: Enemy Territory";
317 static const char* sETModComboItem = "Custom ET modification";
320 // HARD-CODED JK2 HACK
321 static const char* sJK2ComboItem = "Jedi Knight II Outcast";
322 static const char* sJK2ModComboItem = "Custom JK2 modification";
323 static const char* sJK2SPCombo = "Single Player mapping mode";
324 static const char* sJK2MPCombo = "Multiplayer mapping mode";
327 // HARD-CODED JA HACK
328 static const char* sJAComboItem = "Jedi Knight Jedi Academy";
329 static const char* sJAModComboItem = "Custom JA modification";
330 static const char* sJASPCombo = "Single Player mapping mode";
331 static const char* sJAMPCombo = "Multiplayer mapping mode";
334 // HARD-CODED STVEF2 HACK
335 static const char* sSTVEFComboItem = "Star Trek Voyager : Elite Force";
336 static const char* sSTVEFModComboItem = "Custom Elite Force modification";
337 static const char* sSTVEFSPCombo = "Single Player mapping mode";
338 static const char* sSTVEFMPCombo = "Holo Match mapping mode";
341 // HARD-CODED SOF2 HACK
342 static const char* sSOF2ComboItem = "Soldier of Fortune II - Double Helix";
343 static const char* sSOF2ModComboItem = "Custom Sof2 modification";
344 static const char* sSOF2SPCombo = "Single Player mapping mode";
345 static const char* sSOF2MPCombo = "Multiplayer mapping mode";
347 static GtkWidget* game_select; // GTK_COMBO
348 static GtkEntry* fsgame_entry;
350 gint OnSelchangeComboWhatgame (GtkWidget *widget, GdkEvent* event, gpointer data)
352 const char *dir = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(game_select)->entry));
354 if (g_pGameDescription->mGameFile == "wolf.game")
356 if (!strcmp(dir,sWolfComboItem))
358 // disable the fs_game text entry
359 gtk_entry_set_text (fsgame_entry, "");
360 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
364 gtk_entry_set_text (fsgame_entry, "");
365 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
370 else if (g_pGameDescription->mGameFile == "et.game")
372 if (!strcmp(dir,sETComboItem))
374 // disable the fs_game text entry
375 gtk_entry_set_text (fsgame_entry, "");
376 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
380 gtk_entry_set_text (fsgame_entry, "");
381 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
385 else if (g_pGameDescription->mGameFile == "hl.game")
387 if (!strcmp(dir,sHLComboItem))
389 // disable the fs_game text entry
390 gtk_entry_set_text (fsgame_entry, "");
391 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
395 gtk_entry_set_text (fsgame_entry, "");
396 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
402 else if (g_pGameDescription->mGameFile == "jk2.game")
404 if (!strcmp(dir,sJK2ComboItem))
406 // disable the fs_game text entry
407 gtk_entry_set_text (fsgame_entry, "");
408 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
412 gtk_entry_set_text (fsgame_entry, "");
413 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
418 else if (g_pGameDescription->mGameFile == "ja.game")
420 if (!strcmp(dir,sJAComboItem))
422 // disable the fs_game text entry
423 gtk_entry_set_text (fsgame_entry, "");
424 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
428 gtk_entry_set_text (fsgame_entry, "");
429 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
434 else if (g_pGameDescription->mGameFile == "stvef.game")
436 if (!strcmp(dir,sSTVEFComboItem))
438 // disable the fs_game text entry
439 gtk_entry_set_text (fsgame_entry, "");
440 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
444 gtk_entry_set_text (fsgame_entry, "");
445 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
450 else if (g_pGameDescription->mGameFile == "sof2.game")
452 if (!strcmp(dir,sSOF2ComboItem))
454 // disable the fs_game text entry
455 gtk_entry_set_text (fsgame_entry, "");
456 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
460 gtk_entry_set_text (fsgame_entry, "");
461 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
467 if (!strcmp(dir,sQ3ComboItem))
469 // disable the fs_game text entry
470 gtk_entry_set_text (fsgame_entry, "");
471 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
473 else if (!strcmp(dir,sTAComboItem))
475 gtk_entry_set_text (fsgame_entry, "missionpack");
476 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
480 gtk_entry_set_text (fsgame_entry, "");
481 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
488 void DoProjectSettings ()
491 GtkWidget *frame, *label, *vbox, *table1, *table2, *button;
494 GtkWidget *base, *game;
495 GtkWidget *gamemode_combo;
496 GList *combo_list = (GList*)NULL;
498 int loop = 1, ret = IDCANCEL;
500 project = gtk_window_new (GTK_WINDOW_TOPLEVEL);
501 gtk_window_set_title (GTK_WINDOW (project), _("Project Settings"));
502 gtk_signal_connect (GTK_OBJECT (project), "delete_event",
503 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
504 gtk_signal_connect (GTK_OBJECT (project), "destroy",
505 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
506 g_object_set_data (G_OBJECT (project), "loop", &loop);
507 g_object_set_data (G_OBJECT (project), "ret", &ret);
508 gtk_window_set_default_size (GTK_WINDOW (project), 550, 400);
510 table1 = gtk_table_new (3, 2, FALSE);
511 gtk_widget_show (table1);
512 gtk_container_add (GTK_CONTAINER (project), table1);
513 gtk_container_set_border_width (GTK_CONTAINER (table1), 5);
514 gtk_table_set_row_spacings (GTK_TABLE (table1), 5);
515 gtk_table_set_col_spacings (GTK_TABLE (table1), 5);
517 vbox = gtk_vbox_new (FALSE, 5);
518 gtk_widget_show (vbox);
519 gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 0, 1,
520 (GtkAttachOptions) (GTK_FILL),
521 (GtkAttachOptions) (GTK_FILL), 0, 0);
523 button = gtk_button_new_with_label (_("OK"));
524 gtk_widget_show (button);
525 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
526 gtk_signal_connect (GTK_OBJECT (button), "clicked",
527 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
528 gtk_widget_set_usize (button, 60, -2);
530 button = gtk_button_new_with_label (_("Cancel"));
531 gtk_widget_show (button);
532 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
533 gtk_signal_connect (GTK_OBJECT (button), "clicked",
534 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
535 gtk_widget_set_usize (button, 60, -2);
537 vbox = gtk_vbox_new (FALSE, 5);
538 gtk_widget_show (vbox);
539 gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 1, 2,
540 (GtkAttachOptions) (GTK_FILL),
541 (GtkAttachOptions) (GTK_FILL), 0, 0);
543 button = gtk_button_new_with_label (_("Add..."));
544 gtk_widget_show (button);
545 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
546 gtk_signal_connect (GTK_OBJECT (button), "clicked",
547 GTK_SIGNAL_FUNC (project_add), project);
548 gtk_widget_set_usize (button, 60, -2);
550 button = gtk_button_new_with_label (_("Change..."));
551 gtk_widget_show (button);
552 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
553 gtk_signal_connect (GTK_OBJECT (button), "clicked",
554 GTK_SIGNAL_FUNC (project_change), project);
555 gtk_widget_set_usize (button, 60, -2);
557 button = gtk_button_new_with_label (_("Remove"));
558 gtk_widget_show (button);
559 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
560 gtk_signal_connect (GTK_OBJECT (button), "clicked",
561 GTK_SIGNAL_FUNC (project_remove), project);
562 gtk_widget_set_usize (button, 60, -2);
564 frame = gtk_frame_new (_("Misc settings"));
565 gtk_widget_show (frame);
566 gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 2, 3,
567 (GtkAttachOptions) (GTK_FILL),
568 (GtkAttachOptions) (GTK_FILL), 0, 0);
570 brush = gtk_check_button_new_with_label (_("Use brush primitives in MAP files (NOTE: experimental feature,\n"
571 "required by the texture tools plugin)"));
572 gtk_widget_show (brush);
573 gtk_container_add (GTK_CONTAINER (frame), brush);
574 gtk_container_set_border_width (GTK_CONTAINER (brush), 5);
576 frame = gtk_frame_new (_("Menu commands"));
577 gtk_widget_show (frame);
578 gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 1, 2,
579 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
580 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
582 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
583 gtk_widget_show (scr);
584 gtk_container_add (GTK_CONTAINER (frame), scr);
585 gtk_container_set_border_width (GTK_CONTAINER (scr), 5);
586 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
587 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
591 GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
593 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
594 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
596 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
597 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
598 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
600 GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
601 gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
603 gtk_widget_show(view);
605 g_object_set_data(G_OBJECT (project), "view", view);
606 g_object_set_data(G_OBJECT (project), "bsp_commands", store);
607 gtk_container_add(GTK_CONTAINER (scr), view);
609 g_object_unref(G_OBJECT(store));
612 frame = gtk_frame_new (_("Project settings"));
613 gtk_widget_show (frame);
614 gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1,
615 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
616 (GtkAttachOptions) (GTK_FILL), 0, 0);
618 // HACK: hardcoded game stuff
619 if (g_pGameDescription->mGameFile == "wolf.game" ||
620 g_pGameDescription->mGameFile == "et.game" ||
621 g_pGameDescription->mGameFile == "jk2.game" ||
622 g_pGameDescription->mGameFile == "stvef.game" ||
623 g_pGameDescription->mGameFile == "sof2.game" ||
624 g_pGameDescription->mGameFile == "ja.game" )
626 table2 = gtk_table_new (9, 2, FALSE);
630 table2 = gtk_table_new (8, 2, FALSE);
632 gtk_widget_show (table2);
633 gtk_container_add (GTK_CONTAINER (frame), table2);
634 gtk_container_set_border_width (GTK_CONTAINER (table2), 5);
635 gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
636 gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
639 fill in the game selection combo
640 HACK: hardcoded Q3/Wolf/HL switch
641 \todo that stuff would be faster to write with implementation of property bags and associated code to edit
643 if (g_pGameDescription->mGameFile == "wolf.game")
645 combo_list = g_list_append (combo_list, (void *)sWolfComboItem);
646 combo_list = g_list_append (combo_list, (void *)sWolfModComboItem);
648 else if (g_pGameDescription->mGameFile == "et.game")
650 combo_list = g_list_append (combo_list, (void *)sETComboItem);
651 combo_list = g_list_append (combo_list, (void *)sETModComboItem);
653 else if (g_pGameDescription->mGameFile == "hl.game")
655 combo_list = g_list_append (combo_list, (void *)sHLComboItem);
656 combo_list = g_list_append (combo_list, (void *)sHLModComboItem);
660 else if (g_pGameDescription->mGameFile == "jk2.game")
662 combo_list = g_list_append (combo_list, (void *)sJK2ComboItem);
663 combo_list = g_list_append (combo_list, (void *)sJK2ModComboItem);
667 else if (g_pGameDescription->mGameFile == "ja.game")
669 combo_list = g_list_append (combo_list, (void *)sJAComboItem);
670 combo_list = g_list_append (combo_list, (void *)sJAModComboItem);
674 else if (g_pGameDescription->mGameFile == "stvef.game")
676 combo_list = g_list_append (combo_list, (void *)sSTVEFComboItem);
677 combo_list = g_list_append (combo_list, (void *)sSTVEFModComboItem);
680 // SOF2 HACK A LA JK2 A LA WOLF
681 else if (g_pGameDescription->mGameFile == "sof2.game")
683 combo_list = g_list_append (combo_list, (void *)sSOF2ComboItem);
684 combo_list = g_list_append (combo_list, (void *)sSOF2ModComboItem);
689 combo_list = g_list_append (combo_list, (void *)sQ3ComboItem);
690 combo_list = g_list_append (combo_list, (void *)sTAComboItem);
691 combo_list = g_list_append (combo_list, (void *)sModComboItem);
694 game_select = gtk_combo_new ();
695 gtk_combo_set_popdown_strings (GTK_COMBO (game_select), combo_list);
696 gtk_widget_show (game_select);
697 gtk_table_attach (GTK_TABLE (table2), game_select, 1, 2, 6, 7,
698 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
699 (GtkAttachOptions) (0), 0, 0);
701 gtk_signal_connect (GTK_OBJECT(GTK_COMBO (game_select)->entry), "changed",
702 GTK_SIGNAL_FUNC (OnSelchangeComboWhatgame), NULL);
704 g_list_free (combo_list);
705 gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (game_select)->entry), FALSE);
707 game = gtk_entry_new();
708 fsgame_entry = GTK_ENTRY(game);
709 gtk_widget_show(game);
710 gtk_table_attach(GTK_TABLE(table2), game, 1, 2, 7, 8,
711 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
712 (GtkAttachOptions) (0), 0, 0);
715 wolf specific: select MP or SP mode
717 if (g_pGameDescription->mGameFile == "wolf.game")
720 combo_list = g_list_append (combo_list, (void *)sWolfSPCombo);
721 combo_list = g_list_append (combo_list, (void *)sWolfMPCombo);
723 gamemode_combo = gtk_combo_new ();
724 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
725 gtk_widget_show(gamemode_combo);
726 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
727 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
728 (GtkAttachOptions) (0), 0, 0);
730 g_list_free (combo_list);
733 label = gtk_label_new (_("Mapping mode"));
734 gtk_widget_show (label);
735 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
736 (GtkAttachOptions) (GTK_FILL),
737 (GtkAttachOptions) (0), 0, 0);
738 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
743 if (g_pGameDescription->mGameFile == "jk2.game")
746 combo_list = g_list_append (combo_list, (void *)sJK2SPCombo);
747 combo_list = g_list_append (combo_list, (void *)sJK2MPCombo);
749 gamemode_combo = gtk_combo_new ();
750 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
751 gtk_widget_show(gamemode_combo);
752 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
753 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
754 (GtkAttachOptions) (0), 0, 0);
756 g_list_free (combo_list);
759 label = gtk_label_new (_("Mapping mode"));
760 gtk_widget_show (label);
761 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
762 (GtkAttachOptions) (GTK_FILL),
763 (GtkAttachOptions) (0), 0, 0);
764 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
768 if (g_pGameDescription->mGameFile == "ja.game")
771 combo_list = g_list_append (combo_list, (void *)sJASPCombo);
772 combo_list = g_list_append (combo_list, (void *)sJAMPCombo);
774 gamemode_combo = gtk_combo_new ();
775 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
776 gtk_widget_show(gamemode_combo);
777 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
778 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
779 (GtkAttachOptions) (0), 0, 0);
781 g_list_free (combo_list);
784 label = gtk_label_new (_("Mapping mode"));
785 gtk_widget_show (label);
786 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
787 (GtkAttachOptions) (GTK_FILL),
788 (GtkAttachOptions) (0), 0, 0);
789 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
793 if (g_pGameDescription->mGameFile == "stvef.game")
796 combo_list = g_list_append (combo_list, (void *)sSTVEFSPCombo);
797 combo_list = g_list_append (combo_list, (void *)sSTVEFMPCombo);
799 gamemode_combo = gtk_combo_new ();
800 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
801 gtk_widget_show(gamemode_combo);
802 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
803 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
804 (GtkAttachOptions) (0), 0, 0);
806 g_list_free (combo_list);
809 label = gtk_label_new (_("Mapping mode"));
810 gtk_widget_show (label);
811 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
812 (GtkAttachOptions) (GTK_FILL),
813 (GtkAttachOptions) (0), 0, 0);
814 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
818 if (g_pGameDescription->mGameFile == "sof2.game")
821 combo_list = g_list_append (combo_list, (void *)sSOF2SPCombo);
822 combo_list = g_list_append (combo_list, (void *)sSOF2MPCombo);
824 gamemode_combo = gtk_combo_new ();
825 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
826 gtk_widget_show(gamemode_combo);
827 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
828 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
829 (GtkAttachOptions) (0), 0, 0);
831 g_list_free (combo_list);
834 label = gtk_label_new (_("Mapping mode"));
835 gtk_widget_show (label);
836 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
837 (GtkAttachOptions) (GTK_FILL),
838 (GtkAttachOptions) (0), 0, 0);
839 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
846 base = gtk_entry_new ();
847 g_object_set_data (G_OBJECT (project), "base", base);
848 gtk_widget_show (base);
849 gtk_table_attach (GTK_TABLE (table2), base, 1, 2, 0, 1,
850 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
851 (GtkAttachOptions) (0), 0, 0);
854 label = gtk_label_new (_("basepath"));
855 gtk_widget_show (label);
856 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
857 (GtkAttachOptions) (GTK_FILL),
858 (GtkAttachOptions) (0), 0, 0);
859 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
862 label = gtk_label_new (_("Select mod"));
863 gtk_widget_show (label);
864 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 6, 7,
865 (GtkAttachOptions) (GTK_FILL),
866 (GtkAttachOptions) (0), 0, 0);
867 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
869 label = gtk_label_new (_("fs_game"));
870 gtk_widget_show (label);
871 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 7, 8,
872 (GtkAttachOptions) (GTK_FILL),
873 (GtkAttachOptions) (0), 0, 0);
874 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
877 gtk_entry_set_text (GTK_ENTRY (base), ValueForKey (g_qeglobals.d_project_entity, "basepath"));
878 UpdateBSPCommandList (project);
879 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (brush), (g_qeglobals.m_bBrushPrimitMode) ? TRUE : FALSE);
881 // initialise the fs_game selection from the project settings into the dialog
882 const char *dir = ValueForKey (g_qeglobals.d_project_entity, "gamename");
883 // HACK: hardcoded wolf stuff
884 if (g_pGameDescription->mGameFile == "wolf.game")
886 if ((strlen(dir) == 0) || !stricmp(dir,"main"))
888 // no fs_game set, we are running stock Quake III Arena editing
889 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfComboItem);
890 gtk_entry_set_text (GTK_ENTRY (game), "");
891 gtk_widget_set_sensitive(game, false);
895 // this is a custom mod
896 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfModComboItem);
897 gtk_entry_set_text (GTK_ENTRY (game), dir);
898 gtk_widget_set_sensitive(game, true);
901 // HACK: hardcoded et stuff
902 if (g_pGameDescription->mGameFile == "et.game")
904 if ((strlen(dir) == 0) || !stricmp(dir,"etmain"))
906 // no fs_game set, we are running stock Quake III Arena editing
907 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETComboItem);
908 gtk_entry_set_text (GTK_ENTRY (game), "");
909 gtk_widget_set_sensitive(game, false);
913 // this is a custom mod
914 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETModComboItem);
915 gtk_entry_set_text (GTK_ENTRY (game), dir);
916 gtk_widget_set_sensitive(game, true);
919 // HACK: hardcoded half-life stuff
920 else if (g_pGameDescription->mGameFile == "hl.game")
922 if ((strlen(dir) == 0) || !stricmp(dir,"valve"))
924 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLComboItem);
925 gtk_entry_set_text (GTK_ENTRY (game), "");
926 gtk_widget_set_sensitive(game, false);
930 // this is a custom mod
931 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLModComboItem);
932 gtk_entry_set_text (GTK_ENTRY (game), dir);
933 gtk_widget_set_sensitive(game, true);
938 else if (g_pGameDescription->mGameFile == "jk2.game")
940 if ((strlen(dir) == 0) || !stricmp(dir,"base"))
942 // no fs_game set, we are running stock Quake III Arena editing
943 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ComboItem);
944 gtk_entry_set_text (GTK_ENTRY (game), "");
945 gtk_widget_set_sensitive(game, false);
949 // this is a custom mod
950 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ModComboItem);
951 gtk_entry_set_text (GTK_ENTRY (game), dir);
952 gtk_widget_set_sensitive(game, true);
957 else if (g_pGameDescription->mGameFile == "ja.game")
959 if ((strlen(dir) == 0) || !stricmp(dir,"base"))
961 // no fs_game set, we are running stock editing
962 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAComboItem);
963 gtk_entry_set_text (GTK_ENTRY (game), "");
964 gtk_widget_set_sensitive(game, false);
968 // this is a custom mod
969 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAModComboItem);
970 gtk_entry_set_text (GTK_ENTRY (game), dir);
971 gtk_widget_set_sensitive(game, true);
976 else if (g_pGameDescription->mGameFile == "stvef.game")
978 if ((strlen(dir) == 0) || !stricmp(dir,"baseEf"))
980 // no fs_game set, we are running stock Quake III Arena editing
981 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFComboItem);
982 gtk_entry_set_text (GTK_ENTRY (game), "");
983 gtk_widget_set_sensitive(game, false);
987 // this is a custom mod
988 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFModComboItem);
989 gtk_entry_set_text (GTK_ENTRY (game), dir);
990 gtk_widget_set_sensitive(game, true);
995 else if (g_pGameDescription->mGameFile == "sof2.game")
997 if ((strlen(dir) == 0) || !stricmp(dir,"base"))
999 // no fs_game set, we are running stock Quake III Arena editing
1000 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ComboItem);
1001 gtk_entry_set_text (GTK_ENTRY (game), "");
1002 gtk_widget_set_sensitive(game, false);
1006 // this is a custom mod
1007 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ModComboItem);
1008 gtk_entry_set_text (GTK_ENTRY (game), dir);
1009 gtk_widget_set_sensitive(game, true);
1014 if ((strlen(dir) == 0) || !strcmp(dir,"baseq3"))
1016 // no fs_game set, we are running stock Quake III Arena editing
1017 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sQ3ComboItem);
1018 gtk_entry_set_text (GTK_ENTRY (game), "");
1019 gtk_widget_set_sensitive(game, false);
1021 else if (!strcmp(dir,"missionpack"))
1023 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sTAComboItem);
1024 gtk_entry_set_text (GTK_ENTRY (game), "missionpack");
1025 gtk_widget_set_sensitive(game, false);
1029 // this is a custom mod
1030 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sModComboItem);
1031 gtk_entry_set_text (GTK_ENTRY (game), dir);
1032 gtk_widget_set_sensitive(game, true);
1036 // HACK: hardcoded wolf stuff
1037 if (g_pGameDescription->mGameFile == "wolf.game")
1039 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
1040 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
1042 // nothing set yet, or single player
1043 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfSPCombo);
1047 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfMPCombo);
1052 else if (g_pGameDescription->mGameFile == "jk2.game")
1054 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
1055 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
1057 // nothing set yet, or single player
1058 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2SPCombo);
1062 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2MPCombo);
1066 else if (g_pGameDescription->mGameFile == "ja.game")
1068 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
1069 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
1071 // nothing set yet, or single player
1072 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJASPCombo);
1076 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJAMPCombo);
1080 else if (g_pGameDescription->mGameFile == "stvef.game")
1082 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
1083 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
1085 // nothing set yet, or single player
1086 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFSPCombo);
1090 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFMPCombo);
1094 else if (g_pGameDescription->mGameFile == "sof2.game")
1096 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
1097 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
1099 // nothing set yet, or single player
1100 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2SPCombo);
1104 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2MPCombo);
1108 gtk_grab_add (project);
1109 gtk_widget_show (project);
1111 g_pGameDescription->Dump();
1114 gtk_main_iteration ();
1122 // convert path to unix format
1123 for(r = gtk_entry_get_text (GTK_ENTRY (base)), w=buf; *r != '\0'; r++, w++)
1124 *w = (*r == '\\') ? '/' : *r;
1126 if(w != buf && *(w-1) != '/') *(w++) = '/';
1129 SetKeyValue (g_qeglobals.d_project_entity, "basepath", buf);
1131 dir = gtk_entry_get_text (GTK_ENTRY (game));
1132 // Hack: hard coded wolf stuff
1133 if (g_pGameDescription->mGameFile == "wolf.game")
1135 if (!strlen(dir) || !stricmp(dir,"main"))
1137 DeleteKey (g_qeglobals.d_project_entity, "gamename");
1141 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
1144 // Hack: hard coded ET stuff
1145 else if (g_pGameDescription->mGameFile == "et.game")
1147 if (!strlen(dir) || !stricmp(dir,"etmain"))
1149 DeleteKey (g_qeglobals.d_project_entity, "gamename");
1153 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
1156 // Hack: hard coded Half-life stuff
1157 else if (g_pGameDescription->mGameFile == "hl.game")
1159 if (!strlen(dir) || !stricmp(dir,"valve"))
1161 DeleteKey (g_qeglobals.d_project_entity, "gamename");
1165 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
1168 else if (g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game")
1170 if (!strlen(dir) || !stricmp(dir,"base"))
1172 DeleteKey (g_qeglobals.d_project_entity, "gamename");
1176 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
1181 else if (g_pGameDescription->mGameFile == "stvef.game")
1183 if (!strlen(dir) || !stricmp(dir,"baseEf"))
1185 DeleteKey (g_qeglobals.d_project_entity, "gamename");
1189 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
1194 if (!strlen(dir) || !strcmp(dir,"baseq3"))
1196 DeleteKey (g_qeglobals.d_project_entity, "gamename");
1200 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
1204 // HACK: hardcoded wolf stuff
1205 if (g_pGameDescription->mGameFile == "wolf.game")
1207 // read from gamemode_combo
1208 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
1209 if (!strlen(gamemode) || !strcmp(gamemode, sWolfSPCombo))
1211 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
1215 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
1221 if (g_pGameDescription->mGameFile == "jk2.game")
1223 // read from gamemode_combo
1224 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
1225 if (!strlen(gamemode) || !strcmp(gamemode, sJK2SPCombo))
1227 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
1231 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
1236 if (g_pGameDescription->mGameFile == "ja.game")
1238 // read from gamemode_combo
1239 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
1240 if (!strlen(gamemode) || !strcmp(gamemode, sJASPCombo))
1242 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
1246 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
1252 if (g_pGameDescription->mGameFile == "stvef.game")
1254 // read from gamemode_combo
1255 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
1256 if (!strlen(gamemode) || !strcmp(gamemode, sSTVEFSPCombo))
1258 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
1262 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
1266 g_qeglobals.m_strHomeMaps = g_qeglobals.m_strHomeGame;
1267 const char* str = ValueForKey(g_qeglobals.d_project_entity, "gamename");
1268 if(str[0] == '\0') str = g_pGameDescription->mBaseGame.GetBuffer();
1269 g_qeglobals.m_strHomeMaps += str;
1270 g_qeglobals.m_strHomeMaps += '/';
1274 if (g_pGameDescription->mGameFile == "sof2.game")
1276 // read from gamemode_combo
1277 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
1278 if (!strlen(gamemode) || !strcmp(gamemode, sSOF2SPCombo))
1280 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
1284 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
1288 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (brush)))
1289 g_qeglobals.m_bBrushPrimitMode = TRUE;
1291 g_qeglobals.m_bBrushPrimitMode = FALSE;
1293 SetKeyValue(g_qeglobals.d_project_entity, "brush_primit", (g_qeglobals.m_bBrushPrimitMode ? "1" : "0" ));
1295 QE_SaveProject( g_PrefsDlg.m_strLastProject.GetBuffer() );
1298 gtk_grab_remove (project);
1299 gtk_widget_destroy (project);
1302 // =============================================================================
1307 static GtkWidget *dlg;
1308 GtkWidget *vbox, *vbox2, *hbox, *table, *button, *label, *scr;
1309 GtkWidget *brushes_entry, *entities_entry, *net_entry;
1310 int loop = 1, ret = IDCANCEL;
1315 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1317 load_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
1319 gtk_window_set_title (GTK_WINDOW (dlg), _("Map Info"));
1320 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
1321 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1322 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
1323 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1324 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
1325 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
1327 vbox = gtk_vbox_new (FALSE, 5);
1328 gtk_widget_show (vbox);
1329 gtk_container_add (GTK_CONTAINER (dlg), vbox);
1330 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1332 hbox = gtk_hbox_new (FALSE, 5);
1333 gtk_widget_show (hbox);
1334 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
1336 table = gtk_table_new (3, 2, FALSE);
1337 gtk_widget_show (table);
1338 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
1339 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1340 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1342 brushes_entry = gtk_entry_new ();
1343 gtk_widget_show (brushes_entry);
1344 gtk_table_attach (GTK_TABLE (table), brushes_entry, 1, 2, 0, 1,
1345 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1346 (GtkAttachOptions) (0), 0, 0);
1347 gtk_entry_set_editable (GTK_ENTRY (brushes_entry), FALSE);
1349 entities_entry = gtk_entry_new ();
1350 gtk_widget_show (entities_entry);
1351 gtk_table_attach (GTK_TABLE (table), entities_entry, 1, 2, 1, 2,
1352 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1353 (GtkAttachOptions) (0), 0, 0);
1354 gtk_entry_set_editable (GTK_ENTRY (entities_entry), FALSE);
1356 net_entry = gtk_entry_new ();
1357 gtk_widget_show (net_entry);
1358 gtk_table_attach (GTK_TABLE (table), net_entry, 1, 2, 2, 3,
1359 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1360 (GtkAttachOptions) (0), 0, 0);
1361 gtk_entry_set_editable (GTK_ENTRY (net_entry), FALSE);
1363 label = gtk_label_new (_("Total Brushes"));
1364 gtk_widget_show (label);
1365 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1366 (GtkAttachOptions) (GTK_FILL),
1367 (GtkAttachOptions) (0), 0, 0);
1368 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1370 label = gtk_label_new (_("Total Entities"));
1371 gtk_widget_show (label);
1372 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1373 (GtkAttachOptions) (GTK_FILL),
1374 (GtkAttachOptions) (0), 0, 0);
1375 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1377 label = gtk_label_new (_("Net brush count\n(non entity)"));
1378 gtk_widget_show (label);
1379 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1380 (GtkAttachOptions) (GTK_FILL),
1381 (GtkAttachOptions) (0), 0, 0);
1382 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1384 vbox2 = gtk_vbox_new (FALSE, 5);
1385 gtk_widget_show (vbox2);
1386 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
1388 button = gtk_button_new_with_label (_("Close"));;
1389 gtk_widget_show (button);
1390 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
1391 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1392 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1393 gtk_widget_set_usize (button, 60, -2);
1395 label = gtk_label_new (_("Entity breakdown"));
1396 gtk_widget_show (label);
1397 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1398 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1400 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
1401 gtk_widget_show (scr);
1402 gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
1403 gtk_container_set_border_width (GTK_CONTAINER (scr), 5);
1404 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1406 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
1408 GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
1411 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
1412 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(view), TRUE);
1415 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
1416 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(_("Entity"), renderer, "text", 0, NULL);
1417 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
1418 gtk_tree_view_column_set_sort_column_id(column, 0);
1422 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
1423 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(_("Count"), renderer, "text", 1, NULL);
1424 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
1425 gtk_tree_view_column_set_sort_column_id(column, 1);
1428 gtk_widget_show(view);
1430 gtk_container_add(GTK_CONTAINER (scr), view);
1433 // Initialize fields
1434 int TotalBrushes = 0, TotalEntities = 0, Net = 0;
1436 for (brush_t* pBrush = active_brushes.next; pBrush != &active_brushes; pBrush = pBrush->next)
1439 if (pBrush->owner == world_entity)
1449 GSList *l, *entitymap = NULL;
1452 for (entity_t* pEntity = entities.next; pEntity != &entities; pEntity=pEntity->next)
1457 for (l = entitymap; l; l = g_slist_next (l))
1459 entry = (map_t*)l->data;
1461 if (strcmp (entry->name, pEntity->eclass->name) == 0)
1471 entry = (map_t*)qmalloc (sizeof (map_t));
1472 entry->name = pEntity->eclass->name;
1474 entitymap = g_slist_append (entitymap, entry);
1480 entry = (map_t*)entitymap->data;
1482 sprintf (tmp, "%d", entry->count);
1484 gtk_list_store_append(GTK_LIST_STORE(store), &iter);
1485 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, entry->name, 1, tmp, -1);
1487 entitymap = g_slist_remove (entitymap, entry);
1490 g_object_unref(G_OBJECT(store));
1493 sprintf (tmp, "%d", TotalBrushes);
1494 gtk_entry_set_text (GTK_ENTRY (brushes_entry), tmp);
1495 sprintf (tmp, "%d", TotalEntities);
1496 gtk_entry_set_text (GTK_ENTRY (entities_entry), tmp);
1497 sprintf (tmp, "%d", Net);
1498 gtk_entry_set_text (GTK_ENTRY (net_entry), tmp);
1501 gtk_widget_show (dlg);
1504 gtk_main_iteration ();
1507 save_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
1509 gtk_grab_remove (dlg);
1510 gtk_widget_destroy (dlg);
1514 // =============================================================================
1515 // Entity List dialog
1517 static void entitylist_select (GtkWidget *widget, gpointer data)
1519 GtkTreeView* view = GTK_TREE_VIEW(g_object_get_data (G_OBJECT (data), "entities"));
1521 GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
1523 GtkTreeModel* model;
1524 GtkTreeIter selected;
1525 if(gtk_tree_selection_get_selected(selection, &model, &selected))
1528 gtk_tree_model_get(model, &selected, 1, &pEntity, -1);
1532 for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)
1535 Select_Brush (pEntity->brushes.onext);
1536 Sys_UpdateWindows(W_ALL);
1542 static gint entitylist_click (GtkWidget *widget, GdkEventButton *event, gpointer data)
1544 if (event->type == GDK_2BUTTON_PRESS)
1546 entitylist_select (NULL, data);
1552 static void entitylist_selection_changed(GtkTreeSelection* selection, gpointer data)
1554 GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (data), "keyvalues"));
1556 gtk_list_store_clear(store);
1558 GtkTreeModel* model;
1559 GtkTreeIter selected;
1560 if(gtk_tree_selection_get_selected(selection, &model, &selected))
1563 gtk_tree_model_get(model, &selected, 1, &pEntity, -1);
1567 for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)
1569 GtkTreeIter appended;
1570 gtk_list_store_append(store, &appended);
1571 gtk_list_store_set(store, &appended, 0, pEpair->key, 1, pEpair->value, -1);
1577 void DoEntityList ()
1579 static GtkWidget *dlg;
1580 GtkWidget *vbox, *hbox, *hbox2, *button, *scr;
1581 int loop = 1, ret = IDCANCEL;
1586 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1588 load_window_pos (dlg, g_PrefsDlg.mWindowInfo.posEntityInfoWnd);
1590 gtk_window_set_title (GTK_WINDOW (dlg), _("Entities"));
1591 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
1592 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1593 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
1594 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1595 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
1596 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
1598 hbox = gtk_hbox_new (TRUE, 5);
1599 gtk_widget_show (hbox);
1600 gtk_container_add (GTK_CONTAINER (dlg), hbox);
1601 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1603 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
1604 gtk_widget_show (scr);
1605 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
1606 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1607 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
1610 GtkTreeStore* store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
1612 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
1613 g_signal_connect(G_OBJECT(view), "button_press_event", G_CALLBACK(entitylist_click), dlg);
1614 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
1617 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
1618 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
1619 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
1623 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
1624 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(entitylist_selection_changed), dlg);
1627 gtk_widget_show(view);
1629 gtk_container_add(GTK_CONTAINER (scr), view);
1630 g_object_set_data (G_OBJECT (dlg), "entities", view);
1635 gtk_tree_store_append(store, &child, NULL);
1636 gtk_tree_store_set(store, &child, 0, world_entity->eclass->name, 1, world_entity, -1);
1639 GSList *l, *entitymap = NULL;
1647 for (entity_t* pEntity=entities.next; pEntity != &entities; pEntity=pEntity->next)
1652 for (l = entitymap; l; l = g_slist_next (l))
1654 entry = (map_t*)l->data;
1656 if (strcmp (entry->name, pEntity->eclass->name) == 0)
1658 parent = entry->node;
1666 gtk_tree_store_append(store, &parent, NULL);
1667 gtk_tree_store_set(store, &parent, 0, pEntity->eclass->name, 1, NULL, -1);
1669 entry = (map_t*)malloc (sizeof(map_t));
1670 entitymap = g_slist_append (entitymap, entry);
1671 entry->name = pEntity->eclass->name;
1672 entry->node = parent;
1676 gtk_tree_store_append(store, &child, &parent);
1677 gtk_tree_store_set(store, &child, 0, pEntity->eclass->name, 1, pEntity, -1);
1682 free (entitymap->data);
1683 entitymap = g_slist_remove (entitymap, entitymap->data);
1687 g_object_unref(G_OBJECT(store));
1690 vbox = gtk_vbox_new (FALSE, 5);
1691 gtk_widget_show (vbox);
1692 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
1694 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
1695 gtk_widget_show (scr);
1696 gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
1697 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1698 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
1701 GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
1703 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
1706 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
1707 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(_("Key"), renderer, "text", 0, NULL);
1708 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
1712 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
1713 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(_("Value"), renderer, "text", 1, NULL);
1714 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
1717 gtk_widget_show(view);
1719 g_object_set_data(G_OBJECT(dlg), "keyvalues", store);
1720 gtk_container_add(GTK_CONTAINER (scr), view);
1722 g_object_unref(G_OBJECT(store));
1725 hbox2 = gtk_hbox_new (FALSE, 5);
1726 gtk_widget_show (hbox2);
1727 gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);
1729 button = gtk_button_new_with_label (_("Select"));
1730 gtk_widget_show (button);
1731 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1732 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1733 GTK_SIGNAL_FUNC (entitylist_select), dlg);
1734 gtk_widget_set_usize (button, 60, -2);
1736 button = gtk_button_new_with_label (_("Close"));;
1737 gtk_widget_show (button);
1738 gtk_box_pack_end (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1739 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1740 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1741 gtk_widget_set_usize (button, 60, -2);
1744 gtk_widget_show (dlg);
1747 gtk_main_iteration ();
1749 save_window_pos (dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
1751 gtk_grab_remove (dlg);
1752 gtk_widget_destroy (dlg);
1757 // =============================================================================
1760 static void rotatedlg_apply (GtkWidget *widget, gpointer data)
1762 GtkSpinButton *spin;
1765 spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "x"));
1766 f = gtk_spin_button_get_value_as_float (spin);
1768 Select_RotateAxis(0,f);
1769 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f); // reset to 0 on Apply
1771 spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "y"));
1772 f = gtk_spin_button_get_value_as_float (spin);
1774 Select_RotateAxis(1,f);
1775 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);
1777 spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "z"));
1778 f = gtk_spin_button_get_value_as_float (spin);
1780 Select_RotateAxis(2,f);
1781 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);
1786 GtkWidget *dlg, *hbox, *vbox, *table, *label, *button;
1787 GtkWidget *x, *y, *z;
1789 int loop = 1, ret = IDCANCEL;
1791 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1792 gtk_window_set_title (GTK_WINDOW (dlg), _("Arbitrary rotation"));
1793 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
1794 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1795 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
1796 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1797 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
1798 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
1800 hbox = gtk_hbox_new (FALSE, 5);
1801 gtk_widget_show (hbox);
1802 gtk_container_add (GTK_CONTAINER (dlg), hbox);
1803 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1805 table = gtk_table_new (3, 2, FALSE);
1806 gtk_widget_show (table);
1807 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
1808 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1809 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1811 label = gtk_label_new (_(" X "));
1812 gtk_widget_show (label);
1813 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1814 (GtkAttachOptions) (0),
1815 (GtkAttachOptions) (0), 0, 0);
1817 label = gtk_label_new (_(" Y "));
1818 gtk_widget_show (label);
1819 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1820 (GtkAttachOptions) (0),
1821 (GtkAttachOptions) (0), 0, 0);
1823 label = gtk_label_new (_(" Z "));
1825 gtk_widget_show (label);
1826 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1827 (GtkAttachOptions) (0),
1828 (GtkAttachOptions) (0), 0, 0);
1830 adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
1831 x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1832 g_object_set_data (G_OBJECT (dlg), "x", x);
1833 gtk_widget_show (x);
1834 gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
1835 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1836 (GtkAttachOptions) (0), 0, 0);
1837 gtk_widget_set_usize (x, 60, -2);
1838 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (x), TRUE);
1840 adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
1841 y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1842 g_object_set_data (G_OBJECT (dlg), "y", y);
1843 gtk_widget_show (y);
1844 gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
1845 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1846 (GtkAttachOptions) (0), 0, 0);
1847 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (y), TRUE);
1849 adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
1850 z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1851 g_object_set_data (G_OBJECT (dlg), "z", z);
1852 gtk_widget_show (z);
1853 gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,
1854 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1855 (GtkAttachOptions) (0), 0, 0);
1856 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (z), TRUE);
1858 vbox = gtk_vbox_new (FALSE, 5);
1859 gtk_widget_show (vbox);
1860 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
1862 button = gtk_button_new_with_label (_("OK"));
1863 gtk_widget_show (button);
1864 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1865 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1866 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1867 gtk_widget_set_usize (button, 60, -2);
1869 button = gtk_button_new_with_label (_("Cancel"));;
1870 gtk_widget_show (button);
1871 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1872 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1873 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
1875 button = gtk_button_new_with_label (_("Apply"));
1876 gtk_widget_show (button);
1877 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1878 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1879 GTK_SIGNAL_FUNC (rotatedlg_apply), dlg);
1882 gtk_widget_show (dlg);
1885 gtk_main_iteration ();
1888 rotatedlg_apply (button, dlg);
1890 gtk_grab_remove (dlg);
1891 gtk_widget_destroy (dlg);
1894 // =============================================================================
1899 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
1900 int loop = 1, ret = IDCANCEL;
1902 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1903 gtk_window_set_title (GTK_WINDOW (dlg), _("Gamma"));
1904 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
1905 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1906 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
1907 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1908 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
1909 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
1911 hbox = gtk_hbox_new (FALSE, 5);
1912 gtk_widget_show (hbox);
1913 gtk_container_add (GTK_CONTAINER (dlg), hbox);
1914 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1916 vbox = gtk_vbox_new (FALSE, 5);
1917 gtk_widget_show (vbox);
1918 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
1920 entry = gtk_entry_new ();
1921 gtk_widget_show (entry);
1922 gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
1924 label = gtk_label_new (_("0.0 is brightest\n1.0 is darkest"));
1925 gtk_widget_show (label);
1926 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1928 label = gtk_label_new (_("You must restart for the\nsettings to take effect"));
1929 gtk_widget_show (label);
1930 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1932 vbox = gtk_vbox_new (FALSE, 5);
1933 gtk_widget_show (vbox);
1934 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
1936 button = gtk_button_new_with_label (_("OK"));
1937 gtk_widget_show (button);
1938 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1939 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1940 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1941 gtk_widget_set_usize (button, 60, -2);
1943 button = gtk_button_new_with_label (_("Cancel"));;
1944 gtk_widget_show (button);
1945 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1946 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1947 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
1949 // Initialize dialog
1951 sprintf (buf, "%1.1f", g_qeglobals.d_savedinfo.fGamma);
1952 gtk_entry_set_text (GTK_ENTRY (entry), buf);
1955 gtk_widget_show (dlg);
1958 gtk_main_iteration ();
1961 g_qeglobals.d_savedinfo.fGamma = g_strtod (gtk_entry_get_text (GTK_ENTRY (entry)), NULL);
1963 gtk_grab_remove (dlg);
1964 gtk_widget_destroy (dlg);
1967 // =============================================================================
1968 // Find Brush Dialog
1970 // helper function to walk through the active brushes only and drop the regioned out ones
1971 bool WalkRegionBrush (brush_t **b, entity_t *e)
1976 for(b2=active_brushes.next ; b2 != &active_brushes ; b2=b2->next)
1979 break; // this is an active brush
1981 if (b2==&active_brushes)
1983 // this is a regioned out brush
1985 if (*b == &e->brushes)
1987 Sys_Status ("No such brush", 0);
1991 } while (b2==&active_brushes);
1995 void SelectBrush (int entitynum, int brushnum)
2001 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503
2002 // making this work when regioning is on too
2014 Sys_Status ("No such entity", 0);
2019 // we need to make sure we walk to the next 'active' entity to have a valid --entitynum
2020 // that is, find a brush that belongs to this entity in the active brushes
2023 for (b = active_brushes.next ; b != &active_brushes ; b=b->next)
2026 break; // this is an active entity
2028 if (b==&active_brushes)
2030 // this is a regioned out entity
2032 // don't walk past the end either
2035 Sys_Status ("No such entity", 0);
2039 } while(b==&active_brushes);
2044 b = e->brushes.onext;
2045 if (b == &e->brushes)
2047 Sys_Status ("No such brush", 0);
2052 if (!WalkRegionBrush(&b, e))
2059 if (b == &e->brushes)
2061 Sys_Status ("No such brush", 0);
2066 if (!WalkRegionBrush(&b, e))
2071 Brush_RemoveFromList (b);
2072 Brush_AddToList (b, &selected_brushes);
2074 Sys_UpdateWindows (W_ALL);
2075 for (i = 0; i < 3; i++)
2077 if (g_pParentWnd->GetXYWnd())
2078 g_pParentWnd->GetXYWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
2080 if (g_pParentWnd->GetXZWnd())
2081 g_pParentWnd->GetXZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
2083 if (g_pParentWnd->GetYZWnd())
2084 g_pParentWnd->GetYZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
2087 Sys_Status ("Selected", 0);
2090 static void GetSelectionIndex (int *ent, int *brush)
2097 b = selected_brushes.next;
2098 if (b == &selected_brushes)
2102 if (b->owner != world_entity)
2105 for (entity = entities.next; entity != &entities; entity=entity->next, (*ent)++)
2110 for (b2=b->owner->brushes.onext; b2 != b && b2 != &b->owner->brushes; b2=b2->onext, (*brush)++)
2116 GtkWidget *dlg, *vbox, *hbox, *table, *label, *button, *entity, *brush;
2117 int loop = 1, ret = IDCANCEL;
2119 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2120 gtk_window_set_title (GTK_WINDOW (dlg), _("Find Brush"));
2121 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2122 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2123 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2124 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2125 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2126 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2128 vbox = gtk_vbox_new (FALSE, 5);
2129 gtk_widget_show (vbox);
2130 gtk_container_add (GTK_CONTAINER (dlg), vbox);
2131 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2133 table = gtk_table_new (2, 2, FALSE);
2134 gtk_widget_show (table);
2135 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
2136 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2137 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2139 label = gtk_label_new (_("Entity number"));
2140 gtk_widget_show (label);
2141 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2142 (GtkAttachOptions) (0),
2143 (GtkAttachOptions) (0), 0, 0);
2145 label = gtk_label_new (_("Brush number"));
2146 gtk_widget_show (label);
2147 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2148 (GtkAttachOptions) (0),
2149 (GtkAttachOptions) (0), 0, 0);
2151 entity = gtk_entry_new ();
2152 gtk_widget_show (entity);
2153 gtk_table_attach (GTK_TABLE (table), entity, 1, 2, 0, 1,
2154 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2155 (GtkAttachOptions) (0), 0, 0);
2157 brush = gtk_entry_new ();
2158 gtk_widget_show (brush);
2159 gtk_table_attach (GTK_TABLE (table), brush, 1, 2, 1, 2,
2160 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2161 (GtkAttachOptions) (0), 0, 0);
2163 hbox = gtk_hbox_new (FALSE, 5);
2164 gtk_widget_show (hbox);
2165 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2167 button = gtk_button_new_with_label (_("OK"));
2168 gtk_widget_show (button);
2169 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
2170 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2171 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2172 gtk_widget_set_usize (button, 60, -2);
2174 button = gtk_button_new_with_label (_("Cancel"));;
2175 gtk_widget_show (button);
2176 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
2177 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2178 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
2180 // Initialize dialog
2184 GetSelectionIndex (&ent, &br);
2185 sprintf (buf, "%i", ent);
2186 gtk_entry_set_text (GTK_ENTRY (entity), buf);
2187 sprintf (buf, "%i", br);
2188 gtk_entry_set_text (GTK_ENTRY (brush), buf);
2191 gtk_widget_show (dlg);
2194 gtk_main_iteration ();
2198 const char *entstr = gtk_entry_get_text (GTK_ENTRY (entity));
2199 const char *brushstr = gtk_entry_get_text (GTK_ENTRY (brush));
2200 SelectBrush (atoi(entstr), atoi(brushstr));
2203 gtk_grab_remove (dlg);
2204 gtk_widget_destroy (dlg);
2207 // =============================================================================
2208 // Arbitrary Sides dialog
2210 void DoSides (bool bCone, bool bSphere, bool bTorus)
2212 GtkWidget *dlg, *vbox, *hbox, *button, *label, *entry;
2213 int loop = 1, ret = IDCANCEL;
2215 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2216 gtk_window_set_title (GTK_WINDOW (dlg), _("Arbitrary sides"));
2217 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2218 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2219 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2220 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2221 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2222 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2224 hbox = gtk_hbox_new (FALSE, 5);
2225 gtk_widget_show (hbox);
2226 gtk_container_add (GTK_CONTAINER (dlg), hbox);
2227 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2229 label = gtk_label_new (_("Sides:"));
2230 gtk_widget_show (label);
2231 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2233 entry = gtk_entry_new ();
2234 gtk_widget_show (entry);
2235 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
2237 vbox = gtk_vbox_new (FALSE, 5);
2238 gtk_widget_show (vbox);
2239 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
2241 button = gtk_button_new_with_label (_("OK"));
2242 gtk_widget_show (button);
2243 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2244 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2245 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2246 gtk_widget_set_usize (button, 60, -2);
2248 button = gtk_button_new_with_label (_("Cancel"));;
2249 gtk_widget_show (button);
2250 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2251 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2252 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
2255 gtk_widget_show (dlg);
2258 gtk_main_iteration ();
2262 const char *str = gtk_entry_get_text (GTK_ENTRY (entry));
2265 Brush_MakeSidedCone(atoi(str));
2267 Brush_MakeSidedSphere(atoi(str));
2269 Brush_MakeSided (atoi(str));
2272 gtk_grab_remove (dlg);
2273 gtk_widget_destroy (dlg);
2276 // =============================================================================
2279 void DoNewPatchDlg ()
2281 GtkWidget *dlg, *hbox, *table, *vbox, *label, *button, *combo;
2282 GtkWidget *width, *height;
2283 GList *combo_list = (GList*)NULL;
2284 int loop = 1, ret = IDCANCEL;
2286 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2287 gtk_window_set_title (GTK_WINDOW (dlg), _("Patch density"));
2288 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2289 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2290 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2291 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2292 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2293 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2295 hbox = gtk_hbox_new (FALSE, 5);
2296 gtk_widget_show (hbox);
2297 gtk_container_add (GTK_CONTAINER (dlg), hbox);
2298 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2300 table = gtk_table_new (2, 2, FALSE);
2301 gtk_widget_show (table);
2302 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
2303 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2304 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2306 label = gtk_label_new (_("Width:"));
2307 gtk_widget_show (label);
2308 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2309 (GtkAttachOptions) (GTK_FILL),
2310 (GtkAttachOptions) (0), 0, 0);
2311 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2313 label = gtk_label_new (_("Height:"));
2314 gtk_widget_show (label);
2315 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2316 (GtkAttachOptions) (GTK_FILL),
2317 (GtkAttachOptions) (0), 0, 0);
2318 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2320 combo_list = g_list_append (combo_list, (void *)_("3"));
2321 combo_list = g_list_append (combo_list, (void *)_("5"));
2322 combo_list = g_list_append (combo_list, (void *)_("7"));
2323 combo_list = g_list_append (combo_list, (void *)_("9"));
2324 combo_list = g_list_append (combo_list, (void *)_("11"));
2325 combo_list = g_list_append (combo_list, (void *)_("13"));
2326 combo_list = g_list_append (combo_list, (void *)_("15"));
2328 combo = gtk_combo_new ();
2329 width = GTK_COMBO (combo)->entry;
2330 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
2331 gtk_widget_show (combo);
2332 gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 0, 1,
2333 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2334 (GtkAttachOptions) (0), 0, 0);
2336 combo = gtk_combo_new ();
2337 height = GTK_COMBO (combo)->entry;
2338 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
2339 gtk_widget_show (combo);
2340 gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 1, 2,
2341 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2342 (GtkAttachOptions) (0), 0, 0);
2344 vbox = gtk_vbox_new (FALSE, 5);
2345 gtk_widget_show (vbox);
2346 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
2348 button = gtk_button_new_with_label (_("OK"));
2349 gtk_widget_show (button);
2350 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2351 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2352 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2353 gtk_widget_set_usize (button, 60, -2);
2355 button = gtk_button_new_with_label (_("Cancel"));;
2356 gtk_widget_show (button);
2357 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2358 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2359 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
2361 // Initialize dialog
2362 g_list_free (combo_list);
2363 gtk_entry_set_text (GTK_ENTRY (width), _("3"));
2364 gtk_entry_set_editable (GTK_ENTRY (width), FALSE);
2365 gtk_entry_set_text (GTK_ENTRY (height), _("3"));
2366 gtk_entry_set_editable (GTK_ENTRY (height), FALSE);
2369 gtk_widget_show (dlg);
2372 gtk_main_iteration ();
2376 const char* w = gtk_entry_get_text (GTK_ENTRY (width));
2377 const char* h = gtk_entry_get_text (GTK_ENTRY (height));
2379 Patch_GenericMesh(atoi (w), atoi (h), g_pParentWnd->ActiveXY ()->GetViewType ());
2380 Sys_UpdateWindows (W_ALL);
2383 gtk_grab_remove (dlg);
2384 gtk_widget_destroy (dlg);
2387 // =============================================================================
2392 GtkWidget *dlg, *hbox, *table, *vbox, *label, *button;
2393 GtkWidget *x, *y, *z;
2394 int loop = 1, ret = IDCANCEL;
2396 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2397 gtk_window_set_title (GTK_WINDOW (dlg), _("Scale"));
2398 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2399 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2400 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2401 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2402 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2403 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2405 hbox = gtk_hbox_new (FALSE, 5);
2406 gtk_widget_show (hbox);
2407 gtk_container_add (GTK_CONTAINER (dlg), hbox);
2408 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2410 table = gtk_table_new (3, 2, FALSE);
2411 gtk_widget_show (table);
2412 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
2413 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2414 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2416 label = gtk_label_new (_("X:"));
2417 gtk_widget_show (label);
2418 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2419 (GtkAttachOptions) (GTK_FILL),
2420 (GtkAttachOptions) (0), 0, 0);
2421 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2423 label = gtk_label_new (_("Y:"));
2424 gtk_widget_show (label);
2425 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2426 (GtkAttachOptions) (GTK_FILL),
2427 (GtkAttachOptions) (0), 0, 0);
2428 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2430 label = gtk_label_new (_("Z:"));
2431 gtk_widget_show (label);
2432 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2433 (GtkAttachOptions) (GTK_FILL),
2434 (GtkAttachOptions) (0), 0, 0);
2435 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2437 x = gtk_entry_new ();
2438 gtk_widget_show (x);
2439 gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
2440 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2441 (GtkAttachOptions) (0), 0, 0);
2443 y = gtk_entry_new ();
2444 gtk_widget_show (y);
2445 gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
2446 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2447 (GtkAttachOptions) (0), 0, 0);
2449 z = gtk_entry_new ();
2450 gtk_widget_show (z);
2451 gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,
2452 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2453 (GtkAttachOptions) (0), 0, 0);
2455 vbox = gtk_vbox_new (FALSE, 5);
2456 gtk_widget_show (vbox);
2457 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
2459 button = gtk_button_new_with_label (_("OK"));
2460 gtk_widget_show (button);
2461 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2462 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2463 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2464 gtk_widget_set_usize (button, 60, -2);
2466 button = gtk_button_new_with_label (_("Cancel"));;
2467 gtk_widget_show (button);
2468 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2469 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2470 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
2472 // Initialize dialog
2473 gtk_entry_set_text (GTK_ENTRY (x), _("1.0"));
2474 gtk_entry_set_text (GTK_ENTRY (y), _("1.0"));
2475 gtk_entry_set_text (GTK_ENTRY (z), _("1.0"));
2478 gtk_widget_show (dlg);
2481 gtk_main_iteration ();
2486 sx = atof (gtk_entry_get_text (GTK_ENTRY (x)));
2487 sy = atof (gtk_entry_get_text (GTK_ENTRY (y)));
2488 sz = atof (gtk_entry_get_text (GTK_ENTRY (z)));
2490 if (sx > 0 && sy > 0 && sz > 0)
2492 Select_Scale(sx, sy, sz);
2493 Sys_UpdateWindows (W_ALL);
2496 Sys_Printf("Warning.. Tried to scale by a zero value.");
2499 gtk_grab_remove (dlg);
2500 gtk_widget_destroy (dlg);
2503 // =============================================================================
2504 // Thicken Patch dialog
2506 void DoThickenDlg ()
2508 GtkWidget *dlg, *vbox, *hbox, *vbox2, *button, *label;
2509 GtkWidget *amount, *seams, *group;
2510 int loop = 1, ret = IDCANCEL;
2511 static qboolean bGroupResult = true;
2513 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2514 gtk_window_set_title (GTK_WINDOW (dlg), _("Thicken Patch"));
2515 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2516 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2517 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2518 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2519 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2520 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2522 vbox = gtk_vbox_new (FALSE, 5);
2523 gtk_widget_show (vbox);
2524 gtk_container_add (GTK_CONTAINER (dlg), vbox);
2525 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2527 hbox = gtk_hbox_new (FALSE, 5);
2528 gtk_widget_show (hbox);
2529 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2531 label = gtk_label_new (_("This produces a set of patches\n"
2532 "that contains the original patch along with the\n"
2533 "'thick' patch and an optimal set of seam patches."));
2534 gtk_widget_show (label);
2535 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2537 vbox2 = gtk_vbox_new (FALSE, 5);
2538 gtk_widget_show (vbox2);
2539 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
2541 button = gtk_button_new_with_label (_("OK"));
2542 gtk_widget_show (button);
2543 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
2544 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2545 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2546 gtk_widget_set_usize (button, 60, -2);
2548 button = gtk_button_new_with_label (_("Cancel"));;
2549 gtk_widget_show (button);
2550 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
2551 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2552 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
2554 hbox = gtk_hbox_new (FALSE, 5);
2555 gtk_widget_show (hbox);
2556 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2558 label = gtk_label_new (_("Amount:"));
2559 gtk_widget_show (label);
2560 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2562 amount = gtk_entry_new ();
2563 gtk_widget_show (amount);
2564 gtk_box_pack_start (GTK_BOX (hbox), amount, FALSE, FALSE, 0);
2566 seams = gtk_check_button_new_with_label (_("Seams"));
2567 gtk_widget_show (seams);
2568 gtk_box_pack_start (GTK_BOX (hbox), seams, FALSE, FALSE, 0);
2571 group = gtk_check_button_new_with_label(_("Result to func_group"));
2572 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(group), bGroupResult);
2573 gtk_box_pack_start(GTK_BOX(vbox), group, FALSE, FALSE, 0);
2574 gtk_widget_show(group);
2577 // Initialize dialog
2578 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (seams), TRUE);
2579 gtk_entry_set_text (GTK_ENTRY (amount), "8");
2582 gtk_widget_show (dlg);
2585 gtk_main_iteration ();
2589 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group)))
2590 bGroupResult = true;
2592 bGroupResult = false;
2593 Patch_Thicken (atoi (gtk_entry_get_text (GTK_ENTRY (amount))),
2594 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (seams)), bGroupResult);
2595 Sys_UpdateWindows (W_ALL);
2598 gtk_grab_remove (dlg);
2599 gtk_widget_destroy (dlg);
2602 // =============================================================================
2603 // About dialog (no program is complete without one)
2605 void about_button_changelog (GtkWidget *widget, gpointer data)
2609 log += "changelog.txt";
2610 OpenURL(log.GetBuffer());
2613 void about_button_credits (GtkWidget *widget, gpointer data)
2616 cred = g_strAppPath;
2617 cred += "credits.html";
2618 OpenURL(cred.GetBuffer());
2623 GtkWidget *dlg, *vbox, *vbox2, *hbox, *frame, *table, *label, *pixmap, *button, *sc_extensions, *text_extensions;
2624 int loop = 1, ret = IDCANCEL;
2626 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2627 gtk_window_set_title (GTK_WINDOW (dlg), _("About GtkRadiant"));
2628 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2629 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2630 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2631 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2632 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2633 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2635 vbox = gtk_vbox_new (FALSE, 10);
2636 gtk_widget_show (vbox);
2637 gtk_container_add (GTK_CONTAINER (dlg), vbox);
2638 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2640 hbox = gtk_hbox_new (FALSE, 5);
2641 gtk_widget_show (hbox);
2642 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2644 vbox2 = gtk_vbox_new (FALSE, 5);
2645 gtk_widget_show (vbox2);
2646 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, FALSE, 0);
2648 frame = gtk_frame_new ((char*)NULL);
2649 gtk_widget_show (frame);
2650 gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
2651 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2653 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "logo.bmp");
2654 gtk_widget_show (pixmap);
2655 gtk_container_add (GTK_CONTAINER (frame), pixmap);
2657 label = gtk_label_new ("GtkRadiant " RADIANT_VERSION "\n"
2659 RADIANT_ABOUTMSG "\n\n"
2660 "By qeradiant.com\n\n"
2661 "This product contains software technology\n"
2662 "from id Software, Inc. ('id Technology').\n"
2663 "id Technology 2000 id Software,Inc.\n\n"
2664 "GtkRadiant is unsupported, however\n"
2665 "you may report your problems at\n"
2666 "http://zerowing.idsoftware.com/bugzilla"
2669 gtk_widget_show (label);
2670 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2671 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2672 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2674 vbox2 = gtk_vbox_new (FALSE, 5);
2675 gtk_widget_show (vbox2);
2676 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
2678 button = gtk_button_new_with_label (_("OK"));
2679 gtk_widget_show (button);
2680 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
2681 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2682 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2684 button = gtk_button_new_with_label (_("Credits"));
2685 gtk_widget_show (button);
2686 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
2687 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2688 GTK_SIGNAL_FUNC (about_button_credits), NULL);
2690 button = gtk_button_new_with_label (_("Changelog"));
2691 gtk_widget_show (button);
2692 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
2693 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2694 GTK_SIGNAL_FUNC (about_button_changelog), NULL);
2696 frame = gtk_frame_new (_("OpenGL Properties"));
2697 gtk_widget_show (frame);
2698 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2700 table = gtk_table_new (3, 2, FALSE);
2701 gtk_widget_show (table);
2702 gtk_container_add (GTK_CONTAINER (frame), table);
2703 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2704 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2705 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
2707 label = gtk_label_new (_("Vendor:"));
2708 gtk_widget_show (label);
2709 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2710 (GtkAttachOptions) (GTK_FILL),
2711 (GtkAttachOptions) (0), 0, 0);
2712 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2714 label = gtk_label_new (_("Version:"));
2715 gtk_widget_show (label);
2716 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2717 (GtkAttachOptions) (GTK_FILL),
2718 (GtkAttachOptions) (0), 0, 0);
2719 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2721 label = gtk_label_new (_("Renderer:"));
2722 gtk_widget_show (label);
2723 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2724 (GtkAttachOptions) (GTK_FILL),
2725 (GtkAttachOptions) (0), 0, 0);
2726 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2728 label = gtk_label_new ((char*)qglGetString (GL_VENDOR));
2729 gtk_widget_show (label);
2730 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
2731 (GtkAttachOptions) (GTK_FILL),
2732 (GtkAttachOptions) (0), 0, 0);
2733 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2735 label = gtk_label_new ((char*)qglGetString (GL_VERSION));
2736 gtk_widget_show (label);
2737 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
2738 (GtkAttachOptions) (GTK_FILL),
2739 (GtkAttachOptions) (0), 0, 0);
2740 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2742 label = gtk_label_new ((char*)qglGetString (GL_RENDERER));
2743 gtk_widget_show (label);
2744 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,
2745 (GtkAttachOptions) (GTK_FILL),
2746 (GtkAttachOptions) (0), 0, 0);
2747 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2749 frame = gtk_frame_new (_("OpenGL Extensions"));
2750 gtk_widget_show (frame);
2751 gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
2753 hbox = gtk_hbox_new (FALSE, 5);
2754 gtk_widget_show (hbox);
2755 gtk_container_add (GTK_CONTAINER (frame), hbox);
2756 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2758 sc_extensions = gtk_scrolled_window_new(NULL, NULL);
2759 gtk_box_pack_start(GTK_BOX(hbox), sc_extensions, TRUE, TRUE, 0);
2760 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_extensions), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
2761 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sc_extensions), GTK_SHADOW_IN);
2762 gtk_widget_show(sc_extensions);
2764 text_extensions = gtk_text_view_new();
2765 gtk_text_view_set_editable(GTK_TEXT_VIEW(text_extensions), FALSE);
2766 gtk_container_add (GTK_CONTAINER (sc_extensions), text_extensions);
2767 GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_extensions));
2768 gtk_text_buffer_set_text(buffer, (char *)qglGetString(GL_EXTENSIONS), -1);
2769 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_extensions), GTK_WRAP_WORD);;
2770 gtk_widget_show(text_extensions);
2773 gtk_widget_show (dlg);
2776 gtk_main_iteration ();
2778 gtk_grab_remove (dlg);
2779 gtk_widget_destroy (dlg);
2782 // =============================================================================
2783 // Command List dialog
2785 void DoCommandListDlg ()
2787 GtkWidget *dlg, *vbox, *hbox, *scr, *button;
2788 int loop = 1, ret = IDCANCEL;
2790 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2791 gtk_window_set_title (GTK_WINDOW (dlg), _("Mapped Commands"));
2792 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2793 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2794 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2795 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2796 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2797 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2798 gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);
2800 hbox = gtk_hbox_new (FALSE, 5);
2801 gtk_widget_show (hbox);
2802 gtk_container_add (GTK_CONTAINER (dlg), hbox);
2803 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2805 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
2806 gtk_widget_show (scr);
2807 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
2808 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2809 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
2812 GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
2814 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
2817 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
2818 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(_("Command"), renderer, "text", 0, NULL);
2819 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2823 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
2824 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(_("Key"), renderer, "text", 1, NULL);
2825 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2828 gtk_widget_show(view);
2829 gtk_container_add(GTK_CONTAINER (scr), view);
2832 // Initialize dialog
2834 path = g_strTempPath;
2835 path += "commandlist.txt";
2837 GSList *cmds = NULL;
2840 for (n = 0; n < g_nCommandCount; n++)
2841 cmds = g_slist_append (cmds, g_Commands[n].m_strCommand);
2842 cmds = g_slist_sort (cmds, (gint (*)(const void *, const void *))strcmp);
2844 Sys_Printf("Writing the command list to %s", path.GetBuffer() );
2845 FILE* fileout = fopen (path.GetBuffer (), "wt");
2849 for (n = 0; n < g_nCommandCount; n++)
2850 if (cmds->data == g_Commands[n].m_strCommand)
2853 char c = g_Commands[n].m_nKey;
2854 CString strLine, strMod(""), strKeys (c);
2856 for (int k = 0; k < g_nKeyCount; k++)
2858 if (g_Keys[k].m_nVKKey == g_Commands[n].m_nKey)
2860 strKeys = g_Keys[k].m_strName;
2865 if (g_Commands[n].m_nModifiers & RAD_SHIFT)
2867 if (g_Commands[n].m_nModifiers & RAD_ALT)
2868 strMod += (strMod.GetLength() > 0) ? " + Alt" : "Alt";
2869 if (g_Commands[n].m_nModifiers & RAD_CONTROL)
2870 strMod += (strMod.GetLength() > 0) ? " + Control" : "Control";
2871 if (strMod.GetLength() > 0)
2877 gtk_list_store_append(store, &iter);
2878 gtk_list_store_set(store, &iter, 0, g_Commands[n].m_strCommand, 1, strMod.GetBuffer (), -1);
2881 if (fileout != NULL)
2883 strLine.Format("%-25s %s\r\n", g_Commands[n].m_strCommand, strMod.GetBuffer ());
2884 fputs (strLine.GetBuffer (), fileout);
2887 cmds = g_slist_remove (cmds, cmds->data);
2890 if (fileout != NULL)
2894 g_object_unref(G_OBJECT(store));
2897 vbox = gtk_vbox_new (FALSE, 5);
2898 gtk_widget_show (vbox);
2899 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2901 button = gtk_button_new_with_label (_("Close"));;
2902 gtk_widget_show (button);
2903 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2904 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2905 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2906 gtk_widget_set_usize (button, 60, -2);
2909 gtk_widget_show (dlg);
2912 gtk_main_iteration ();
2914 gtk_grab_remove (dlg);
2915 gtk_widget_destroy (dlg);
2918 // =============================================================================
2919 // Texture List dialog
2921 void DoTextureListDlg ()
2923 GtkWidget *dlg, *vbox, *hbox, *scr, *button;
2924 int loop = 1, ret = IDCANCEL;
2926 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2927 gtk_window_set_title (GTK_WINDOW (dlg), _("Textures"));
2928 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
2929 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
2930 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
2931 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2932 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
2933 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
2934 gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);
2936 hbox = gtk_hbox_new (FALSE, 5);
2937 gtk_widget_show (hbox);
2938 gtk_container_add (GTK_CONTAINER (dlg), hbox);
2939 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2941 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
2942 gtk_widget_show (scr);
2943 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
2944 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2945 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
2947 GtkWidget* texture_list;
2950 GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
2952 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
2953 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
2956 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
2957 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
2958 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2961 gtk_widget_show(view);
2962 gtk_container_add(GTK_CONTAINER (scr), view);
2965 // Initialize dialog
2966 GSList *textures = (GSList*)NULL;
2967 FillTextureMenu(&textures);
2968 while (textures != NULL)
2972 gtk_list_store_append(store, &iter);
2973 gtk_list_store_set(store, &iter, 0, (gchar*)textures->data, -1);
2975 free (textures->data);
2976 textures = g_slist_remove (textures, textures->data);
2980 g_object_unref(G_OBJECT(store));
2982 texture_list = view;
2985 vbox = gtk_vbox_new (FALSE, 5);
2986 gtk_widget_show (vbox);
2987 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2989 button = gtk_button_new_with_label (_("Load"));;
2990 gtk_widget_show (button);
2991 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2992 gtk_signal_connect (GTK_OBJECT (button), "clicked",
2993 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
2994 gtk_widget_set_usize (button, 60, -2);
2996 button = gtk_button_new_with_label (_("Close"));;
2997 gtk_widget_show (button);
2998 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2999 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3000 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3001 gtk_widget_set_usize (button, 60, -2);
3004 gtk_widget_show (dlg);
3007 gtk_main_iteration ();
3011 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(texture_list));
3013 GtkTreeModel* model;
3015 if(gtk_tree_selection_get_selected(selection, &model, &iter))
3017 GtkTreePath* path = gtk_tree_model_get_path(model, &iter);
3018 if(gtk_tree_path_get_depth(path) == 1)
3019 Texture_ShowDirectory(gtk_tree_path_get_indices(path)[0] + CMD_TEXTUREWAD);
3020 gtk_tree_path_free(path);
3024 gtk_grab_remove (dlg);
3025 gtk_widget_destroy (dlg);
3028 // =============================================================================
3031 int DoCapDlg (int *type, bool *b_GroupResult)
3033 GtkWidget *dlg, *vbox, *hbox, *table, *pixmap, *button, *group_toggle, *radio_vbox;
3034 GtkWidget *bevel, *endcap, *ibevel, *iendcap;
3035 GSList *group = (GSList*)NULL;
3036 int loop = 1, ret = IDCANCEL;
3038 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3039 gtk_window_set_title (GTK_WINDOW (dlg), _("Cap"));
3040 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3041 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3042 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3043 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3044 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3045 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3047 hbox = gtk_hbox_new (FALSE, 5);
3048 gtk_widget_show (hbox);
3049 gtk_container_add (GTK_CONTAINER (dlg), hbox);
3050 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3052 // Gef: Added a vbox to contain the toggle buttons
3053 radio_vbox = gtk_vbox_new(FALSE, 4);
3054 gtk_container_add(GTK_CONTAINER(hbox), radio_vbox);
3055 gtk_widget_show(radio_vbox);
3057 table = gtk_table_new (4, 2, FALSE);
3058 gtk_widget_show (table);
3059 gtk_box_pack_start (GTK_BOX (radio_vbox), table, TRUE, TRUE, 0);
3060 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
3061 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
3063 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_bevel.bmp");
3064 gtk_widget_show (pixmap);
3065 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 0, 1,
3066 (GtkAttachOptions) (GTK_FILL),
3067 (GtkAttachOptions) (0), 0, 0);
3069 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_endcap.bmp");
3070 gtk_widget_show (pixmap);
3071 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 1, 2,
3072 (GtkAttachOptions) (GTK_FILL),
3073 (GtkAttachOptions) (0), 0, 0);
3075 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_ibevel.bmp");
3076 gtk_widget_show (pixmap);
3077 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 2, 3,
3078 (GtkAttachOptions) (GTK_FILL),
3079 (GtkAttachOptions) (0), 0, 0);
3081 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_iendcap.bmp");
3082 gtk_widget_show (pixmap);
3083 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 3, 4,
3084 (GtkAttachOptions) (GTK_FILL),
3085 (GtkAttachOptions) (0), 0, 0);
3087 bevel = gtk_radio_button_new_with_label (group, _("Bevel"));
3088 gtk_widget_show (bevel);
3089 gtk_table_attach (GTK_TABLE (table), bevel, 1, 2, 0, 1,
3090 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
3091 (GtkAttachOptions) (0), 0, 0);
3092 group = gtk_radio_button_group (GTK_RADIO_BUTTON (bevel));
3094 endcap = gtk_radio_button_new_with_label (group, _("Endcap"));
3095 gtk_widget_show (endcap);
3096 gtk_table_attach (GTK_TABLE (table), endcap, 1, 2, 1, 2,
3097 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
3098 (GtkAttachOptions) (0), 0, 0);
3099 group = gtk_radio_button_group (GTK_RADIO_BUTTON (endcap));
3101 ibevel = gtk_radio_button_new_with_label (group, _("Inverted Bevel"));
3102 gtk_widget_show (ibevel);
3103 gtk_table_attach (GTK_TABLE (table), ibevel, 1, 2, 2, 3,
3104 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
3105 (GtkAttachOptions) (0), 0, 0);
3106 group = gtk_radio_button_group (GTK_RADIO_BUTTON (ibevel));
3108 iendcap = gtk_radio_button_new_with_label (group, _("Inverted Endcap"));
3109 gtk_widget_show (iendcap);
3110 gtk_table_attach (GTK_TABLE (table), iendcap, 1, 2, 3, 4,
3111 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
3112 (GtkAttachOptions) (0), 0, 0);
3113 group = gtk_radio_button_group (GTK_RADIO_BUTTON (iendcap));
3115 // Gef: added radio toggle for func_grouping capped patches
3116 group_toggle = gtk_check_button_new_with_label(_("Result to func_group"));
3117 gtk_container_add(GTK_CONTAINER(radio_vbox), group_toggle);
3118 gtk_widget_show(group_toggle);
3120 vbox = gtk_vbox_new (FALSE, 5);
3121 gtk_widget_show (vbox);
3122 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3124 button = gtk_button_new_with_label (_("OK"));
3125 gtk_widget_show (button);
3126 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3127 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3128 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
3129 gtk_widget_set_usize (button, 60, -2);
3131 button = gtk_button_new_with_label (_("Cancel"));
3132 gtk_widget_show (button);
3133 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3134 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3135 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3136 gtk_widget_set_usize (button, 60, -2);
3138 // Gef: Set the state of the func_group toggle
3139 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (group_toggle), *b_GroupResult);
3141 // Initialize dialog
3142 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bevel), TRUE);
3145 gtk_widget_show (dlg);
3148 gtk_main_iteration ();
3152 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (bevel)))
3153 *type = BEVEL; //*type = CapDialog::BEVEL;
3154 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (endcap)))
3155 *type = ENDCAP; //*type = CapDialog::ENDCAP;
3156 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ibevel)))
3157 *type = IBEVEL; // *type = CapDialog::IBEVEL;
3158 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (iendcap)))
3159 *type = IENDCAP; // *type = CapDialog::IENDCAP;
3161 // Gef: Added toggle for optional cap func_grouping
3162 *b_GroupResult = (bool *)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group_toggle));
3165 gtk_grab_remove (dlg);
3166 gtk_widget_destroy (dlg);
3171 // =============================================================================
3174 void DoScriptsDlg ()
3176 GtkWidget *dlg, *vbox, *vbox2, *hbox, *label, *button, *scr;
3177 int loop = 1, ret = IDCANCEL;
3179 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3180 gtk_window_set_title (GTK_WINDOW (dlg), _("Available Scripts - Not Implemented Yet"));
3181 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3182 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3183 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3184 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3185 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3186 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3188 vbox = gtk_vbox_new (FALSE, 5);
3189 gtk_widget_show (vbox);
3190 gtk_container_add (GTK_CONTAINER (dlg), vbox);
3191 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
3193 label = gtk_label_new (_("WARNING: BrushScripting is in a highly experimental state and is\n"
3194 "far from complete. If you attempt to use them it is VERY LIKELY\n"
3195 "that Radiant will crash. Save your work before attempting to\n"
3196 "make use of any scripting features."));
3197 gtk_widget_show (label);
3198 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
3199 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
3200 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3202 hbox = gtk_hbox_new (FALSE, 5);
3203 gtk_widget_show (hbox);
3204 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3206 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
3207 gtk_widget_show (scr);
3208 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
3209 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
3210 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
3212 GtkWidget* scripts_list;
3215 GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
3217 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
3218 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
3221 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
3222 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
3223 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
3226 gtk_widget_show(view);
3227 gtk_container_add(GTK_CONTAINER (scr), view);
3230 // Initialize dialog
3232 strINI = g_strGameToolsPath;
3233 strINI += "/scripts.ini";
3236 f = fopen (strINI.GetBuffer(), "rt");
3239 char line[1024], *ptr;
3241 // read section names
3242 while (fgets (line, 1024, f) != 0)
3247 ptr = strchr (line, ']');
3252 gtk_list_store_append(store, &iter);
3253 gtk_list_store_set(store, &iter, 0, line, -1);
3260 g_object_unref(G_OBJECT(store));
3262 scripts_list = view;
3265 vbox2 = gtk_vbox_new (FALSE, 5);
3266 gtk_widget_show (vbox2);
3267 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
3269 button = gtk_button_new_with_label (_("Run"));
3270 gtk_widget_show (button);
3271 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
3272 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3273 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
3274 gtk_widget_set_usize (button, 60, -2);
3276 button = gtk_button_new_with_label (_("New..."));
3277 gtk_widget_show (button);
3278 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
3279 gtk_widget_set_sensitive (button, FALSE);
3280 gtk_widget_set_usize (button, 60, -2);
3282 button = gtk_button_new_with_label (_("Edit..."));
3283 gtk_widget_show (button);
3284 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
3285 gtk_widget_set_sensitive (button, FALSE);
3286 gtk_widget_set_usize (button, 60, -2);
3288 button = gtk_button_new_with_label (_("Close"));
3289 gtk_widget_show (button);
3290 gtk_box_pack_end (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
3291 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3292 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3293 gtk_widget_set_usize (button, 60, -2);
3296 gtk_widget_show (dlg);
3299 gtk_main_iteration ();
3303 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(scripts_list));
3305 GtkTreeModel* model;
3307 if(gtk_tree_selection_get_selected(selection, &model, &iter))
3310 gtk_tree_model_get(model, &iter, 0, &script, -1);
3311 RunScriptByName(script, true);
3316 gtk_grab_remove (dlg);
3317 gtk_widget_destroy (dlg);
3320 // =============================================================================
3323 int DoBSInputDlg (const char *fields[5], float values[5])
3325 GtkWidget *dlg, *vbox, *hbox, *label, *button;
3326 GtkWidget *entries[5];
3327 int i, loop = 1, ret = IDCANCEL;
3329 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3330 gtk_window_set_title (GTK_WINDOW (dlg), _("BrushScript Input"));
3331 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3332 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3333 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3334 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3335 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3336 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3338 hbox = gtk_hbox_new (FALSE, 5);
3339 gtk_widget_show (hbox);
3340 gtk_container_add (GTK_CONTAINER (dlg), hbox);
3341 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3343 vbox = gtk_vbox_new (FALSE, 5);
3344 gtk_widget_show (vbox);
3345 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
3347 // Create entries and initialize them
3348 for (i = 0; i < 5; i++)
3350 if (strlen (fields[i]) == 0)
3353 label = gtk_label_new (fields[i]);
3354 gtk_widget_show (label);
3355 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
3356 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
3357 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3359 entries[i] = gtk_entry_new ();
3360 gtk_widget_show (entries[i]);
3361 gtk_box_pack_start (GTK_BOX (vbox), entries[i], TRUE, TRUE, 0);
3364 sprintf (buf, "%f", values[i]);
3365 gtk_entry_set_text (GTK_ENTRY (entries[i]), buf);
3368 vbox = gtk_vbox_new (FALSE, 5);
3369 gtk_widget_show (vbox);
3370 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3372 button = gtk_button_new_with_label (_("OK"));
3373 gtk_widget_show (button);
3374 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3375 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3376 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
3377 gtk_widget_set_usize (button, 60, -2);
3379 button = gtk_button_new_with_label (_("Cancel"));
3380 gtk_widget_show (button);
3381 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3382 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3383 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3384 gtk_widget_set_usize (button, 60, -2);
3387 gtk_widget_show (dlg);
3390 gtk_main_iteration ();
3392 for (i = 0; i < 5; i++)
3394 if (strlen (fields[i]) == 0)
3397 values[i] = atof (gtk_entry_get_text (GTK_ENTRY (entries[i])));
3400 gtk_grab_remove (dlg);
3401 gtk_widget_destroy (dlg);
3406 // =============================================================================
3407 // TextureLayout dialog
3409 int DoTextureLayout (float *fx, float *fy)
3411 GtkWidget *dlg, *vbox, *hbox, *table, *label, *button;
3413 int loop = 1, ret = IDCANCEL;
3415 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3416 gtk_window_set_title (GTK_WINDOW (dlg), _("Patch texture layout"));
3417 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3418 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3419 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3420 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3421 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3422 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3424 hbox = gtk_hbox_new (FALSE, 5);
3425 gtk_widget_show (hbox);
3426 gtk_container_add (GTK_CONTAINER (dlg), hbox);
3427 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3429 vbox = gtk_vbox_new (FALSE, 5);
3430 gtk_widget_show (vbox);
3431 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
3433 label = gtk_label_new (_("Texture will be fit across the patch based\n"
3434 "on the x and y values given. Values of 1x1\n"
3435 "will \"fit\" the texture. 2x2 will repeat\n"
3437 gtk_widget_show (label);
3438 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
3439 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3441 table = gtk_table_new (2, 2, FALSE);
3442 gtk_widget_show (table);
3443 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
3444 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
3445 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
3447 label = gtk_label_new (_("Texture x:"));
3448 gtk_widget_show (label);
3449 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
3450 (GtkAttachOptions) (GTK_FILL),
3451 (GtkAttachOptions) (0), 0, 0);
3452 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3454 label = gtk_label_new (_("Texture y:"));
3455 gtk_widget_show (label);
3456 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
3457 (GtkAttachOptions) (GTK_FILL),
3458 (GtkAttachOptions) (0), 0, 0);
3459 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3461 x = gtk_entry_new ();
3462 gtk_widget_show (x);
3463 gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
3464 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
3465 (GtkAttachOptions) (0), 0, 0);
3467 y = gtk_entry_new ();
3468 gtk_widget_show (y);
3469 gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
3470 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
3471 (GtkAttachOptions) (0), 0, 0);
3473 vbox = gtk_vbox_new (FALSE, 5);
3474 gtk_widget_show (vbox);
3475 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3477 button = gtk_button_new_with_label (_("OK"));
3478 gtk_widget_show (button);
3479 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3480 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3481 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
3482 gtk_widget_set_usize (button, 60, -2);
3484 button = gtk_button_new_with_label (_("Cancel"));
3485 gtk_widget_show (button);
3486 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3487 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3488 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3489 gtk_widget_set_usize (button, 60, -2);
3492 gtk_entry_set_text (GTK_ENTRY (x), _("4.0"));
3493 gtk_entry_set_text (GTK_ENTRY (y), _("4.0"));
3496 gtk_widget_show (dlg);
3499 gtk_main_iteration ();
3503 *fx = atof (gtk_entry_get_text (GTK_ENTRY (x)));
3504 *fy = atof (gtk_entry_get_text (GTK_ENTRY (y)));
3507 gtk_grab_remove (dlg);
3508 gtk_widget_destroy (dlg);
3513 // =============================================================================
3516 char* DoNameDlg (const char* title)
3518 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
3519 int loop = 1, ret = IDCANCEL;
3522 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3523 gtk_window_set_title (GTK_WINDOW (dlg), title);
3524 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3525 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3526 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3527 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3528 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3529 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3531 hbox = gtk_hbox_new (FALSE, 5);
3532 gtk_widget_show (hbox);
3533 gtk_container_add (GTK_CONTAINER (dlg), hbox);
3534 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3536 label = gtk_label_new (_("Name:"));
3537 gtk_widget_show (label);
3538 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3540 entry = gtk_entry_new ();
3541 gtk_widget_show (entry);
3542 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3544 vbox = gtk_vbox_new (FALSE, 5);
3545 gtk_widget_show (vbox);
3546 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3548 button = gtk_button_new_with_label (_("OK"));
3549 gtk_widget_show (button);
3550 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3551 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3552 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
3553 gtk_widget_set_usize (button, 60, -2);
3555 button = gtk_button_new_with_label (_("Cancel"));
3556 gtk_widget_show (button);
3557 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3558 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3559 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3560 gtk_widget_set_usize (button, 60, -2);
3563 gtk_widget_show (dlg);
3566 gtk_main_iteration ();
3569 str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
3573 gtk_grab_remove (dlg);
3574 gtk_widget_destroy (dlg);
3579 // =============================================================================
3580 // NewProject dialog
3582 char* DoNewProjectDlg ()
3584 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry, *check;
3585 int loop = 1, ret = IDCANCEL;
3588 // start by a warning message
3589 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=459
3590 // mattn: URLs no longer valid
3592 // msg = "Are you sure you want a new project?\n";
3593 // msg += "Please note that creating a new project is not the prefered way to setup GtkRadiant for mod editing.\n";
3594 // msg += "Check http://www.qeradiant.com/faq/index.cgi?file=220 for more information";
3595 // if (gtk_MessageBox(NULL, msg.GetBuffer(), _("Confirm"), MB_YESNO, "http://www.qeradiant.com/faq/index.cgi?file=220" ) == IDNO)
3600 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3601 gtk_window_set_title (GTK_WINDOW (dlg), _("New Project"));
3602 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3603 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3604 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3605 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3606 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3607 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3609 hbox = gtk_hbox_new (FALSE, 10);
3610 gtk_widget_show (hbox);
3611 gtk_container_add (GTK_CONTAINER (dlg), hbox);
3612 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3614 vbox = gtk_vbox_new (FALSE, 5);
3615 gtk_widget_show (vbox);
3616 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3618 label = gtk_label_new (_("This will create a new directory beneath your\n"
3619 "game path based on the project name you give."));
3620 gtk_widget_show (label);
3621 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
3622 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3624 label = gtk_label_new (_("Project name:"));
3625 gtk_widget_show (label);
3626 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
3627 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3628 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3630 entry = gtk_entry_new ();
3631 gtk_widget_show (entry);
3632 gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
3634 check = gtk_check_button_new_with_label (_("Include game dll files"));
3635 gtk_widget_show (check);
3636 gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0);
3637 gtk_widget_set_sensitive (check, FALSE);
3639 vbox = gtk_vbox_new (FALSE, 5);
3640 gtk_widget_show (vbox);
3641 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3643 button = gtk_button_new_with_label (_("OK"));
3644 gtk_widget_show (button);
3645 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3646 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3647 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
3648 gtk_widget_set_usize (button, 60, -2);
3650 button = gtk_button_new_with_label (_("Cancel"));
3651 gtk_widget_show (button);
3652 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3653 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3654 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
3655 gtk_widget_set_usize (button, 60, -2);
3658 gtk_widget_show (dlg);
3661 gtk_main_iteration ();
3664 str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
3668 gtk_grab_remove (dlg);
3669 gtk_widget_destroy (dlg);
3674 // =============================================================================
3675 // Text Editor dialog
3677 // master window widget
3678 static GtkWidget *text_editor = NULL;
3679 static GtkWidget *text_widget; // slave, text widget from the gtk editor
3681 static gint editor_delete (GtkWidget *widget, gpointer data)
3683 if (gtk_MessageBox (widget, _("Close the shader editor ?"), _("Radiant"), MB_YESNO) == IDNO)
3686 gtk_widget_hide (text_editor);
3691 static void editor_save (GtkWidget *widget, gpointer data)
3693 FILE *f = fopen ((char*)g_object_get_data (G_OBJECT (data), "filename"), "w");
3694 gpointer text = g_object_get_data (G_OBJECT (data), "text");
3698 gtk_MessageBox (GTK_WIDGET(data), _("Error saving file !"));
3702 char *str = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);
3703 fwrite (str, 1, strlen (str), f);
3707 static void editor_close (GtkWidget *widget, gpointer data)
3709 if (gtk_MessageBox (text_editor, _("Close the shader editor ?"), _("Radiant"), MB_YESNO) == IDNO)
3712 gtk_widget_hide (text_editor);
3716 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355
3720 HWND FindEditWindow()
3722 return FindWindow("TFormEditPadLite", NULL);
3725 HWND FindEditWindow()
3727 HWND hwnd = FindWindow("TFormEditPadLite", NULL);
3730 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
3733 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
3736 hwnd = FindWindowEx(hwnd, NULL, "TEditPadEditor", NULL);
3739 hwnd = FindWindowEx(hwnd, NULL, "TWinControlProxy", NULL);
3748 HWND FindEditWindow()
3750 HWND hwnd = FindWindow("TFormEditPadLite", NULL);
3753 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
3756 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
3759 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
3762 hwnd = FindWindowEx(hwnd, NULL, "TFrameSearchReplace", NULL);
3765 hwnd = FindWindowEx(hwnd, NULL, "TJGStringEditorControl", NULL);
3775 HWND FindEditWindow()
3777 HWND hwnd = FindWindow("TEditPadForm", NULL);
3778 HWND hwndEdit = NULL;
3781 HWND hwndTab = FindWindowEx(hwnd, NULL, "TTabControl", NULL);
3782 if (hwndTab != NULL)
3784 hwndEdit = FindWindowEx(hwndTab, NULL, "TRicherEdit", NULL);
3792 static void CreateGtkTextEditor ()
3795 GtkWidget *vbox, *hbox, *button, *scr, *text;
3797 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3799 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3800 GTK_SIGNAL_FUNC (editor_delete), NULL);
3801 gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 300);
3803 vbox = gtk_vbox_new (FALSE, 5);
3804 gtk_widget_show (vbox);
3805 gtk_container_add (GTK_CONTAINER (dlg), vbox);
3806 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
3808 scr = gtk_scrolled_window_new (NULL, NULL);
3809 gtk_widget_show (scr);
3810 gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
3811 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3812 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
3814 text = gtk_text_view_new();
3815 gtk_container_add (GTK_CONTAINER (scr), text);
3816 gtk_widget_show (text);
3817 g_object_set_data (G_OBJECT (dlg), "text", text);
3818 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), TRUE);
3820 hbox = gtk_hbox_new (FALSE, 5);
3821 gtk_widget_show (hbox);
3822 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3824 button = gtk_button_new_with_label (_("Close"));
3825 gtk_widget_show (button);
3826 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3827 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3828 GTK_SIGNAL_FUNC (editor_close), dlg);
3829 gtk_widget_set_usize (button, 60, -2);
3831 button = gtk_button_new_with_label (_("Save"));
3832 gtk_widget_show (button);
3833 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3834 gtk_signal_connect (GTK_OBJECT (button), "clicked",
3835 GTK_SIGNAL_FUNC (editor_save), dlg);
3836 gtk_widget_set_usize (button, 60, -2);
3842 static void DoGtkTextEditor (const char* filename, guint cursorpos)
3845 CreateGtkTextEditor(); // build it the first time we need it
3848 FILE *f = fopen (filename, "r");
3852 Sys_Printf("Unable to load file %s in shader editor.\n", filename);
3853 gtk_widget_hide (text_editor);
3857 fseek (f, 0, SEEK_END);
3858 int len = ftell (f);
3859 void *buf = qmalloc (len);
3863 fread (buf, 1, len, f);
3865 gtk_window_set_title (GTK_WINDOW (text_editor), filename);
3867 GtkTextBuffer* text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget));
3868 gtk_text_buffer_set_text(text_buffer, (char*)buf, len);
3870 old_filename = g_object_get_data (G_OBJECT (text_editor), "filename");
3873 g_object_set_data (G_OBJECT (text_editor), "filename", strdup (filename));
3875 // trying to show later
3876 gtk_widget_show (text_editor);
3879 while (gtk_events_pending ())
3880 gtk_main_iteration ();
3883 // only move the cursor if it's not exceeding the size..
3884 // NOTE: this is erroneous, cursorpos is the offset in bytes, not in characters
3885 // len is the max size in bytes, not in characters either, but the character count is below that limit..
3886 // thinking .. the difference between character count and byte count would be only because of CR/LF?
3888 GtkTextIter text_iter;
3889 // character offset, not byte offset
3890 gtk_text_buffer_get_iter_at_offset(text_buffer, &text_iter, cursorpos);
3891 gtk_text_buffer_place_cursor(text_buffer, &text_iter);
3895 gtk_widget_queue_draw(text_widget);
3903 void DoTextEditor (const char* filename, int cursorpos)
3905 CString strEditCommand;
3907 if (g_PrefsDlg.m_bUseWin32Editor)
3909 Sys_Printf("opening file '%s' (line %d info ignored)\n", filename);
3910 ShellExecute((HWND)GDK_WINDOW_HWND (g_pParentWnd->m_pWidget->window), "open", filename, NULL, NULL, SW_SHOW );
3914 // check if a custom editor is set
3915 if((g_PrefsDlg.m_bUseCustomEditor) && (g_PrefsDlg.m_strEditorCommand.GetLength() > 0))
3917 strEditCommand = g_PrefsDlg.m_strEditorCommand;
3918 strEditCommand += " \"";
3919 strEditCommand += filename;
3920 strEditCommand += "\"";
3922 Sys_Printf("Launching: %s\n", strEditCommand.GetBuffer());
3923 // note: linux does not return false if the command failed so it will assume success
3924 if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)
3926 Sys_FPrintf(SYS_WRN, "Warning: Failed to execute %s, using default\n", strEditCommand.GetBuffer());
3930 // the command (appeared) to run successfully, no need to do anything more
3936 DoGtkTextEditor (filename, cursorpos);
3938 // old win32 code with EditPad bindings, broken
3939 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355
3941 strEditCommand = g_strAppPath.GetBuffer();
3942 strEditCommand += "editpad.exe";
3943 strEditCommand += " \"";
3944 strEditCommand += filename;
3945 strEditCommand += "\"";
3946 if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)
3948 Sys_FPrintf(SYS_WRN, "WARNING: Gtk shader editor is not fully functional on windows in general and unstable on win98 in particular.\n");
3949 Sys_FPrintf(SYS_WRN, " you can use EditPad instead (install it in Radiant's directory): http://www.qeradiant.com/?data=files&files_dir=18\n");
3950 DoGtkTextEditor (filename, cursorpos);
3954 // TTimo: we used to call Delay here, to continue processing messages. But it seems to induce a lot of instabilities.
3955 // so now the user will simply have to wait.
3958 // now grab the edit window and scroll to the shader we want to edit
3959 HWND hwndEdit = FindEditWindow();
3961 if (hwndEdit != NULL)
3962 PostMessage(hwndEdit, EM_SETSEL, cursorpos, cursorpos);
3964 Sys_Printf("Unable to load shader editor.\n");
3969 // =============================================================================
3970 // Light Intensity dialog
3972 int DoLightIntensityDlg (int *intensity)
3974 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
3975 int loop = 1, ret = IDCANCEL;
3977 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3978 gtk_window_set_title (GTK_WINDOW (dlg), _("Light intensity"));
3979 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
3980 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
3981 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
3982 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
3983 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
3984 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
3986 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3987 gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
3989 hbox = gtk_hbox_new (FALSE, 5);
3990 gtk_widget_show (hbox);
3991 gtk_container_add (GTK_CONTAINER (dlg), hbox);
3992 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3994 vbox = gtk_vbox_new (FALSE, 5);
3995 gtk_widget_show (vbox);
3996 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
3998 label = gtk_label_new (_("ESC for default, ENTER to validate"));
3999 gtk_widget_show (label);
4000 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
4002 entry = gtk_entry_new ();
4003 gtk_widget_show (entry);
4004 gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
4006 vbox = gtk_vbox_new (FALSE, 5);
4007 gtk_widget_show (vbox);
4008 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
4010 button = gtk_button_new_with_label (_("OK"));
4011 gtk_widget_show (button);
4012 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
4013 gtk_signal_connect (GTK_OBJECT (button), "clicked",
4014 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
4015 gtk_widget_add_accelerator (button, "clicked", accel_group,
4016 GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
4017 gtk_widget_set_usize (button, 60, -2);
4019 button = gtk_button_new_with_label (_("Cancel"));
4020 gtk_widget_show (button);
4021 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
4022 gtk_signal_connect (GTK_OBJECT (button), "clicked",
4023 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
4024 gtk_widget_add_accelerator (button, "clicked", accel_group,
4025 GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
4026 gtk_widget_set_usize (button, 60, -2);
4029 sprintf (buf, "%d", *intensity);
4030 gtk_entry_set_text (GTK_ENTRY (entry), buf);
4033 gtk_widget_show (dlg);
4036 gtk_main_iteration ();
4039 *intensity = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));
4041 gtk_grab_remove (dlg);
4042 gtk_widget_destroy (dlg);