2 Copyright (c) 2001, Loki software, inc.
\r
5 Redistribution and use in source and binary forms, with or without modification,
\r
6 are permitted provided that the following conditions are met:
\r
8 Redistributions of source code must retain the above copyright notice, this list
\r
9 of conditions and the following disclaimer.
\r
11 Redistributions in binary form must reproduce the above copyright notice, this
\r
12 list of conditions and the following disclaimer in the documentation and/or
\r
13 other materials provided with the distribution.
\r
15 Neither the name of Loki software nor the names of its contributors may be used
\r
16 to endorse or promote products derived from this software without specific prior
\r
17 written permission.
\r
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
\r
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
\r
22 DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
\r
23 DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
\r
24 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
\r
25 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
\r
28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
32 // Some small dialogs that don't need much
\r
34 // Leonardo Zide (leo@lokigames.com)
\r
38 #include <gdk/gdkkeysyms.h>
\r
39 #include <gtk/gtk.h>
\r
42 #include <gdk/gdkwin32.h>
\r
46 #include <shellapi.h>
\r
49 // =============================================================================
\r
50 // Color selection dialog
\r
52 qboolean DoColor (int iIndex)
\r
54 static bool bColorOpen = false;
\r
58 Sys_FPrintf(SYS_WRN, "DoColor dialog is already open\n");
\r
64 if (color_dialog (g_pParentWnd->m_pWidget, g_qeglobals.d_savedinfo.colors[iIndex]))
\r
67 ** scale colors so that at least one component is at 1.0F
\r
68 ** if this is meant to select an entity color
\r
70 if (iIndex == COLOR_ENTITY)
\r
72 float largest = 0.0F;
\r
74 if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )
\r
75 largest = g_qeglobals.d_savedinfo.colors[iIndex][0];
\r
76 if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )
\r
77 largest = g_qeglobals.d_savedinfo.colors[iIndex][1];
\r
78 if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )
\r
79 largest = g_qeglobals.d_savedinfo.colors[iIndex][2];
\r
81 if ( largest == 0.0F )
\r
83 g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;
\r
84 g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;
\r
85 g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;
\r
89 float scaler = 1.0F / largest;
\r
91 g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;
\r
92 g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;
\r
93 g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;
\r
97 Sys_UpdateWindows (W_ALL);
\r
102 bColorOpen = false;
\r
107 // =============================================================================
\r
108 // Project settings dialog
\r
110 static void UpdateBSPCommandList (GtkWidget *dialog);
\r
112 static void DoProjectAddEdit (bool edit, GtkWidget *parent)
\r
114 GtkWidget *dlg, *vbox, *hbox, *label, *table, *button;
\r
115 GtkWidget *cmd, *text;
\r
116 int loop = 1, ret = IDCANCEL;
\r
118 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
120 gtk_window_set_title (GTK_WINDOW (dlg), "Edit Command");
\r
122 gtk_window_set_title (GTK_WINDOW (dlg), "Add Command");
\r
123 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
124 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
125 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
126 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
127 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
128 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
130 vbox = gtk_vbox_new (FALSE, 5);
\r
131 gtk_widget_show (vbox);
\r
132 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
133 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
135 table = gtk_table_new (2, 2, FALSE);
\r
136 gtk_widget_show (table);
\r
137 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
\r
138 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
139 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
141 label = gtk_label_new ("Menu text");
\r
142 gtk_widget_show (label);
\r
143 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
144 (GtkAttachOptions) (GTK_FILL),
\r
145 (GtkAttachOptions) (0), 0, 0);
\r
146 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
148 label = gtk_label_new ("Command");
\r
149 gtk_widget_show (label);
\r
150 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
151 (GtkAttachOptions) (GTK_FILL),
\r
152 (GtkAttachOptions) (0), 0, 0);
\r
153 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
155 text = gtk_entry_new ();
\r
156 g_object_set_data (G_OBJECT (dlg), "text", text);
\r
157 gtk_widget_show (text);
\r
158 gtk_table_attach (GTK_TABLE (table), text, 1, 2, 0, 1,
\r
159 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
160 (GtkAttachOptions) (0), 0, 0);
\r
161 gtk_widget_set_usize (text, 300, -2);
\r
163 cmd = gtk_entry_new ();
\r
164 g_object_set_data (G_OBJECT (dlg), "cmd", cmd);
\r
165 gtk_widget_show (cmd);
\r
166 gtk_table_attach (GTK_TABLE (table), cmd, 1, 2, 1, 2,
\r
167 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
168 (GtkAttachOptions) (0), 0, 0);
\r
169 gtk_widget_set_usize (cmd, 300, -2);
\r
171 hbox = gtk_hbox_new (FALSE, 5);
\r
172 gtk_widget_show (hbox);
\r
173 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
175 button = gtk_button_new_with_label ("OK");
\r
176 gtk_widget_show (button);
\r
177 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
\r
178 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
179 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
180 gtk_widget_set_usize (button, 60, -2);
\r
182 button = gtk_button_new_with_label ("Cancel");
\r
183 gtk_widget_show (button);
\r
184 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
\r
185 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
186 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
187 gtk_widget_set_usize (button, 60, -2);
\r
191 GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(parent), "view"));
\r
192 GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
\r
194 GtkTreeModel* model;
\r
195 if(gtk_tree_selection_get_selected(selection, &model, &iter))
\r
198 gtk_tree_model_get(model, &iter, 0, &key, -1);
\r
199 const char* value = ValueForKey (g_qeglobals.d_project_entity, key);
\r
200 gtk_entry_set_text (GTK_ENTRY (text), key);
\r
201 gtk_entry_set_text (GTK_ENTRY (cmd), value);
\r
206 gtk_grab_add (dlg);
\r
207 gtk_widget_show (dlg);
\r
210 gtk_main_iteration ();
\r
214 const char* key = gtk_entry_get_text (GTK_ENTRY (text));
\r
215 const char* value = gtk_entry_get_text (GTK_ENTRY (cmd));
\r
217 if (strlen (key) <= 0 || strlen (value) <= 0)
\r
219 Sys_Printf ("Command not added\n");
\r
225 SetKeyValue (g_qeglobals.d_project_entity, key, value);
\r
230 if (key[0] == 'b' && key[1] == 's' && key[2] == 'p')
\r
232 SetKeyValue (g_qeglobals.d_project_entity, key, value);
\r
236 Sys_Printf ("BSP commands must be preceded by \"bsp\"");
\r
239 UpdateBSPCommandList (parent);
\r
243 gtk_grab_remove (dlg);
\r
244 gtk_widget_destroy (dlg);
\r
247 static void UpdateBSPCommandList (GtkWidget *dialog)
\r
249 GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT(dialog), "bsp_commands"));
\r
251 gtk_list_store_clear(store);
\r
253 for(epair_t* ep = g_qeglobals.d_project_entity->epairs; ep != NULL; ep = ep->next)
\r
255 if(ep->key[0] == 'b' && ep->key[1] == 's' && ep->key[2] == 'p')
\r
258 gtk_list_store_append(store, &iter);
\r
259 gtk_list_store_set(store, &iter, 0, ep->key, -1);
\r
264 static void project_add (GtkWidget *widget, gpointer data)
\r
266 GtkWidget *dlg = GTK_WIDGET (data);
\r
267 DoProjectAddEdit (false, dlg);
\r
268 UpdateBSPCommandList (dlg);
\r
271 static void project_change (GtkWidget *widget, gpointer data)
\r
273 GtkWidget *dlg = GTK_WIDGET (data);
\r
274 DoProjectAddEdit (true, dlg);
\r
275 UpdateBSPCommandList (dlg);
\r
278 static void project_remove (GtkWidget *widget, gpointer data)
\r
280 GtkWidget* project = GTK_WIDGET(data);
\r
282 GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(project), "view"));
\r
283 GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
\r
285 GtkTreeModel* model;
\r
286 if(gtk_tree_selection_get_selected(selection, &model, &iter))
\r
289 gtk_tree_model_get(model, &iter, 0, &key, -1);
\r
290 DeleteKey (g_qeglobals.d_project_entity, key);
\r
293 char* index = gtk_tree_model_get_string_from_iter(model, &iter);
\r
294 Sys_Printf ("Selected %s\n", index);
\r
297 UpdateBSPCommandList(project);
\r
302 static const char* sQ3ComboItem = "Quake III Arena";
\r
303 static const char* sTAComboItem = "Quake III: Team Arena";
\r
304 static const char* sModComboItem = "Custom Quake III modification";
\r
305 static const char* sWolfComboItem = "Return To Castle Wolfenstein";
\r
306 static const char* sWolfModComboItem = "Custom RTCW modification";
\r
307 static const char* sHLComboItem = "Half-life";
\r
308 static const char* sHLModComboItem = "Custom Half-life modification";
\r
310 static const char* sWolfSPCombo = "Single Player mapping mode";
\r
311 static const char* sWolfMPCombo = "Multiplayer mapping mode";
\r
314 // HARD-CODED ET HACK
\r
315 static const char* sETComboItem = "Wolfenstein: Enemy Territory";
\r
316 static const char* sETModComboItem = "Custom ET modification";
\r
319 // HARD-CODED JK2 HACK
\r
320 static const char* sJK2ComboItem = "Jedi Knight II Outcast";
\r
321 static const char* sJK2ModComboItem = "Custom JK2 modification";
\r
322 static const char* sJK2SPCombo = "Single Player mapping mode";
\r
323 static const char* sJK2MPCombo = "Multiplayer mapping mode";
\r
326 // HARD-CODED JA HACK
\r
327 static const char* sJAComboItem = "Jedi Knight Jedi Academy";
\r
328 static const char* sJAModComboItem = "Custom JA modification";
\r
329 static const char* sJASPCombo = "Single Player mapping mode";
\r
330 static const char* sJAMPCombo = "Multiplayer mapping mode";
\r
333 // HARD-CODED STVEF2 HACK
\r
334 static const char* sSTVEFComboItem = "Star Trek Voyager : Elite Force";
\r
335 static const char* sSTVEFModComboItem = "Custom Elite Force modification";
\r
336 static const char* sSTVEFSPCombo = "Single Player mapping mode";
\r
337 static const char* sSTVEFMPCombo = "Holo Match mapping mode";
\r
340 // HARD-CODED SOF2 HACK
\r
341 static const char* sSOF2ComboItem = "Soldier of Fortune II - Double Helix";
\r
342 static const char* sSOF2ModComboItem = "Custom Sof2 modification";
\r
343 static const char* sSOF2SPCombo = "Single Player mapping mode";
\r
344 static const char* sSOF2MPCombo = "Multiplayer mapping mode";
\r
346 static GtkWidget* game_select; // GTK_COMBO
\r
347 static GtkEntry* fsgame_entry;
\r
349 gint OnSelchangeComboWhatgame (GtkWidget *widget, GdkEvent* event, gpointer data)
\r
351 const char *dir = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(game_select)->entry));
\r
353 if (g_pGameDescription->mGameFile == "wolf.game")
\r
355 if (!strcmp(dir,sWolfComboItem))
\r
357 // disable the fs_game text entry
\r
358 gtk_entry_set_text (fsgame_entry, "");
\r
359 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
363 gtk_entry_set_text (fsgame_entry, "");
\r
364 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
369 else if (g_pGameDescription->mGameFile == "et.game")
\r
371 if (!strcmp(dir,sETComboItem))
\r
373 // disable the fs_game text entry
\r
374 gtk_entry_set_text (fsgame_entry, "");
\r
375 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
379 gtk_entry_set_text (fsgame_entry, "");
\r
380 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
384 else if (g_pGameDescription->mGameFile == "hl.game")
\r
386 if (!strcmp(dir,sHLComboItem))
\r
388 // disable the fs_game text entry
\r
389 gtk_entry_set_text (fsgame_entry, "");
\r
390 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
394 gtk_entry_set_text (fsgame_entry, "");
\r
395 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
401 else if (g_pGameDescription->mGameFile == "jk2.game")
\r
403 if (!strcmp(dir,sJK2ComboItem))
\r
405 // disable the fs_game text entry
\r
406 gtk_entry_set_text (fsgame_entry, "");
\r
407 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
411 gtk_entry_set_text (fsgame_entry, "");
\r
412 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
417 else if (g_pGameDescription->mGameFile == "ja.game")
\r
419 if (!strcmp(dir,sJAComboItem))
\r
421 // disable the fs_game text entry
\r
422 gtk_entry_set_text (fsgame_entry, "");
\r
423 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
427 gtk_entry_set_text (fsgame_entry, "");
\r
428 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
433 else if (g_pGameDescription->mGameFile == "stvef.game")
\r
435 if (!strcmp(dir,sSTVEFComboItem))
\r
437 // disable the fs_game text entry
\r
438 gtk_entry_set_text (fsgame_entry, "");
\r
439 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
443 gtk_entry_set_text (fsgame_entry, "");
\r
444 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
449 else if (g_pGameDescription->mGameFile == "sof2.game")
\r
451 if (!strcmp(dir,sSOF2ComboItem))
\r
453 // disable the fs_game text entry
\r
454 gtk_entry_set_text (fsgame_entry, "");
\r
455 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
459 gtk_entry_set_text (fsgame_entry, "");
\r
460 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
466 if (!strcmp(dir,sQ3ComboItem))
\r
468 // disable the fs_game text entry
\r
469 gtk_entry_set_text (fsgame_entry, "");
\r
470 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
472 else if (!strcmp(dir,sTAComboItem))
\r
474 gtk_entry_set_text (fsgame_entry, "missionpack");
\r
475 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
\r
479 gtk_entry_set_text (fsgame_entry, "");
\r
480 gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
\r
487 void DoProjectSettings ()
\r
489 GtkWidget *project;
\r
490 GtkWidget *frame, *label, *vbox, *table1, *table2, *button;
\r
493 GtkWidget *base, *game;
\r
494 GtkWidget *gamemode_combo;
\r
495 GList *combo_list = (GList*)NULL;
\r
497 int loop = 1, ret = IDCANCEL;
\r
499 project = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
500 gtk_window_set_title (GTK_WINDOW (project), "Project Settings");
\r
501 gtk_signal_connect (GTK_OBJECT (project), "delete_event",
\r
502 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
503 gtk_signal_connect (GTK_OBJECT (project), "destroy",
\r
504 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
505 g_object_set_data (G_OBJECT (project), "loop", &loop);
\r
506 g_object_set_data (G_OBJECT (project), "ret", &ret);
\r
507 gtk_window_set_default_size (GTK_WINDOW (project), 550, 400);
\r
509 table1 = gtk_table_new (3, 2, FALSE);
\r
510 gtk_widget_show (table1);
\r
511 gtk_container_add (GTK_CONTAINER (project), table1);
\r
512 gtk_container_set_border_width (GTK_CONTAINER (table1), 5);
\r
513 gtk_table_set_row_spacings (GTK_TABLE (table1), 5);
\r
514 gtk_table_set_col_spacings (GTK_TABLE (table1), 5);
\r
516 vbox = gtk_vbox_new (FALSE, 5);
\r
517 gtk_widget_show (vbox);
\r
518 gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 0, 1,
\r
519 (GtkAttachOptions) (GTK_FILL),
\r
520 (GtkAttachOptions) (GTK_FILL), 0, 0);
\r
522 button = gtk_button_new_with_label ("OK");
\r
523 gtk_widget_show (button);
\r
524 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
525 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
526 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
527 gtk_widget_set_usize (button, 60, -2);
\r
529 button = gtk_button_new_with_label ("Cancel");
\r
530 gtk_widget_show (button);
\r
531 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
532 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
533 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
534 gtk_widget_set_usize (button, 60, -2);
\r
536 vbox = gtk_vbox_new (FALSE, 5);
\r
537 gtk_widget_show (vbox);
\r
538 gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 1, 2,
\r
539 (GtkAttachOptions) (GTK_FILL),
\r
540 (GtkAttachOptions) (GTK_FILL), 0, 0);
\r
542 button = gtk_button_new_with_label ("Add...");
\r
543 gtk_widget_show (button);
\r
544 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
545 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
546 GTK_SIGNAL_FUNC (project_add), project);
\r
547 gtk_widget_set_usize (button, 60, -2);
\r
549 button = gtk_button_new_with_label ("Change...");
\r
550 gtk_widget_show (button);
\r
551 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
552 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
553 GTK_SIGNAL_FUNC (project_change), project);
\r
554 gtk_widget_set_usize (button, 60, -2);
\r
556 button = gtk_button_new_with_label ("Remove");
\r
557 gtk_widget_show (button);
\r
558 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
559 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
560 GTK_SIGNAL_FUNC (project_remove), project);
\r
561 gtk_widget_set_usize (button, 60, -2);
\r
563 frame = gtk_frame_new ("Misc settings");
\r
564 gtk_widget_show (frame);
\r
565 gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 2, 3,
\r
566 (GtkAttachOptions) (GTK_FILL),
\r
567 (GtkAttachOptions) (GTK_FILL), 0, 0);
\r
569 brush = gtk_check_button_new_with_label ("Use brush primitives in MAP files (NOTE: experimental feature,\n"
\r
570 "required by the texture tools plugin)");
\r
571 gtk_widget_show (brush);
\r
572 gtk_container_add (GTK_CONTAINER (frame), brush);
\r
573 gtk_container_set_border_width (GTK_CONTAINER (brush), 5);
\r
575 frame = gtk_frame_new ("Menu commands");
\r
576 gtk_widget_show (frame);
\r
577 gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 1, 2,
\r
578 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
579 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
\r
581 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
582 gtk_widget_show (scr);
\r
583 gtk_container_add (GTK_CONTAINER (frame), scr);
\r
584 gtk_container_set_border_width (GTK_CONTAINER (scr), 5);
\r
585 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
586 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
\r
590 GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
\r
592 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
593 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
\r
595 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
596 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
\r
597 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
599 GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
\r
600 gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
\r
602 gtk_widget_show(view);
\r
604 g_object_set_data(G_OBJECT (project), "view", view);
\r
605 g_object_set_data(G_OBJECT (project), "bsp_commands", store);
\r
606 gtk_container_add(GTK_CONTAINER (scr), view);
\r
608 g_object_unref(G_OBJECT(store));
\r
611 frame = gtk_frame_new ("Project settings");
\r
612 gtk_widget_show (frame);
\r
613 gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1,
\r
614 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
615 (GtkAttachOptions) (GTK_FILL), 0, 0);
\r
617 // HACK: hardcoded game stuff
\r
618 if (g_pGameDescription->mGameFile == "wolf.game" ||
\r
619 g_pGameDescription->mGameFile == "et.game" ||
\r
620 g_pGameDescription->mGameFile == "jk2.game" ||
\r
621 g_pGameDescription->mGameFile == "stvef.game" ||
\r
622 g_pGameDescription->mGameFile == "sof2.game" ||
\r
623 g_pGameDescription->mGameFile == "ja.game" )
\r
625 table2 = gtk_table_new (9, 2, FALSE);
\r
629 table2 = gtk_table_new (8, 2, FALSE);
\r
631 gtk_widget_show (table2);
\r
632 gtk_container_add (GTK_CONTAINER (frame), table2);
\r
633 gtk_container_set_border_width (GTK_CONTAINER (table2), 5);
\r
634 gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
\r
635 gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
\r
638 fill in the game selection combo
\r
639 HACK: hardcoded Q3/Wolf/HL switch
\r
640 \todo that stuff would be faster to write with implementation of property bags and associated code to edit
\r
642 if (g_pGameDescription->mGameFile == "wolf.game")
\r
644 combo_list = g_list_append (combo_list, (void *)sWolfComboItem);
\r
645 combo_list = g_list_append (combo_list, (void *)sWolfModComboItem);
\r
647 else if (g_pGameDescription->mGameFile == "et.game")
\r
649 combo_list = g_list_append (combo_list, (void *)sETComboItem);
\r
650 combo_list = g_list_append (combo_list, (void *)sETModComboItem);
\r
652 else if (g_pGameDescription->mGameFile == "hl.game")
\r
654 combo_list = g_list_append (combo_list, (void *)sHLComboItem);
\r
655 combo_list = g_list_append (combo_list, (void *)sHLModComboItem);
\r
659 else if (g_pGameDescription->mGameFile == "jk2.game")
\r
661 combo_list = g_list_append (combo_list, (void *)sJK2ComboItem);
\r
662 combo_list = g_list_append (combo_list, (void *)sJK2ModComboItem);
\r
666 else if (g_pGameDescription->mGameFile == "ja.game")
\r
668 combo_list = g_list_append (combo_list, (void *)sJAComboItem);
\r
669 combo_list = g_list_append (combo_list, (void *)sJAModComboItem);
\r
673 else if (g_pGameDescription->mGameFile == "stvef.game")
\r
675 combo_list = g_list_append (combo_list, (void *)sSTVEFComboItem);
\r
676 combo_list = g_list_append (combo_list, (void *)sSTVEFModComboItem);
\r
679 // SOF2 HACK A LA JK2 A LA WOLF
\r
680 else if (g_pGameDescription->mGameFile == "sof2.game")
\r
682 combo_list = g_list_append (combo_list, (void *)sSOF2ComboItem);
\r
683 combo_list = g_list_append (combo_list, (void *)sSOF2ModComboItem);
\r
688 combo_list = g_list_append (combo_list, (void *)sQ3ComboItem);
\r
689 combo_list = g_list_append (combo_list, (void *)sTAComboItem);
\r
690 combo_list = g_list_append (combo_list, (void *)sModComboItem);
\r
693 game_select = gtk_combo_new ();
\r
694 gtk_combo_set_popdown_strings (GTK_COMBO (game_select), combo_list);
\r
695 gtk_widget_show (game_select);
\r
696 gtk_table_attach (GTK_TABLE (table2), game_select, 1, 2, 6, 7,
\r
697 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
698 (GtkAttachOptions) (0), 0, 0);
\r
700 gtk_signal_connect (GTK_OBJECT(GTK_COMBO (game_select)->entry), "changed",
\r
701 GTK_SIGNAL_FUNC (OnSelchangeComboWhatgame), NULL);
\r
703 g_list_free (combo_list);
\r
704 gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (game_select)->entry), FALSE);
\r
706 game = gtk_entry_new();
\r
707 fsgame_entry = GTK_ENTRY(game);
\r
708 gtk_widget_show(game);
\r
709 gtk_table_attach(GTK_TABLE(table2), game, 1, 2, 7, 8,
\r
710 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
711 (GtkAttachOptions) (0), 0, 0);
\r
714 wolf specific: select MP or SP mode
\r
716 if (g_pGameDescription->mGameFile == "wolf.game")
\r
719 combo_list = g_list_append (combo_list, (void *)sWolfSPCombo);
\r
720 combo_list = g_list_append (combo_list, (void *)sWolfMPCombo);
\r
722 gamemode_combo = gtk_combo_new ();
\r
723 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
\r
724 gtk_widget_show(gamemode_combo);
\r
725 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
\r
726 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
727 (GtkAttachOptions) (0), 0, 0);
\r
729 g_list_free (combo_list);
\r
732 label = gtk_label_new ("Mapping mode");
\r
733 gtk_widget_show (label);
\r
734 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
\r
735 (GtkAttachOptions) (GTK_FILL),
\r
736 (GtkAttachOptions) (0), 0, 0);
\r
737 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
742 if (g_pGameDescription->mGameFile == "jk2.game")
\r
745 combo_list = g_list_append (combo_list, (void *)sJK2SPCombo);
\r
746 combo_list = g_list_append (combo_list, (void *)sJK2MPCombo);
\r
748 gamemode_combo = gtk_combo_new ();
\r
749 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
\r
750 gtk_widget_show(gamemode_combo);
\r
751 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
\r
752 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
753 (GtkAttachOptions) (0), 0, 0);
\r
755 g_list_free (combo_list);
\r
758 label = gtk_label_new ("Mapping mode");
\r
759 gtk_widget_show (label);
\r
760 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
\r
761 (GtkAttachOptions) (GTK_FILL),
\r
762 (GtkAttachOptions) (0), 0, 0);
\r
763 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
767 if (g_pGameDescription->mGameFile == "ja.game")
\r
770 combo_list = g_list_append (combo_list, (void *)sJASPCombo);
\r
771 combo_list = g_list_append (combo_list, (void *)sJAMPCombo);
\r
773 gamemode_combo = gtk_combo_new ();
\r
774 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
\r
775 gtk_widget_show(gamemode_combo);
\r
776 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
\r
777 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
778 (GtkAttachOptions) (0), 0, 0);
\r
780 g_list_free (combo_list);
\r
783 label = gtk_label_new ("Mapping mode");
\r
784 gtk_widget_show (label);
\r
785 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
\r
786 (GtkAttachOptions) (GTK_FILL),
\r
787 (GtkAttachOptions) (0), 0, 0);
\r
788 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
792 if (g_pGameDescription->mGameFile == "stvef.game")
\r
795 combo_list = g_list_append (combo_list, (void *)sSTVEFSPCombo);
\r
796 combo_list = g_list_append (combo_list, (void *)sSTVEFMPCombo);
\r
798 gamemode_combo = gtk_combo_new ();
\r
799 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
\r
800 gtk_widget_show(gamemode_combo);
\r
801 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
\r
802 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
803 (GtkAttachOptions) (0), 0, 0);
\r
805 g_list_free (combo_list);
\r
808 label = gtk_label_new ("Mapping mode");
\r
809 gtk_widget_show (label);
\r
810 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
\r
811 (GtkAttachOptions) (GTK_FILL),
\r
812 (GtkAttachOptions) (0), 0, 0);
\r
813 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
817 if (g_pGameDescription->mGameFile == "sof2.game")
\r
820 combo_list = g_list_append (combo_list, (void *)sSOF2SPCombo);
\r
821 combo_list = g_list_append (combo_list, (void *)sSOF2MPCombo);
\r
823 gamemode_combo = gtk_combo_new ();
\r
824 gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
\r
825 gtk_widget_show(gamemode_combo);
\r
826 gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
\r
827 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
828 (GtkAttachOptions) (0), 0, 0);
\r
830 g_list_free (combo_list);
\r
833 label = gtk_label_new ("Mapping mode");
\r
834 gtk_widget_show (label);
\r
835 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
\r
836 (GtkAttachOptions) (GTK_FILL),
\r
837 (GtkAttachOptions) (0), 0, 0);
\r
838 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
845 base = gtk_entry_new ();
\r
846 g_object_set_data (G_OBJECT (project), "base", base);
\r
847 gtk_widget_show (base);
\r
848 gtk_table_attach (GTK_TABLE (table2), base, 1, 2, 0, 1,
\r
849 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
850 (GtkAttachOptions) (0), 0, 0);
\r
853 label = gtk_label_new ("basepath");
\r
854 gtk_widget_show (label);
\r
855 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
\r
856 (GtkAttachOptions) (GTK_FILL),
\r
857 (GtkAttachOptions) (0), 0, 0);
\r
858 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
861 label = gtk_label_new ("Select mod");
\r
862 gtk_widget_show (label);
\r
863 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 6, 7,
\r
864 (GtkAttachOptions) (GTK_FILL),
\r
865 (GtkAttachOptions) (0), 0, 0);
\r
866 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
868 label = gtk_label_new ("fs_game");
\r
869 gtk_widget_show (label);
\r
870 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 7, 8,
\r
871 (GtkAttachOptions) (GTK_FILL),
\r
872 (GtkAttachOptions) (0), 0, 0);
\r
873 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
875 // Initialize fields
\r
876 gtk_entry_set_text (GTK_ENTRY (base), ValueForKey (g_qeglobals.d_project_entity, "basepath"));
\r
877 UpdateBSPCommandList (project);
\r
878 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (brush), (g_qeglobals.m_bBrushPrimitMode) ? TRUE : FALSE);
\r
880 // initialise the fs_game selection from the project settings into the dialog
\r
881 const char *dir = ValueForKey (g_qeglobals.d_project_entity, "gamename");
\r
882 // HACK: hardcoded wolf stuff
\r
883 if (g_pGameDescription->mGameFile == "wolf.game")
\r
885 if ((strlen(dir) == 0) || !stricmp(dir,"main"))
\r
887 // no fs_game set, we are running stock Quake III Arena editing
\r
888 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfComboItem);
\r
889 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
890 gtk_widget_set_sensitive(game, false);
\r
894 // this is a custom mod
\r
895 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfModComboItem);
\r
896 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
897 gtk_widget_set_sensitive(game, true);
\r
900 // HACK: hardcoded et stuff
\r
901 if (g_pGameDescription->mGameFile == "et.game")
\r
903 if ((strlen(dir) == 0) || !stricmp(dir,"etmain"))
\r
905 // no fs_game set, we are running stock Quake III Arena editing
\r
906 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETComboItem);
\r
907 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
908 gtk_widget_set_sensitive(game, false);
\r
912 // this is a custom mod
\r
913 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETModComboItem);
\r
914 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
915 gtk_widget_set_sensitive(game, true);
\r
918 // HACK: hardcoded half-life stuff
\r
919 else if (g_pGameDescription->mGameFile == "hl.game")
\r
921 if ((strlen(dir) == 0) || !stricmp(dir,"valve"))
\r
923 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLComboItem);
\r
924 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
925 gtk_widget_set_sensitive(game, false);
\r
929 // this is a custom mod
\r
930 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLModComboItem);
\r
931 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
932 gtk_widget_set_sensitive(game, true);
\r
937 else if (g_pGameDescription->mGameFile == "jk2.game")
\r
939 if ((strlen(dir) == 0) || !stricmp(dir,"base"))
\r
941 // no fs_game set, we are running stock Quake III Arena editing
\r
942 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ComboItem);
\r
943 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
944 gtk_widget_set_sensitive(game, false);
\r
948 // this is a custom mod
\r
949 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ModComboItem);
\r
950 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
951 gtk_widget_set_sensitive(game, true);
\r
956 else if (g_pGameDescription->mGameFile == "ja.game")
\r
958 if ((strlen(dir) == 0) || !stricmp(dir,"base"))
\r
960 // no fs_game set, we are running stock editing
\r
961 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAComboItem);
\r
962 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
963 gtk_widget_set_sensitive(game, false);
\r
967 // this is a custom mod
\r
968 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAModComboItem);
\r
969 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
970 gtk_widget_set_sensitive(game, true);
\r
975 else if (g_pGameDescription->mGameFile == "stvef.game")
\r
977 if ((strlen(dir) == 0) || !stricmp(dir,"baseEf"))
\r
979 // no fs_game set, we are running stock Quake III Arena editing
\r
980 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFComboItem);
\r
981 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
982 gtk_widget_set_sensitive(game, false);
\r
986 // this is a custom mod
\r
987 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFModComboItem);
\r
988 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
989 gtk_widget_set_sensitive(game, true);
\r
994 else if (g_pGameDescription->mGameFile == "sof2.game")
\r
996 if ((strlen(dir) == 0) || !stricmp(dir,"base"))
\r
998 // no fs_game set, we are running stock Quake III Arena editing
\r
999 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ComboItem);
\r
1000 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
1001 gtk_widget_set_sensitive(game, false);
\r
1005 // this is a custom mod
\r
1006 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ModComboItem);
\r
1007 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
1008 gtk_widget_set_sensitive(game, true);
\r
1013 if ((strlen(dir) == 0) || !strcmp(dir,"baseq3"))
\r
1015 // no fs_game set, we are running stock Quake III Arena editing
\r
1016 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sQ3ComboItem);
\r
1017 gtk_entry_set_text (GTK_ENTRY (game), "");
\r
1018 gtk_widget_set_sensitive(game, false);
\r
1020 else if (!strcmp(dir,"missionpack"))
\r
1022 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sTAComboItem);
\r
1023 gtk_entry_set_text (GTK_ENTRY (game), "missionpack");
\r
1024 gtk_widget_set_sensitive(game, false);
\r
1028 // this is a custom mod
\r
1029 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sModComboItem);
\r
1030 gtk_entry_set_text (GTK_ENTRY (game), dir);
\r
1031 gtk_widget_set_sensitive(game, true);
\r
1035 // HACK: hardcoded wolf stuff
\r
1036 if (g_pGameDescription->mGameFile == "wolf.game")
\r
1038 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
\r
1039 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
\r
1041 // nothing set yet, or single player
\r
1042 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfSPCombo);
\r
1046 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfMPCombo);
\r
1051 else if (g_pGameDescription->mGameFile == "jk2.game")
\r
1053 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
\r
1054 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
\r
1056 // nothing set yet, or single player
\r
1057 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2SPCombo);
\r
1061 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2MPCombo);
\r
1065 else if (g_pGameDescription->mGameFile == "ja.game")
\r
1067 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
\r
1068 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
\r
1070 // nothing set yet, or single player
\r
1071 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJASPCombo);
\r
1075 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJAMPCombo);
\r
1079 else if (g_pGameDescription->mGameFile == "stvef.game")
\r
1081 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
\r
1082 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
\r
1084 // nothing set yet, or single player
\r
1085 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFSPCombo);
\r
1089 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFMPCombo);
\r
1093 else if (g_pGameDescription->mGameFile == "sof2.game")
\r
1095 const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
\r
1096 if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
\r
1098 // nothing set yet, or single player
\r
1099 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2SPCombo);
\r
1103 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2MPCombo);
\r
1107 gtk_grab_add (project);
\r
1108 gtk_widget_show (project);
\r
1110 g_pGameDescription->Dump();
\r
1113 gtk_main_iteration ();
\r
1121 // convert path to unix format
\r
1122 for(r = gtk_entry_get_text (GTK_ENTRY (base)), w=buf; *r != '\0'; r++, w++)
\r
1123 *w = (*r == '\\') ? '/' : *r;
\r
1125 if(w != buf && *(w-1) != '/') *(w++) = '/';
\r
1126 // terminate string
\r
1128 SetKeyValue (g_qeglobals.d_project_entity, "basepath", buf);
\r
1130 dir = gtk_entry_get_text (GTK_ENTRY (game));
\r
1131 // Hack: hard coded wolf stuff
\r
1132 if (g_pGameDescription->mGameFile == "wolf.game")
\r
1134 if (!strlen(dir) || !stricmp(dir,"main"))
\r
1136 DeleteKey (g_qeglobals.d_project_entity, "gamename");
\r
1140 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
\r
1143 // Hack: hard coded ET stuff
\r
1144 else if (g_pGameDescription->mGameFile == "et.game")
\r
1146 if (!strlen(dir) || !stricmp(dir,"etmain"))
\r
1148 DeleteKey (g_qeglobals.d_project_entity, "gamename");
\r
1152 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
\r
1155 // Hack: hard coded Half-life stuff
\r
1156 else if (g_pGameDescription->mGameFile == "hl.game")
\r
1158 if (!strlen(dir) || !stricmp(dir,"valve"))
\r
1160 DeleteKey (g_qeglobals.d_project_entity, "gamename");
\r
1164 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
\r
1167 else if (g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game")
\r
1169 if (!strlen(dir) || !stricmp(dir,"base"))
\r
1171 DeleteKey (g_qeglobals.d_project_entity, "gamename");
\r
1175 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
\r
1180 else if (g_pGameDescription->mGameFile == "stvef.game")
\r
1182 if (!strlen(dir) || !stricmp(dir,"baseEf"))
\r
1184 DeleteKey (g_qeglobals.d_project_entity, "gamename");
\r
1188 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
\r
1193 if (!strlen(dir) || !strcmp(dir,"baseq3"))
\r
1195 DeleteKey (g_qeglobals.d_project_entity, "gamename");
\r
1199 SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
\r
1203 // HACK: hardcoded wolf stuff
\r
1204 if (g_pGameDescription->mGameFile == "wolf.game")
\r
1206 // read from gamemode_combo
\r
1207 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
\r
1208 if (!strlen(gamemode) || !strcmp(gamemode, sWolfSPCombo))
\r
1210 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
\r
1214 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
\r
1220 if (g_pGameDescription->mGameFile == "jk2.game")
\r
1222 // read from gamemode_combo
\r
1223 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
\r
1224 if (!strlen(gamemode) || !strcmp(gamemode, sJK2SPCombo))
\r
1226 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
\r
1230 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
\r
1235 if (g_pGameDescription->mGameFile == "ja.game")
\r
1237 // read from gamemode_combo
\r
1238 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
\r
1239 if (!strlen(gamemode) || !strcmp(gamemode, sJASPCombo))
\r
1241 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
\r
1245 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
\r
1251 if (g_pGameDescription->mGameFile == "stvef.game")
\r
1253 // read from gamemode_combo
\r
1254 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
\r
1255 if (!strlen(gamemode) || !strcmp(gamemode, sSTVEFSPCombo))
\r
1257 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
\r
1261 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
\r
1265 g_qeglobals.m_strHomeMaps = g_qeglobals.m_strHomeGame;
\r
1266 const char* str = ValueForKey(g_qeglobals.d_project_entity, "gamename");
\r
1267 if(str[0] == '\0') str = g_pGameDescription->mBaseGame.GetBuffer();
\r
1268 g_qeglobals.m_strHomeMaps += str;
\r
1269 g_qeglobals.m_strHomeMaps += '/';
\r
1273 if (g_pGameDescription->mGameFile == "sof2.game")
\r
1275 // read from gamemode_combo
\r
1276 const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
\r
1277 if (!strlen(gamemode) || !strcmp(gamemode, sSOF2SPCombo))
\r
1279 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
\r
1283 SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
\r
1287 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (brush)))
\r
1288 g_qeglobals.m_bBrushPrimitMode = TRUE;
\r
1290 g_qeglobals.m_bBrushPrimitMode = FALSE;
\r
1292 SetKeyValue(g_qeglobals.d_project_entity, "brush_primit", (g_qeglobals.m_bBrushPrimitMode ? "1" : "0" ));
\r
1294 // QE_CheckProjectEntity();
\r
1296 QE_SaveProject( g_PrefsDlg.m_strLastProject.GetBuffer() );
\r
1299 gtk_grab_remove (project);
\r
1300 gtk_widget_destroy (project);
\r
1303 // =============================================================================
\r
1308 static GtkWidget *dlg;
\r
1309 GtkWidget *vbox, *vbox2, *hbox, *table, *button, *label, *scr;
\r
1310 GtkWidget *brushes_entry, *entities_entry, *net_entry;
\r
1311 int loop = 1, ret = IDCANCEL;
\r
1316 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
1318 load_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
\r
1320 gtk_window_set_title (GTK_WINDOW (dlg), "Map Info");
\r
1321 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
1322 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
1323 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
1324 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
1325 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
1326 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
1328 vbox = gtk_vbox_new (FALSE, 5);
\r
1329 gtk_widget_show (vbox);
\r
1330 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
1331 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
1333 hbox = gtk_hbox_new (FALSE, 5);
\r
1334 gtk_widget_show (hbox);
\r
1335 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
1337 table = gtk_table_new (3, 2, FALSE);
\r
1338 gtk_widget_show (table);
\r
1339 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
\r
1340 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
1341 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
1343 brushes_entry = gtk_entry_new ();
\r
1344 gtk_widget_show (brushes_entry);
\r
1345 gtk_table_attach (GTK_TABLE (table), brushes_entry, 1, 2, 0, 1,
\r
1346 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
1347 (GtkAttachOptions) (0), 0, 0);
\r
1348 gtk_entry_set_editable (GTK_ENTRY (brushes_entry), FALSE);
\r
1350 entities_entry = gtk_entry_new ();
\r
1351 gtk_widget_show (entities_entry);
\r
1352 gtk_table_attach (GTK_TABLE (table), entities_entry, 1, 2, 1, 2,
\r
1353 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
1354 (GtkAttachOptions) (0), 0, 0);
\r
1355 gtk_entry_set_editable (GTK_ENTRY (entities_entry), FALSE);
\r
1357 net_entry = gtk_entry_new ();
\r
1358 gtk_widget_show (net_entry);
\r
1359 gtk_table_attach (GTK_TABLE (table), net_entry, 1, 2, 2, 3,
\r
1360 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
1361 (GtkAttachOptions) (0), 0, 0);
\r
1362 gtk_entry_set_editable (GTK_ENTRY (net_entry), FALSE);
\r
1364 label = gtk_label_new ("Total Brushes");
\r
1365 gtk_widget_show (label);
\r
1366 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
1367 (GtkAttachOptions) (GTK_FILL),
\r
1368 (GtkAttachOptions) (0), 0, 0);
\r
1369 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
1371 label = gtk_label_new ("Total Entities");
\r
1372 gtk_widget_show (label);
\r
1373 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
1374 (GtkAttachOptions) (GTK_FILL),
\r
1375 (GtkAttachOptions) (0), 0, 0);
\r
1376 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
1378 label = gtk_label_new ("Net brush count\n(non entity)");
\r
1379 gtk_widget_show (label);
\r
1380 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
\r
1381 (GtkAttachOptions) (GTK_FILL),
\r
1382 (GtkAttachOptions) (0), 0, 0);
\r
1383 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
1385 vbox2 = gtk_vbox_new (FALSE, 5);
\r
1386 gtk_widget_show (vbox2);
\r
1387 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
\r
1389 button = gtk_button_new_with_label ("Close");
\r
1390 gtk_widget_show (button);
\r
1391 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
1392 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1393 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
1394 gtk_widget_set_usize (button, 60, -2);
\r
1396 label = gtk_label_new ("Entity breakdown");
\r
1397 gtk_widget_show (label);
\r
1398 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
\r
1399 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
1401 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
1402 gtk_widget_show (scr);
\r
1403 gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
\r
1404 gtk_container_set_border_width (GTK_CONTAINER (scr), 5);
\r
1405 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
1407 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
\r
1409 GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
\r
1412 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
1413 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(view), TRUE);
\r
1416 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
1417 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Entity", renderer, "text", 0, NULL);
\r
1418 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
1419 gtk_tree_view_column_set_sort_column_id(column, 0);
\r
1423 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
1424 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Count", renderer, "text", 1, NULL);
\r
1425 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
1426 gtk_tree_view_column_set_sort_column_id(column, 1);
\r
1429 gtk_widget_show(view);
\r
1431 gtk_container_add(GTK_CONTAINER (scr), view);
\r
1434 // Initialize fields
\r
1435 int TotalBrushes = 0, TotalEntities = 0, Net = 0;
\r
1437 for (brush_t* pBrush = active_brushes.next; pBrush != &active_brushes; pBrush = pBrush->next)
\r
1440 if (pBrush->owner == world_entity)
\r
1450 GSList *l, *entitymap = NULL;
\r
1453 for (entity_t* pEntity = entities.next; pEntity != &entities; pEntity=pEntity->next)
\r
1458 for (l = entitymap; l; l = g_slist_next (l))
\r
1460 entry = (map_t*)l->data;
\r
1462 if (strcmp (entry->name, pEntity->eclass->name) == 0)
\r
1472 entry = (map_t*)qmalloc (sizeof (map_t));
\r
1473 entry->name = pEntity->eclass->name;
\r
1475 entitymap = g_slist_append (entitymap, entry);
\r
1481 entry = (map_t*)entitymap->data;
\r
1483 sprintf (tmp, "%d", entry->count);
\r
1485 gtk_list_store_append(GTK_LIST_STORE(store), &iter);
\r
1486 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, entry->name, 1, tmp, -1);
\r
1488 entitymap = g_slist_remove (entitymap, entry);
\r
1491 g_object_unref(G_OBJECT(store));
\r
1494 sprintf (tmp, "%d", TotalBrushes);
\r
1495 gtk_entry_set_text (GTK_ENTRY (brushes_entry), tmp);
\r
1496 sprintf (tmp, "%d", TotalEntities);
\r
1497 gtk_entry_set_text (GTK_ENTRY (entities_entry), tmp);
\r
1498 sprintf (tmp, "%d", Net);
\r
1499 gtk_entry_set_text (GTK_ENTRY (net_entry), tmp);
\r
1501 gtk_grab_add (dlg);
\r
1502 gtk_widget_show (dlg);
\r
1505 gtk_main_iteration ();
\r
1507 // save before exit
\r
1508 save_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
\r
1510 gtk_grab_remove (dlg);
\r
1511 gtk_widget_destroy (dlg);
\r
1515 // =============================================================================
\r
1516 // Entity List dialog
\r
1518 static void entitylist_select (GtkWidget *widget, gpointer data)
\r
1520 GtkTreeView* view = GTK_TREE_VIEW(g_object_get_data (G_OBJECT (data), "entities"));
\r
1522 GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
\r
1524 GtkTreeModel* model;
\r
1525 GtkTreeIter selected;
\r
1526 if(gtk_tree_selection_get_selected(selection, &model, &selected))
\r
1528 entity_t* pEntity;
\r
1529 gtk_tree_model_get(model, &selected, 1, &pEntity, -1);
\r
1533 for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)
\r
1535 Select_Deselect ();
\r
1536 Select_Brush (pEntity->brushes.onext);
\r
1537 Sys_UpdateWindows(W_ALL);
\r
1543 static gint entitylist_click (GtkWidget *widget, GdkEventButton *event, gpointer data)
\r
1545 if (event->type == GDK_2BUTTON_PRESS)
\r
1547 entitylist_select (NULL, data);
\r
1553 static void entitylist_selection_changed(GtkTreeSelection* selection, gpointer data)
\r
1555 GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (data), "keyvalues"));
\r
1557 gtk_list_store_clear(store);
\r
1559 GtkTreeModel* model;
\r
1560 GtkTreeIter selected;
\r
1561 if(gtk_tree_selection_get_selected(selection, &model, &selected))
\r
1563 entity_t* pEntity;
\r
1564 gtk_tree_model_get(model, &selected, 1, &pEntity, -1);
\r
1568 for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)
\r
1570 GtkTreeIter appended;
\r
1571 gtk_list_store_append(store, &appended);
\r
1572 gtk_list_store_set(store, &appended, 0, pEpair->key, 1, pEpair->value, -1);
\r
1578 void DoEntityList ()
\r
1580 static GtkWidget *dlg;
\r
1581 GtkWidget *vbox, *hbox, *hbox2, *button, *scr;
\r
1582 int loop = 1, ret = IDCANCEL;
\r
1587 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
1589 load_window_pos (dlg, g_PrefsDlg.mWindowInfo.posEntityInfoWnd);
\r
1591 gtk_window_set_title (GTK_WINDOW (dlg), "Entities");
\r
1592 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
1593 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
1594 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
1595 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
1596 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
1597 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
1599 hbox = gtk_hbox_new (TRUE, 5);
\r
1600 gtk_widget_show (hbox);
\r
1601 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
1602 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
1604 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
1605 gtk_widget_show (scr);
\r
1606 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
\r
1607 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
1608 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
\r
1611 GtkTreeStore* store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
\r
1613 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
1614 g_signal_connect(G_OBJECT(view), "button_press_event", G_CALLBACK(entitylist_click), dlg);
\r
1615 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
\r
1618 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
1619 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
\r
1620 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
1624 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
\r
1625 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(entitylist_selection_changed), dlg);
\r
1628 gtk_widget_show(view);
\r
1630 gtk_container_add(GTK_CONTAINER (scr), view);
\r
1631 g_object_set_data (G_OBJECT (dlg), "entities", view);
\r
1635 GtkTreeIter child;
\r
1636 gtk_tree_store_append(store, &child, NULL);
\r
1637 gtk_tree_store_set(store, &child, 0, world_entity->eclass->name, 1, world_entity, -1);
\r
1640 GSList *l, *entitymap = NULL;
\r
1648 for (entity_t* pEntity=entities.next; pEntity != &entities; pEntity=pEntity->next)
\r
1650 GtkTreeIter parent;
\r
1651 bool found = false;
\r
1653 for (l = entitymap; l; l = g_slist_next (l))
\r
1655 entry = (map_t*)l->data;
\r
1657 if (strcmp (entry->name, pEntity->eclass->name) == 0)
\r
1659 parent = entry->node;
\r
1667 gtk_tree_store_append(store, &parent, NULL);
\r
1668 gtk_tree_store_set(store, &parent, 0, pEntity->eclass->name, 1, NULL, -1);
\r
1670 entry = (map_t*)malloc (sizeof(map_t));
\r
1671 entitymap = g_slist_append (entitymap, entry);
\r
1672 entry->name = pEntity->eclass->name;
\r
1673 entry->node = parent;
\r
1676 GtkTreeIter child;
\r
1677 gtk_tree_store_append(store, &child, &parent);
\r
1678 gtk_tree_store_set(store, &child, 0, pEntity->eclass->name, 1, pEntity, -1);
\r
1683 free (entitymap->data);
\r
1684 entitymap = g_slist_remove (entitymap, entitymap->data);
\r
1688 g_object_unref(G_OBJECT(store));
\r
1691 vbox = gtk_vbox_new (FALSE, 5);
\r
1692 gtk_widget_show (vbox);
\r
1693 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
1695 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
1696 gtk_widget_show (scr);
\r
1697 gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
\r
1698 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
1699 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
\r
1702 GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
\r
1704 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
1707 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
1708 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 0, NULL);
\r
1709 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
1713 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
1714 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Value", renderer, "text", 1, NULL);
\r
1715 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
1718 gtk_widget_show(view);
\r
1720 g_object_set_data(G_OBJECT(dlg), "keyvalues", store);
\r
1721 gtk_container_add(GTK_CONTAINER (scr), view);
\r
1723 g_object_unref(G_OBJECT(store));
\r
1726 hbox2 = gtk_hbox_new (FALSE, 5);
\r
1727 gtk_widget_show (hbox2);
\r
1728 gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);
\r
1730 button = gtk_button_new_with_label ("Select");
\r
1731 gtk_widget_show (button);
\r
1732 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
\r
1733 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1734 GTK_SIGNAL_FUNC (entitylist_select), dlg);
\r
1735 gtk_widget_set_usize (button, 60, -2);
\r
1737 button = gtk_button_new_with_label ("Close");
\r
1738 gtk_widget_show (button);
\r
1739 gtk_box_pack_end (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
\r
1740 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1741 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
1742 gtk_widget_set_usize (button, 60, -2);
\r
1744 gtk_grab_add (dlg);
\r
1745 gtk_widget_show (dlg);
\r
1748 gtk_main_iteration ();
\r
1750 save_window_pos (dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
\r
1752 gtk_grab_remove (dlg);
\r
1753 gtk_widget_destroy (dlg);
\r
1758 // =============================================================================
\r
1761 static void rotatedlg_apply (GtkWidget *widget, gpointer data)
\r
1763 GtkSpinButton *spin;
\r
1766 spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "x"));
\r
1767 f = gtk_spin_button_get_value_as_float (spin);
\r
1769 Select_RotateAxis(0,f);
\r
1770 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f); // reset to 0 on Apply
\r
1772 spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "y"));
\r
1773 f = gtk_spin_button_get_value_as_float (spin);
\r
1775 Select_RotateAxis(1,f);
\r
1776 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);
\r
1778 spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "z"));
\r
1779 f = gtk_spin_button_get_value_as_float (spin);
\r
1781 Select_RotateAxis(2,f);
\r
1782 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);
\r
1785 void DoRotateDlg ()
\r
1787 GtkWidget *dlg, *hbox, *vbox, *table, *label, *button;
\r
1788 GtkWidget *x, *y, *z;
\r
1790 int loop = 1, ret = IDCANCEL;
\r
1792 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
1793 gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary rotation");
\r
1794 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
1795 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
1796 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
1797 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
1798 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
1799 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
1801 hbox = gtk_hbox_new (FALSE, 5);
\r
1802 gtk_widget_show (hbox);
\r
1803 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
1804 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
1806 table = gtk_table_new (3, 2, FALSE);
\r
1807 gtk_widget_show (table);
\r
1808 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
\r
1809 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
1810 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
1812 label = gtk_label_new (" X ");
\r
1813 gtk_widget_show (label);
\r
1814 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
1815 (GtkAttachOptions) (0),
\r
1816 (GtkAttachOptions) (0), 0, 0);
\r
1818 label = gtk_label_new (" Y ");
\r
1819 gtk_widget_show (label);
\r
1820 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
1821 (GtkAttachOptions) (0),
\r
1822 (GtkAttachOptions) (0), 0, 0);
\r
1824 label = gtk_label_new (" Z ");
\r
1826 gtk_widget_show (label);
\r
1827 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
\r
1828 (GtkAttachOptions) (0),
\r
1829 (GtkAttachOptions) (0), 0, 0);
\r
1831 adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
\r
1832 x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
\r
1833 g_object_set_data (G_OBJECT (dlg), "x", x);
\r
1834 gtk_widget_show (x);
\r
1835 gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
\r
1836 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
1837 (GtkAttachOptions) (0), 0, 0);
\r
1838 gtk_widget_set_usize (x, 60, -2);
\r
1839 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (x), TRUE);
\r
1841 adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
\r
1842 y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
\r
1843 g_object_set_data (G_OBJECT (dlg), "y", y);
\r
1844 gtk_widget_show (y);
\r
1845 gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
\r
1846 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
1847 (GtkAttachOptions) (0), 0, 0);
\r
1848 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (y), TRUE);
\r
1850 adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
\r
1851 z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
\r
1852 g_object_set_data (G_OBJECT (dlg), "z", z);
\r
1853 gtk_widget_show (z);
\r
1854 gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,
\r
1855 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
1856 (GtkAttachOptions) (0), 0, 0);
\r
1857 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (z), TRUE);
\r
1859 vbox = gtk_vbox_new (FALSE, 5);
\r
1860 gtk_widget_show (vbox);
\r
1861 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
1863 button = gtk_button_new_with_label ("OK");
\r
1864 gtk_widget_show (button);
\r
1865 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
1866 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1867 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
1868 gtk_widget_set_usize (button, 60, -2);
\r
1870 button = gtk_button_new_with_label ("Cancel");
\r
1871 gtk_widget_show (button);
\r
1872 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
1873 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1874 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
1876 button = gtk_button_new_with_label ("Apply");
\r
1877 gtk_widget_show (button);
\r
1878 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
1879 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1880 GTK_SIGNAL_FUNC (rotatedlg_apply), dlg);
\r
1882 gtk_grab_add (dlg);
\r
1883 gtk_widget_show (dlg);
\r
1886 gtk_main_iteration ();
\r
1889 rotatedlg_apply (button, dlg);
\r
1891 gtk_grab_remove (dlg);
\r
1892 gtk_widget_destroy (dlg);
\r
1895 // =============================================================================
\r
1900 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
\r
1901 int loop = 1, ret = IDCANCEL;
\r
1903 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
1904 gtk_window_set_title (GTK_WINDOW (dlg), "Gamma");
\r
1905 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
1906 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
1907 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
1908 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
1909 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
1910 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
1912 hbox = gtk_hbox_new (FALSE, 5);
\r
1913 gtk_widget_show (hbox);
\r
1914 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
1915 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
1917 vbox = gtk_vbox_new (FALSE, 5);
\r
1918 gtk_widget_show (vbox);
\r
1919 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
1921 entry = gtk_entry_new ();
\r
1922 gtk_widget_show (entry);
\r
1923 gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
\r
1925 label = gtk_label_new ("0.0 is brightest\n1.0 is darkest");
\r
1926 gtk_widget_show (label);
\r
1927 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
\r
1929 label = gtk_label_new ("You must restart for the\nsettings to take effect");
\r
1930 gtk_widget_show (label);
\r
1931 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
\r
1933 vbox = gtk_vbox_new (FALSE, 5);
\r
1934 gtk_widget_show (vbox);
\r
1935 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
1937 button = gtk_button_new_with_label ("OK");
\r
1938 gtk_widget_show (button);
\r
1939 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
1940 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1941 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
1942 gtk_widget_set_usize (button, 60, -2);
\r
1944 button = gtk_button_new_with_label ("Cancel");
\r
1945 gtk_widget_show (button);
\r
1946 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
1947 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
1948 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
1950 // Initialize dialog
\r
1952 sprintf (buf, "%1.1f", g_qeglobals.d_savedinfo.fGamma);
\r
1953 gtk_entry_set_text (GTK_ENTRY (entry), buf);
\r
1955 gtk_grab_add (dlg);
\r
1956 gtk_widget_show (dlg);
\r
1959 gtk_main_iteration ();
\r
1962 g_qeglobals.d_savedinfo.fGamma = g_strtod (gtk_entry_get_text (GTK_ENTRY (entry)), NULL);
\r
1964 gtk_grab_remove (dlg);
\r
1965 gtk_widget_destroy (dlg);
\r
1968 // =============================================================================
\r
1969 // Find Brush Dialog
\r
1971 // helper function to walk through the active brushes only and drop the regioned out ones
\r
1972 bool WalkRegionBrush (brush_t **b, entity_t *e)
\r
1977 for(b2=active_brushes.next ; b2 != &active_brushes ; b2=b2->next)
\r
1980 break; // this is an active brush
\r
1982 if (b2==&active_brushes)
\r
1984 // this is a regioned out brush
\r
1986 if (*b == &e->brushes)
\r
1988 Sys_Status ("No such brush", 0);
\r
1992 } while (b2==&active_brushes);
\r
1996 void SelectBrush (int entitynum, int brushnum)
\r
2002 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503
\r
2003 // making this work when regioning is on too
\r
2005 if (entitynum == 0)
\r
2009 e = entities.next;
\r
2010 while (--entitynum)
\r
2013 if (e == &entities)
\r
2015 Sys_Status ("No such entity", 0);
\r
2018 if (region_active)
\r
2020 // we need to make sure we walk to the next 'active' entity to have a valid --entitynum
\r
2021 // that is, find a brush that belongs to this entity in the active brushes
\r
2024 for (b = active_brushes.next ; b != &active_brushes ; b=b->next)
\r
2026 if (b->owner == e)
\r
2027 break; // this is an active entity
\r
2029 if (b==&active_brushes)
\r
2031 // this is a regioned out entity
\r
2033 // don't walk past the end either
\r
2034 if (e == &entities)
\r
2036 Sys_Status ("No such entity", 0);
\r
2040 } while(b==&active_brushes);
\r
2045 b = e->brushes.onext;
\r
2046 if (b == &e->brushes)
\r
2048 Sys_Status ("No such brush", 0);
\r
2051 if (region_active)
\r
2053 if (!WalkRegionBrush(&b, e))
\r
2057 while (brushnum--)
\r
2060 if (b == &e->brushes)
\r
2062 Sys_Status ("No such brush", 0);
\r
2065 if (region_active)
\r
2067 if (!WalkRegionBrush(&b, e))
\r
2072 Brush_RemoveFromList (b);
\r
2073 Brush_AddToList (b, &selected_brushes);
\r
2075 Sys_UpdateWindows (W_ALL);
\r
2076 for (i = 0; i < 3; i++)
\r
2078 if (g_pParentWnd->GetXYWnd())
\r
2079 g_pParentWnd->GetXYWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
\r
2081 if (g_pParentWnd->GetXZWnd())
\r
2082 g_pParentWnd->GetXZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
\r
2084 if (g_pParentWnd->GetYZWnd())
\r
2085 g_pParentWnd->GetYZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
\r
2088 Sys_Status ("Selected", 0);
\r
2091 static void GetSelectionIndex (int *ent, int *brush)
\r
2096 *ent = *brush = 0;
\r
2098 b = selected_brushes.next;
\r
2099 if (b == &selected_brushes)
\r
2103 if (b->owner != world_entity)
\r
2106 for (entity = entities.next; entity != &entities; entity=entity->next, (*ent)++)
\r
2111 for (b2=b->owner->brushes.onext; b2 != b && b2 != &b->owner->brushes; b2=b2->onext, (*brush)++)
\r
2117 GtkWidget *dlg, *vbox, *hbox, *table, *label, *button, *entity, *brush;
\r
2118 int loop = 1, ret = IDCANCEL;
\r
2120 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2121 gtk_window_set_title (GTK_WINDOW (dlg), "Find Brush");
\r
2122 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2123 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2124 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2125 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2126 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2127 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2129 vbox = gtk_vbox_new (FALSE, 5);
\r
2130 gtk_widget_show (vbox);
\r
2131 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
2132 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
2134 table = gtk_table_new (2, 2, FALSE);
\r
2135 gtk_widget_show (table);
\r
2136 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
\r
2137 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
2138 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
2140 label = gtk_label_new ("Entity number");
\r
2141 gtk_widget_show (label);
\r
2142 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
2143 (GtkAttachOptions) (0),
\r
2144 (GtkAttachOptions) (0), 0, 0);
\r
2146 label = gtk_label_new ("Brush number");
\r
2147 gtk_widget_show (label);
\r
2148 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
2149 (GtkAttachOptions) (0),
\r
2150 (GtkAttachOptions) (0), 0, 0);
\r
2152 entity = gtk_entry_new ();
\r
2153 gtk_widget_show (entity);
\r
2154 gtk_table_attach (GTK_TABLE (table), entity, 1, 2, 0, 1,
\r
2155 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2156 (GtkAttachOptions) (0), 0, 0);
\r
2158 brush = gtk_entry_new ();
\r
2159 gtk_widget_show (brush);
\r
2160 gtk_table_attach (GTK_TABLE (table), brush, 1, 2, 1, 2,
\r
2161 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2162 (GtkAttachOptions) (0), 0, 0);
\r
2164 hbox = gtk_hbox_new (FALSE, 5);
\r
2165 gtk_widget_show (hbox);
\r
2166 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
2168 button = gtk_button_new_with_label ("OK");
\r
2169 gtk_widget_show (button);
\r
2170 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
\r
2171 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2172 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2173 gtk_widget_set_usize (button, 60, -2);
\r
2175 button = gtk_button_new_with_label ("Cancel");
\r
2176 gtk_widget_show (button);
\r
2177 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
\r
2178 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2179 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
2181 // Initialize dialog
\r
2185 GetSelectionIndex (&ent, &br);
\r
2186 sprintf (buf, "%i", ent);
\r
2187 gtk_entry_set_text (GTK_ENTRY (entity), buf);
\r
2188 sprintf (buf, "%i", br);
\r
2189 gtk_entry_set_text (GTK_ENTRY (brush), buf);
\r
2191 gtk_grab_add (dlg);
\r
2192 gtk_widget_show (dlg);
\r
2195 gtk_main_iteration ();
\r
2199 const char *entstr = gtk_entry_get_text (GTK_ENTRY (entity));
\r
2200 const char *brushstr = gtk_entry_get_text (GTK_ENTRY (brush));
\r
2201 SelectBrush (atoi(entstr), atoi(brushstr));
\r
2204 gtk_grab_remove (dlg);
\r
2205 gtk_widget_destroy (dlg);
\r
2208 // =============================================================================
\r
2209 // Arbitrary Sides dialog
\r
2211 void DoSides (bool bCone, bool bSphere, bool bTorus)
\r
2213 GtkWidget *dlg, *vbox, *hbox, *button, *label, *entry;
\r
2214 int loop = 1, ret = IDCANCEL;
\r
2216 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2217 gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary sides");
\r
2218 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2219 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2220 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2221 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2222 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2223 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2225 hbox = gtk_hbox_new (FALSE, 5);
\r
2226 gtk_widget_show (hbox);
\r
2227 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
2228 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
2230 label = gtk_label_new ("Sides:");
\r
2231 gtk_widget_show (label);
\r
2232 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
\r
2234 entry = gtk_entry_new ();
\r
2235 gtk_widget_show (entry);
\r
2236 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
\r
2238 vbox = gtk_vbox_new (FALSE, 5);
\r
2239 gtk_widget_show (vbox);
\r
2240 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
\r
2242 button = gtk_button_new_with_label ("OK");
\r
2243 gtk_widget_show (button);
\r
2244 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2245 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2246 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2247 gtk_widget_set_usize (button, 60, -2);
\r
2249 button = gtk_button_new_with_label ("Cancel");
\r
2250 gtk_widget_show (button);
\r
2251 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2252 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2253 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
2255 gtk_grab_add (dlg);
\r
2256 gtk_widget_show (dlg);
\r
2259 gtk_main_iteration ();
\r
2263 const char *str = gtk_entry_get_text (GTK_ENTRY (entry));
\r
2266 Brush_MakeSidedCone(atoi(str));
\r
2268 Brush_MakeSidedSphere(atoi(str));
\r
2270 Brush_MakeSided (atoi(str));
\r
2273 gtk_grab_remove (dlg);
\r
2274 gtk_widget_destroy (dlg);
\r
2277 // =============================================================================
\r
2278 // New Patch dialog
\r
2280 void DoNewPatchDlg ()
\r
2282 GtkWidget *dlg, *hbox, *table, *vbox, *label, *button, *combo;
\r
2283 GtkWidget *width, *height;
\r
2284 GList *combo_list = (GList*)NULL;
\r
2285 int loop = 1, ret = IDCANCEL;
\r
2287 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2288 gtk_window_set_title (GTK_WINDOW (dlg), "Patch density");
\r
2289 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2290 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2291 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2292 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2293 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2294 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2296 hbox = gtk_hbox_new (FALSE, 5);
\r
2297 gtk_widget_show (hbox);
\r
2298 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
2299 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
2301 table = gtk_table_new (2, 2, FALSE);
\r
2302 gtk_widget_show (table);
\r
2303 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
\r
2304 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
2305 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
2307 label = gtk_label_new ("Width:");
\r
2308 gtk_widget_show (label);
\r
2309 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
2310 (GtkAttachOptions) (GTK_FILL),
\r
2311 (GtkAttachOptions) (0), 0, 0);
\r
2312 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2314 label = gtk_label_new ("Height:");
\r
2315 gtk_widget_show (label);
\r
2316 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
2317 (GtkAttachOptions) (GTK_FILL),
\r
2318 (GtkAttachOptions) (0), 0, 0);
\r
2319 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2321 combo_list = g_list_append (combo_list, (void *)"3");
\r
2322 combo_list = g_list_append (combo_list, (void *)"5");
\r
2323 combo_list = g_list_append (combo_list, (void *)"7");
\r
2324 combo_list = g_list_append (combo_list, (void *)"9");
\r
2325 combo_list = g_list_append (combo_list, (void *)"11");
\r
2326 combo_list = g_list_append (combo_list, (void *)"13");
\r
2327 combo_list = g_list_append (combo_list, (void *)"15");
\r
2329 combo = gtk_combo_new ();
\r
2330 width = GTK_COMBO (combo)->entry;
\r
2331 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
\r
2332 gtk_widget_show (combo);
\r
2333 gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 0, 1,
\r
2334 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2335 (GtkAttachOptions) (0), 0, 0);
\r
2337 combo = gtk_combo_new ();
\r
2338 height = GTK_COMBO (combo)->entry;
\r
2339 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
\r
2340 gtk_widget_show (combo);
\r
2341 gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 1, 2,
\r
2342 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2343 (GtkAttachOptions) (0), 0, 0);
\r
2345 vbox = gtk_vbox_new (FALSE, 5);
\r
2346 gtk_widget_show (vbox);
\r
2347 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
2349 button = gtk_button_new_with_label ("OK");
\r
2350 gtk_widget_show (button);
\r
2351 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2352 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2353 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2354 gtk_widget_set_usize (button, 60, -2);
\r
2356 button = gtk_button_new_with_label ("Cancel");
\r
2357 gtk_widget_show (button);
\r
2358 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2359 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2360 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
2362 // Initialize dialog
\r
2363 g_list_free (combo_list);
\r
2364 gtk_entry_set_text (GTK_ENTRY (width), "3");
\r
2365 gtk_entry_set_editable (GTK_ENTRY (width), FALSE);
\r
2366 gtk_entry_set_text (GTK_ENTRY (height), "3");
\r
2367 gtk_entry_set_editable (GTK_ENTRY (height), FALSE);
\r
2369 gtk_grab_add (dlg);
\r
2370 gtk_widget_show (dlg);
\r
2373 gtk_main_iteration ();
\r
2377 const char* w = gtk_entry_get_text (GTK_ENTRY (width));
\r
2378 const char* h = gtk_entry_get_text (GTK_ENTRY (height));
\r
2380 Patch_GenericMesh(atoi (w), atoi (h), g_pParentWnd->ActiveXY ()->GetViewType ());
\r
2381 Sys_UpdateWindows (W_ALL);
\r
2384 gtk_grab_remove (dlg);
\r
2385 gtk_widget_destroy (dlg);
\r
2388 // =============================================================================
\r
2389 // New Patch dialog
\r
2391 void DoScaleDlg ()
\r
2393 GtkWidget *dlg, *hbox, *table, *vbox, *label, *button;
\r
2394 GtkWidget *x, *y, *z;
\r
2395 int loop = 1, ret = IDCANCEL;
\r
2397 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2398 gtk_window_set_title (GTK_WINDOW (dlg), "Scale");
\r
2399 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2400 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2401 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2402 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2403 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2404 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2406 hbox = gtk_hbox_new (FALSE, 5);
\r
2407 gtk_widget_show (hbox);
\r
2408 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
2409 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
2411 table = gtk_table_new (3, 2, FALSE);
\r
2412 gtk_widget_show (table);
\r
2413 gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
\r
2414 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
2415 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
2417 label = gtk_label_new ("X:");
\r
2418 gtk_widget_show (label);
\r
2419 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
2420 (GtkAttachOptions) (GTK_FILL),
\r
2421 (GtkAttachOptions) (0), 0, 0);
\r
2422 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2424 label = gtk_label_new ("Y:");
\r
2425 gtk_widget_show (label);
\r
2426 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
2427 (GtkAttachOptions) (GTK_FILL),
\r
2428 (GtkAttachOptions) (0), 0, 0);
\r
2429 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2431 label = gtk_label_new ("Z:");
\r
2432 gtk_widget_show (label);
\r
2433 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
\r
2434 (GtkAttachOptions) (GTK_FILL),
\r
2435 (GtkAttachOptions) (0), 0, 0);
\r
2436 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2438 x = gtk_entry_new ();
\r
2439 gtk_widget_show (x);
\r
2440 gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
\r
2441 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2442 (GtkAttachOptions) (0), 0, 0);
\r
2444 y = gtk_entry_new ();
\r
2445 gtk_widget_show (y);
\r
2446 gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
\r
2447 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2448 (GtkAttachOptions) (0), 0, 0);
\r
2450 z = gtk_entry_new ();
\r
2451 gtk_widget_show (z);
\r
2452 gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,
\r
2453 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
2454 (GtkAttachOptions) (0), 0, 0);
\r
2456 vbox = gtk_vbox_new (FALSE, 5);
\r
2457 gtk_widget_show (vbox);
\r
2458 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
2460 button = gtk_button_new_with_label ("OK");
\r
2461 gtk_widget_show (button);
\r
2462 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2463 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2464 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2465 gtk_widget_set_usize (button, 60, -2);
\r
2467 button = gtk_button_new_with_label ("Cancel");
\r
2468 gtk_widget_show (button);
\r
2469 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2470 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2471 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
2473 // Initialize dialog
\r
2474 gtk_entry_set_text (GTK_ENTRY (x), "1.0");
\r
2475 gtk_entry_set_text (GTK_ENTRY (y), "1.0");
\r
2476 gtk_entry_set_text (GTK_ENTRY (z), "1.0");
\r
2478 gtk_grab_add (dlg);
\r
2479 gtk_widget_show (dlg);
\r
2482 gtk_main_iteration ();
\r
2487 sx = atof (gtk_entry_get_text (GTK_ENTRY (x)));
\r
2488 sy = atof (gtk_entry_get_text (GTK_ENTRY (y)));
\r
2489 sz = atof (gtk_entry_get_text (GTK_ENTRY (z)));
\r
2491 if (sx > 0 && sy > 0 && sz > 0)
\r
2493 Select_Scale(sx, sy, sz);
\r
2494 Sys_UpdateWindows (W_ALL);
\r
2497 Sys_Printf("Warning.. Tried to scale by a zero value.");
\r
2500 gtk_grab_remove (dlg);
\r
2501 gtk_widget_destroy (dlg);
\r
2504 // =============================================================================
\r
2505 // Thicken Patch dialog
\r
2507 void DoThickenDlg ()
\r
2509 GtkWidget *dlg, *vbox, *hbox, *vbox2, *button, *label;
\r
2510 GtkWidget *amount, *seams, *group;
\r
2511 int loop = 1, ret = IDCANCEL;
\r
2512 static qboolean bGroupResult = true;
\r
2514 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2515 gtk_window_set_title (GTK_WINDOW (dlg), "Thicken Patch");
\r
2516 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2517 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2518 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2519 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2520 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2521 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2523 vbox = gtk_vbox_new (FALSE, 5);
\r
2524 gtk_widget_show (vbox);
\r
2525 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
2526 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
2528 hbox = gtk_hbox_new (FALSE, 5);
\r
2529 gtk_widget_show (hbox);
\r
2530 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
2532 label = gtk_label_new ("This produces a set of patches\n"
\r
2533 "that contains the original patch along with the\n"
\r
2534 "'thick' patch and an optimal set of seam patches.");
\r
2535 gtk_widget_show (label);
\r
2536 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
\r
2538 vbox2 = gtk_vbox_new (FALSE, 5);
\r
2539 gtk_widget_show (vbox2);
\r
2540 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
\r
2542 button = gtk_button_new_with_label ("OK");
\r
2543 gtk_widget_show (button);
\r
2544 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
2545 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2546 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2547 gtk_widget_set_usize (button, 60, -2);
\r
2549 button = gtk_button_new_with_label ("Cancel");
\r
2550 gtk_widget_show (button);
\r
2551 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
2552 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2553 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
2555 hbox = gtk_hbox_new (FALSE, 5);
\r
2556 gtk_widget_show (hbox);
\r
2557 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
2559 label = gtk_label_new ("Amount:");
\r
2560 gtk_widget_show (label);
\r
2561 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
\r
2563 amount = gtk_entry_new ();
\r
2564 gtk_widget_show (amount);
\r
2565 gtk_box_pack_start (GTK_BOX (hbox), amount, FALSE, FALSE, 0);
\r
2567 seams = gtk_check_button_new_with_label ("Seams");
\r
2568 gtk_widget_show (seams);
\r
2569 gtk_box_pack_start (GTK_BOX (hbox), seams, FALSE, FALSE, 0);
\r
2572 group = gtk_check_button_new_with_label("Result to func_group");
\r
2573 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(group), bGroupResult);
\r
2574 gtk_box_pack_start(GTK_BOX(vbox), group, FALSE, FALSE, 0);
\r
2575 gtk_widget_show(group);
\r
2578 // Initialize dialog
\r
2579 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (seams), TRUE);
\r
2580 gtk_entry_set_text (GTK_ENTRY (amount), "8");
\r
2582 gtk_grab_add (dlg);
\r
2583 gtk_widget_show (dlg);
\r
2586 gtk_main_iteration ();
\r
2590 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group)))
\r
2591 bGroupResult = true;
\r
2593 bGroupResult = false;
\r
2594 Patch_Thicken (atoi (gtk_entry_get_text (GTK_ENTRY (amount))),
\r
2595 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (seams)), bGroupResult);
\r
2596 Sys_UpdateWindows (W_ALL);
\r
2599 gtk_grab_remove (dlg);
\r
2600 gtk_widget_destroy (dlg);
\r
2603 // =============================================================================
\r
2604 // About dialog (no program is complete without one)
\r
2606 void about_button_changelog (GtkWidget *widget, gpointer data)
\r
2609 log = g_strAppPath;
\r
2610 log += "changelog.txt";
\r
2611 OpenURL(log.GetBuffer());
\r
2614 void about_button_credits (GtkWidget *widget, gpointer data)
\r
2617 cred = g_strAppPath;
\r
2618 cred += "credits.html";
\r
2619 OpenURL(cred.GetBuffer());
\r
2624 GtkWidget *dlg, *vbox, *vbox2, *hbox, *frame, *table, *label, *pixmap, *button, *sc_extensions, *text_extensions;
\r
2625 int loop = 1, ret = IDCANCEL;
\r
2627 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2628 gtk_window_set_title (GTK_WINDOW (dlg), "About GtkRadiant");
\r
2629 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2630 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2631 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2632 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2633 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2634 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2636 vbox = gtk_vbox_new (FALSE, 10);
\r
2637 gtk_widget_show (vbox);
\r
2638 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
2639 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
2641 hbox = gtk_hbox_new (FALSE, 5);
\r
2642 gtk_widget_show (hbox);
\r
2643 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
2645 vbox2 = gtk_vbox_new (FALSE, 5);
\r
2646 gtk_widget_show (vbox2);
\r
2647 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, FALSE, 0);
\r
2649 frame = gtk_frame_new ((char*)NULL);
\r
2650 gtk_widget_show (frame);
\r
2651 gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
\r
2652 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
\r
2654 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "logo.bmp");
\r
2655 gtk_widget_show (pixmap);
\r
2656 gtk_container_add (GTK_CONTAINER (frame), pixmap);
\r
2658 label = gtk_label_new ("GtkRadiant " RADIANT_VERSION "\n"
\r
2660 RADIANT_ABOUTMSG "\n\n"
\r
2661 "By qeradiant.com\n\n"
\r
2662 "This product contains software technology\n"
\r
2663 "from id Software, Inc. ('id Technology').\n"
\r
2664 "id Technology 2000 id Software,Inc.\n\n"
\r
2665 "GtkRadiant is unsupported, however\n"
\r
2666 "you may report your problems at\n"
\r
2667 "http://zerowing.idsoftware.com/bugzilla"
\r
2670 gtk_widget_show (label);
\r
2671 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
\r
2672 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
2673 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
\r
2675 vbox2 = gtk_vbox_new (FALSE, 5);
\r
2676 gtk_widget_show (vbox2);
\r
2677 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
\r
2679 button = gtk_button_new_with_label ("OK");
\r
2680 gtk_widget_show (button);
\r
2681 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
2682 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2683 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2685 button = gtk_button_new_with_label ("Credits");
\r
2686 gtk_widget_show (button);
\r
2687 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
2688 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2689 GTK_SIGNAL_FUNC (about_button_credits), NULL);
\r
2691 button = gtk_button_new_with_label ("Changelog");
\r
2692 gtk_widget_show (button);
\r
2693 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
2694 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2695 GTK_SIGNAL_FUNC (about_button_changelog), NULL);
\r
2697 frame = gtk_frame_new ("OpenGL Properties");
\r
2698 gtk_widget_show (frame);
\r
2699 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
\r
2701 table = gtk_table_new (3, 2, FALSE);
\r
2702 gtk_widget_show (table);
\r
2703 gtk_container_add (GTK_CONTAINER (frame), table);
\r
2704 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
2705 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
2706 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
\r
2708 label = gtk_label_new ("Vendor:");
\r
2709 gtk_widget_show (label);
\r
2710 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
2711 (GtkAttachOptions) (GTK_FILL),
\r
2712 (GtkAttachOptions) (0), 0, 0);
\r
2713 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2715 label = gtk_label_new ("Version:");
\r
2716 gtk_widget_show (label);
\r
2717 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
2718 (GtkAttachOptions) (GTK_FILL),
\r
2719 (GtkAttachOptions) (0), 0, 0);
\r
2720 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2722 label = gtk_label_new ("Renderer:");
\r
2723 gtk_widget_show (label);
\r
2724 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
\r
2725 (GtkAttachOptions) (GTK_FILL),
\r
2726 (GtkAttachOptions) (0), 0, 0);
\r
2727 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2729 label = gtk_label_new ((char*)qglGetString (GL_VENDOR));
\r
2730 gtk_widget_show (label);
\r
2731 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
\r
2732 (GtkAttachOptions) (GTK_FILL),
\r
2733 (GtkAttachOptions) (0), 0, 0);
\r
2734 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2736 label = gtk_label_new ((char*)qglGetString (GL_VERSION));
\r
2737 gtk_widget_show (label);
\r
2738 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
\r
2739 (GtkAttachOptions) (GTK_FILL),
\r
2740 (GtkAttachOptions) (0), 0, 0);
\r
2741 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2743 label = gtk_label_new ((char*)qglGetString (GL_RENDERER));
\r
2744 gtk_widget_show (label);
\r
2745 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,
\r
2746 (GtkAttachOptions) (GTK_FILL),
\r
2747 (GtkAttachOptions) (0), 0, 0);
\r
2748 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
2750 frame = gtk_frame_new ("OpenGL Extensions");
\r
2751 gtk_widget_show (frame);
\r
2752 gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
\r
2754 hbox = gtk_hbox_new (FALSE, 5);
\r
2755 gtk_widget_show (hbox);
\r
2756 gtk_container_add (GTK_CONTAINER (frame), hbox);
\r
2757 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
2759 sc_extensions = gtk_scrolled_window_new(NULL, NULL);
\r
2760 gtk_box_pack_start(GTK_BOX(hbox), sc_extensions, TRUE, TRUE, 0);
\r
2761 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_extensions), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
\r
2762 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sc_extensions), GTK_SHADOW_IN);
\r
2763 gtk_widget_show(sc_extensions);
\r
2765 text_extensions = gtk_text_view_new();
\r
2766 gtk_text_view_set_editable(GTK_TEXT_VIEW(text_extensions), FALSE);
\r
2767 gtk_container_add (GTK_CONTAINER (sc_extensions), text_extensions);
\r
2768 GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_extensions));
\r
2769 gtk_text_buffer_set_text(buffer, (char *)qglGetString(GL_EXTENSIONS), -1);
\r
2770 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_extensions), GTK_WRAP_WORD);;
\r
2771 gtk_widget_show(text_extensions);
\r
2773 gtk_grab_add (dlg);
\r
2774 gtk_widget_show (dlg);
\r
2777 gtk_main_iteration ();
\r
2779 gtk_grab_remove (dlg);
\r
2780 gtk_widget_destroy (dlg);
\r
2783 // =============================================================================
\r
2784 // Command List dialog
\r
2786 void DoCommandListDlg ()
\r
2788 GtkWidget *dlg, *vbox, *hbox, *scr, *button;
\r
2789 int loop = 1, ret = IDCANCEL;
\r
2791 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2792 gtk_window_set_title (GTK_WINDOW (dlg), "Mapped Commands");
\r
2793 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2794 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2795 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2796 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2797 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2798 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2799 gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);
\r
2801 hbox = gtk_hbox_new (FALSE, 5);
\r
2802 gtk_widget_show (hbox);
\r
2803 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
2804 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
2806 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
2807 gtk_widget_show (scr);
\r
2808 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
\r
2809 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
2810 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
\r
2813 GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
\r
2815 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
2818 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
2819 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Command", renderer, "text", 0, NULL);
\r
2820 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
2824 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
2825 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 1, NULL);
\r
2826 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
2829 gtk_widget_show(view);
\r
2830 gtk_container_add(GTK_CONTAINER (scr), view);
\r
2833 // Initialize dialog
\r
2835 path = g_strTempPath;
\r
2836 path += "commandlist.txt";
\r
2838 GSList *cmds = NULL;
\r
2841 for (n = 0; n < g_nCommandCount; n++)
\r
2842 cmds = g_slist_append (cmds, g_Commands[n].m_strCommand);
\r
2843 cmds = g_slist_sort (cmds, (gint (*)(const void *, const void *))strcmp);
\r
2845 Sys_Printf("Writing the command list to %s", path.GetBuffer() );
\r
2846 FILE* fileout = fopen (path.GetBuffer (), "wt");
\r
2850 for (n = 0; n < g_nCommandCount; n++)
\r
2851 if (cmds->data == g_Commands[n].m_strCommand)
\r
2854 char c = g_Commands[n].m_nKey;
\r
2855 CString strLine, strMod(""), strKeys (c);
\r
2857 for (int k = 0; k < g_nKeyCount; k++)
\r
2859 if (g_Keys[k].m_nVKKey == g_Commands[n].m_nKey)
\r
2861 strKeys = g_Keys[k].m_strName;
\r
2866 if (g_Commands[n].m_nModifiers & RAD_SHIFT)
\r
2868 if (g_Commands[n].m_nModifiers & RAD_ALT)
\r
2869 strMod += (strMod.GetLength() > 0) ? " + Alt" : "Alt";
\r
2870 if (g_Commands[n].m_nModifiers & RAD_CONTROL)
\r
2871 strMod += (strMod.GetLength() > 0) ? " + Control" : "Control";
\r
2872 if (strMod.GetLength() > 0)
\r
2874 strMod += strKeys;
\r
2878 gtk_list_store_append(store, &iter);
\r
2879 gtk_list_store_set(store, &iter, 0, g_Commands[n].m_strCommand, 1, strMod.GetBuffer (), -1);
\r
2882 if (fileout != NULL)
\r
2884 strLine.Format("%-25s %s\r\n", g_Commands[n].m_strCommand, strMod.GetBuffer ());
\r
2885 fputs (strLine.GetBuffer (), fileout);
\r
2888 cmds = g_slist_remove (cmds, cmds->data);
\r
2891 if (fileout != NULL)
\r
2895 g_object_unref(G_OBJECT(store));
\r
2898 vbox = gtk_vbox_new (FALSE, 5);
\r
2899 gtk_widget_show (vbox);
\r
2900 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
2902 button = gtk_button_new_with_label ("Close");
\r
2903 gtk_widget_show (button);
\r
2904 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2905 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2906 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2907 gtk_widget_set_usize (button, 60, -2);
\r
2909 gtk_grab_add (dlg);
\r
2910 gtk_widget_show (dlg);
\r
2913 gtk_main_iteration ();
\r
2915 gtk_grab_remove (dlg);
\r
2916 gtk_widget_destroy (dlg);
\r
2919 // =============================================================================
\r
2920 // Texture List dialog
\r
2922 void DoTextureListDlg ()
\r
2924 GtkWidget *dlg, *vbox, *hbox, *scr, *button;
\r
2925 int loop = 1, ret = IDCANCEL;
\r
2927 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
2928 gtk_window_set_title (GTK_WINDOW (dlg), "Textures");
\r
2929 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
2930 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
2931 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
2932 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
2933 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
2934 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
2935 gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);
\r
2937 hbox = gtk_hbox_new (FALSE, 5);
\r
2938 gtk_widget_show (hbox);
\r
2939 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
2940 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
2942 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
2943 gtk_widget_show (scr);
\r
2944 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
\r
2945 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
2946 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
\r
2948 GtkWidget* texture_list;
\r
2951 GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
\r
2953 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
2954 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
\r
2957 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
2958 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
\r
2959 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
2962 gtk_widget_show(view);
\r
2963 gtk_container_add(GTK_CONTAINER (scr), view);
\r
2966 // Initialize dialog
\r
2967 GSList *textures = (GSList*)NULL;
\r
2968 FillTextureMenu(&textures);
\r
2969 while (textures != NULL)
\r
2973 gtk_list_store_append(store, &iter);
\r
2974 gtk_list_store_set(store, &iter, 0, (gchar*)textures->data, -1);
\r
2976 free (textures->data);
\r
2977 textures = g_slist_remove (textures, textures->data);
\r
2981 g_object_unref(G_OBJECT(store));
\r
2983 texture_list = view;
\r
2986 vbox = gtk_vbox_new (FALSE, 5);
\r
2987 gtk_widget_show (vbox);
\r
2988 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
2990 button = gtk_button_new_with_label ("Load");
\r
2991 gtk_widget_show (button);
\r
2992 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
2993 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
2994 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
2995 gtk_widget_set_usize (button, 60, -2);
\r
2997 button = gtk_button_new_with_label ("Close");
\r
2998 gtk_widget_show (button);
\r
2999 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3000 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3001 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3002 gtk_widget_set_usize (button, 60, -2);
\r
3004 gtk_grab_add (dlg);
\r
3005 gtk_widget_show (dlg);
\r
3008 gtk_main_iteration ();
\r
3012 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(texture_list));
\r
3014 GtkTreeModel* model;
\r
3016 if(gtk_tree_selection_get_selected(selection, &model, &iter))
\r
3018 GtkTreePath* path = gtk_tree_model_get_path(model, &iter);
\r
3019 if(gtk_tree_path_get_depth(path) == 1)
\r
3020 Texture_ShowDirectory(gtk_tree_path_get_indices(path)[0] + CMD_TEXTUREWAD);
\r
3021 gtk_tree_path_free(path);
\r
3025 gtk_grab_remove (dlg);
\r
3026 gtk_widget_destroy (dlg);
\r
3029 // =============================================================================
\r
3032 int DoCapDlg (int *type, bool *b_GroupResult)
\r
3034 GtkWidget *dlg, *vbox, *hbox, *table, *pixmap, *button, *group_toggle, *radio_vbox;
\r
3035 GtkWidget *bevel, *endcap, *ibevel, *iendcap;
\r
3036 GSList *group = (GSList*)NULL;
\r
3037 int loop = 1, ret = IDCANCEL;
\r
3039 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3040 gtk_window_set_title (GTK_WINDOW (dlg), "Cap");
\r
3041 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3042 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3043 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3044 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3045 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3046 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3048 hbox = gtk_hbox_new (FALSE, 5);
\r
3049 gtk_widget_show (hbox);
\r
3050 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
3051 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
3053 // Gef: Added a vbox to contain the toggle buttons
\r
3054 radio_vbox = gtk_vbox_new(FALSE, 4);
\r
3055 gtk_container_add(GTK_CONTAINER(hbox), radio_vbox);
\r
3056 gtk_widget_show(radio_vbox);
\r
3058 table = gtk_table_new (4, 2, FALSE);
\r
3059 gtk_widget_show (table);
\r
3060 gtk_box_pack_start (GTK_BOX (radio_vbox), table, TRUE, TRUE, 0);
\r
3061 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
3062 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
3064 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_bevel.bmp");
\r
3065 gtk_widget_show (pixmap);
\r
3066 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 0, 1,
\r
3067 (GtkAttachOptions) (GTK_FILL),
\r
3068 (GtkAttachOptions) (0), 0, 0);
\r
3070 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_endcap.bmp");
\r
3071 gtk_widget_show (pixmap);
\r
3072 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 1, 2,
\r
3073 (GtkAttachOptions) (GTK_FILL),
\r
3074 (GtkAttachOptions) (0), 0, 0);
\r
3076 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_ibevel.bmp");
\r
3077 gtk_widget_show (pixmap);
\r
3078 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 2, 3,
\r
3079 (GtkAttachOptions) (GTK_FILL),
\r
3080 (GtkAttachOptions) (0), 0, 0);
\r
3082 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_iendcap.bmp");
\r
3083 gtk_widget_show (pixmap);
\r
3084 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 3, 4,
\r
3085 (GtkAttachOptions) (GTK_FILL),
\r
3086 (GtkAttachOptions) (0), 0, 0);
\r
3088 bevel = gtk_radio_button_new_with_label (group, "Bevel");
\r
3089 gtk_widget_show (bevel);
\r
3090 gtk_table_attach (GTK_TABLE (table), bevel, 1, 2, 0, 1,
\r
3091 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
\r
3092 (GtkAttachOptions) (0), 0, 0);
\r
3093 group = gtk_radio_button_group (GTK_RADIO_BUTTON (bevel));
\r
3095 endcap = gtk_radio_button_new_with_label (group, "Endcap");
\r
3096 gtk_widget_show (endcap);
\r
3097 gtk_table_attach (GTK_TABLE (table), endcap, 1, 2, 1, 2,
\r
3098 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
\r
3099 (GtkAttachOptions) (0), 0, 0);
\r
3100 group = gtk_radio_button_group (GTK_RADIO_BUTTON (endcap));
\r
3102 ibevel = gtk_radio_button_new_with_label (group, "Inverted Bevel");
\r
3103 gtk_widget_show (ibevel);
\r
3104 gtk_table_attach (GTK_TABLE (table), ibevel, 1, 2, 2, 3,
\r
3105 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
\r
3106 (GtkAttachOptions) (0), 0, 0);
\r
3107 group = gtk_radio_button_group (GTK_RADIO_BUTTON (ibevel));
\r
3109 iendcap = gtk_radio_button_new_with_label (group, "Inverted Endcap");
\r
3110 gtk_widget_show (iendcap);
\r
3111 gtk_table_attach (GTK_TABLE (table), iendcap, 1, 2, 3, 4,
\r
3112 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
\r
3113 (GtkAttachOptions) (0), 0, 0);
\r
3114 group = gtk_radio_button_group (GTK_RADIO_BUTTON (iendcap));
\r
3116 // Gef: added radio toggle for func_grouping capped patches
\r
3117 group_toggle = gtk_check_button_new_with_label("Result to func_group");
\r
3118 gtk_container_add(GTK_CONTAINER(radio_vbox), group_toggle);
\r
3119 gtk_widget_show(group_toggle);
\r
3121 vbox = gtk_vbox_new (FALSE, 5);
\r
3122 gtk_widget_show (vbox);
\r
3123 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
3125 button = gtk_button_new_with_label ("OK");
\r
3126 gtk_widget_show (button);
\r
3127 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3128 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3129 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
3130 gtk_widget_set_usize (button, 60, -2);
\r
3132 button = gtk_button_new_with_label ("Cancel");
\r
3133 gtk_widget_show (button);
\r
3134 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3135 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3136 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3137 gtk_widget_set_usize (button, 60, -2);
\r
3139 // Gef: Set the state of the func_group toggle
\r
3140 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (group_toggle), *b_GroupResult);
\r
3142 // Initialize dialog
\r
3143 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bevel), TRUE);
\r
3145 gtk_grab_add (dlg);
\r
3146 gtk_widget_show (dlg);
\r
3149 gtk_main_iteration ();
\r
3153 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (bevel)))
\r
3154 *type = BEVEL; //*type = CapDialog::BEVEL;
\r
3155 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (endcap)))
\r
3156 *type = ENDCAP; //*type = CapDialog::ENDCAP;
\r
3157 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ibevel)))
\r
3158 *type = IBEVEL; // *type = CapDialog::IBEVEL;
\r
3159 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (iendcap)))
\r
3160 *type = IENDCAP; // *type = CapDialog::IENDCAP;
\r
3162 // Gef: Added toggle for optional cap func_grouping
\r
3163 *b_GroupResult = (bool *)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group_toggle));
\r
3166 gtk_grab_remove (dlg);
\r
3167 gtk_widget_destroy (dlg);
\r
3172 // =============================================================================
\r
3173 // Scripts dialog
\r
3175 void DoScriptsDlg ()
\r
3177 GtkWidget *dlg, *vbox, *vbox2, *hbox, *label, *button, *scr;
\r
3178 int loop = 1, ret = IDCANCEL;
\r
3180 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3181 gtk_window_set_title (GTK_WINDOW (dlg), "Available Scripts - Not Implemented Yet");
\r
3182 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3183 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3184 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3185 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3186 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3187 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3189 vbox = gtk_vbox_new (FALSE, 5);
\r
3190 gtk_widget_show (vbox);
\r
3191 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
3192 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
3194 label = gtk_label_new ("WARNING: BrushScripting is in a highly experimental state and is\n"
\r
3195 "far from complete. If you attempt to use them it is VERY LIKELY\n"
\r
3196 "that Radiant will crash. Save your work before attempting to\n"
\r
3197 "make use of any scripting features.");
\r
3198 gtk_widget_show (label);
\r
3199 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
\r
3200 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
3201 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
\r
3203 hbox = gtk_hbox_new (FALSE, 5);
\r
3204 gtk_widget_show (hbox);
\r
3205 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
\r
3207 scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
\r
3208 gtk_widget_show (scr);
\r
3209 gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
\r
3210 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
\r
3211 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
\r
3213 GtkWidget* scripts_list;
\r
3216 GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
\r
3218 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
\r
3219 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
\r
3222 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
\r
3223 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
\r
3224 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
\r
3227 gtk_widget_show(view);
\r
3228 gtk_container_add(GTK_CONTAINER (scr), view);
\r
3231 // Initialize dialog
\r
3233 strINI = g_strGameToolsPath;
\r
3234 strINI += "/scripts.ini";
\r
3237 f = fopen (strINI.GetBuffer(), "rt");
\r
3240 char line[1024], *ptr;
\r
3242 // read section names
\r
3243 while (fgets (line, 1024, f) != 0)
\r
3245 if (line[0] != '[')
\r
3248 ptr = strchr (line, ']');
\r
3253 gtk_list_store_append(store, &iter);
\r
3254 gtk_list_store_set(store, &iter, 0, line, -1);
\r
3261 g_object_unref(G_OBJECT(store));
\r
3263 scripts_list = view;
\r
3266 vbox2 = gtk_vbox_new (FALSE, 5);
\r
3267 gtk_widget_show (vbox2);
\r
3268 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
\r
3270 button = gtk_button_new_with_label ("Run");
\r
3271 gtk_widget_show (button);
\r
3272 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
3273 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3274 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
3275 gtk_widget_set_usize (button, 60, -2);
\r
3277 button = gtk_button_new_with_label ("New...");
\r
3278 gtk_widget_show (button);
\r
3279 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
3280 gtk_widget_set_sensitive (button, FALSE);
\r
3281 gtk_widget_set_usize (button, 60, -2);
\r
3283 button = gtk_button_new_with_label ("Edit...");
\r
3284 gtk_widget_show (button);
\r
3285 gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
3286 gtk_widget_set_sensitive (button, FALSE);
\r
3287 gtk_widget_set_usize (button, 60, -2);
\r
3289 button = gtk_button_new_with_label ("Close");
\r
3290 gtk_widget_show (button);
\r
3291 gtk_box_pack_end (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
\r
3292 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3293 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3294 gtk_widget_set_usize (button, 60, -2);
\r
3296 gtk_grab_add (dlg);
\r
3297 gtk_widget_show (dlg);
\r
3300 gtk_main_iteration ();
\r
3304 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(scripts_list));
\r
3306 GtkTreeModel* model;
\r
3308 if(gtk_tree_selection_get_selected(selection, &model, &iter))
\r
3311 gtk_tree_model_get(model, &iter, 0, &script, -1);
\r
3312 RunScriptByName(script, true);
\r
3317 gtk_grab_remove (dlg);
\r
3318 gtk_widget_destroy (dlg);
\r
3321 // =============================================================================
\r
3324 int DoBSInputDlg (const char *fields[5], float values[5])
\r
3326 GtkWidget *dlg, *vbox, *hbox, *label, *button;
\r
3327 GtkWidget *entries[5];
\r
3328 int i, loop = 1, ret = IDCANCEL;
\r
3330 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3331 gtk_window_set_title (GTK_WINDOW (dlg), "BrushScript Input");
\r
3332 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3333 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3334 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3335 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3336 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3337 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3339 hbox = gtk_hbox_new (FALSE, 5);
\r
3340 gtk_widget_show (hbox);
\r
3341 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
3342 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
3344 vbox = gtk_vbox_new (FALSE, 5);
\r
3345 gtk_widget_show (vbox);
\r
3346 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
3348 // Create entries and initialize them
\r
3349 for (i = 0; i < 5; i++)
\r
3351 if (strlen (fields[i]) == 0)
\r
3354 label = gtk_label_new (fields[i]);
\r
3355 gtk_widget_show (label);
\r
3356 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
\r
3357 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
\r
3358 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
\r
3360 entries[i] = gtk_entry_new ();
\r
3361 gtk_widget_show (entries[i]);
\r
3362 gtk_box_pack_start (GTK_BOX (vbox), entries[i], TRUE, TRUE, 0);
\r
3365 sprintf (buf, "%f", values[i]);
\r
3366 gtk_entry_set_text (GTK_ENTRY (entries[i]), buf);
\r
3369 vbox = gtk_vbox_new (FALSE, 5);
\r
3370 gtk_widget_show (vbox);
\r
3371 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
3373 button = gtk_button_new_with_label ("OK");
\r
3374 gtk_widget_show (button);
\r
3375 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3376 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3377 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
3378 gtk_widget_set_usize (button, 60, -2);
\r
3380 button = gtk_button_new_with_label ("Cancel");
\r
3381 gtk_widget_show (button);
\r
3382 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3383 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3384 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3385 gtk_widget_set_usize (button, 60, -2);
\r
3387 gtk_grab_add (dlg);
\r
3388 gtk_widget_show (dlg);
\r
3391 gtk_main_iteration ();
\r
3393 for (i = 0; i < 5; i++)
\r
3395 if (strlen (fields[i]) == 0)
\r
3398 values[i] = atof (gtk_entry_get_text (GTK_ENTRY (entries[i])));
\r
3401 gtk_grab_remove (dlg);
\r
3402 gtk_widget_destroy (dlg);
\r
3407 // =============================================================================
\r
3408 // TextureLayout dialog
\r
3410 int DoTextureLayout (float *fx, float *fy)
\r
3412 GtkWidget *dlg, *vbox, *hbox, *table, *label, *button;
\r
3414 int loop = 1, ret = IDCANCEL;
\r
3416 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3417 gtk_window_set_title (GTK_WINDOW (dlg), "Patch texture layout");
\r
3418 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3419 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3420 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3421 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3422 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3423 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3425 hbox = gtk_hbox_new (FALSE, 5);
\r
3426 gtk_widget_show (hbox);
\r
3427 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
3428 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
3430 vbox = gtk_vbox_new (FALSE, 5);
\r
3431 gtk_widget_show (vbox);
\r
3432 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
3434 label = gtk_label_new ("Texture will be fit across the patch based\n"
\r
3435 "on the x and y values given. Values of 1x1\n"
\r
3436 "will \"fit\" the texture. 2x2 will repeat\n"
\r
3437 "it twice, etc.");
\r
3438 gtk_widget_show (label);
\r
3439 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
\r
3440 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
\r
3442 table = gtk_table_new (2, 2, FALSE);
\r
3443 gtk_widget_show (table);
\r
3444 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
\r
3445 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
\r
3446 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
\r
3448 label = gtk_label_new ("Texture x:");
\r
3449 gtk_widget_show (label);
\r
3450 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
\r
3451 (GtkAttachOptions) (GTK_FILL),
\r
3452 (GtkAttachOptions) (0), 0, 0);
\r
3453 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
3455 label = gtk_label_new ("Texture y:");
\r
3456 gtk_widget_show (label);
\r
3457 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
\r
3458 (GtkAttachOptions) (GTK_FILL),
\r
3459 (GtkAttachOptions) (0), 0, 0);
\r
3460 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
3462 x = gtk_entry_new ();
\r
3463 gtk_widget_show (x);
\r
3464 gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
\r
3465 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
3466 (GtkAttachOptions) (0), 0, 0);
\r
3468 y = gtk_entry_new ();
\r
3469 gtk_widget_show (y);
\r
3470 gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
\r
3471 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
\r
3472 (GtkAttachOptions) (0), 0, 0);
\r
3474 vbox = gtk_vbox_new (FALSE, 5);
\r
3475 gtk_widget_show (vbox);
\r
3476 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
3478 button = gtk_button_new_with_label ("OK");
\r
3479 gtk_widget_show (button);
\r
3480 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3481 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3482 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
3483 gtk_widget_set_usize (button, 60, -2);
\r
3485 button = gtk_button_new_with_label ("Cancel");
\r
3486 gtk_widget_show (button);
\r
3487 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3488 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3489 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3490 gtk_widget_set_usize (button, 60, -2);
\r
3493 gtk_entry_set_text (GTK_ENTRY (x), "4.0");
\r
3494 gtk_entry_set_text (GTK_ENTRY (y), "4.0");
\r
3496 gtk_grab_add (dlg);
\r
3497 gtk_widget_show (dlg);
\r
3500 gtk_main_iteration ();
\r
3504 *fx = atof (gtk_entry_get_text (GTK_ENTRY (x)));
\r
3505 *fy = atof (gtk_entry_get_text (GTK_ENTRY (y)));
\r
3508 gtk_grab_remove (dlg);
\r
3509 gtk_widget_destroy (dlg);
\r
3514 // =============================================================================
\r
3517 char* DoNameDlg (const char* title)
\r
3519 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
\r
3520 int loop = 1, ret = IDCANCEL;
\r
3523 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3524 gtk_window_set_title (GTK_WINDOW (dlg), title);
\r
3525 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3526 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3527 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3528 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3529 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3530 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3532 hbox = gtk_hbox_new (FALSE, 5);
\r
3533 gtk_widget_show (hbox);
\r
3534 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
3535 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
3537 label = gtk_label_new ("Name:");
\r
3538 gtk_widget_show (label);
\r
3539 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
\r
3541 entry = gtk_entry_new ();
\r
3542 gtk_widget_show (entry);
\r
3543 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
\r
3545 vbox = gtk_vbox_new (FALSE, 5);
\r
3546 gtk_widget_show (vbox);
\r
3547 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
3549 button = gtk_button_new_with_label ("OK");
\r
3550 gtk_widget_show (button);
\r
3551 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3552 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3553 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
3554 gtk_widget_set_usize (button, 60, -2);
\r
3556 button = gtk_button_new_with_label ("Cancel");
\r
3557 gtk_widget_show (button);
\r
3558 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3559 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3560 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3561 gtk_widget_set_usize (button, 60, -2);
\r
3563 gtk_grab_add (dlg);
\r
3564 gtk_widget_show (dlg);
\r
3567 gtk_main_iteration ();
\r
3570 str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
\r
3574 gtk_grab_remove (dlg);
\r
3575 gtk_widget_destroy (dlg);
\r
3580 // =============================================================================
\r
3581 // NewProject dialog
\r
3583 char* DoNewProjectDlg ()
\r
3585 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry, *check;
\r
3586 int loop = 1, ret = IDCANCEL;
\r
3589 // start by a warning message
\r
3590 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=459
\r
3592 msg = "Are you sure you want a new project?\n";
\r
3593 msg += "Please note that creating a new project is not the prefered way to setup GtkRadiant for mod editing.\n";
\r
3594 msg += "Check http://www.qeradiant.com/faq/index.cgi?file=220 for more information";
\r
3595 if (gtk_MessageBox(NULL, msg.GetBuffer(), "Confirm", MB_YESNO, "http://www.qeradiant.com/faq/index.cgi?file=220" ) == IDNO)
\r
3600 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3601 gtk_window_set_title (GTK_WINDOW (dlg), "New Project");
\r
3602 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3603 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3604 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3605 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3606 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3607 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3609 hbox = gtk_hbox_new (FALSE, 10);
\r
3610 gtk_widget_show (hbox);
\r
3611 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
3612 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
3614 vbox = gtk_vbox_new (FALSE, 5);
\r
3615 gtk_widget_show (vbox);
\r
3616 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
3618 label = gtk_label_new ("This will create a new directory beneath your\n"
\r
3619 "game path based on the project name you give.");
\r
3620 gtk_widget_show (label);
\r
3621 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
\r
3622 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
\r
3624 label = gtk_label_new ("Project name:");
\r
3625 gtk_widget_show (label);
\r
3626 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
\r
3627 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
\r
3628 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
\r
3630 entry = gtk_entry_new ();
\r
3631 gtk_widget_show (entry);
\r
3632 gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
\r
3634 check = gtk_check_button_new_with_label ("Include game dll files");
\r
3635 gtk_widget_show (check);
\r
3636 gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0);
\r
3637 gtk_widget_set_sensitive (check, FALSE);
\r
3639 vbox = gtk_vbox_new (FALSE, 5);
\r
3640 gtk_widget_show (vbox);
\r
3641 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
3643 button = gtk_button_new_with_label ("OK");
\r
3644 gtk_widget_show (button);
\r
3645 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3646 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3647 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
3648 gtk_widget_set_usize (button, 60, -2);
\r
3650 button = gtk_button_new_with_label ("Cancel");
\r
3651 gtk_widget_show (button);
\r
3652 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
3653 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3654 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
3655 gtk_widget_set_usize (button, 60, -2);
\r
3657 gtk_grab_add (dlg);
\r
3658 gtk_widget_show (dlg);
\r
3661 gtk_main_iteration ();
\r
3664 str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
\r
3668 gtk_grab_remove (dlg);
\r
3669 gtk_widget_destroy (dlg);
\r
3674 // =============================================================================
\r
3675 // Text Editor dialog
\r
3677 // master window widget
\r
3678 static GtkWidget *text_editor = NULL;
\r
3679 static GtkWidget *text_widget; // slave, text widget from the gtk editor
\r
3681 static gint editor_delete (GtkWidget *widget, gpointer data)
\r
3683 if (gtk_MessageBox (widget, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)
\r
3686 gtk_widget_hide (text_editor);
\r
3691 static void editor_save (GtkWidget *widget, gpointer data)
\r
3693 FILE *f = fopen ((char*)g_object_get_data (G_OBJECT (data), "filename"), "w");
\r
3694 gpointer text = g_object_get_data (G_OBJECT (data), "text");
\r
3698 gtk_MessageBox (GTK_WIDGET(data), "Error saving file !");
\r
3702 char *str = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);
\r
3703 fwrite (str, 1, strlen (str), f);
\r
3707 static void editor_close (GtkWidget *widget, gpointer data)
\r
3709 if (gtk_MessageBox (text_editor, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)
\r
3712 gtk_widget_hide (text_editor);
\r
3715 // several attempts
\r
3716 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355
\r
3720 HWND FindEditWindow()
\r
3722 return FindWindow("TFormEditPadLite", NULL);
\r
3725 HWND FindEditWindow()
\r
3727 HWND hwnd = FindWindow("TFormEditPadLite", NULL);
\r
3730 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
\r
3733 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
\r
3736 hwnd = FindWindowEx(hwnd, NULL, "TEditPadEditor", NULL);
\r
3739 hwnd = FindWindowEx(hwnd, NULL, "TWinControlProxy", NULL);
\r
3748 HWND FindEditWindow()
\r
3750 HWND hwnd = FindWindow("TFormEditPadLite", NULL);
\r
3753 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
\r
3756 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
\r
3759 hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
\r
3762 hwnd = FindWindowEx(hwnd, NULL, "TFrameSearchReplace", NULL);
\r
3765 hwnd = FindWindowEx(hwnd, NULL, "TJGStringEditorControl", NULL);
\r
3775 HWND FindEditWindow()
\r
3777 HWND hwnd = FindWindow("TEditPadForm", NULL);
\r
3778 HWND hwndEdit = NULL;
\r
3781 HWND hwndTab = FindWindowEx(hwnd, NULL, "TTabControl", NULL);
\r
3782 if (hwndTab != NULL)
\r
3784 hwndEdit = FindWindowEx(hwndTab, NULL, "TRicherEdit", NULL);
\r
3792 static void CreateGtkTextEditor ()
\r
3795 GtkWidget *vbox, *hbox, *button, *scr, *text;
\r
3797 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3799 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3800 GTK_SIGNAL_FUNC (editor_delete), NULL);
\r
3801 gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 300);
\r
3803 vbox = gtk_vbox_new (FALSE, 5);
\r
3804 gtk_widget_show (vbox);
\r
3805 gtk_container_add (GTK_CONTAINER (dlg), vbox);
\r
3806 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
\r
3808 scr = gtk_scrolled_window_new (NULL, NULL);
\r
3809 gtk_widget_show (scr);
\r
3810 gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
\r
3811 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
\r
3812 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
\r
3814 text = gtk_text_view_new();
\r
3815 gtk_container_add (GTK_CONTAINER (scr), text);
\r
3816 gtk_widget_show (text);
\r
3817 g_object_set_data (G_OBJECT (dlg), "text", text);
\r
3818 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), TRUE);
\r
3820 hbox = gtk_hbox_new (FALSE, 5);
\r
3821 gtk_widget_show (hbox);
\r
3822 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
\r
3824 button = gtk_button_new_with_label ("Close");
\r
3825 gtk_widget_show (button);
\r
3826 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
\r
3827 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3828 GTK_SIGNAL_FUNC (editor_close), dlg);
\r
3829 gtk_widget_set_usize (button, 60, -2);
\r
3831 button = gtk_button_new_with_label ("Save");
\r
3832 gtk_widget_show (button);
\r
3833 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
\r
3834 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
3835 GTK_SIGNAL_FUNC (editor_save), dlg);
\r
3836 gtk_widget_set_usize (button, 60, -2);
\r
3838 text_editor = dlg;
\r
3839 text_widget = text;
\r
3842 static void DoGtkTextEditor (const char* filename, guint cursorpos)
\r
3845 CreateGtkTextEditor(); // build it the first time we need it
\r
3848 FILE *f = fopen (filename, "r");
\r
3852 Sys_Printf("Unable to load file %s in shader editor.\n", filename);
\r
3853 gtk_widget_hide (text_editor);
\r
3857 fseek (f, 0, SEEK_END);
\r
3858 int len = ftell (f);
\r
3859 void *buf = qmalloc (len);
\r
3860 void *old_filename;
\r
3863 fread (buf, 1, len, f);
\r
3865 gtk_window_set_title (GTK_WINDOW (text_editor), filename);
\r
3867 GtkTextBuffer* text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget));
\r
3868 gtk_text_buffer_set_text(text_buffer, (char*)buf, len);
\r
3870 old_filename = g_object_get_data (G_OBJECT (text_editor), "filename");
\r
3872 free(old_filename);
\r
3873 g_object_set_data (G_OBJECT (text_editor), "filename", strdup (filename));
\r
3875 // trying to show later
\r
3876 gtk_widget_show (text_editor);
\r
3879 while (gtk_events_pending ())
\r
3880 gtk_main_iteration ();
\r
3883 // only move the cursor if it's not exceeding the size..
\r
3884 // NOTE: this is erroneous, cursorpos is the offset in bytes, not in characters
\r
3885 // len is the max size in bytes, not in characters either, but the character count is below that limit..
\r
3886 // thinking .. the difference between character count and byte count would be only because of CR/LF?
\r
3888 GtkTextIter text_iter;
\r
3889 // character offset, not byte offset
\r
3890 gtk_text_buffer_get_iter_at_offset(text_buffer, &text_iter, cursorpos);
\r
3891 gtk_text_buffer_place_cursor(text_buffer, &text_iter);
\r
3895 gtk_widget_queue_draw(text_widget);
\r
3903 void DoTextEditor (const char* filename, int cursorpos)
\r
3905 CString strEditCommand;
\r
3907 if (g_PrefsDlg.m_bUseWin32Editor)
\r
3909 Sys_Printf("opening file '%s' (line %d info ignored)\n", filename);
\r
3910 ShellExecute((HWND)GDK_WINDOW_HWND (g_pParentWnd->m_pWidget->window), "open", filename, NULL, NULL, SW_SHOW );
\r
3914 // check if a custom editor is set
\r
3915 if((g_PrefsDlg.m_bUseCustomEditor) && (g_PrefsDlg.m_strEditorCommand.GetLength() > 0))
\r
3917 strEditCommand = g_PrefsDlg.m_strEditorCommand;
\r
3918 strEditCommand += " \"";
\r
3919 strEditCommand += filename;
\r
3920 strEditCommand += "\"";
\r
3922 Sys_Printf("Launching: %s\n", strEditCommand.GetBuffer());
\r
3923 // note: linux does not return false if the command failed so it will assume success
\r
3924 if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)
\r
3926 Sys_FPrintf(SYS_WRN, "Warning: Failed to execute %s, using default\n", strEditCommand.GetBuffer());
\r
3930 // the command (appeared) to run successfully, no need to do anything more
\r
3936 DoGtkTextEditor (filename, cursorpos);
\r
3938 // old win32 code with EditPad bindings, broken
\r
3939 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355
\r
3941 strEditCommand = g_strAppPath.GetBuffer();
\r
3942 strEditCommand += "editpad.exe";
\r
3943 strEditCommand += " \"";
\r
3944 strEditCommand += filename;
\r
3945 strEditCommand += "\"";
\r
3946 if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)
\r
3948 Sys_FPrintf(SYS_WRN, "WARNING: Gtk shader editor is not fully functional on windows in general and unstable on win98 in particular.\n");
\r
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");
\r
3950 DoGtkTextEditor (filename, cursorpos);
\r
3954 // TTimo: we used to call Delay here, to continue processing messages. But it seems to induce a lot of instabilities.
\r
3955 // so now the user will simply have to wait.
\r
3958 // now grab the edit window and scroll to the shader we want to edit
\r
3959 HWND hwndEdit = FindEditWindow();
\r
3961 if (hwndEdit != NULL)
\r
3962 PostMessage(hwndEdit, EM_SETSEL, cursorpos, cursorpos);
\r
3964 Sys_Printf("Unable to load shader editor.\n");
\r
3969 // =============================================================================
\r
3970 // Light Intensity dialog
\r
3972 int DoLightIntensityDlg (int *intensity)
\r
3974 GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
\r
3975 int loop = 1, ret = IDCANCEL;
\r
3977 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
\r
3978 gtk_window_set_title (GTK_WINDOW (dlg), "Light intensity");
\r
3979 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
\r
3980 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
\r
3981 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
\r
3982 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
\r
3983 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
\r
3984 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
\r
3986 GtkAccelGroup *accel_group = gtk_accel_group_new ();
\r
3987 gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
\r
3989 hbox = gtk_hbox_new (FALSE, 5);
\r
3990 gtk_widget_show (hbox);
\r
3991 gtk_container_add (GTK_CONTAINER (dlg), hbox);
\r
3992 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
\r
3994 vbox = gtk_vbox_new (FALSE, 5);
\r
3995 gtk_widget_show (vbox);
\r
3996 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
\r
3998 label = gtk_label_new ("ESC for default, ENTER to validate");
\r
3999 gtk_widget_show (label);
\r
4000 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
\r
4002 entry = gtk_entry_new ();
\r
4003 gtk_widget_show (entry);
\r
4004 gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
\r
4006 vbox = gtk_vbox_new (FALSE, 5);
\r
4007 gtk_widget_show (vbox);
\r
4008 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
\r
4010 button = gtk_button_new_with_label ("OK");
\r
4011 gtk_widget_show (button);
\r
4012 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
4013 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
4014 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
\r
4015 gtk_widget_add_accelerator (button, "clicked", accel_group,
\r
4016 GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
\r
4017 gtk_widget_set_usize (button, 60, -2);
\r
4019 button = gtk_button_new_with_label ("Cancel");
\r
4020 gtk_widget_show (button);
\r
4021 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
\r
4022 gtk_signal_connect (GTK_OBJECT (button), "clicked",
\r
4023 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
\r
4024 gtk_widget_add_accelerator (button, "clicked", accel_group,
\r
4025 GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
\r
4026 gtk_widget_set_usize (button, 60, -2);
\r
4029 sprintf (buf, "%d", *intensity);
\r
4030 gtk_entry_set_text (GTK_ENTRY (entry), buf);
\r
4032 gtk_grab_add (dlg);
\r
4033 gtk_widget_show (dlg);
\r
4036 gtk_main_iteration ();
\r
4039 *intensity = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));
\r
4041 gtk_grab_remove (dlg);
\r
4042 gtk_widget_destroy (dlg);
\r