-/*\r
-Copyright (c) 2001, Loki software, inc.\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification, \r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list \r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the name of Loki software nor the names of its contributors may be used \r
-to endorse or promote products derived from this software without specific prior \r
-written permission. \r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' \r
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \r
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY \r
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; \r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS \r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
-*/\r
-\r
-//\r
-// Some small dialogs that don't need much\r
-//\r
-// Leonardo Zide (leo@lokigames.com)\r
-//\r
-\r
-#include "stdafx.h"\r
-#include <gdk/gdkkeysyms.h>\r
-#include <gtk/gtk.h>\r
-\r
-#ifdef _WIN32\r
-#include <gdk/gdkwin32.h>\r
-#endif\r
-\r
-#ifdef _WIN32\r
-#include <shellapi.h>\r
-#endif\r
-\r
-// =============================================================================\r
-// Color selection dialog\r
-\r
-qboolean DoColor (int iIndex)\r
-{\r
- static bool bColorOpen = false;\r
- \r
- if(bColorOpen)\r
- {\r
- Sys_FPrintf(SYS_WRN, "DoColor dialog is already open\n");\r
- return false;\r
- }\r
-\r
- bColorOpen = true; \r
- \r
- if (color_dialog (g_pParentWnd->m_pWidget, g_qeglobals.d_savedinfo.colors[iIndex]))\r
- {\r
- /* \r
- ** scale colors so that at least one component is at 1.0F \r
- ** if this is meant to select an entity color\r
- */\r
- if (iIndex == COLOR_ENTITY)\r
- {\r
- float largest = 0.0F;\r
-\r
- if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )\r
- largest = g_qeglobals.d_savedinfo.colors[iIndex][0];\r
- if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )\r
- largest = g_qeglobals.d_savedinfo.colors[iIndex][1];\r
- if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )\r
- largest = g_qeglobals.d_savedinfo.colors[iIndex][2];\r
-\r
- if ( largest == 0.0F )\r
- {\r
- g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;\r
- g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;\r
- g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;\r
- }\r
- else\r
- {\r
- float scaler = 1.0F / largest;\r
-\r
- g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;\r
- g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;\r
- g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;\r
- }\r
- }\r
-\r
- Sys_UpdateWindows (W_ALL);\r
- bColorOpen = false;\r
- return true;\r
- }\r
- else {\r
- bColorOpen = false;\r
- return false;\r
- }\r
-}\r
-\r
-// =============================================================================\r
-// Project settings dialog\r
-\r
-static void UpdateBSPCommandList (GtkWidget *dialog);\r
-\r
-static void DoProjectAddEdit (bool edit, GtkWidget *parent)\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *label, *table, *button;\r
- GtkWidget *cmd, *text;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- if (edit)\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Edit Command");\r
- else\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Add Command");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- table = gtk_table_new (2, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
- label = gtk_label_new ("Menu text");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
- label = gtk_label_new ("Command");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
- text = gtk_entry_new ();\r
- g_object_set_data (G_OBJECT (dlg), "text", text);\r
- gtk_widget_show (text);\r
- gtk_table_attach (GTK_TABLE (table), text, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_widget_set_usize (text, 300, -2);\r
-\r
- cmd = gtk_entry_new ();\r
- g_object_set_data (G_OBJECT (dlg), "cmd", cmd);\r
- gtk_widget_show (cmd);\r
- gtk_table_attach (GTK_TABLE (table), cmd, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_widget_set_usize (cmd, 300, -2);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- if (edit)\r
- {\r
- GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(parent), "view"));\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection(view);\r
- GtkTreeIter iter;\r
- GtkTreeModel* model;\r
- if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
- {\r
- char* key;\r
- gtk_tree_model_get(model, &iter, 0, &key, -1);\r
- const char* value = ValueForKey (g_qeglobals.d_project_entity, key);\r
- gtk_entry_set_text (GTK_ENTRY (text), key);\r
- gtk_entry_set_text (GTK_ENTRY (cmd), value);\r
- g_free(key);\r
- }\r
- }\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- const char* key = gtk_entry_get_text (GTK_ENTRY (text));\r
- const char* value = gtk_entry_get_text (GTK_ENTRY (cmd));\r
-\r
- if (strlen (key) <= 0 || strlen (value) <= 0)\r
- {\r
- Sys_Printf ("Command not added\n");\r
- }\r
- else\r
- {\r
- if (edit)\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, key, value);\r
- FillBSPMenu ();\r
- }\r
- else\r
- {\r
- if (key[0] == 'b' && key[1] == 's' && key[2] == 'p')\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, key, value);\r
- FillBSPMenu ();\r
- }\r
- else\r
- Sys_Printf ("BSP commands must be preceded by \"bsp\"");\r
- }\r
-\r
- UpdateBSPCommandList (parent);\r
- }\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-static void UpdateBSPCommandList (GtkWidget *dialog)\r
-{\r
- GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT(dialog), "bsp_commands"));\r
-\r
- gtk_list_store_clear(store);\r
-\r
- for(epair_t* ep = g_qeglobals.d_project_entity->epairs; ep != NULL; ep = ep->next)\r
- {\r
- if(ep->key[0] == 'b' && ep->key[1] == 's' && ep->key[2] == 'p')\r
- {\r
- GtkTreeIter iter;\r
- gtk_list_store_append(store, &iter);\r
- gtk_list_store_set(store, &iter, 0, ep->key, -1);\r
- }\r
- }\r
-}\r
-\r
-static void project_add (GtkWidget *widget, gpointer data)\r
-{\r
- GtkWidget *dlg = GTK_WIDGET (data);\r
- DoProjectAddEdit (false, dlg);\r
- UpdateBSPCommandList (dlg);\r
-}\r
-\r
-static void project_change (GtkWidget *widget, gpointer data)\r
-{\r
- GtkWidget *dlg = GTK_WIDGET (data);\r
- DoProjectAddEdit (true, dlg);\r
- UpdateBSPCommandList (dlg);\r
-}\r
-\r
-static void project_remove (GtkWidget *widget, gpointer data)\r
-{\r
- GtkWidget* project = GTK_WIDGET(data);\r
-\r
- GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(project), "view"));\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection(view);\r
- GtkTreeIter iter;\r
- GtkTreeModel* model;\r
- if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
- {\r
- char* key;\r
- gtk_tree_model_get(model, &iter, 0, &key, -1);\r
- DeleteKey (g_qeglobals.d_project_entity, key);\r
- g_free(key);\r
-\r
- char* index = gtk_tree_model_get_string_from_iter(model, &iter);\r
- Sys_Printf ("Selected %s\n", index);\r
- g_free(index);\r
-\r
- UpdateBSPCommandList(project);\r
- FillBSPMenu();\r
- }\r
-}\r
-\r
-static const char* sQ3ComboItem = "Quake III Arena";\r
-static const char* sTAComboItem = "Quake III: Team Arena";\r
-static const char* sModComboItem = "Custom Quake III modification";\r
-static const char* sWolfComboItem = "Return To Castle Wolfenstein";\r
-static const char* sWolfModComboItem = "Custom RTCW modification";\r
-static const char* sHLComboItem = "Half-life";\r
-static const char* sHLModComboItem = "Custom Half-life modification";\r
-\r
-static const char* sWolfSPCombo = "Single Player mapping mode";\r
-static const char* sWolfMPCombo = "Multiplayer mapping mode";\r
-\r
-// Arnout\r
-// HARD-CODED ET HACK\r
-static const char* sETComboItem = "Wolfenstein: Enemy Territory";\r
-static const char* sETModComboItem = "Custom ET modification";\r
-\r
-// RIANT\r
-// HARD-CODED JK2 HACK\r
-static const char* sJK2ComboItem = "Jedi Knight II Outcast";\r
-static const char* sJK2ModComboItem = "Custom JK2 modification";\r
-static const char* sJK2SPCombo = "Single Player mapping mode";\r
-static const char* sJK2MPCombo = "Multiplayer mapping mode";\r
-\r
-// TTimo\r
-// HARD-CODED JA HACK\r
-static const char* sJAComboItem = "Jedi Knight Jedi Academy";\r
-static const char* sJAModComboItem = "Custom JA modification";\r
-static const char* sJASPCombo = "Single Player mapping mode";\r
-static const char* sJAMPCombo = "Multiplayer mapping mode";\r
-\r
-// RIANT\r
-// HARD-CODED STVEF2 HACK\r
-static const char* sSTVEFComboItem = "Star Trek Voyager : Elite Force";\r
-static const char* sSTVEFModComboItem = "Custom Elite Force modification";\r
-static const char* sSTVEFSPCombo = "Single Player mapping mode";\r
-static const char* sSTVEFMPCombo = "Holo Match mapping mode";\r
-\r
-// RIANT\r
-// HARD-CODED SOF2 HACK\r
-static const char* sSOF2ComboItem = "Soldier of Fortune II - Double Helix";\r
-static const char* sSOF2ModComboItem = "Custom Sof2 modification";\r
-static const char* sSOF2SPCombo = "Single Player mapping mode";\r
-static const char* sSOF2MPCombo = "Multiplayer mapping mode";\r
-\r
-static GtkWidget* game_select; // GTK_COMBO\r
-static GtkEntry* fsgame_entry;\r
-\r
-gint OnSelchangeComboWhatgame (GtkWidget *widget, GdkEvent* event, gpointer data)\r
-{\r
- const char *dir = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(game_select)->entry));\r
- // HACK: Wolf\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- if (!strcmp(dir,sWolfComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
-\r
- }\r
- // HACK: ET\r
- else if (g_pGameDescription->mGameFile == "et.game")\r
- {\r
- if (!strcmp(dir,sETComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
-\r
- }\r
- else if (g_pGameDescription->mGameFile == "hl.game")\r
- {\r
- if (!strcmp(dir,sHLComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
-\r
- }\r
- // RIANT\r
- // HACK: JK2\r
- else if (g_pGameDescription->mGameFile == "jk2.game")\r
- {\r
- if (!strcmp(dir,sJK2ComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
- }\r
- // TTimo\r
- // HACK: JA\r
- else if (g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- if (!strcmp(dir,sJAComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
- }\r
- // RIANT\r
- // HACK: STVEF\r
- else if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- if (!strcmp(dir,sSTVEFComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
- }\r
- // RIANT\r
- // HACK: SOF2\r
- else if (g_pGameDescription->mGameFile == "sof2.game")\r
- {\r
- if (!strcmp(dir,sSOF2ComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
- }\r
- // QUAKE 3\r
- else\r
- {\r
- if (!strcmp(dir,sQ3ComboItem))\r
- {\r
- // disable the fs_game text entry\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else if (!strcmp(dir,sTAComboItem))\r
- {\r
- gtk_entry_set_text (fsgame_entry, "missionpack");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (fsgame_entry, "");\r
- gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
- }\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-void DoProjectSettings ()\r
-{\r
- GtkWidget *project;\r
- GtkWidget *frame, *label, *vbox, *table1, *table2, *button;\r
- GtkWidget *brush;\r
- GtkWidget *scr;\r
- GtkWidget *base, *game;\r
- GtkWidget *gamemode_combo;\r
- GList *combo_list = (GList*)NULL;\r
-\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- project = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (project), "Project Settings");\r
- gtk_signal_connect (GTK_OBJECT (project), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (project), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (project), "loop", &loop);\r
- g_object_set_data (G_OBJECT (project), "ret", &ret);\r
- gtk_window_set_default_size (GTK_WINDOW (project), 550, 400);\r
-\r
- table1 = gtk_table_new (3, 2, FALSE);\r
- gtk_widget_show (table1);\r
- gtk_container_add (GTK_CONTAINER (project), table1);\r
- gtk_container_set_border_width (GTK_CONTAINER (table1), 5);\r
- gtk_table_set_row_spacings (GTK_TABLE (table1), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table1), 5);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
- button = gtk_button_new_with_label ("Add...");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (project_add), project);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Change...");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (project_change), project);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Remove");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (project_remove), project);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- frame = gtk_frame_new ("Misc settings");\r
- gtk_widget_show (frame);\r
- gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
- brush = gtk_check_button_new_with_label ("Use brush primitives in MAP files (NOTE: experimental feature,\n"\r
- "required by the texture tools plugin)");\r
- gtk_widget_show (brush);\r
- gtk_container_add (GTK_CONTAINER (frame), brush);\r
- gtk_container_set_border_width (GTK_CONTAINER (brush), 5);\r
-\r
- frame = gtk_frame_new ("Menu commands");\r
- gtk_widget_show (frame);\r
- gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_container_add (GTK_CONTAINER (frame), scr);\r
- gtk_container_set_border_width (GTK_CONTAINER (scr), 5);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
-\r
- {\r
- GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);\r
-\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);\r
-\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));\r
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);\r
-\r
- gtk_widget_show(view);\r
-\r
- g_object_set_data(G_OBJECT (project), "view", view);\r
- g_object_set_data(G_OBJECT (project), "bsp_commands", store);\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
- \r
- g_object_unref(G_OBJECT(store));\r
- }\r
-\r
- frame = gtk_frame_new ("Project settings");\r
- gtk_widget_show (frame);\r
- gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
- // HACK: hardcoded game stuff\r
- if (g_pGameDescription->mGameFile == "wolf.game" ||\r
- g_pGameDescription->mGameFile == "et.game" ||\r
- g_pGameDescription->mGameFile == "jk2.game" || \r
- g_pGameDescription->mGameFile == "stvef.game" ||\r
- g_pGameDescription->mGameFile == "sof2.game" ||\r
- g_pGameDescription->mGameFile == "ja.game" )\r
- {\r
- table2 = gtk_table_new (9, 2, FALSE);\r
- }\r
- else\r
- {\r
- table2 = gtk_table_new (8, 2, FALSE);\r
- }\r
- gtk_widget_show (table2);\r
- gtk_container_add (GTK_CONTAINER (frame), table2);\r
- gtk_container_set_border_width (GTK_CONTAINER (table2), 5);\r
- gtk_table_set_row_spacings (GTK_TABLE (table2), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table2), 5);\r
-\r
- /*\r
- fill in the game selection combo\r
- HACK: hardcoded Q3/Wolf/HL switch\r
- \todo that stuff would be faster to write with implementation of property bags and associated code to edit\r
- */\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sWolfComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sWolfModComboItem);\r
- }\r
- else if (g_pGameDescription->mGameFile == "et.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sETComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sETModComboItem);\r
- }\r
- else if (g_pGameDescription->mGameFile == "hl.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sHLComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sHLModComboItem);\r
- }\r
- // RIANT\r
- // JK2 HACK\r
- else if (g_pGameDescription->mGameFile == "jk2.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sJK2ComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sJK2ModComboItem);\r
- }\r
- // TTimo\r
- // JA HACK\r
- else if (g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sJAComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sJAModComboItem);\r
- }\r
- // RIANT\r
- // STVEF HACK\r
- else if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sSTVEFComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sSTVEFModComboItem);\r
- }\r
- // RIANT\r
- // SOF2 HACK A LA JK2 A LA WOLF\r
- else if (g_pGameDescription->mGameFile == "sof2.game")\r
- {\r
- combo_list = g_list_append (combo_list, (void *)sSOF2ComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sSOF2ModComboItem);\r
- }\r
- else\r
- {\r
- // Q3 or default\r
- combo_list = g_list_append (combo_list, (void *)sQ3ComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sTAComboItem);\r
- combo_list = g_list_append (combo_list, (void *)sModComboItem);\r
- }\r
-\r
- game_select = gtk_combo_new ();\r
- gtk_combo_set_popdown_strings (GTK_COMBO (game_select), combo_list);\r
- gtk_widget_show (game_select);\r
- gtk_table_attach (GTK_TABLE (table2), game_select, 1, 2, 6, 7,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- gtk_signal_connect (GTK_OBJECT(GTK_COMBO (game_select)->entry), "changed",\r
- GTK_SIGNAL_FUNC (OnSelchangeComboWhatgame), NULL);\r
-\r
- g_list_free (combo_list);\r
- gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (game_select)->entry), FALSE);\r
-\r
- game = gtk_entry_new();\r
- fsgame_entry = GTK_ENTRY(game);\r
- gtk_widget_show(game);\r
- gtk_table_attach(GTK_TABLE(table2), game, 1, 2, 7, 8,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- \r
- /*\r
- wolf specific: select MP or SP mode\r
- */\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- combo_list = NULL;\r
- combo_list = g_list_append (combo_list, (void *)sWolfSPCombo);\r
- combo_list = g_list_append (combo_list, (void *)sWolfMPCombo);\r
- \r
- gamemode_combo = gtk_combo_new ();\r
- gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
- gtk_widget_show(gamemode_combo);\r
- gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- g_list_free (combo_list);\r
- combo_list = NULL;\r
-\r
- label = gtk_label_new ("Mapping mode");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- }\r
-\r
- // RIANT\r
- // JK2 HACK\r
- if (g_pGameDescription->mGameFile == "jk2.game")\r
- {\r
- combo_list = NULL;\r
- combo_list = g_list_append (combo_list, (void *)sJK2SPCombo);\r
- combo_list = g_list_append (combo_list, (void *)sJK2MPCombo);\r
- \r
- gamemode_combo = gtk_combo_new ();\r
- gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
- gtk_widget_show(gamemode_combo);\r
- gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- g_list_free (combo_list);\r
- combo_list = NULL;\r
-\r
- label = gtk_label_new ("Mapping mode");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- }\r
- // TTimo\r
- // JA HACK\r
- if (g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- combo_list = NULL;\r
- combo_list = g_list_append (combo_list, (void *)sJASPCombo);\r
- combo_list = g_list_append (combo_list, (void *)sJAMPCombo);\r
- \r
- gamemode_combo = gtk_combo_new ();\r
- gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
- gtk_widget_show(gamemode_combo);\r
- gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- g_list_free (combo_list);\r
- combo_list = NULL;\r
-\r
- label = gtk_label_new ("Mapping mode");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- }\r
- // RIANT\r
- // STVEF HACK\r
- if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- combo_list = NULL;\r
- combo_list = g_list_append (combo_list, (void *)sSTVEFSPCombo);\r
- combo_list = g_list_append (combo_list, (void *)sSTVEFMPCombo);\r
- \r
- gamemode_combo = gtk_combo_new ();\r
- gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
- gtk_widget_show(gamemode_combo);\r
- gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- g_list_free (combo_list);\r
- combo_list = NULL;\r
-\r
- label = gtk_label_new ("Mapping mode");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- }\r
- // RIANT\r
- // SOF2 HACK\r
- if (g_pGameDescription->mGameFile == "sof2.game")\r
- {\r
- combo_list = NULL;\r
- combo_list = g_list_append (combo_list, (void *)sSOF2SPCombo);\r
- combo_list = g_list_append (combo_list, (void *)sSOF2MPCombo);\r
- \r
- gamemode_combo = gtk_combo_new ();\r
- gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
- gtk_widget_show(gamemode_combo);\r
- gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- g_list_free (combo_list);\r
- combo_list = NULL;\r
-\r
- label = gtk_label_new ("Mapping mode");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- }\r
-\r
- /*\r
- the usual stuff\r
- */\r
-\r
- base = gtk_entry_new ();\r
- g_object_set_data (G_OBJECT (project), "base", base);\r
- gtk_widget_show (base);\r
- gtk_table_attach (GTK_TABLE (table2), base, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
-\r
- label = gtk_label_new ("basepath");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-\r
- label = gtk_label_new ("Select mod");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 6, 7,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
- label = gtk_label_new ("fs_game");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 7, 8,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
- // Initialize fields\r
- gtk_entry_set_text (GTK_ENTRY (base), ValueForKey (g_qeglobals.d_project_entity, "basepath"));\r
- UpdateBSPCommandList (project);\r
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (brush), (g_qeglobals.m_bBrushPrimitMode) ? TRUE : FALSE);\r
-\r
- // initialise the fs_game selection from the project settings into the dialog\r
- const char *dir = ValueForKey (g_qeglobals.d_project_entity, "gamename");\r
- // HACK: hardcoded wolf stuff\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"main"))\r
- {\r
- // no fs_game set, we are running stock Quake III Arena editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- // HACK: hardcoded et stuff\r
- if (g_pGameDescription->mGameFile == "et.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"etmain"))\r
- {\r
- // no fs_game set, we are running stock Quake III Arena editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- // HACK: hardcoded half-life stuff\r
- else if (g_pGameDescription->mGameFile == "hl.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"valve"))\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- // RIANT\r
- // JK2 HACK\r
- else if (g_pGameDescription->mGameFile == "jk2.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"base"))\r
- {\r
- // no fs_game set, we are running stock Quake III Arena editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- // TTimo\r
- // JA HACK\r
- else if (g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"base"))\r
- {\r
- // no fs_game set, we are running stock editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- // RIANT\r
- // STVEF2 HACK\r
- else if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"baseEf"))\r
- {\r
- // no fs_game set, we are running stock Quake III Arena editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- // RIANT\r
- // SOF2 HACK\r
- else if (g_pGameDescription->mGameFile == "sof2.game")\r
- {\r
- if ((strlen(dir) == 0) || !stricmp(dir,"base"))\r
- {\r
- // no fs_game set, we are running stock Quake III Arena editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
- else\r
- {\r
- if ((strlen(dir) == 0) || !strcmp(dir,"baseq3"))\r
- {\r
- // no fs_game set, we are running stock Quake III Arena editing\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sQ3ComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else if (!strcmp(dir,"missionpack"))\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sTAComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), "missionpack");\r
- gtk_widget_set_sensitive(game, false);\r
- }\r
- else\r
- {\r
- // this is a custom mod\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sModComboItem);\r
- gtk_entry_set_text (GTK_ENTRY (game), dir);\r
- gtk_widget_set_sensitive(game, true);\r
- }\r
- }\r
-\r
- // HACK: hardcoded wolf stuff\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
- if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
- {\r
- // nothing set yet, or single player\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfSPCombo);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfMPCombo);\r
- }\r
- }\r
-\r
- // JK2 HACK\r
- else if (g_pGameDescription->mGameFile == "jk2.game")\r
- {\r
- const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
- if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
- {\r
- // nothing set yet, or single player\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2SPCombo);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2MPCombo);\r
- }\r
- }\r
- // JA HACK\r
- else if (g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
- if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
- {\r
- // nothing set yet, or single player\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJASPCombo);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJAMPCombo);\r
- }\r
- }\r
- // STVEF HACK\r
- else if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
- if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
- {\r
- // nothing set yet, or single player\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFSPCombo);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFMPCombo);\r
- }\r
- }\r
- // SOF2 HACK\r
- else if (g_pGameDescription->mGameFile == "sof2.game")\r
- {\r
- const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
- if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
- {\r
- // nothing set yet, or single player\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2SPCombo);\r
- }\r
- else\r
- {\r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2MPCombo);\r
- }\r
- }\r
-\r
- gtk_grab_add (project);\r
- gtk_widget_show (project);\r
-\r
- g_pGameDescription->Dump();\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- char buf[1024];\r
- const char *r;\r
- char *w;\r
- \r
- // convert path to unix format\r
- for(r = gtk_entry_get_text (GTK_ENTRY (base)), w=buf; *r != '\0'; r++, w++)\r
- *w = (*r == '\\') ? '/' : *r;\r
- // add last slash\r
- if(w != buf && *(w-1) != '/') *(w++) = '/';\r
- // terminate string\r
- *w = '\0';\r
- SetKeyValue (g_qeglobals.d_project_entity, "basepath", buf);\r
-\r
- dir = gtk_entry_get_text (GTK_ENTRY (game));\r
- // Hack: hard coded wolf stuff\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- if (!strlen(dir) || !stricmp(dir,"main"))\r
- {\r
- DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
- }\r
- }\r
- // Hack: hard coded ET stuff\r
- else if (g_pGameDescription->mGameFile == "et.game")\r
- {\r
- if (!strlen(dir) || !stricmp(dir,"etmain"))\r
- {\r
- DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
- }\r
- }\r
- // Hack: hard coded Half-life stuff\r
- else if (g_pGameDescription->mGameFile == "hl.game")\r
- {\r
- if (!strlen(dir) || !stricmp(dir,"valve"))\r
- {\r
- DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
- }\r
- }\r
- else if (g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- if (!strlen(dir) || !stricmp(dir,"base"))\r
- {\r
- DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
- }\r
- }\r
- // RIANT\r
- // STVEF HACK\r
- else if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- if (!strlen(dir) || !stricmp(dir,"baseEf"))\r
- {\r
- DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
- }\r
- }\r
- else\r
- {\r
- if (!strlen(dir) || !strcmp(dir,"baseq3"))\r
- {\r
- DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
- }\r
- }\r
- \r
- // HACK: hardcoded wolf stuff\r
- if (g_pGameDescription->mGameFile == "wolf.game")\r
- {\r
- // read from gamemode_combo\r
- const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
- if (!strlen(gamemode) || !strcmp(gamemode, sWolfSPCombo))\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
- }\r
- }\r
-\r
- // RIANT\r
- // JK2 HACK\r
- if (g_pGameDescription->mGameFile == "jk2.game")\r
- {\r
- // read from gamemode_combo\r
- const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
- if (!strlen(gamemode) || !strcmp(gamemode, sJK2SPCombo))\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
- }\r
- }\r
- // TTimo\r
- // JA HACK\r
- if (g_pGameDescription->mGameFile == "ja.game")\r
- {\r
- // read from gamemode_combo\r
- const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
- if (!strlen(gamemode) || !strcmp(gamemode, sJASPCombo))\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
- }\r
- }\r
- \r
- // RIANT\r
- // STVEF HACK\r
- if (g_pGameDescription->mGameFile == "stvef.game")\r
- {\r
- // read from gamemode_combo\r
- const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
- if (!strlen(gamemode) || !strcmp(gamemode, sSTVEFSPCombo))\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
- }\r
- }\r
-\r
- g_qeglobals.m_strHomeMaps = g_qeglobals.m_strHomeGame;\r
- const char* str = ValueForKey(g_qeglobals.d_project_entity, "gamename");\r
- if(str[0] == '\0') str = g_pGameDescription->mBaseGame.GetBuffer();\r
- g_qeglobals.m_strHomeMaps += str;\r
- g_qeglobals.m_strHomeMaps += '/';\r
-\r
- // RIANT\r
- // SOF2 HACK\r
- if (g_pGameDescription->mGameFile == "sof2.game")\r
- {\r
- // read from gamemode_combo\r
- const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
- if (!strlen(gamemode) || !strcmp(gamemode, sSOF2SPCombo))\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
- }\r
- else\r
- {\r
- SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
- }\r
- }\r
-\r
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (brush)))\r
- g_qeglobals.m_bBrushPrimitMode = TRUE;\r
- else\r
- g_qeglobals.m_bBrushPrimitMode = FALSE;\r
-\r
- SetKeyValue(g_qeglobals.d_project_entity, "brush_primit", (g_qeglobals.m_bBrushPrimitMode ? "1" : "0" ));\r
-\r
-// QE_CheckProjectEntity();\r
-\r
- QE_SaveProject( g_PrefsDlg.m_strLastProject.GetBuffer() );\r
- }\r
-\r
- gtk_grab_remove (project);\r
- gtk_widget_destroy (project);\r
-}\r
-\r
-// =============================================================================\r
-// MapInfo dialog\r
-\r
-void DoMapInfo ()\r
-{\r
- static GtkWidget *dlg;\r
- GtkWidget *vbox, *vbox2, *hbox, *table, *button, *label, *scr;\r
- GtkWidget *brushes_entry, *entities_entry, *net_entry;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- if (dlg != NULL)\r
- return;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-\r
- load_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);\r
-\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Map Info");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- table = gtk_table_new (3, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
- brushes_entry = gtk_entry_new ();\r
- gtk_widget_show (brushes_entry);\r
- gtk_table_attach (GTK_TABLE (table), brushes_entry, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_entry_set_editable (GTK_ENTRY (brushes_entry), FALSE);\r
-\r
- entities_entry = gtk_entry_new ();\r
- gtk_widget_show (entities_entry);\r
- gtk_table_attach (GTK_TABLE (table), entities_entry, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_entry_set_editable (GTK_ENTRY (entities_entry), FALSE);\r
-\r
- net_entry = gtk_entry_new ();\r
- gtk_widget_show (net_entry);\r
- gtk_table_attach (GTK_TABLE (table), net_entry, 1, 2, 2, 3,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_entry_set_editable (GTK_ENTRY (net_entry), FALSE);\r
-\r
- label = gtk_label_new ("Total Brushes");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Total Entities");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Net brush count\n(non entity)");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- vbox2 = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox2);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("Close");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- label = gtk_label_new ("Entity breakdown");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);\r
- gtk_container_set_border_width (GTK_CONTAINER (scr), 5);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
- GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);\r
-\r
- {\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(view), TRUE);\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Entity", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- gtk_tree_view_column_set_sort_column_id(column, 0);\r
- }\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Count", renderer, "text", 1, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- gtk_tree_view_column_set_sort_column_id(column, 1);\r
- }\r
-\r
- gtk_widget_show(view);\r
-\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
- }\r
-\r
- // Initialize fields\r
- int TotalBrushes = 0, TotalEntities = 0, Net = 0;\r
-\r
- for (brush_t* pBrush = active_brushes.next; pBrush != &active_brushes; pBrush = pBrush->next)\r
- {\r
- TotalBrushes++;\r
- if (pBrush->owner == world_entity)\r
- Net++;\r
- }\r
-\r
- typedef struct\r
- {\r
- const char *name;\r
- int count;\r
- } map_t;\r
-\r
- GSList *l, *entitymap = NULL;\r
- map_t *entry;\r
-\r
- for (entity_t* pEntity = entities.next; pEntity != &entities; pEntity=pEntity->next)\r
- {\r
- TotalEntities++;\r
- bool add = true;\r
-\r
- for (l = entitymap; l; l = g_slist_next (l))\r
- {\r
- entry = (map_t*)l->data;\r
-\r
- if (strcmp (entry->name, pEntity->eclass->name) == 0)\r
- {\r
- entry->count++;\r
- add = false;\r
- break;\r
- }\r
- }\r
-\r
- if (add)\r
- {\r
- entry = (map_t*)qmalloc (sizeof (map_t));\r
- entry->name = pEntity->eclass->name;\r
- entry->count = 1;\r
- entitymap = g_slist_append (entitymap, entry);\r
- }\r
- }\r
-\r
- while (entitymap)\r
- {\r
- entry = (map_t*)entitymap->data;\r
- char tmp[16];\r
- sprintf (tmp, "%d", entry->count);\r
- GtkTreeIter iter;\r
- gtk_list_store_append(GTK_LIST_STORE(store), &iter);\r
- gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, entry->name, 1, tmp, -1);\r
- free (entry);\r
- entitymap = g_slist_remove (entitymap, entry);\r
- }\r
-\r
- g_object_unref(G_OBJECT(store));\r
-\r
- char tmp[16];\r
- sprintf (tmp, "%d", TotalBrushes);\r
- gtk_entry_set_text (GTK_ENTRY (brushes_entry), tmp);\r
- sprintf (tmp, "%d", TotalEntities);\r
- gtk_entry_set_text (GTK_ENTRY (entities_entry), tmp);\r
- sprintf (tmp, "%d", Net);\r
- gtk_entry_set_text (GTK_ENTRY (net_entry), tmp);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- // save before exit\r
- save_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
- dlg = NULL;\r
-}\r
-\r
-// =============================================================================\r
-// Entity List dialog\r
-\r
-static void entitylist_select (GtkWidget *widget, gpointer data)\r
-{\r
- GtkTreeView* view = GTK_TREE_VIEW(g_object_get_data (G_OBJECT (data), "entities"));\r
-\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection(view);\r
-\r
- GtkTreeModel* model;\r
- GtkTreeIter selected;\r
- if(gtk_tree_selection_get_selected(selection, &model, &selected))\r
- {\r
- entity_t* pEntity;\r
- gtk_tree_model_get(model, &selected, 1, &pEntity, -1);\r
-\r
- if (pEntity)\r
- {\r
- for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)\r
- {\r
- Select_Deselect ();\r
- Select_Brush (pEntity->brushes.onext);\r
- Sys_UpdateWindows(W_ALL);\r
- }\r
- }\r
- }\r
-}\r
-\r
-static gint entitylist_click (GtkWidget *widget, GdkEventButton *event, gpointer data)\r
-{\r
- if (event->type == GDK_2BUTTON_PRESS)\r
- {\r
- entitylist_select (NULL, data);\r
- return TRUE;\r
- }\r
- return FALSE;\r
-}\r
-\r
-static void entitylist_selection_changed(GtkTreeSelection* selection, gpointer data)\r
-{\r
- GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (data), "keyvalues"));\r
-\r
- gtk_list_store_clear(store);\r
-\r
- GtkTreeModel* model;\r
- GtkTreeIter selected;\r
- if(gtk_tree_selection_get_selected(selection, &model, &selected))\r
- {\r
- entity_t* pEntity;\r
- gtk_tree_model_get(model, &selected, 1, &pEntity, -1);\r
-\r
- if (pEntity)\r
- {\r
- for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)\r
- {\r
- GtkTreeIter appended;\r
- gtk_list_store_append(store, &appended);\r
- gtk_list_store_set(store, &appended, 0, pEpair->key, 1, pEpair->value, -1);\r
- }\r
- }\r
- }\r
-}\r
-\r
-void DoEntityList ()\r
-{\r
- static GtkWidget *dlg;\r
- GtkWidget *vbox, *hbox, *hbox2, *button, *scr;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- if (dlg != NULL)\r
- return;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-\r
- load_window_pos (dlg, g_PrefsDlg.mWindowInfo.posEntityInfoWnd);\r
-\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Entities");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (TRUE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
- {\r
- GtkTreeStore* store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);\r
-\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
- g_signal_connect(G_OBJECT(view), "button_press_event", G_CALLBACK(entitylist_click), dlg);\r
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- {\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));\r
- g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(entitylist_selection_changed), dlg);\r
- }\r
-\r
- gtk_widget_show(view);\r
-\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
- g_object_set_data (G_OBJECT (dlg), "entities", view);\r
-\r
- {\r
- {\r
- GtkTreeIter child;\r
- gtk_tree_store_append(store, &child, NULL);\r
- gtk_tree_store_set(store, &child, 0, world_entity->eclass->name, 1, world_entity, -1);\r
- }\r
-\r
- GSList *l, *entitymap = NULL;\r
- typedef struct\r
- {\r
- GtkTreeIter node;\r
- const char *name;\r
- } map_t;\r
- map_t *entry;\r
-\r
- for (entity_t* pEntity=entities.next; pEntity != &entities; pEntity=pEntity->next)\r
- {\r
- GtkTreeIter parent;\r
- bool found = false;\r
-\r
- for (l = entitymap; l; l = g_slist_next (l))\r
- {\r
- entry = (map_t*)l->data;\r
-\r
- if (strcmp (entry->name, pEntity->eclass->name) == 0)\r
- {\r
- parent = entry->node;\r
- found = true;\r
- break;\r
- }\r
- }\r
-\r
- if (!found)\r
- {\r
- gtk_tree_store_append(store, &parent, NULL);\r
- gtk_tree_store_set(store, &parent, 0, pEntity->eclass->name, 1, NULL, -1);\r
-\r
- entry = (map_t*)malloc (sizeof(map_t));\r
- entitymap = g_slist_append (entitymap, entry);\r
- entry->name = pEntity->eclass->name;\r
- entry->node = parent;\r
- }\r
-\r
- GtkTreeIter child;\r
- gtk_tree_store_append(store, &child, &parent);\r
- gtk_tree_store_set(store, &child, 0, pEntity->eclass->name, 1, pEntity, -1);\r
- }\r
-\r
- while (entitymap)\r
- {\r
- free (entitymap->data);\r
- entitymap = g_slist_remove (entitymap, entitymap->data);\r
- }\r
- }\r
- \r
- g_object_unref(G_OBJECT(store));\r
- }\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
- {\r
- GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);\r
-\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Value", renderer, "text", 1, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- gtk_widget_show(view);\r
-\r
- g_object_set_data(G_OBJECT(dlg), "keyvalues", store);\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
- \r
- g_object_unref(G_OBJECT(store));\r
- }\r
-\r
- hbox2 = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox2);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);\r
- \r
- button = gtk_button_new_with_label ("Select");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (entitylist_select), dlg);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Close");\r
- gtk_widget_show (button);\r
- gtk_box_pack_end (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- save_window_pos (dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- dlg = NULL;\r
-}\r
-\r
-// =============================================================================\r
-// Rotate dialog\r
-\r
-static void rotatedlg_apply (GtkWidget *widget, gpointer data)\r
-{\r
- GtkSpinButton *spin;\r
- float f;\r
-\r
- spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "x"));\r
- f = gtk_spin_button_get_value_as_float (spin);\r
- if (f != 0.0)\r
- Select_RotateAxis(0,f);\r
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f); // reset to 0 on Apply\r
- \r
- spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "y"));\r
- f = gtk_spin_button_get_value_as_float (spin);\r
- if (f != 0.0)\r
- Select_RotateAxis(1,f);\r
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);\r
- \r
- spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "z"));\r
- f = gtk_spin_button_get_value_as_float (spin);\r
- if (f != 0.0)\r
- Select_RotateAxis(2,f);\r
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);\r
-}\r
-\r
-void DoRotateDlg ()\r
-{\r
- GtkWidget *dlg, *hbox, *vbox, *table, *label, *button;\r
- GtkWidget *x, *y, *z;\r
- GtkObject *adj;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary rotation");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
- \r
- table = gtk_table_new (3, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- \r
- label = gtk_label_new (" X ");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (0),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- label = gtk_label_new (" Y ");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (0),\r
- (GtkAttachOptions) (0), 0, 0);\r
- \r
- label = gtk_label_new (" Z ");\r
-\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
- (GtkAttachOptions) (0),\r
- (GtkAttachOptions) (0), 0, 0);\r
- \r
- adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);\r
- x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
- g_object_set_data (G_OBJECT (dlg), "x", x);\r
- gtk_widget_show (x);\r
- gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_widget_set_usize (x, 60, -2);\r
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (x), TRUE);\r
- \r
- adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);\r
- y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
- g_object_set_data (G_OBJECT (dlg), "y", y);\r
- gtk_widget_show (y);\r
- gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (y), TRUE);\r
- \r
- adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);\r
- z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
- g_object_set_data (G_OBJECT (dlg), "z", z);\r
- gtk_widget_show (z);\r
- gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (z), TRUE);\r
- \r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
- \r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- \r
- button = gtk_button_new_with_label ("Apply");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (rotatedlg_apply), dlg);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- rotatedlg_apply (button, dlg);\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Gamma dialog\r
-\r
-void DoGamma ()\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Gamma");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- entry = gtk_entry_new ();\r
- gtk_widget_show (entry);\r
- gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);\r
-\r
- label = gtk_label_new ("0.0 is brightest\n1.0 is darkest");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
-\r
- label = gtk_label_new ("You must restart for the\nsettings to take effect");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
- // Initialize dialog\r
- char buf[16];\r
- sprintf (buf, "%1.1f", g_qeglobals.d_savedinfo.fGamma);\r
- gtk_entry_set_text (GTK_ENTRY (entry), buf);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- g_qeglobals.d_savedinfo.fGamma = g_strtod (gtk_entry_get_text (GTK_ENTRY (entry)), NULL);\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Find Brush Dialog\r
-\r
-// helper function to walk through the active brushes only and drop the regioned out ones\r
-bool WalkRegionBrush (brush_t **b, entity_t *e)\r
-{\r
- brush_t *b2;\r
- do\r
- {\r
- for(b2=active_brushes.next ; b2 != &active_brushes ; b2=b2->next)\r
- {\r
- if (b2==*b)\r
- break; // this is an active brush\r
- }\r
- if (b2==&active_brushes)\r
- {\r
- // this is a regioned out brush\r
- *b = (*b)->onext;\r
- if (*b == &e->brushes)\r
- {\r
- Sys_Status ("No such brush", 0);\r
- return false;\r
- }\r
- }\r
- } while (b2==&active_brushes);\r
- return true;\r
-}\r
-\r
-void SelectBrush (int entitynum, int brushnum)\r
-{\r
- entity_t *e;\r
- brush_t *b;\r
- int i;\r
-\r
- // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503\r
- // making this work when regioning is on too\r
-\r
- if (entitynum == 0)\r
- e = world_entity;\r
- else\r
- {\r
- e = entities.next;\r
- while (--entitynum)\r
- {\r
- e = e->next;\r
- if (e == &entities)\r
- {\r
- Sys_Status ("No such entity", 0);\r
- return;\r
- }\r
- if (region_active)\r
- {\r
- // we need to make sure we walk to the next 'active' entity to have a valid --entitynum\r
- // that is, find a brush that belongs to this entity in the active brushes\r
- do\r
- {\r
- for (b = active_brushes.next ; b != &active_brushes ; b=b->next)\r
- {\r
- if (b->owner == e)\r
- break; // this is an active entity\r
- }\r
- if (b==&active_brushes)\r
- {\r
- // this is a regioned out entity\r
- e = e->next; \r
- // don't walk past the end either\r
- if (e == &entities)\r
- {\r
- Sys_Status ("No such entity", 0);\r
- return;\r
- }\r
- }\r
- } while(b==&active_brushes);\r
- }\r
- }\r
- }\r
-\r
- b = e->brushes.onext;\r
- if (b == &e->brushes)\r
- {\r
- Sys_Status ("No such brush", 0);\r
- return;\r
- }\r
- if (region_active)\r
- {\r
- if (!WalkRegionBrush(&b, e))\r
- return;\r
- }\r
-\r
- while (brushnum--)\r
- {\r
- b = b->onext;\r
- if (b == &e->brushes)\r
- {\r
- Sys_Status ("No such brush", 0);\r
- return;\r
- }\r
- if (region_active)\r
- {\r
- if (!WalkRegionBrush(&b, e))\r
- return;\r
- }\r
- }\r
-\r
- Brush_RemoveFromList (b);\r
- Brush_AddToList (b, &selected_brushes);\r
-\r
- Sys_UpdateWindows (W_ALL);\r
- for (i = 0; i < 3; i++)\r
- {\r
- if (g_pParentWnd->GetXYWnd())\r
- g_pParentWnd->GetXYWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;\r
-\r
- if (g_pParentWnd->GetXZWnd())\r
- g_pParentWnd->GetXZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;\r
- \r
- if (g_pParentWnd->GetYZWnd())\r
- g_pParentWnd->GetYZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;\r
- }\r
-\r
- Sys_Status ("Selected", 0);\r
-}\r
-\r
-static void GetSelectionIndex (int *ent, int *brush)\r
-{\r
- brush_t *b, *b2;\r
- entity_t *entity;\r
-\r
- *ent = *brush = 0;\r
-\r
- b = selected_brushes.next;\r
- if (b == &selected_brushes)\r
- return;\r
-\r
- // find entity\r
- if (b->owner != world_entity)\r
- {\r
- (*ent)++;\r
- for (entity = entities.next; entity != &entities; entity=entity->next, (*ent)++)\r
- ;\r
- }\r
-\r
- // find brush\r
- for (b2=b->owner->brushes.onext; b2 != b && b2 != &b->owner->brushes; b2=b2->onext, (*brush)++)\r
- ;\r
-}\r
-\r
-void DoFind ()\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *table, *label, *button, *entity, *brush;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Find Brush");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- table = gtk_table_new (2, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- \r
- label = gtk_label_new ("Entity number");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (0),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- label = gtk_label_new ("Brush number");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (0),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- entity = gtk_entry_new ();\r
- gtk_widget_show (entity);\r
- gtk_table_attach (GTK_TABLE (table), entity, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- brush = gtk_entry_new ();\r
- gtk_widget_show (brush);\r
- gtk_table_attach (GTK_TABLE (table), brush, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
- // Initialize dialog\r
- char buf[16];\r
- int ent, br;\r
-\r
- GetSelectionIndex (&ent, &br);\r
- sprintf (buf, "%i", ent);\r
- gtk_entry_set_text (GTK_ENTRY (entity), buf);\r
- sprintf (buf, "%i", br);\r
- gtk_entry_set_text (GTK_ENTRY (brush), buf);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- const char *entstr = gtk_entry_get_text (GTK_ENTRY (entity));\r
- const char *brushstr = gtk_entry_get_text (GTK_ENTRY (brush));\r
- SelectBrush (atoi(entstr), atoi(brushstr));\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Arbitrary Sides dialog\r
-\r
-void DoSides (bool bCone, bool bSphere, bool bTorus)\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *button, *label, *entry;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary sides");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- label = gtk_label_new ("Sides:");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
- entry = gtk_entry_new ();\r
- gtk_widget_show (entry);\r
- gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- const char *str = gtk_entry_get_text (GTK_ENTRY (entry));\r
-\r
- if (bCone)\r
- Brush_MakeSidedCone(atoi(str));\r
- else if (bSphere)\r
- Brush_MakeSidedSphere(atoi(str));\r
- else\r
- Brush_MakeSided (atoi(str));\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// New Patch dialog\r
-\r
-void DoNewPatchDlg ()\r
-{\r
- GtkWidget *dlg, *hbox, *table, *vbox, *label, *button, *combo;\r
- GtkWidget *width, *height;\r
- GList *combo_list = (GList*)NULL;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Patch density");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- table = gtk_table_new (2, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- \r
- label = gtk_label_new ("Width:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Height:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- combo_list = g_list_append (combo_list, (void *)"3");\r
- combo_list = g_list_append (combo_list, (void *)"5");\r
- combo_list = g_list_append (combo_list, (void *)"7");\r
- combo_list = g_list_append (combo_list, (void *)"9");\r
- combo_list = g_list_append (combo_list, (void *)"11");\r
- combo_list = g_list_append (combo_list, (void *)"13");\r
- combo_list = g_list_append (combo_list, (void *)"15");\r
-\r
- combo = gtk_combo_new ();\r
- width = GTK_COMBO (combo)->entry;\r
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);\r
- gtk_widget_show (combo);\r
- gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- combo = gtk_combo_new ();\r
- height = GTK_COMBO (combo)->entry;\r
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);\r
- gtk_widget_show (combo);\r
- gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
- // Initialize dialog\r
- g_list_free (combo_list);\r
- gtk_entry_set_text (GTK_ENTRY (width), "3");\r
- gtk_entry_set_editable (GTK_ENTRY (width), FALSE);\r
- gtk_entry_set_text (GTK_ENTRY (height), "3");\r
- gtk_entry_set_editable (GTK_ENTRY (height), FALSE);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- const char* w = gtk_entry_get_text (GTK_ENTRY (width));\r
- const char* h = gtk_entry_get_text (GTK_ENTRY (height));\r
-\r
- Patch_GenericMesh(atoi (w), atoi (h), g_pParentWnd->ActiveXY ()->GetViewType ());\r
- Sys_UpdateWindows (W_ALL);\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// New Patch dialog\r
-\r
-void DoScaleDlg ()\r
-{\r
- GtkWidget *dlg, *hbox, *table, *vbox, *label, *button;\r
- GtkWidget *x, *y, *z;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Scale");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- table = gtk_table_new (3, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- \r
- label = gtk_label_new ("X:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Y:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Z:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- x = gtk_entry_new ();\r
- gtk_widget_show (x);\r
- gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- y = gtk_entry_new ();\r
- gtk_widget_show (y);\r
- gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- z = gtk_entry_new ();\r
- gtk_widget_show (z);\r
- gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
- // Initialize dialog\r
- gtk_entry_set_text (GTK_ENTRY (x), "1.0");\r
- gtk_entry_set_text (GTK_ENTRY (y), "1.0");\r
- gtk_entry_set_text (GTK_ENTRY (z), "1.0");\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- float sx, sy, sz;\r
- sx = atof (gtk_entry_get_text (GTK_ENTRY (x)));\r
- sy = atof (gtk_entry_get_text (GTK_ENTRY (y)));\r
- sz = atof (gtk_entry_get_text (GTK_ENTRY (z)));\r
-\r
- if (sx > 0 && sy > 0 && sz > 0)\r
- {\r
- Select_Scale(sx, sy, sz);\r
- Sys_UpdateWindows (W_ALL);\r
- }\r
- else\r
- Sys_Printf("Warning.. Tried to scale by a zero value.");\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Thicken Patch dialog\r
-\r
-void DoThickenDlg ()\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *vbox2, *button, *label;\r
- GtkWidget *amount, *seams, *group;\r
- int loop = 1, ret = IDCANCEL;\r
- static qboolean bGroupResult = true;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Thicken Patch");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- label = gtk_label_new ("This produces a set of patches\n"\r
- "that contains the original patch along with the\n"\r
- "'thick' patch and an optimal set of seam patches.");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
- vbox2 = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox2);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
- \r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- label = gtk_label_new ("Amount:");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
- amount = gtk_entry_new ();\r
- gtk_widget_show (amount);\r
- gtk_box_pack_start (GTK_BOX (hbox), amount, FALSE, FALSE, 0);\r
-\r
- seams = gtk_check_button_new_with_label ("Seams");\r
- gtk_widget_show (seams);\r
- gtk_box_pack_start (GTK_BOX (hbox), seams, FALSE, FALSE, 0);\r
- \r
- // bGroupResult\r
- group = gtk_check_button_new_with_label("Result to func_group");\r
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(group), bGroupResult);\r
- gtk_box_pack_start(GTK_BOX(vbox), group, FALSE, FALSE, 0);\r
- gtk_widget_show(group);\r
- \r
-\r
- // Initialize dialog\r
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (seams), TRUE);\r
- gtk_entry_set_text (GTK_ENTRY (amount), "8");\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group)))\r
- bGroupResult = true;\r
- else\r
- bGroupResult = false;\r
- Patch_Thicken (atoi (gtk_entry_get_text (GTK_ENTRY (amount))),\r
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (seams)), bGroupResult);\r
- Sys_UpdateWindows (W_ALL);\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// About dialog (no program is complete without one)\r
-\r
-void about_button_changelog (GtkWidget *widget, gpointer data)\r
-{\r
- Str log;\r
- log = g_strAppPath;\r
- log += "changelog.txt";\r
- OpenURL(log.GetBuffer());\r
-}\r
-\r
-void about_button_credits (GtkWidget *widget, gpointer data)\r
-{\r
- Str cred;\r
- cred = g_strAppPath;\r
- cred += "credits.html";\r
- OpenURL(cred.GetBuffer());\r
-}\r
-\r
-void DoAbout ()\r
-{\r
- GtkWidget *dlg, *vbox, *vbox2, *hbox, *frame, *table, *label, *pixmap, *button, *sc_extensions, *text_extensions;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "About GtkRadiant");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- vbox = gtk_vbox_new (FALSE, 10);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- vbox2 = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox2);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, FALSE, 0);\r
-\r
- frame = gtk_frame_new ((char*)NULL);\r
- gtk_widget_show (frame);\r
- gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);\r
- gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);\r
-\r
- pixmap = new_pixmap (g_pParentWnd->m_pWidget, "logo.bmp");\r
- gtk_widget_show (pixmap);\r
- gtk_container_add (GTK_CONTAINER (frame), pixmap);\r
-\r
- label = gtk_label_new ("GtkRadiant " RADIANT_VERSION "\n"\r
- __DATE__ "\n\n"\r
- RADIANT_ABOUTMSG "\n\n"\r
- "By qeradiant.com\n\n"\r
- "This product contains software technology\n"\r
- "from id Software, Inc. ('id Technology').\n"\r
- "id Technology 2000 id Software,Inc.\n\n"\r
- "GtkRadiant is unsupported, however\n"\r
- "you may report your problems at\n"\r
- "http://zerowing.idsoftware.com/bugzilla"\r
- );\r
- \r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
- vbox2 = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox2);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-\r
- button = gtk_button_new_with_label ("Credits");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (about_button_credits), NULL);\r
-\r
- button = gtk_button_new_with_label ("Changelog");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (about_button_changelog), NULL);\r
-\r
- frame = gtk_frame_new ("OpenGL Properties");\r
- gtk_widget_show (frame);\r
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);\r
-\r
- table = gtk_table_new (3, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_container_add (GTK_CONTAINER (frame), table);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
- \r
- label = gtk_label_new ("Vendor:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Version:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Renderer:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ((char*)qglGetString (GL_VENDOR));\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ((char*)qglGetString (GL_VERSION));\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ((char*)qglGetString (GL_RENDERER));\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- frame = gtk_frame_new ("OpenGL Extensions");\r
- gtk_widget_show (frame);\r
- gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (frame), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- sc_extensions = gtk_scrolled_window_new(NULL, NULL);\r
- gtk_box_pack_start(GTK_BOX(hbox), sc_extensions, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_extensions), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sc_extensions), GTK_SHADOW_IN);\r
- gtk_widget_show(sc_extensions);\r
- \r
- text_extensions = gtk_text_view_new();\r
- gtk_text_view_set_editable(GTK_TEXT_VIEW(text_extensions), FALSE);\r
- gtk_container_add (GTK_CONTAINER (sc_extensions), text_extensions);\r
- GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_extensions));\r
- gtk_text_buffer_set_text(buffer, (char *)qglGetString(GL_EXTENSIONS), -1);\r
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_extensions), GTK_WRAP_WORD);;\r
- gtk_widget_show(text_extensions); \r
- \r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Command List dialog \r
-\r
-void DoCommandListDlg ()\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *scr, *button;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Mapped Commands");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
- gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
- {\r
- GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);\r
-\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Command", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 1, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- gtk_widget_show(view);\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
-\r
- {\r
- // Initialize dialog\r
- CString path;\r
- path = g_strTempPath;\r
- path += "commandlist.txt";\r
-\r
- GSList *cmds = NULL;\r
- int n;\r
-\r
- for (n = 0; n < g_nCommandCount; n++)\r
- cmds = g_slist_append (cmds, g_Commands[n].m_strCommand);\r
- cmds = g_slist_sort (cmds, (gint (*)(const void *, const void *))strcmp);\r
-\r
- Sys_Printf("Writing the command list to %s", path.GetBuffer() );\r
- FILE* fileout = fopen (path.GetBuffer (), "wt");\r
-\r
- while (cmds)\r
- {\r
- for (n = 0; n < g_nCommandCount; n++)\r
- if (cmds->data == g_Commands[n].m_strCommand)\r
- break;\r
-\r
- char c = g_Commands[n].m_nKey;\r
- CString strLine, strMod(""), strKeys (c);\r
-\r
- for (int k = 0; k < g_nKeyCount; k++)\r
- {\r
- if (g_Keys[k].m_nVKKey == g_Commands[n].m_nKey)\r
- {\r
- strKeys = g_Keys[k].m_strName;\r
- break;\r
- }\r
- }\r
-\r
- if (g_Commands[n].m_nModifiers & RAD_SHIFT)\r
- strMod = "Shift";\r
- if (g_Commands[n].m_nModifiers & RAD_ALT)\r
- strMod += (strMod.GetLength() > 0) ? " + Alt" : "Alt";\r
- if (g_Commands[n].m_nModifiers & RAD_CONTROL)\r
- strMod += (strMod.GetLength() > 0) ? " + Control" : "Control";\r
- if (strMod.GetLength() > 0)\r
- strMod += " + ";\r
- strMod += strKeys;\r
-\r
- {\r
- GtkTreeIter iter;\r
- gtk_list_store_append(store, &iter);\r
- gtk_list_store_set(store, &iter, 0, g_Commands[n].m_strCommand, 1, strMod.GetBuffer (), -1);\r
- }\r
- \r
- if (fileout != NULL)\r
- {\r
- strLine.Format("%-25s %s\r\n", g_Commands[n].m_strCommand, strMod.GetBuffer ());\r
- fputs (strLine.GetBuffer (), fileout);\r
- }\r
-\r
- cmds = g_slist_remove (cmds, cmds->data);\r
- }\r
-\r
- if (fileout != NULL)\r
- fclose (fileout);\r
- }\r
- \r
- g_object_unref(G_OBJECT(store));\r
- }\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("Close");\r
- gtk_widget_show (button);\r
- gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Texture List dialog \r
-\r
-void DoTextureListDlg ()\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *scr, *button;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Textures");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
- gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
- GtkWidget* texture_list;\r
-\r
- {\r
- GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);\r
-\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); \r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- gtk_widget_show(view);\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
-\r
- {\r
- // Initialize dialog\r
- GSList *textures = (GSList*)NULL;\r
- FillTextureMenu(&textures);\r
- while (textures != NULL)\r
- {\r
- {\r
- GtkTreeIter iter;\r
- gtk_list_store_append(store, &iter);\r
- gtk_list_store_set(store, &iter, 0, (gchar*)textures->data, -1);\r
- }\r
- free (textures->data);\r
- textures = g_slist_remove (textures, textures->data);\r
- }\r
- }\r
- \r
- g_object_unref(G_OBJECT(store));\r
-\r
- texture_list = view;\r
- }\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("Load");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Close");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(texture_list));\r
-\r
- GtkTreeModel* model;\r
- GtkTreeIter iter;\r
- if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
- {\r
- GtkTreePath* path = gtk_tree_model_get_path(model, &iter);\r
- if(gtk_tree_path_get_depth(path) == 1)\r
- Texture_ShowDirectory(gtk_tree_path_get_indices(path)[0] + CMD_TEXTUREWAD);\r
- gtk_tree_path_free(path);\r
- }\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Cap dialog \r
-\r
-int DoCapDlg (int *type, bool *b_GroupResult)\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *table, *pixmap, *button, *group_toggle, *radio_vbox;\r
- GtkWidget *bevel, *endcap, *ibevel, *iendcap;\r
- GSList *group = (GSList*)NULL;\r
- int loop = 1, ret = IDCANCEL;\r
- \r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Cap");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- // Gef: Added a vbox to contain the toggle buttons\r
- radio_vbox = gtk_vbox_new(FALSE, 4);\r
- gtk_container_add(GTK_CONTAINER(hbox), radio_vbox);\r
- gtk_widget_show(radio_vbox);\r
- \r
- table = gtk_table_new (4, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (radio_vbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- \r
- pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_bevel.bmp");\r
- gtk_widget_show (pixmap);\r
- gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_endcap.bmp");\r
- gtk_widget_show (pixmap);\r
- gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_ibevel.bmp");\r
- gtk_widget_show (pixmap);\r
- gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_iendcap.bmp");\r
- gtk_widget_show (pixmap);\r
- gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 3, 4,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- bevel = gtk_radio_button_new_with_label (group, "Bevel");\r
- gtk_widget_show (bevel);\r
- gtk_table_attach (GTK_TABLE (table), bevel, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
- (GtkAttachOptions) (0), 0, 0);\r
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (bevel));\r
-\r
- endcap = gtk_radio_button_new_with_label (group, "Endcap");\r
- gtk_widget_show (endcap);\r
- gtk_table_attach (GTK_TABLE (table), endcap, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
- (GtkAttachOptions) (0), 0, 0);\r
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (endcap));\r
-\r
- ibevel = gtk_radio_button_new_with_label (group, "Inverted Bevel");\r
- gtk_widget_show (ibevel);\r
- gtk_table_attach (GTK_TABLE (table), ibevel, 1, 2, 2, 3,\r
- (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
- (GtkAttachOptions) (0), 0, 0);\r
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (ibevel));\r
-\r
- iendcap = gtk_radio_button_new_with_label (group, "Inverted Endcap");\r
- gtk_widget_show (iendcap);\r
- gtk_table_attach (GTK_TABLE (table), iendcap, 1, 2, 3, 4,\r
- (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
- (GtkAttachOptions) (0), 0, 0);\r
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (iendcap));\r
-\r
- // Gef: added radio toggle for func_grouping capped patches\r
- group_toggle = gtk_check_button_new_with_label("Result to func_group");\r
- gtk_container_add(GTK_CONTAINER(radio_vbox), group_toggle);\r
- gtk_widget_show(group_toggle);\r
- \r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- // Gef: Set the state of the func_group toggle\r
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (group_toggle), *b_GroupResult);\r
- \r
- // Initialize dialog\r
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bevel), TRUE);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (bevel)))\r
- *type = BEVEL; //*type = CapDialog::BEVEL;\r
- else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (endcap)))\r
- *type = ENDCAP; //*type = CapDialog::ENDCAP;\r
- else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ibevel)))\r
- *type = IBEVEL; // *type = CapDialog::IBEVEL;\r
- else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (iendcap)))\r
- *type = IENDCAP; // *type = CapDialog::IENDCAP;\r
-\r
- // Gef: Added toggle for optional cap func_grouping\r
- *b_GroupResult = (bool *)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group_toggle));\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- return ret;\r
-}\r
-\r
-// =============================================================================\r
-// Scripts dialog \r
-\r
-void DoScriptsDlg ()\r
-{\r
- GtkWidget *dlg, *vbox, *vbox2, *hbox, *label, *button, *scr;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Available Scripts - Not Implemented Yet");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- label = gtk_label_new ("WARNING: BrushScripting is in a highly experimental state and is\n"\r
- "far from complete. If you attempt to use them it is VERY LIKELY\n"\r
- "that Radiant will crash. Save your work before attempting to\n"\r
- "make use of any scripting features.");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);\r
-\r
- scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
- GtkWidget* scripts_list;\r
-\r
- {\r
- GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);\r
-\r
- GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); \r
-\r
- {\r
- GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
- GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
- }\r
-\r
- gtk_widget_show(view);\r
- gtk_container_add(GTK_CONTAINER (scr), view);\r
-\r
- {\r
- // Initialize dialog\r
- CString strINI;\r
- strINI = g_strGameToolsPath;\r
- strINI += "/scripts.ini";\r
- FILE *f;\r
-\r
- f = fopen (strINI.GetBuffer(), "rt");\r
- if (f != NULL)\r
- {\r
- char line[1024], *ptr;\r
-\r
- // read section names\r
- while (fgets (line, 1024, f) != 0)\r
- {\r
- if (line[0] != '[')\r
- continue;\r
-\r
- ptr = strchr (line, ']');\r
- *ptr = '\0';\r
-\r
- {\r
- GtkTreeIter iter;\r
- gtk_list_store_append(store, &iter);\r
- gtk_list_store_set(store, &iter, 0, line, -1);\r
- }\r
- }\r
- fclose (f);\r
- }\r
- }\r
- \r
- g_object_unref(G_OBJECT(store));\r
-\r
- scripts_list = view;\r
- }\r
-\r
- vbox2 = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox2);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("Run");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("New...");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_widget_set_sensitive (button, FALSE);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Edit...");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_widget_set_sensitive (button, FALSE);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Close");\r
- gtk_widget_show (button);\r
- gtk_box_pack_end (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(scripts_list));\r
-\r
- GtkTreeModel* model;\r
- GtkTreeIter iter;\r
- if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
- {\r
- char* script;\r
- gtk_tree_model_get(model, &iter, 0, &script, -1);\r
- RunScriptByName(script, true);\r
- g_free(script);\r
- }\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// dialog \r
-\r
-int DoBSInputDlg (const char *fields[5], float values[5])\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *label, *button;\r
- GtkWidget *entries[5];\r
- int i, loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "BrushScript Input");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- // Create entries and initialize them\r
- for (i = 0; i < 5; i++)\r
- {\r
- if (strlen (fields[i]) == 0)\r
- continue;\r
-\r
- label = gtk_label_new (fields[i]);\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
- entries[i] = gtk_entry_new ();\r
- gtk_widget_show (entries[i]);\r
- gtk_box_pack_start (GTK_BOX (vbox), entries[i], TRUE, TRUE, 0);\r
-\r
- char buf[32];\r
- sprintf (buf, "%f", values[i]);\r
- gtk_entry_set_text (GTK_ENTRY (entries[i]), buf);\r
- }\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- for (i = 0; i < 5; i++)\r
- {\r
- if (strlen (fields[i]) == 0)\r
- continue;\r
-\r
- values[i] = atof (gtk_entry_get_text (GTK_ENTRY (entries[i])));\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- return ret;\r
-}\r
-\r
-// =============================================================================\r
-// TextureLayout dialog \r
-\r
-int DoTextureLayout (float *fx, float *fy)\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *table, *label, *button;\r
- GtkWidget *x, *y;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Patch texture layout");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- label = gtk_label_new ("Texture will be fit across the patch based\n"\r
- "on the x and y values given. Values of 1x1\n"\r
- "will \"fit\" the texture. 2x2 will repeat\n"\r
- "it twice, etc.");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
- table = gtk_table_new (2, 2, FALSE);\r
- gtk_widget_show (table);\r
- gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);\r
- gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
- gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
- \r
- label = gtk_label_new ("Texture x:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- label = gtk_label_new ("Texture y:");\r
- gtk_widget_show (label);\r
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
- (GtkAttachOptions) (GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- x = gtk_entry_new ();\r
- gtk_widget_show (x);\r
- gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- y = gtk_entry_new ();\r
- gtk_widget_show (y);\r
- gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,\r
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
- (GtkAttachOptions) (0), 0, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- // Initialize\r
- gtk_entry_set_text (GTK_ENTRY (x), "4.0");\r
- gtk_entry_set_text (GTK_ENTRY (y), "4.0");\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- {\r
- *fx = atof (gtk_entry_get_text (GTK_ENTRY (x)));\r
- *fy = atof (gtk_entry_get_text (GTK_ENTRY (y)));\r
- }\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- return ret;\r
-}\r
-\r
-// =============================================================================\r
-// Name dialog \r
-\r
-char* DoNameDlg (const char* title)\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;\r
- int loop = 1, ret = IDCANCEL;\r
- char *str;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), title);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- label = gtk_label_new ("Name:");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
- entry = gtk_entry_new ();\r
- gtk_widget_show (entry);\r
- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));\r
- else\r
- str = NULL;\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- return str;\r
-}\r
-\r
-// =============================================================================\r
-// NewProject dialog \r
-\r
-char* DoNewProjectDlg ()\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry, *check;\r
- int loop = 1, ret = IDCANCEL;\r
- char *str;\r
-\r
- // start by a warning message\r
- // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=459\r
- CString msg;\r
- msg = "Are you sure you want a new project?\n";\r
- msg += "Please note that creating a new project is not the prefered way to setup GtkRadiant for mod editing.\n";\r
- msg += "Check http://www.qeradiant.com/faq/index.cgi?file=220 for more information";\r
- if (gtk_MessageBox(NULL, msg.GetBuffer(), "Confirm", MB_YESNO, "http://www.qeradiant.com/faq/index.cgi?file=220" ) == IDNO)\r
- {\r
- return NULL;\r
- }\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "New Project");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- hbox = gtk_hbox_new (FALSE, 10);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- label = gtk_label_new ("This will create a new directory beneath your\n"\r
- "game path based on the project name you give.");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
- label = gtk_label_new ("Project name:");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
- entry = gtk_entry_new ();\r
- gtk_widget_show (entry);\r
- gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);\r
-\r
- check = gtk_check_button_new_with_label ("Include game dll files");\r
- gtk_widget_show (check);\r
- gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0);\r
- gtk_widget_set_sensitive (check, FALSE);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));\r
- else\r
- str = NULL;\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- return str;\r
-}\r
-\r
-// =============================================================================\r
-// Text Editor dialog \r
-\r
-// master window widget\r
-static GtkWidget *text_editor = NULL;\r
-static GtkWidget *text_widget; // slave, text widget from the gtk editor\r
-\r
-static gint editor_delete (GtkWidget *widget, gpointer data)\r
-{\r
- if (gtk_MessageBox (widget, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)\r
- return TRUE;\r
-\r
- gtk_widget_hide (text_editor);\r
-\r
- return TRUE;\r
-}\r
-\r
-static void editor_save (GtkWidget *widget, gpointer data)\r
-{\r
- FILE *f = fopen ((char*)g_object_get_data (G_OBJECT (data), "filename"), "w");\r
- gpointer text = g_object_get_data (G_OBJECT (data), "text");\r
-\r
- if (f == NULL)\r
- {\r
- gtk_MessageBox (GTK_WIDGET(data), "Error saving file !");\r
- return;\r
- }\r
-\r
- char *str = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);\r
- fwrite (str, 1, strlen (str), f);\r
- fclose (f);\r
-}\r
-\r
-static void editor_close (GtkWidget *widget, gpointer data)\r
-{\r
- if (gtk_MessageBox (text_editor, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)\r
- return;\r
-\r
- gtk_widget_hide (text_editor);\r
-}\r
-\r
-// several attempts\r
-// http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355\r
-#if 0\r
-#ifdef _WIN32\r
-\r
-HWND FindEditWindow()\r
-{\r
- return FindWindow("TFormEditPadLite", NULL);\r
-}\r
-\r
-HWND FindEditWindow()\r
-{\r
- HWND hwnd = FindWindow("TFormEditPadLite", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TEditPadEditor", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TWinControlProxy", NULL);\r
- return hwnd;\r
- }\r
- }\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-HWND FindEditWindow()\r
-{\r
- HWND hwnd = FindWindow("TFormEditPadLite", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TFrameSearchReplace", NULL);\r
- if (hwnd)\r
- {\r
- hwnd = FindWindowEx(hwnd, NULL, "TJGStringEditorControl", NULL);\r
- return hwnd;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-HWND FindEditWindow()\r
-{\r
- HWND hwnd = FindWindow("TEditPadForm", NULL);\r
- HWND hwndEdit = NULL;\r
- if (hwnd != NULL)\r
- {\r
- HWND hwndTab = FindWindowEx(hwnd, NULL, "TTabControl", NULL);\r
- if (hwndTab != NULL)\r
- {\r
- hwndEdit = FindWindowEx(hwndTab, NULL, "TRicherEdit", NULL);\r
- }\r
- }\r
- return hwndEdit;\r
-}\r
-#endif\r
-#endif // #if 0\r
-\r
-static void CreateGtkTextEditor ()\r
-{\r
- GtkWidget *dlg;\r
- GtkWidget *vbox, *hbox, *button, *scr, *text;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (editor_delete), NULL);\r
- gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 300);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
- scr = gtk_scrolled_window_new (NULL, NULL);\r
- gtk_widget_show (scr);\r
- gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);\r
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);\r
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
- text = gtk_text_view_new();\r
- gtk_container_add (GTK_CONTAINER (scr), text);\r
- gtk_widget_show (text);\r
- g_object_set_data (G_OBJECT (dlg), "text", text);\r
- gtk_text_view_set_editable (GTK_TEXT_VIEW(text), TRUE);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
- button = gtk_button_new_with_label ("Close");\r
- gtk_widget_show (button);\r
- gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (editor_close), dlg);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Save");\r
- gtk_widget_show (button);\r
- gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (editor_save), dlg);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- text_editor = dlg;\r
- text_widget = text;\r
-}\r
-\r
-static void DoGtkTextEditor (const char* filename, guint cursorpos)\r
-{\r
- if (!text_editor)\r
- CreateGtkTextEditor(); // build it the first time we need it\r
-\r
- // Load file\r
- FILE *f = fopen (filename, "r");\r
-\r
- if (f == NULL)\r
- {\r
- Sys_Printf("Unable to load file %s in shader editor.\n", filename);\r
- gtk_widget_hide (text_editor);\r
- }\r
- else\r
- {\r
- fseek (f, 0, SEEK_END);\r
- int len = ftell (f);\r
- void *buf = qmalloc (len);\r
- void *old_filename;\r
-\r
- rewind (f);\r
- fread (buf, 1, len, f);\r
-\r
- gtk_window_set_title (GTK_WINDOW (text_editor), filename);\r
-\r
- GtkTextBuffer* text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget));\r
- gtk_text_buffer_set_text(text_buffer, (char*)buf, len);\r
-\r
- old_filename = g_object_get_data (G_OBJECT (text_editor), "filename");\r
- if (old_filename)\r
- free(old_filename);\r
- g_object_set_data (G_OBJECT (text_editor), "filename", strdup (filename));\r
-\r
- // trying to show later\r
- gtk_widget_show (text_editor);\r
-\r
-#ifdef _WIN32\r
- while (gtk_events_pending ())\r
- gtk_main_iteration ();\r
-#endif\r
-\r
- // only move the cursor if it's not exceeding the size..\r
- // NOTE: this is erroneous, cursorpos is the offset in bytes, not in characters\r
- // len is the max size in bytes, not in characters either, but the character count is below that limit..\r
- // thinking .. the difference between character count and byte count would be only because of CR/LF?\r
- {\r
- GtkTextIter text_iter;\r
- // character offset, not byte offset\r
- gtk_text_buffer_get_iter_at_offset(text_buffer, &text_iter, cursorpos);\r
- gtk_text_buffer_place_cursor(text_buffer, &text_iter);\r
- }\r
-\r
-#ifdef _WIN32\r
- gtk_widget_queue_draw(text_widget);\r
-#endif\r
-\r
- free (buf);\r
- fclose (f);\r
- }\r
-}\r
-\r
-void DoTextEditor (const char* filename, int cursorpos)\r
-{\r
- CString strEditCommand;\r
-#ifdef _WIN32\r
- if (g_PrefsDlg.m_bUseWin32Editor)\r
- {\r
- Sys_Printf("opening file '%s' (line %d info ignored)\n", filename);\r
- ShellExecute((HWND)GDK_WINDOW_HWND (g_pParentWnd->m_pWidget->window), "open", filename, NULL, NULL, SW_SHOW );\r
- return;\r
- }\r
-#else\r
- // check if a custom editor is set\r
- if((g_PrefsDlg.m_bUseCustomEditor) && (g_PrefsDlg.m_strEditorCommand.GetLength() > 0))\r
- {\r
- strEditCommand = g_PrefsDlg.m_strEditorCommand;\r
- strEditCommand += " \"";\r
- strEditCommand += filename;\r
- strEditCommand += "\"";\r
- \r
- Sys_Printf("Launching: %s\n", strEditCommand.GetBuffer());\r
- // note: linux does not return false if the command failed so it will assume success\r
- if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)\r
- {\r
- Sys_FPrintf(SYS_WRN, "Warning: Failed to execute %s, using default\n", strEditCommand.GetBuffer());\r
- }\r
- else\r
- {\r
- // the command (appeared) to run successfully, no need to do anything more\r
- return;\r
- }\r
- }\r
-#endif\r
- \r
- DoGtkTextEditor (filename, cursorpos);\r
-\r
- // old win32 code with EditPad bindings, broken\r
- // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355\r
-#if 0\r
- strEditCommand = g_strAppPath.GetBuffer();\r
- strEditCommand += "editpad.exe";\r
- strEditCommand += " \"";\r
- strEditCommand += filename;\r
- strEditCommand += "\"";\r
- if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)\r
- {\r
- Sys_FPrintf(SYS_WRN, "WARNING: Gtk shader editor is not fully functional on windows in general and unstable on win98 in particular.\n");\r
- 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
- DoGtkTextEditor (filename, cursorpos);\r
- }\r
- else\r
- {\r
- // TTimo: we used to call Delay here, to continue processing messages. But it seems to induce a lot of instabilities.\r
- // so now the user will simply have to wait.\r
- Sleep( 1500 );\r
-\r
- // now grab the edit window and scroll to the shader we want to edit\r
- HWND hwndEdit = FindEditWindow();\r
-\r
- if (hwndEdit != NULL)\r
- PostMessage(hwndEdit, EM_SETSEL, cursorpos, cursorpos);\r
- else\r
- Sys_Printf("Unable to load shader editor.\n");\r
- }\r
-#endif\r
-}\r
-\r
-// =============================================================================\r
-// Light Intensity dialog \r
-\r
-int DoLightIntensityDlg (int *intensity)\r
-{\r
- GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;\r
- int loop = 1, ret = IDCANCEL;\r
-\r
- dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (dlg), "Light intensity");\r
- gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
- GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
- gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
- g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
- GtkAccelGroup *accel_group = gtk_accel_group_new ();\r
- gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);\r
-\r
- hbox = gtk_hbox_new (FALSE, 5);\r
- gtk_widget_show (hbox);\r
- gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
- label = gtk_label_new ("ESC for default, ENTER to validate");\r
- gtk_widget_show (label);\r
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
-\r
- entry = gtk_entry_new ();\r
- gtk_widget_show (entry);\r
- gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);\r
-\r
- vbox = gtk_vbox_new (FALSE, 5);\r
- gtk_widget_show (vbox);\r
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
- button = gtk_button_new_with_label ("OK");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
- gtk_widget_add_accelerator (button, "clicked", accel_group,\r
- GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- button = gtk_button_new_with_label ("Cancel");\r
- gtk_widget_show (button);\r
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
- gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
- gtk_widget_add_accelerator (button, "clicked", accel_group,\r
- GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);\r
- gtk_widget_set_usize (button, 60, -2);\r
-\r
- char buf[16];\r
- sprintf (buf, "%d", *intensity);\r
- gtk_entry_set_text (GTK_ENTRY (entry), buf);\r
-\r
- gtk_grab_add (dlg);\r
- gtk_widget_show (dlg);\r
-\r
- while (loop)\r
- gtk_main_iteration ();\r
-\r
- if (ret == IDOK)\r
- *intensity = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));\r
-\r
- gtk_grab_remove (dlg);\r
- gtk_widget_destroy (dlg);\r
-\r
- return ret;\r
-}\r
+/*
+Copyright (c) 2001, Loki software, inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list
+of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the name of Loki software nor the names of its contributors may be used
+to endorse or promote products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+//
+// Some small dialogs that don't need much
+//
+// Leonardo Zide (leo@lokigames.com)
+//
+
+#include "stdafx.h"
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#ifdef _WIN32
+#include <gdk/gdkwin32.h>
+#endif
+
+#ifdef _WIN32
+#include <shellapi.h>
+#endif
+
+// =============================================================================
+// Color selection dialog
+
+qboolean DoColor (int iIndex)
+{
+ static bool bColorOpen = false;
+
+ if(bColorOpen)
+ {
+ Sys_FPrintf(SYS_WRN, "DoColor dialog is already open\n");
+ return false;
+ }
+
+ bColorOpen = true;
+
+ if (color_dialog (g_pParentWnd->m_pWidget, g_qeglobals.d_savedinfo.colors[iIndex]))
+ {
+ /*
+ ** scale colors so that at least one component is at 1.0F
+ ** if this is meant to select an entity color
+ */
+ if (iIndex == COLOR_ENTITY)
+ {
+ float largest = 0.0F;
+
+ if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )
+ largest = g_qeglobals.d_savedinfo.colors[iIndex][0];
+ if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )
+ largest = g_qeglobals.d_savedinfo.colors[iIndex][1];
+ if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )
+ largest = g_qeglobals.d_savedinfo.colors[iIndex][2];
+
+ if ( largest == 0.0F )
+ {
+ g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;
+ g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;
+ g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;
+ }
+ else
+ {
+ float scaler = 1.0F / largest;
+
+ g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;
+ g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;
+ g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;
+ }
+ }
+
+ Sys_UpdateWindows (W_ALL);
+ bColorOpen = false;
+ return true;
+ }
+ else {
+ bColorOpen = false;
+ return false;
+ }
+}
+
+// =============================================================================
+// Project settings dialog
+
+static void UpdateBSPCommandList (GtkWidget *dialog);
+
+static void DoProjectAddEdit (bool edit, GtkWidget *parent)
+{
+ GtkWidget *dlg, *vbox, *hbox, *label, *table, *button;
+ GtkWidget *cmd, *text;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ if (edit)
+ gtk_window_set_title (GTK_WINDOW (dlg), "Edit Command");
+ else
+ gtk_window_set_title (GTK_WINDOW (dlg), "Add Command");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ label = gtk_label_new ("Menu text");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+ label = gtk_label_new ("Command");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+ text = gtk_entry_new ();
+ g_object_set_data (G_OBJECT (dlg), "text", text);
+ gtk_widget_show (text);
+ gtk_table_attach (GTK_TABLE (table), text, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_usize (text, 300, -2);
+
+ cmd = gtk_entry_new ();
+ g_object_set_data (G_OBJECT (dlg), "cmd", cmd);
+ gtk_widget_show (cmd);
+ gtk_table_attach (GTK_TABLE (table), cmd, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_usize (cmd, 300, -2);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ if (edit)
+ {
+ GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(parent), "view"));
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
+ GtkTreeIter iter;
+ GtkTreeModel* model;
+ if(gtk_tree_selection_get_selected(selection, &model, &iter))
+ {
+ char* key;
+ gtk_tree_model_get(model, &iter, 0, &key, -1);
+ const char* value = ValueForKey (g_qeglobals.d_project_entity, key);
+ gtk_entry_set_text (GTK_ENTRY (text), key);
+ gtk_entry_set_text (GTK_ENTRY (cmd), value);
+ g_free(key);
+ }
+ }
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ const char* key = gtk_entry_get_text (GTK_ENTRY (text));
+ const char* value = gtk_entry_get_text (GTK_ENTRY (cmd));
+
+ if (strlen (key) <= 0 || strlen (value) <= 0)
+ {
+ Sys_Printf ("Command not added\n");
+ }
+ else
+ {
+ if (edit)
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, key, value);
+ FillBSPMenu ();
+ }
+ else
+ {
+ if (key[0] == 'b' && key[1] == 's' && key[2] == 'p')
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, key, value);
+ FillBSPMenu ();
+ }
+ else
+ Sys_Printf ("BSP commands must be preceded by \"bsp\"");
+ }
+
+ UpdateBSPCommandList (parent);
+ }
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+static void UpdateBSPCommandList (GtkWidget *dialog)
+{
+ GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT(dialog), "bsp_commands"));
+
+ gtk_list_store_clear(store);
+
+ for(epair_t* ep = g_qeglobals.d_project_entity->epairs; ep != NULL; ep = ep->next)
+ {
+ if(ep->key[0] == 'b' && ep->key[1] == 's' && ep->key[2] == 'p')
+ {
+ GtkTreeIter iter;
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, ep->key, -1);
+ }
+ }
+}
+
+static void project_add (GtkWidget *widget, gpointer data)
+{
+ GtkWidget *dlg = GTK_WIDGET (data);
+ DoProjectAddEdit (false, dlg);
+ UpdateBSPCommandList (dlg);
+}
+
+static void project_change (GtkWidget *widget, gpointer data)
+{
+ GtkWidget *dlg = GTK_WIDGET (data);
+ DoProjectAddEdit (true, dlg);
+ UpdateBSPCommandList (dlg);
+}
+
+static void project_remove (GtkWidget *widget, gpointer data)
+{
+ GtkWidget* project = GTK_WIDGET(data);
+
+ GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(project), "view"));
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
+ GtkTreeIter iter;
+ GtkTreeModel* model;
+ if(gtk_tree_selection_get_selected(selection, &model, &iter))
+ {
+ char* key;
+ gtk_tree_model_get(model, &iter, 0, &key, -1);
+ DeleteKey (g_qeglobals.d_project_entity, key);
+ g_free(key);
+
+ char* index = gtk_tree_model_get_string_from_iter(model, &iter);
+ Sys_Printf ("Selected %s\n", index);
+ g_free(index);
+
+ UpdateBSPCommandList(project);
+ FillBSPMenu();
+ }
+}
+
+static const char* sQ3ComboItem = "Quake III Arena";
+static const char* sTAComboItem = "Quake III: Team Arena";
+static const char* sModComboItem = "Custom Quake III modification";
+static const char* sWolfComboItem = "Return To Castle Wolfenstein";
+static const char* sWolfModComboItem = "Custom RTCW modification";
+static const char* sHLComboItem = "Half-life";
+static const char* sHLModComboItem = "Custom Half-life modification";
+
+static const char* sWolfSPCombo = "Single Player mapping mode";
+static const char* sWolfMPCombo = "Multiplayer mapping mode";
+
+// Arnout
+// HARD-CODED ET HACK
+static const char* sETComboItem = "Wolfenstein: Enemy Territory";
+static const char* sETModComboItem = "Custom ET modification";
+
+// RIANT
+// HARD-CODED JK2 HACK
+static const char* sJK2ComboItem = "Jedi Knight II Outcast";
+static const char* sJK2ModComboItem = "Custom JK2 modification";
+static const char* sJK2SPCombo = "Single Player mapping mode";
+static const char* sJK2MPCombo = "Multiplayer mapping mode";
+
+// TTimo
+// HARD-CODED JA HACK
+static const char* sJAComboItem = "Jedi Knight Jedi Academy";
+static const char* sJAModComboItem = "Custom JA modification";
+static const char* sJASPCombo = "Single Player mapping mode";
+static const char* sJAMPCombo = "Multiplayer mapping mode";
+
+// RIANT
+// HARD-CODED STVEF2 HACK
+static const char* sSTVEFComboItem = "Star Trek Voyager : Elite Force";
+static const char* sSTVEFModComboItem = "Custom Elite Force modification";
+static const char* sSTVEFSPCombo = "Single Player mapping mode";
+static const char* sSTVEFMPCombo = "Holo Match mapping mode";
+
+// RIANT
+// HARD-CODED SOF2 HACK
+static const char* sSOF2ComboItem = "Soldier of Fortune II - Double Helix";
+static const char* sSOF2ModComboItem = "Custom Sof2 modification";
+static const char* sSOF2SPCombo = "Single Player mapping mode";
+static const char* sSOF2MPCombo = "Multiplayer mapping mode";
+
+static GtkWidget* game_select; // GTK_COMBO
+static GtkEntry* fsgame_entry;
+
+gint OnSelchangeComboWhatgame (GtkWidget *widget, GdkEvent* event, gpointer data)
+{
+ const char *dir = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(game_select)->entry));
+ // HACK: Wolf
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ if (!strcmp(dir,sWolfComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+
+ }
+ // HACK: ET
+ else if (g_pGameDescription->mGameFile == "et.game")
+ {
+ if (!strcmp(dir,sETComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+
+ }
+ else if (g_pGameDescription->mGameFile == "hl.game")
+ {
+ if (!strcmp(dir,sHLComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+
+ }
+ // RIANT
+ // HACK: JK2
+ else if (g_pGameDescription->mGameFile == "jk2.game")
+ {
+ if (!strcmp(dir,sJK2ComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+ }
+ // TTimo
+ // HACK: JA
+ else if (g_pGameDescription->mGameFile == "ja.game")
+ {
+ if (!strcmp(dir,sJAComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+ }
+ // RIANT
+ // HACK: STVEF
+ else if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ if (!strcmp(dir,sSTVEFComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+ }
+ // RIANT
+ // HACK: SOF2
+ else if (g_pGameDescription->mGameFile == "sof2.game")
+ {
+ if (!strcmp(dir,sSOF2ComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+ }
+ // QUAKE 3
+ else
+ {
+ if (!strcmp(dir,sQ3ComboItem))
+ {
+ // disable the fs_game text entry
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else if (!strcmp(dir,sTAComboItem))
+ {
+ gtk_entry_set_text (fsgame_entry, "missionpack");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);
+ }
+ else
+ {
+ gtk_entry_set_text (fsgame_entry, "");
+ gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);
+ }
+ }
+
+ return TRUE;
+}
+
+void DoProjectSettings ()
+{
+ GtkWidget *project;
+ GtkWidget *frame, *label, *vbox, *table1, *table2, *button;
+ GtkWidget *brush;
+ GtkWidget *scr;
+ GtkWidget *base, *game;
+ GtkWidget *gamemode_combo;
+ GList *combo_list = (GList*)NULL;
+
+ int loop = 1, ret = IDCANCEL;
+
+ project = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (project), "Project Settings");
+ gtk_signal_connect (GTK_OBJECT (project), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (project), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (project), "loop", &loop);
+ g_object_set_data (G_OBJECT (project), "ret", &ret);
+ gtk_window_set_default_size (GTK_WINDOW (project), 550, 400);
+
+ table1 = gtk_table_new (3, 2, FALSE);
+ gtk_widget_show (table1);
+ gtk_container_add (GTK_CONTAINER (project), table1);
+ gtk_container_set_border_width (GTK_CONTAINER (table1), 5);
+ gtk_table_set_row_spacings (GTK_TABLE (table1), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table1), 5);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ button = gtk_button_new_with_label ("Add...");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (project_add), project);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Change...");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (project_change), project);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Remove");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (project_remove), project);
+ gtk_widget_set_usize (button, 60, -2);
+
+ frame = gtk_frame_new ("Misc settings");
+ gtk_widget_show (frame);
+ gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ brush = gtk_check_button_new_with_label ("Use brush primitives in MAP files (NOTE: experimental feature,\n"
+ "required by the texture tools plugin)");
+ gtk_widget_show (brush);
+ gtk_container_add (GTK_CONTAINER (frame), brush);
+ gtk_container_set_border_width (GTK_CONTAINER (brush), 5);
+
+ frame = gtk_frame_new ("Menu commands");
+ gtk_widget_show (frame);
+ gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_container_add (GTK_CONTAINER (frame), scr);
+ gtk_container_set_border_width (GTK_CONTAINER (scr), 5);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
+
+
+ {
+ GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
+
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+
+ GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
+
+ gtk_widget_show(view);
+
+ g_object_set_data(G_OBJECT (project), "view", view);
+ g_object_set_data(G_OBJECT (project), "bsp_commands", store);
+ gtk_container_add(GTK_CONTAINER (scr), view);
+
+ g_object_unref(G_OBJECT(store));
+ }
+
+ frame = gtk_frame_new ("Project settings");
+ gtk_widget_show (frame);
+ gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ // HACK: hardcoded game stuff
+ if (g_pGameDescription->mGameFile == "wolf.game" ||
+ g_pGameDescription->mGameFile == "et.game" ||
+ g_pGameDescription->mGameFile == "jk2.game" ||
+ g_pGameDescription->mGameFile == "stvef.game" ||
+ g_pGameDescription->mGameFile == "sof2.game" ||
+ g_pGameDescription->mGameFile == "ja.game" )
+ {
+ table2 = gtk_table_new (9, 2, FALSE);
+ }
+ else
+ {
+ table2 = gtk_table_new (8, 2, FALSE);
+ }
+ gtk_widget_show (table2);
+ gtk_container_add (GTK_CONTAINER (frame), table2);
+ gtk_container_set_border_width (GTK_CONTAINER (table2), 5);
+ gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
+
+ /*
+ fill in the game selection combo
+ HACK: hardcoded Q3/Wolf/HL switch
+ \todo that stuff would be faster to write with implementation of property bags and associated code to edit
+ */
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sWolfComboItem);
+ combo_list = g_list_append (combo_list, (void *)sWolfModComboItem);
+ }
+ else if (g_pGameDescription->mGameFile == "et.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sETComboItem);
+ combo_list = g_list_append (combo_list, (void *)sETModComboItem);
+ }
+ else if (g_pGameDescription->mGameFile == "hl.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sHLComboItem);
+ combo_list = g_list_append (combo_list, (void *)sHLModComboItem);
+ }
+ // RIANT
+ // JK2 HACK
+ else if (g_pGameDescription->mGameFile == "jk2.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sJK2ComboItem);
+ combo_list = g_list_append (combo_list, (void *)sJK2ModComboItem);
+ }
+ // TTimo
+ // JA HACK
+ else if (g_pGameDescription->mGameFile == "ja.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sJAComboItem);
+ combo_list = g_list_append (combo_list, (void *)sJAModComboItem);
+ }
+ // RIANT
+ // STVEF HACK
+ else if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sSTVEFComboItem);
+ combo_list = g_list_append (combo_list, (void *)sSTVEFModComboItem);
+ }
+ // RIANT
+ // SOF2 HACK A LA JK2 A LA WOLF
+ else if (g_pGameDescription->mGameFile == "sof2.game")
+ {
+ combo_list = g_list_append (combo_list, (void *)sSOF2ComboItem);
+ combo_list = g_list_append (combo_list, (void *)sSOF2ModComboItem);
+ }
+ else
+ {
+ // Q3 or default
+ combo_list = g_list_append (combo_list, (void *)sQ3ComboItem);
+ combo_list = g_list_append (combo_list, (void *)sTAComboItem);
+ combo_list = g_list_append (combo_list, (void *)sModComboItem);
+ }
+
+ game_select = gtk_combo_new ();
+ gtk_combo_set_popdown_strings (GTK_COMBO (game_select), combo_list);
+ gtk_widget_show (game_select);
+ gtk_table_attach (GTK_TABLE (table2), game_select, 1, 2, 6, 7,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ gtk_signal_connect (GTK_OBJECT(GTK_COMBO (game_select)->entry), "changed",
+ GTK_SIGNAL_FUNC (OnSelchangeComboWhatgame), NULL);
+
+ g_list_free (combo_list);
+ gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (game_select)->entry), FALSE);
+
+ game = gtk_entry_new();
+ fsgame_entry = GTK_ENTRY(game);
+ gtk_widget_show(game);
+ gtk_table_attach(GTK_TABLE(table2), game, 1, 2, 7, 8,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ /*
+ wolf specific: select MP or SP mode
+ */
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ combo_list = NULL;
+ combo_list = g_list_append (combo_list, (void *)sWolfSPCombo);
+ combo_list = g_list_append (combo_list, (void *)sWolfMPCombo);
+
+ gamemode_combo = gtk_combo_new ();
+ gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
+ gtk_widget_show(gamemode_combo);
+ gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ g_list_free (combo_list);
+ combo_list = NULL;
+
+ label = gtk_label_new ("Mapping mode");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ }
+
+ // RIANT
+ // JK2 HACK
+ if (g_pGameDescription->mGameFile == "jk2.game")
+ {
+ combo_list = NULL;
+ combo_list = g_list_append (combo_list, (void *)sJK2SPCombo);
+ combo_list = g_list_append (combo_list, (void *)sJK2MPCombo);
+
+ gamemode_combo = gtk_combo_new ();
+ gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
+ gtk_widget_show(gamemode_combo);
+ gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ g_list_free (combo_list);
+ combo_list = NULL;
+
+ label = gtk_label_new ("Mapping mode");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ }
+ // TTimo
+ // JA HACK
+ if (g_pGameDescription->mGameFile == "ja.game")
+ {
+ combo_list = NULL;
+ combo_list = g_list_append (combo_list, (void *)sJASPCombo);
+ combo_list = g_list_append (combo_list, (void *)sJAMPCombo);
+
+ gamemode_combo = gtk_combo_new ();
+ gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
+ gtk_widget_show(gamemode_combo);
+ gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ g_list_free (combo_list);
+ combo_list = NULL;
+
+ label = gtk_label_new ("Mapping mode");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ }
+ // RIANT
+ // STVEF HACK
+ if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ combo_list = NULL;
+ combo_list = g_list_append (combo_list, (void *)sSTVEFSPCombo);
+ combo_list = g_list_append (combo_list, (void *)sSTVEFMPCombo);
+
+ gamemode_combo = gtk_combo_new ();
+ gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
+ gtk_widget_show(gamemode_combo);
+ gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ g_list_free (combo_list);
+ combo_list = NULL;
+
+ label = gtk_label_new ("Mapping mode");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ }
+ // RIANT
+ // SOF2 HACK
+ if (g_pGameDescription->mGameFile == "sof2.game")
+ {
+ combo_list = NULL;
+ combo_list = g_list_append (combo_list, (void *)sSOF2SPCombo);
+ combo_list = g_list_append (combo_list, (void *)sSOF2MPCombo);
+
+ gamemode_combo = gtk_combo_new ();
+ gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);
+ gtk_widget_show(gamemode_combo);
+ gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ g_list_free (combo_list);
+ combo_list = NULL;
+
+ label = gtk_label_new ("Mapping mode");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ }
+
+ /*
+ the usual stuff
+ */
+
+ base = gtk_entry_new ();
+ g_object_set_data (G_OBJECT (project), "base", base);
+ gtk_widget_show (base);
+ gtk_table_attach (GTK_TABLE (table2), base, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+
+ label = gtk_label_new ("basepath");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+
+ label = gtk_label_new ("Select mod");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 6, 7,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+ label = gtk_label_new ("fs_game");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 7, 8,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+ // Initialize fields
+ gtk_entry_set_text (GTK_ENTRY (base), ValueForKey (g_qeglobals.d_project_entity, "basepath"));
+ UpdateBSPCommandList (project);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (brush), (g_qeglobals.m_bBrushPrimitMode) ? TRUE : FALSE);
+
+ // initialise the fs_game selection from the project settings into the dialog
+ const char *dir = ValueForKey (g_qeglobals.d_project_entity, "gamename");
+ // HACK: hardcoded wolf stuff
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"main"))
+ {
+ // no fs_game set, we are running stock Quake III Arena editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ // HACK: hardcoded et stuff
+ if (g_pGameDescription->mGameFile == "et.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"etmain"))
+ {
+ // no fs_game set, we are running stock Quake III Arena editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ // HACK: hardcoded half-life stuff
+ else if (g_pGameDescription->mGameFile == "hl.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"valve"))
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ // RIANT
+ // JK2 HACK
+ else if (g_pGameDescription->mGameFile == "jk2.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"base"))
+ {
+ // no fs_game set, we are running stock Quake III Arena editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ // TTimo
+ // JA HACK
+ else if (g_pGameDescription->mGameFile == "ja.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"base"))
+ {
+ // no fs_game set, we are running stock editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ // RIANT
+ // STVEF2 HACK
+ else if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"baseEf"))
+ {
+ // no fs_game set, we are running stock Quake III Arena editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ // RIANT
+ // SOF2 HACK
+ else if (g_pGameDescription->mGameFile == "sof2.game")
+ {
+ if ((strlen(dir) == 0) || !stricmp(dir,"base"))
+ {
+ // no fs_game set, we are running stock Quake III Arena editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+ else
+ {
+ if ((strlen(dir) == 0) || !strcmp(dir,"baseq3"))
+ {
+ // no fs_game set, we are running stock Quake III Arena editing
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sQ3ComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else if (!strcmp(dir,"missionpack"))
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sTAComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), "missionpack");
+ gtk_widget_set_sensitive(game, false);
+ }
+ else
+ {
+ // this is a custom mod
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sModComboItem);
+ gtk_entry_set_text (GTK_ENTRY (game), dir);
+ gtk_widget_set_sensitive(game, true);
+ }
+ }
+
+ // HACK: hardcoded wolf stuff
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
+ if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
+ {
+ // nothing set yet, or single player
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfSPCombo);
+ }
+ else
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfMPCombo);
+ }
+ }
+
+ // JK2 HACK
+ else if (g_pGameDescription->mGameFile == "jk2.game")
+ {
+ const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
+ if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
+ {
+ // nothing set yet, or single player
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2SPCombo);
+ }
+ else
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2MPCombo);
+ }
+ }
+ // JA HACK
+ else if (g_pGameDescription->mGameFile == "ja.game")
+ {
+ const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
+ if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
+ {
+ // nothing set yet, or single player
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJASPCombo);
+ }
+ else
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJAMPCombo);
+ }
+ }
+ // STVEF HACK
+ else if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
+ if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
+ {
+ // nothing set yet, or single player
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFSPCombo);
+ }
+ else
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFMPCombo);
+ }
+ }
+ // SOF2 HACK
+ else if (g_pGameDescription->mGameFile == "sof2.game")
+ {
+ const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");
+ if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))
+ {
+ // nothing set yet, or single player
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2SPCombo);
+ }
+ else
+ {
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2MPCombo);
+ }
+ }
+
+ gtk_grab_add (project);
+ gtk_widget_show (project);
+
+ g_pGameDescription->Dump();
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ char buf[1024];
+ const char *r;
+ char *w;
+
+ // convert path to unix format
+ for(r = gtk_entry_get_text (GTK_ENTRY (base)), w=buf; *r != '\0'; r++, w++)
+ *w = (*r == '\\') ? '/' : *r;
+ // add last slash
+ if(w != buf && *(w-1) != '/') *(w++) = '/';
+ // terminate string
+ *w = '\0';
+ SetKeyValue (g_qeglobals.d_project_entity, "basepath", buf);
+
+ dir = gtk_entry_get_text (GTK_ENTRY (game));
+ // Hack: hard coded wolf stuff
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ if (!strlen(dir) || !stricmp(dir,"main"))
+ {
+ DeleteKey (g_qeglobals.d_project_entity, "gamename");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
+ }
+ }
+ // Hack: hard coded ET stuff
+ else if (g_pGameDescription->mGameFile == "et.game")
+ {
+ if (!strlen(dir) || !stricmp(dir,"etmain"))
+ {
+ DeleteKey (g_qeglobals.d_project_entity, "gamename");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
+ }
+ }
+ // Hack: hard coded Half-life stuff
+ else if (g_pGameDescription->mGameFile == "hl.game")
+ {
+ if (!strlen(dir) || !stricmp(dir,"valve"))
+ {
+ DeleteKey (g_qeglobals.d_project_entity, "gamename");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
+ }
+ }
+ else if (g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game")
+ {
+ if (!strlen(dir) || !stricmp(dir,"base"))
+ {
+ DeleteKey (g_qeglobals.d_project_entity, "gamename");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
+ }
+ }
+ // RIANT
+ // STVEF HACK
+ else if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ if (!strlen(dir) || !stricmp(dir,"baseEf"))
+ {
+ DeleteKey (g_qeglobals.d_project_entity, "gamename");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
+ }
+ }
+ else
+ {
+ if (!strlen(dir) || !strcmp(dir,"baseq3"))
+ {
+ DeleteKey (g_qeglobals.d_project_entity, "gamename");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);
+ }
+ }
+
+ // HACK: hardcoded wolf stuff
+ if (g_pGameDescription->mGameFile == "wolf.game")
+ {
+ // read from gamemode_combo
+ const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
+ if (!strlen(gamemode) || !strcmp(gamemode, sWolfSPCombo))
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
+ }
+ }
+
+ // RIANT
+ // JK2 HACK
+ if (g_pGameDescription->mGameFile == "jk2.game")
+ {
+ // read from gamemode_combo
+ const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
+ if (!strlen(gamemode) || !strcmp(gamemode, sJK2SPCombo))
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
+ }
+ }
+ // TTimo
+ // JA HACK
+ if (g_pGameDescription->mGameFile == "ja.game")
+ {
+ // read from gamemode_combo
+ const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
+ if (!strlen(gamemode) || !strcmp(gamemode, sJASPCombo))
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
+ }
+ }
+
+ // RIANT
+ // STVEF HACK
+ if (g_pGameDescription->mGameFile == "stvef.game")
+ {
+ // read from gamemode_combo
+ const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
+ if (!strlen(gamemode) || !strcmp(gamemode, sSTVEFSPCombo))
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
+ }
+ }
+
+ g_qeglobals.m_strHomeMaps = g_qeglobals.m_strHomeGame;
+ const char* str = ValueForKey(g_qeglobals.d_project_entity, "gamename");
+ if(str[0] == '\0') str = g_pGameDescription->mBaseGame.GetBuffer();
+ g_qeglobals.m_strHomeMaps += str;
+ g_qeglobals.m_strHomeMaps += '/';
+
+ // RIANT
+ // SOF2 HACK
+ if (g_pGameDescription->mGameFile == "sof2.game")
+ {
+ // read from gamemode_combo
+ const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));
+ if (!strlen(gamemode) || !strcmp(gamemode, sSOF2SPCombo))
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");
+ }
+ else
+ {
+ SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");
+ }
+ }
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (brush)))
+ g_qeglobals.m_bBrushPrimitMode = TRUE;
+ else
+ g_qeglobals.m_bBrushPrimitMode = FALSE;
+
+ SetKeyValue(g_qeglobals.d_project_entity, "brush_primit", (g_qeglobals.m_bBrushPrimitMode ? "1" : "0" ));
+
+// QE_CheckProjectEntity();
+
+ QE_SaveProject( g_PrefsDlg.m_strLastProject.GetBuffer() );
+ }
+
+ gtk_grab_remove (project);
+ gtk_widget_destroy (project);
+}
+
+// =============================================================================
+// MapInfo dialog
+
+void DoMapInfo ()
+{
+ static GtkWidget *dlg;
+ GtkWidget *vbox, *vbox2, *hbox, *table, *button, *label, *scr;
+ GtkWidget *brushes_entry, *entities_entry, *net_entry;
+ int loop = 1, ret = IDCANCEL;
+
+ if (dlg != NULL)
+ return;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ load_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
+
+ gtk_window_set_title (GTK_WINDOW (dlg), "Map Info");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ table = gtk_table_new (3, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ brushes_entry = gtk_entry_new ();
+ gtk_widget_show (brushes_entry);
+ gtk_table_attach (GTK_TABLE (table), brushes_entry, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_entry_set_editable (GTK_ENTRY (brushes_entry), FALSE);
+
+ entities_entry = gtk_entry_new ();
+ gtk_widget_show (entities_entry);
+ gtk_table_attach (GTK_TABLE (table), entities_entry, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_entry_set_editable (GTK_ENTRY (entities_entry), FALSE);
+
+ net_entry = gtk_entry_new ();
+ gtk_widget_show (net_entry);
+ gtk_table_attach (GTK_TABLE (table), net_entry, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_entry_set_editable (GTK_ENTRY (net_entry), FALSE);
+
+ label = gtk_label_new ("Total Brushes");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Total Entities");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Net brush count\n(non entity)");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ vbox2 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ label = gtk_label_new ("Entity breakdown");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (scr), 5);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
+
+ GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+
+ {
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(view), TRUE);
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Entity", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ gtk_tree_view_column_set_sort_column_id(column, 0);
+ }
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Count", renderer, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ gtk_tree_view_column_set_sort_column_id(column, 1);
+ }
+
+ gtk_widget_show(view);
+
+ gtk_container_add(GTK_CONTAINER (scr), view);
+ }
+
+ // Initialize fields
+ int TotalBrushes = 0, TotalEntities = 0, Net = 0;
+
+ for (brush_t* pBrush = active_brushes.next; pBrush != &active_brushes; pBrush = pBrush->next)
+ {
+ TotalBrushes++;
+ if (pBrush->owner == world_entity)
+ Net++;
+ }
+
+ typedef struct
+ {
+ const char *name;
+ int count;
+ } map_t;
+
+ GSList *l, *entitymap = NULL;
+ map_t *entry;
+
+ for (entity_t* pEntity = entities.next; pEntity != &entities; pEntity=pEntity->next)
+ {
+ TotalEntities++;
+ bool add = true;
+
+ for (l = entitymap; l; l = g_slist_next (l))
+ {
+ entry = (map_t*)l->data;
+
+ if (strcmp (entry->name, pEntity->eclass->name) == 0)
+ {
+ entry->count++;
+ add = false;
+ break;
+ }
+ }
+
+ if (add)
+ {
+ entry = (map_t*)qmalloc (sizeof (map_t));
+ entry->name = pEntity->eclass->name;
+ entry->count = 1;
+ entitymap = g_slist_append (entitymap, entry);
+ }
+ }
+
+ while (entitymap)
+ {
+ entry = (map_t*)entitymap->data;
+ char tmp[16];
+ sprintf (tmp, "%d", entry->count);
+ GtkTreeIter iter;
+ gtk_list_store_append(GTK_LIST_STORE(store), &iter);
+ gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, entry->name, 1, tmp, -1);
+ free (entry);
+ entitymap = g_slist_remove (entitymap, entry);
+ }
+
+ g_object_unref(G_OBJECT(store));
+
+ char tmp[16];
+ sprintf (tmp, "%d", TotalBrushes);
+ gtk_entry_set_text (GTK_ENTRY (brushes_entry), tmp);
+ sprintf (tmp, "%d", TotalEntities);
+ gtk_entry_set_text (GTK_ENTRY (entities_entry), tmp);
+ sprintf (tmp, "%d", Net);
+ gtk_entry_set_text (GTK_ENTRY (net_entry), tmp);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ // save before exit
+ save_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+ dlg = NULL;
+}
+
+// =============================================================================
+// Entity List dialog
+
+static void entitylist_select (GtkWidget *widget, gpointer data)
+{
+ GtkTreeView* view = GTK_TREE_VIEW(g_object_get_data (G_OBJECT (data), "entities"));
+
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(view);
+
+ GtkTreeModel* model;
+ GtkTreeIter selected;
+ if(gtk_tree_selection_get_selected(selection, &model, &selected))
+ {
+ entity_t* pEntity;
+ gtk_tree_model_get(model, &selected, 1, &pEntity, -1);
+
+ if (pEntity)
+ {
+ for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)
+ {
+ Select_Deselect ();
+ Select_Brush (pEntity->brushes.onext);
+ Sys_UpdateWindows(W_ALL);
+ }
+ }
+ }
+}
+
+static gint entitylist_click (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ if (event->type == GDK_2BUTTON_PRESS)
+ {
+ entitylist_select (NULL, data);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void entitylist_selection_changed(GtkTreeSelection* selection, gpointer data)
+{
+ GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (data), "keyvalues"));
+
+ gtk_list_store_clear(store);
+
+ GtkTreeModel* model;
+ GtkTreeIter selected;
+ if(gtk_tree_selection_get_selected(selection, &model, &selected))
+ {
+ entity_t* pEntity;
+ gtk_tree_model_get(model, &selected, 1, &pEntity, -1);
+
+ if (pEntity)
+ {
+ for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)
+ {
+ GtkTreeIter appended;
+ gtk_list_store_append(store, &appended);
+ gtk_list_store_set(store, &appended, 0, pEpair->key, 1, pEpair->value, -1);
+ }
+ }
+ }
+}
+
+void DoEntityList ()
+{
+ static GtkWidget *dlg;
+ GtkWidget *vbox, *hbox, *hbox2, *button, *scr;
+ int loop = 1, ret = IDCANCEL;
+
+ if (dlg != NULL)
+ return;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ load_window_pos (dlg, g_PrefsDlg.mWindowInfo.posEntityInfoWnd);
+
+ gtk_window_set_title (GTK_WINDOW (dlg), "Entities");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (TRUE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
+
+ {
+ GtkTreeStore* store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
+
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ g_signal_connect(G_OBJECT(view), "button_press_event", G_CALLBACK(entitylist_click), dlg);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ {
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(entitylist_selection_changed), dlg);
+ }
+
+ gtk_widget_show(view);
+
+ gtk_container_add(GTK_CONTAINER (scr), view);
+ g_object_set_data (G_OBJECT (dlg), "entities", view);
+
+ {
+ {
+ GtkTreeIter child;
+ gtk_tree_store_append(store, &child, NULL);
+ gtk_tree_store_set(store, &child, 0, world_entity->eclass->name, 1, world_entity, -1);
+ }
+
+ GSList *l, *entitymap = NULL;
+ typedef struct
+ {
+ GtkTreeIter node;
+ const char *name;
+ } map_t;
+ map_t *entry;
+
+ for (entity_t* pEntity=entities.next; pEntity != &entities; pEntity=pEntity->next)
+ {
+ GtkTreeIter parent;
+ bool found = false;
+
+ for (l = entitymap; l; l = g_slist_next (l))
+ {
+ entry = (map_t*)l->data;
+
+ if (strcmp (entry->name, pEntity->eclass->name) == 0)
+ {
+ parent = entry->node;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ gtk_tree_store_append(store, &parent, NULL);
+ gtk_tree_store_set(store, &parent, 0, pEntity->eclass->name, 1, NULL, -1);
+
+ entry = (map_t*)malloc (sizeof(map_t));
+ entitymap = g_slist_append (entitymap, entry);
+ entry->name = pEntity->eclass->name;
+ entry->node = parent;
+ }
+
+ GtkTreeIter child;
+ gtk_tree_store_append(store, &child, &parent);
+ gtk_tree_store_set(store, &child, 0, pEntity->eclass->name, 1, pEntity, -1);
+ }
+
+ while (entitymap)
+ {
+ free (entitymap->data);
+ entitymap = g_slist_remove (entitymap, entitymap->data);
+ }
+ }
+
+ g_object_unref(G_OBJECT(store));
+ }
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
+
+ {
+ GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Value", renderer, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ gtk_widget_show(view);
+
+ g_object_set_data(G_OBJECT(dlg), "keyvalues", store);
+ gtk_container_add(GTK_CONTAINER (scr), view);
+
+ g_object_unref(G_OBJECT(store));
+ }
+
+ hbox2 = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("Select");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (entitylist_select), dlg);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ save_window_pos (dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ dlg = NULL;
+}
+
+// =============================================================================
+// Rotate dialog
+
+static void rotatedlg_apply (GtkWidget *widget, gpointer data)
+{
+ GtkSpinButton *spin;
+ float f;
+
+ spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "x"));
+ f = gtk_spin_button_get_value_as_float (spin);
+ if (f != 0.0)
+ Select_RotateAxis(0,f);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f); // reset to 0 on Apply
+
+ spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "y"));
+ f = gtk_spin_button_get_value_as_float (spin);
+ if (f != 0.0)
+ Select_RotateAxis(1,f);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);
+
+ spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "z"));
+ f = gtk_spin_button_get_value_as_float (spin);
+ if (f != 0.0)
+ Select_RotateAxis(2,f);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);
+}
+
+void DoRotateDlg ()
+{
+ GtkWidget *dlg, *hbox, *vbox, *table, *label, *button;
+ GtkWidget *x, *y, *z;
+ GtkObject *adj;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary rotation");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ table = gtk_table_new (3, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ label = gtk_label_new (" X ");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+
+ label = gtk_label_new (" Y ");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+
+ label = gtk_label_new (" Z ");
+
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+
+ adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
+ x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+ g_object_set_data (G_OBJECT (dlg), "x", x);
+ gtk_widget_show (x);
+ gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_usize (x, 60, -2);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (x), TRUE);
+
+ adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
+ y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+ g_object_set_data (G_OBJECT (dlg), "y", y);
+ gtk_widget_show (y);
+ gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (y), TRUE);
+
+ adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);
+ z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+ g_object_set_data (G_OBJECT (dlg), "z", z);
+ gtk_widget_show (z);
+ gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (z), TRUE);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ button = gtk_button_new_with_label ("Apply");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (rotatedlg_apply), dlg);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ rotatedlg_apply (button, dlg);
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Gamma dialog
+
+void DoGamma ()
+{
+ GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Gamma");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ entry = gtk_entry_new ();
+ gtk_widget_show (entry);
+ gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("0.0 is brightest\n1.0 is darkest");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("You must restart for the\nsettings to take effect");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ // Initialize dialog
+ char buf[16];
+ sprintf (buf, "%1.1f", g_qeglobals.d_savedinfo.fGamma);
+ gtk_entry_set_text (GTK_ENTRY (entry), buf);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ g_qeglobals.d_savedinfo.fGamma = g_strtod (gtk_entry_get_text (GTK_ENTRY (entry)), NULL);
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Find Brush Dialog
+
+// helper function to walk through the active brushes only and drop the regioned out ones
+bool WalkRegionBrush (brush_t **b, entity_t *e)
+{
+ brush_t *b2;
+ do
+ {
+ for(b2=active_brushes.next ; b2 != &active_brushes ; b2=b2->next)
+ {
+ if (b2==*b)
+ break; // this is an active brush
+ }
+ if (b2==&active_brushes)
+ {
+ // this is a regioned out brush
+ *b = (*b)->onext;
+ if (*b == &e->brushes)
+ {
+ Sys_Status ("No such brush", 0);
+ return false;
+ }
+ }
+ } while (b2==&active_brushes);
+ return true;
+}
+
+void SelectBrush (int entitynum, int brushnum)
+{
+ entity_t *e;
+ brush_t *b;
+ int i;
+
+ // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503
+ // making this work when regioning is on too
+
+ if (entitynum == 0)
+ e = world_entity;
+ else
+ {
+ e = entities.next;
+ while (--entitynum)
+ {
+ e = e->next;
+ if (e == &entities)
+ {
+ Sys_Status ("No such entity", 0);
+ return;
+ }
+ if (region_active)
+ {
+ // we need to make sure we walk to the next 'active' entity to have a valid --entitynum
+ // that is, find a brush that belongs to this entity in the active brushes
+ do
+ {
+ for (b = active_brushes.next ; b != &active_brushes ; b=b->next)
+ {
+ if (b->owner == e)
+ break; // this is an active entity
+ }
+ if (b==&active_brushes)
+ {
+ // this is a regioned out entity
+ e = e->next;
+ // don't walk past the end either
+ if (e == &entities)
+ {
+ Sys_Status ("No such entity", 0);
+ return;
+ }
+ }
+ } while(b==&active_brushes);
+ }
+ }
+ }
+
+ b = e->brushes.onext;
+ if (b == &e->brushes)
+ {
+ Sys_Status ("No such brush", 0);
+ return;
+ }
+ if (region_active)
+ {
+ if (!WalkRegionBrush(&b, e))
+ return;
+ }
+
+ while (brushnum--)
+ {
+ b = b->onext;
+ if (b == &e->brushes)
+ {
+ Sys_Status ("No such brush", 0);
+ return;
+ }
+ if (region_active)
+ {
+ if (!WalkRegionBrush(&b, e))
+ return;
+ }
+ }
+
+ Brush_RemoveFromList (b);
+ Brush_AddToList (b, &selected_brushes);
+
+ Sys_UpdateWindows (W_ALL);
+ for (i = 0; i < 3; i++)
+ {
+ if (g_pParentWnd->GetXYWnd())
+ g_pParentWnd->GetXYWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
+
+ if (g_pParentWnd->GetXZWnd())
+ g_pParentWnd->GetXZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
+
+ if (g_pParentWnd->GetYZWnd())
+ g_pParentWnd->GetYZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;
+ }
+
+ Sys_Status ("Selected", 0);
+}
+
+static void GetSelectionIndex (int *ent, int *brush)
+{
+ brush_t *b, *b2;
+ entity_t *entity;
+
+ *ent = *brush = 0;
+
+ b = selected_brushes.next;
+ if (b == &selected_brushes)
+ return;
+
+ // find entity
+ if (b->owner != world_entity)
+ {
+ (*ent)++;
+ for (entity = entities.next; entity != &entities; entity=entity->next, (*ent)++)
+ ;
+ }
+
+ // find brush
+ for (b2=b->owner->brushes.onext; b2 != b && b2 != &b->owner->brushes; b2=b2->onext, (*brush)++)
+ ;
+}
+
+void DoFind ()
+{
+ GtkWidget *dlg, *vbox, *hbox, *table, *label, *button, *entity, *brush;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Find Brush");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ label = gtk_label_new ("Entity number");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+
+ label = gtk_label_new ("Brush number");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+
+ entity = gtk_entry_new ();
+ gtk_widget_show (entity);
+ gtk_table_attach (GTK_TABLE (table), entity, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ brush = gtk_entry_new ();
+ gtk_widget_show (brush);
+ gtk_table_attach (GTK_TABLE (table), brush, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ // Initialize dialog
+ char buf[16];
+ int ent, br;
+
+ GetSelectionIndex (&ent, &br);
+ sprintf (buf, "%i", ent);
+ gtk_entry_set_text (GTK_ENTRY (entity), buf);
+ sprintf (buf, "%i", br);
+ gtk_entry_set_text (GTK_ENTRY (brush), buf);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ const char *entstr = gtk_entry_get_text (GTK_ENTRY (entity));
+ const char *brushstr = gtk_entry_get_text (GTK_ENTRY (brush));
+ SelectBrush (atoi(entstr), atoi(brushstr));
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Arbitrary Sides dialog
+
+void DoSides (bool bCone, bool bSphere, bool bTorus)
+{
+ GtkWidget *dlg, *vbox, *hbox, *button, *label, *entry;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary sides");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ label = gtk_label_new ("Sides:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ entry = gtk_entry_new ();
+ gtk_widget_show (entry);
+ gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ const char *str = gtk_entry_get_text (GTK_ENTRY (entry));
+
+ if (bCone)
+ Brush_MakeSidedCone(atoi(str));
+ else if (bSphere)
+ Brush_MakeSidedSphere(atoi(str));
+ else
+ Brush_MakeSided (atoi(str));
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// New Patch dialog
+
+void DoNewPatchDlg ()
+{
+ GtkWidget *dlg, *hbox, *table, *vbox, *label, *button, *combo;
+ GtkWidget *width, *height;
+ GList *combo_list = (GList*)NULL;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Patch density");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ label = gtk_label_new ("Width:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Height:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ combo_list = g_list_append (combo_list, (void *)"3");
+ combo_list = g_list_append (combo_list, (void *)"5");
+ combo_list = g_list_append (combo_list, (void *)"7");
+ combo_list = g_list_append (combo_list, (void *)"9");
+ combo_list = g_list_append (combo_list, (void *)"11");
+ combo_list = g_list_append (combo_list, (void *)"13");
+ combo_list = g_list_append (combo_list, (void *)"15");
+
+ combo = gtk_combo_new ();
+ width = GTK_COMBO (combo)->entry;
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
+ gtk_widget_show (combo);
+ gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ combo = gtk_combo_new ();
+ height = GTK_COMBO (combo)->entry;
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
+ gtk_widget_show (combo);
+ gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ // Initialize dialog
+ g_list_free (combo_list);
+ gtk_entry_set_text (GTK_ENTRY (width), "3");
+ gtk_entry_set_editable (GTK_ENTRY (width), FALSE);
+ gtk_entry_set_text (GTK_ENTRY (height), "3");
+ gtk_entry_set_editable (GTK_ENTRY (height), FALSE);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ const char* w = gtk_entry_get_text (GTK_ENTRY (width));
+ const char* h = gtk_entry_get_text (GTK_ENTRY (height));
+
+ Patch_GenericMesh(atoi (w), atoi (h), g_pParentWnd->ActiveXY ()->GetViewType ());
+ Sys_UpdateWindows (W_ALL);
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// New Patch dialog
+
+void DoScaleDlg ()
+{
+ GtkWidget *dlg, *hbox, *table, *vbox, *label, *button;
+ GtkWidget *x, *y, *z;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Scale");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ table = gtk_table_new (3, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ label = gtk_label_new ("X:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Y:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Z:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ x = gtk_entry_new ();
+ gtk_widget_show (x);
+ gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ y = gtk_entry_new ();
+ gtk_widget_show (y);
+ gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ z = gtk_entry_new ();
+ gtk_widget_show (z);
+ gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ // Initialize dialog
+ gtk_entry_set_text (GTK_ENTRY (x), "1.0");
+ gtk_entry_set_text (GTK_ENTRY (y), "1.0");
+ gtk_entry_set_text (GTK_ENTRY (z), "1.0");
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ float sx, sy, sz;
+ sx = atof (gtk_entry_get_text (GTK_ENTRY (x)));
+ sy = atof (gtk_entry_get_text (GTK_ENTRY (y)));
+ sz = atof (gtk_entry_get_text (GTK_ENTRY (z)));
+
+ if (sx > 0 && sy > 0 && sz > 0)
+ {
+ Select_Scale(sx, sy, sz);
+ Sys_UpdateWindows (W_ALL);
+ }
+ else
+ Sys_Printf("Warning.. Tried to scale by a zero value.");
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Thicken Patch dialog
+
+void DoThickenDlg ()
+{
+ GtkWidget *dlg, *vbox, *hbox, *vbox2, *button, *label;
+ GtkWidget *amount, *seams, *group;
+ int loop = 1, ret = IDCANCEL;
+ static qboolean bGroupResult = true;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Thicken Patch");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ label = gtk_label_new ("This produces a set of patches\n"
+ "that contains the original patch along with the\n"
+ "'thick' patch and an optimal set of seam patches.");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ label = gtk_label_new ("Amount:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ amount = gtk_entry_new ();
+ gtk_widget_show (amount);
+ gtk_box_pack_start (GTK_BOX (hbox), amount, FALSE, FALSE, 0);
+
+ seams = gtk_check_button_new_with_label ("Seams");
+ gtk_widget_show (seams);
+ gtk_box_pack_start (GTK_BOX (hbox), seams, FALSE, FALSE, 0);
+
+ // bGroupResult
+ group = gtk_check_button_new_with_label("Result to func_group");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(group), bGroupResult);
+ gtk_box_pack_start(GTK_BOX(vbox), group, FALSE, FALSE, 0);
+ gtk_widget_show(group);
+
+
+ // Initialize dialog
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (seams), TRUE);
+ gtk_entry_set_text (GTK_ENTRY (amount), "8");
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group)))
+ bGroupResult = true;
+ else
+ bGroupResult = false;
+ Patch_Thicken (atoi (gtk_entry_get_text (GTK_ENTRY (amount))),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (seams)), bGroupResult);
+ Sys_UpdateWindows (W_ALL);
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// About dialog (no program is complete without one)
+
+void about_button_changelog (GtkWidget *widget, gpointer data)
+{
+ Str log;
+ log = g_strAppPath;
+ log += "changelog.txt";
+ OpenURL(log.GetBuffer());
+}
+
+void about_button_credits (GtkWidget *widget, gpointer data)
+{
+ Str cred;
+ cred = g_strAppPath;
+ cred += "credits.html";
+ OpenURL(cred.GetBuffer());
+}
+
+void DoAbout ()
+{
+ GtkWidget *dlg, *vbox, *vbox2, *hbox, *frame, *table, *label, *pixmap, *button, *sc_extensions, *text_extensions;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "About GtkRadiant");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ vbox = gtk_vbox_new (FALSE, 10);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, FALSE, 0);
+
+ frame = gtk_frame_new ((char*)NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+
+ pixmap = new_pixmap (g_pParentWnd->m_pWidget, "logo.bmp");
+ gtk_widget_show (pixmap);
+ gtk_container_add (GTK_CONTAINER (frame), pixmap);
+
+ label = gtk_label_new ("GtkRadiant " RADIANT_VERSION "\n"
+ __DATE__ "\n\n"
+ RADIANT_ABOUTMSG "\n\n"
+ "By qeradiant.com\n\n"
+ "This product contains software technology\n"
+ "from id Software, Inc. ('id Technology').\n"
+ "id Technology 2000 id Software,Inc.\n\n"
+ "GtkRadiant is unsupported, however\n"
+ "you may report your problems at\n"
+ "http://zerowing.idsoftware.com/bugzilla"
+ );
+
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ vbox2 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+
+ button = gtk_button_new_with_label ("Credits");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (about_button_credits), NULL);
+
+ button = gtk_button_new_with_label ("Changelog");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (about_button_changelog), NULL);
+
+ frame = gtk_frame_new ("OpenGL Properties");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+
+ table = gtk_table_new (3, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+ gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+
+ label = gtk_label_new ("Vendor:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Version:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Renderer:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ((char*)qglGetString (GL_VENDOR));
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ((char*)qglGetString (GL_VERSION));
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ((char*)qglGetString (GL_RENDERER));
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ frame = gtk_frame_new ("OpenGL Extensions");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ sc_extensions = gtk_scrolled_window_new(NULL, NULL);
+ gtk_box_pack_start(GTK_BOX(hbox), sc_extensions, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_extensions), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sc_extensions), GTK_SHADOW_IN);
+ gtk_widget_show(sc_extensions);
+
+ text_extensions = gtk_text_view_new();
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(text_extensions), FALSE);
+ gtk_container_add (GTK_CONTAINER (sc_extensions), text_extensions);
+ GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_extensions));
+ gtk_text_buffer_set_text(buffer, (char *)qglGetString(GL_EXTENSIONS), -1);
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_extensions), GTK_WRAP_WORD);;
+ gtk_widget_show(text_extensions);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Command List dialog
+
+void DoCommandListDlg ()
+{
+ GtkWidget *dlg, *vbox, *hbox, *scr, *button;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Mapped Commands");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+ gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
+
+ {
+ GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Command", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ gtk_widget_show(view);
+ gtk_container_add(GTK_CONTAINER (scr), view);
+
+ {
+ // Initialize dialog
+ CString path;
+ path = g_strTempPath;
+ path += "commandlist.txt";
+
+ GSList *cmds = NULL;
+ int n;
+
+ for (n = 0; n < g_nCommandCount; n++)
+ cmds = g_slist_append (cmds, g_Commands[n].m_strCommand);
+ cmds = g_slist_sort (cmds, (gint (*)(const void *, const void *))strcmp);
+
+ Sys_Printf("Writing the command list to %s", path.GetBuffer() );
+ FILE* fileout = fopen (path.GetBuffer (), "wt");
+
+ while (cmds)
+ {
+ for (n = 0; n < g_nCommandCount; n++)
+ if (cmds->data == g_Commands[n].m_strCommand)
+ break;
+
+ char c = g_Commands[n].m_nKey;
+ CString strLine, strMod(""), strKeys (c);
+
+ for (int k = 0; k < g_nKeyCount; k++)
+ {
+ if (g_Keys[k].m_nVKKey == g_Commands[n].m_nKey)
+ {
+ strKeys = g_Keys[k].m_strName;
+ break;
+ }
+ }
+
+ if (g_Commands[n].m_nModifiers & RAD_SHIFT)
+ strMod = "Shift";
+ if (g_Commands[n].m_nModifiers & RAD_ALT)
+ strMod += (strMod.GetLength() > 0) ? " + Alt" : "Alt";
+ if (g_Commands[n].m_nModifiers & RAD_CONTROL)
+ strMod += (strMod.GetLength() > 0) ? " + Control" : "Control";
+ if (strMod.GetLength() > 0)
+ strMod += " + ";
+ strMod += strKeys;
+
+ {
+ GtkTreeIter iter;
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, g_Commands[n].m_strCommand, 1, strMod.GetBuffer (), -1);
+ }
+
+ if (fileout != NULL)
+ {
+ strLine.Format("%-25s %s\r\n", g_Commands[n].m_strCommand, strMod.GetBuffer ());
+ fputs (strLine.GetBuffer (), fileout);
+ }
+
+ cmds = g_slist_remove (cmds, cmds->data);
+ }
+
+ if (fileout != NULL)
+ fclose (fileout);
+ }
+
+ g_object_unref(G_OBJECT(store));
+ }
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Texture List dialog
+
+void DoTextureListDlg ()
+{
+ GtkWidget *dlg, *vbox, *hbox, *scr, *button;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Textures");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+ gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
+
+ GtkWidget* texture_list;
+
+ {
+ GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
+
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ gtk_widget_show(view);
+ gtk_container_add(GTK_CONTAINER (scr), view);
+
+ {
+ // Initialize dialog
+ GSList *textures = (GSList*)NULL;
+ FillTextureMenu(&textures);
+ while (textures != NULL)
+ {
+ {
+ GtkTreeIter iter;
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, (gchar*)textures->data, -1);
+ }
+ free (textures->data);
+ textures = g_slist_remove (textures, textures->data);
+ }
+ }
+
+ g_object_unref(G_OBJECT(store));
+
+ texture_list = view;
+ }
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("Load");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(texture_list));
+
+ GtkTreeModel* model;
+ GtkTreeIter iter;
+ if(gtk_tree_selection_get_selected(selection, &model, &iter))
+ {
+ GtkTreePath* path = gtk_tree_model_get_path(model, &iter);
+ if(gtk_tree_path_get_depth(path) == 1)
+ Texture_ShowDirectory(gtk_tree_path_get_indices(path)[0] + CMD_TEXTUREWAD);
+ gtk_tree_path_free(path);
+ }
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// Cap dialog
+
+int DoCapDlg (int *type, bool *b_GroupResult)
+{
+ GtkWidget *dlg, *vbox, *hbox, *table, *pixmap, *button, *group_toggle, *radio_vbox;
+ GtkWidget *bevel, *endcap, *ibevel, *iendcap;
+ GSList *group = (GSList*)NULL;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Cap");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ // Gef: Added a vbox to contain the toggle buttons
+ radio_vbox = gtk_vbox_new(FALSE, 4);
+ gtk_container_add(GTK_CONTAINER(hbox), radio_vbox);
+ gtk_widget_show(radio_vbox);
+
+ table = gtk_table_new (4, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (radio_vbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_bevel.bmp");
+ gtk_widget_show (pixmap);
+ gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_endcap.bmp");
+ gtk_widget_show (pixmap);
+ gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_ibevel.bmp");
+ gtk_widget_show (pixmap);
+ gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_iendcap.bmp");
+ gtk_widget_show (pixmap);
+ gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 3, 4,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ bevel = gtk_radio_button_new_with_label (group, "Bevel");
+ gtk_widget_show (bevel);
+ gtk_table_attach (GTK_TABLE (table), bevel, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (bevel));
+
+ endcap = gtk_radio_button_new_with_label (group, "Endcap");
+ gtk_widget_show (endcap);
+ gtk_table_attach (GTK_TABLE (table), endcap, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (endcap));
+
+ ibevel = gtk_radio_button_new_with_label (group, "Inverted Bevel");
+ gtk_widget_show (ibevel);
+ gtk_table_attach (GTK_TABLE (table), ibevel, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (ibevel));
+
+ iendcap = gtk_radio_button_new_with_label (group, "Inverted Endcap");
+ gtk_widget_show (iendcap);
+ gtk_table_attach (GTK_TABLE (table), iendcap, 1, 2, 3, 4,
+ (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (iendcap));
+
+ // Gef: added radio toggle for func_grouping capped patches
+ group_toggle = gtk_check_button_new_with_label("Result to func_group");
+ gtk_container_add(GTK_CONTAINER(radio_vbox), group_toggle);
+ gtk_widget_show(group_toggle);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ // Gef: Set the state of the func_group toggle
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (group_toggle), *b_GroupResult);
+
+ // Initialize dialog
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bevel), TRUE);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (bevel)))
+ *type = BEVEL; //*type = CapDialog::BEVEL;
+ else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (endcap)))
+ *type = ENDCAP; //*type = CapDialog::ENDCAP;
+ else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ibevel)))
+ *type = IBEVEL; // *type = CapDialog::IBEVEL;
+ else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (iendcap)))
+ *type = IENDCAP; // *type = CapDialog::IENDCAP;
+
+ // Gef: Added toggle for optional cap func_grouping
+ *b_GroupResult = (bool *)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group_toggle));
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return ret;
+}
+
+// =============================================================================
+// Scripts dialog
+
+void DoScriptsDlg ()
+{
+ GtkWidget *dlg, *vbox, *vbox2, *hbox, *label, *button, *scr;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Available Scripts - Not Implemented Yet");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ label = gtk_label_new ("WARNING: BrushScripting is in a highly experimental state and is\n"
+ "far from complete. If you attempt to use them it is VERY LIKELY\n"
+ "that Radiant will crash. Save your work before attempting to\n"
+ "make use of any scripting features.");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+
+ scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);
+
+ GtkWidget* scripts_list;
+
+ {
+ GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
+
+ GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
+ }
+
+ gtk_widget_show(view);
+ gtk_container_add(GTK_CONTAINER (scr), view);
+
+ {
+ // Initialize dialog
+ CString strINI;
+ strINI = g_strGameToolsPath;
+ strINI += "/scripts.ini";
+ FILE *f;
+
+ f = fopen (strINI.GetBuffer(), "rt");
+ if (f != NULL)
+ {
+ char line[1024], *ptr;
+
+ // read section names
+ while (fgets (line, 1024, f) != 0)
+ {
+ if (line[0] != '[')
+ continue;
+
+ ptr = strchr (line, ']');
+ *ptr = '\0';
+
+ {
+ GtkTreeIter iter;
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, line, -1);
+ }
+ }
+ fclose (f);
+ }
+ }
+
+ g_object_unref(G_OBJECT(store));
+
+ scripts_list = view;
+ }
+
+ vbox2 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("Run");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("New...");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_widget_set_sensitive (button, FALSE);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Edit...");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_widget_set_sensitive (button, FALSE);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(scripts_list));
+
+ GtkTreeModel* model;
+ GtkTreeIter iter;
+ if(gtk_tree_selection_get_selected(selection, &model, &iter))
+ {
+ char* script;
+ gtk_tree_model_get(model, &iter, 0, &script, -1);
+ RunScriptByName(script, true);
+ g_free(script);
+ }
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+}
+
+// =============================================================================
+// dialog
+
+int DoBSInputDlg (const char *fields[5], float values[5])
+{
+ GtkWidget *dlg, *vbox, *hbox, *label, *button;
+ GtkWidget *entries[5];
+ int i, loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "BrushScript Input");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ // Create entries and initialize them
+ for (i = 0; i < 5; i++)
+ {
+ if (strlen (fields[i]) == 0)
+ continue;
+
+ label = gtk_label_new (fields[i]);
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ entries[i] = gtk_entry_new ();
+ gtk_widget_show (entries[i]);
+ gtk_box_pack_start (GTK_BOX (vbox), entries[i], TRUE, TRUE, 0);
+
+ char buf[32];
+ sprintf (buf, "%f", values[i]);
+ gtk_entry_set_text (GTK_ENTRY (entries[i]), buf);
+ }
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ for (i = 0; i < 5; i++)
+ {
+ if (strlen (fields[i]) == 0)
+ continue;
+
+ values[i] = atof (gtk_entry_get_text (GTK_ENTRY (entries[i])));
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return ret;
+}
+
+// =============================================================================
+// TextureLayout dialog
+
+int DoTextureLayout (float *fx, float *fy)
+{
+ GtkWidget *dlg, *vbox, *hbox, *table, *label, *button;
+ GtkWidget *x, *y;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Patch texture layout");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("Texture will be fit across the patch based\n"
+ "on the x and y values given. Values of 1x1\n"
+ "will \"fit\" the texture. 2x2 will repeat\n"
+ "it twice, etc.");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ label = gtk_label_new ("Texture x:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Texture y:");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ x = gtk_entry_new ();
+ gtk_widget_show (x);
+ gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ y = gtk_entry_new ();
+ gtk_widget_show (y);
+ gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ // Initialize
+ gtk_entry_set_text (GTK_ENTRY (x), "4.0");
+ gtk_entry_set_text (GTK_ENTRY (y), "4.0");
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ {
+ *fx = atof (gtk_entry_get_text (GTK_ENTRY (x)));
+ *fy = atof (gtk_entry_get_text (GTK_ENTRY (y)));
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return ret;
+}
+
+// =============================================================================
+// Name dialog
+
+char* DoNameDlg (const char* title)
+{
+ GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
+ int loop = 1, ret = IDCANCEL;
+ char *str;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), title);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ label = gtk_label_new ("Name:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ entry = gtk_entry_new ();
+ gtk_widget_show (entry);
+ gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+ else
+ str = NULL;
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return str;
+}
+
+// =============================================================================
+// NewProject dialog
+
+char* DoNewProjectDlg ()
+{
+ GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry, *check;
+ int loop = 1, ret = IDCANCEL;
+ char *str;
+
+ // start by a warning message
+ // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=459
+ CString msg;
+ msg = "Are you sure you want a new project?\n";
+ msg += "Please note that creating a new project is not the prefered way to setup GtkRadiant for mod editing.\n";
+ msg += "Check http://www.qeradiant.com/faq/index.cgi?file=220 for more information";
+ if (gtk_MessageBox(NULL, msg.GetBuffer(), "Confirm", MB_YESNO, "http://www.qeradiant.com/faq/index.cgi?file=220" ) == IDNO)
+ {
+ return NULL;
+ }
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "New Project");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ hbox = gtk_hbox_new (FALSE, 10);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new ("This will create a new directory beneath your\n"
+ "game path based on the project name you give.");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ label = gtk_label_new ("Project name:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ entry = gtk_entry_new ();
+ gtk_widget_show (entry);
+ gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
+
+ check = gtk_check_button_new_with_label ("Include game dll files");
+ gtk_widget_show (check);
+ gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0);
+ gtk_widget_set_sensitive (check, FALSE);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_set_usize (button, 60, -2);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+ else
+ str = NULL;
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return str;
+}
+
+// =============================================================================
+// Text Editor dialog
+
+// master window widget
+static GtkWidget *text_editor = NULL;
+static GtkWidget *text_widget; // slave, text widget from the gtk editor
+
+static gint editor_delete (GtkWidget *widget, gpointer data)
+{
+ if (gtk_MessageBox (widget, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)
+ return TRUE;
+
+ gtk_widget_hide (text_editor);
+
+ return TRUE;
+}
+
+static void editor_save (GtkWidget *widget, gpointer data)
+{
+ FILE *f = fopen ((char*)g_object_get_data (G_OBJECT (data), "filename"), "w");
+ gpointer text = g_object_get_data (G_OBJECT (data), "text");
+
+ if (f == NULL)
+ {
+ gtk_MessageBox (GTK_WIDGET(data), "Error saving file !");
+ return;
+ }
+
+ char *str = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);
+ fwrite (str, 1, strlen (str), f);
+ fclose (f);
+}
+
+static void editor_close (GtkWidget *widget, gpointer data)
+{
+ if (gtk_MessageBox (text_editor, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)
+ return;
+
+ gtk_widget_hide (text_editor);
+}
+
+// several attempts
+// http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355
+#if 0
+#ifdef _WIN32
+
+HWND FindEditWindow()
+{
+ return FindWindow("TFormEditPadLite", NULL);
+}
+
+HWND FindEditWindow()
+{
+ HWND hwnd = FindWindow("TFormEditPadLite", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TEditPadEditor", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TWinControlProxy", NULL);
+ return hwnd;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+HWND FindEditWindow()
+{
+ HWND hwnd = FindWindow("TFormEditPadLite", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TFrameSearchReplace", NULL);
+ if (hwnd)
+ {
+ hwnd = FindWindowEx(hwnd, NULL, "TJGStringEditorControl", NULL);
+ return hwnd;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+HWND FindEditWindow()
+{
+ HWND hwnd = FindWindow("TEditPadForm", NULL);
+ HWND hwndEdit = NULL;
+ if (hwnd != NULL)
+ {
+ HWND hwndTab = FindWindowEx(hwnd, NULL, "TTabControl", NULL);
+ if (hwndTab != NULL)
+ {
+ hwndEdit = FindWindowEx(hwndTab, NULL, "TRicherEdit", NULL);
+ }
+ }
+ return hwndEdit;
+}
+#endif
+#endif // #if 0
+
+static void CreateGtkTextEditor ()
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox, *hbox, *button, *scr, *text;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (editor_delete), NULL);
+ gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 300);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ scr = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scr);
+ gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
+
+ text = gtk_text_view_new();
+ gtk_container_add (GTK_CONTAINER (scr), text);
+ gtk_widget_show (text);
+ g_object_set_data (G_OBJECT (dlg), "text", text);
+ gtk_text_view_set_editable (GTK_TEXT_VIEW(text), TRUE);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (editor_close), dlg);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Save");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (editor_save), dlg);
+ gtk_widget_set_usize (button, 60, -2);
+
+ text_editor = dlg;
+ text_widget = text;
+}
+
+static void DoGtkTextEditor (const char* filename, guint cursorpos)
+{
+ if (!text_editor)
+ CreateGtkTextEditor(); // build it the first time we need it
+
+ // Load file
+ FILE *f = fopen (filename, "r");
+
+ if (f == NULL)
+ {
+ Sys_Printf("Unable to load file %s in shader editor.\n", filename);
+ gtk_widget_hide (text_editor);
+ }
+ else
+ {
+ fseek (f, 0, SEEK_END);
+ int len = ftell (f);
+ void *buf = qmalloc (len);
+ void *old_filename;
+
+ rewind (f);
+ fread (buf, 1, len, f);
+
+ gtk_window_set_title (GTK_WINDOW (text_editor), filename);
+
+ GtkTextBuffer* text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget));
+ gtk_text_buffer_set_text(text_buffer, (char*)buf, len);
+
+ old_filename = g_object_get_data (G_OBJECT (text_editor), "filename");
+ if (old_filename)
+ free(old_filename);
+ g_object_set_data (G_OBJECT (text_editor), "filename", strdup (filename));
+
+ // trying to show later
+ gtk_widget_show (text_editor);
+
+#ifdef _WIN32
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+#endif
+
+ // only move the cursor if it's not exceeding the size..
+ // NOTE: this is erroneous, cursorpos is the offset in bytes, not in characters
+ // len is the max size in bytes, not in characters either, but the character count is below that limit..
+ // thinking .. the difference between character count and byte count would be only because of CR/LF?
+ {
+ GtkTextIter text_iter;
+ // character offset, not byte offset
+ gtk_text_buffer_get_iter_at_offset(text_buffer, &text_iter, cursorpos);
+ gtk_text_buffer_place_cursor(text_buffer, &text_iter);
+ }
+
+#ifdef _WIN32
+ gtk_widget_queue_draw(text_widget);
+#endif
+
+ free (buf);
+ fclose (f);
+ }
+}
+
+void DoTextEditor (const char* filename, int cursorpos)
+{
+ CString strEditCommand;
+#ifdef _WIN32
+ if (g_PrefsDlg.m_bUseWin32Editor)
+ {
+ Sys_Printf("opening file '%s' (line %d info ignored)\n", filename);
+ ShellExecute((HWND)GDK_WINDOW_HWND (g_pParentWnd->m_pWidget->window), "open", filename, NULL, NULL, SW_SHOW );
+ return;
+ }
+#else
+ // check if a custom editor is set
+ if((g_PrefsDlg.m_bUseCustomEditor) && (g_PrefsDlg.m_strEditorCommand.GetLength() > 0))
+ {
+ strEditCommand = g_PrefsDlg.m_strEditorCommand;
+ strEditCommand += " \"";
+ strEditCommand += filename;
+ strEditCommand += "\"";
+
+ Sys_Printf("Launching: %s\n", strEditCommand.GetBuffer());
+ // note: linux does not return false if the command failed so it will assume success
+ if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)
+ {
+ Sys_FPrintf(SYS_WRN, "Warning: Failed to execute %s, using default\n", strEditCommand.GetBuffer());
+ }
+ else
+ {
+ // the command (appeared) to run successfully, no need to do anything more
+ return;
+ }
+ }
+#endif
+
+ DoGtkTextEditor (filename, cursorpos);
+
+ // old win32 code with EditPad bindings, broken
+ // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355
+#if 0
+ strEditCommand = g_strAppPath.GetBuffer();
+ strEditCommand += "editpad.exe";
+ strEditCommand += " \"";
+ strEditCommand += filename;
+ strEditCommand += "\"";
+ if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)
+ {
+ Sys_FPrintf(SYS_WRN, "WARNING: Gtk shader editor is not fully functional on windows in general and unstable on win98 in particular.\n");
+ 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");
+ DoGtkTextEditor (filename, cursorpos);
+ }
+ else
+ {
+ // TTimo: we used to call Delay here, to continue processing messages. But it seems to induce a lot of instabilities.
+ // so now the user will simply have to wait.
+ Sleep( 1500 );
+
+ // now grab the edit window and scroll to the shader we want to edit
+ HWND hwndEdit = FindEditWindow();
+
+ if (hwndEdit != NULL)
+ PostMessage(hwndEdit, EM_SETSEL, cursorpos, cursorpos);
+ else
+ Sys_Printf("Unable to load shader editor.\n");
+ }
+#endif
+}
+
+// =============================================================================
+// Light Intensity dialog
+
+int DoLightIntensityDlg (int *intensity)
+{
+ GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;
+ int loop = 1, ret = IDCANCEL;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Light intensity");
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (dlg), "loop", &loop);
+ g_object_set_data (G_OBJECT (dlg), "ret", &ret);
+
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("ESC for default, ENTER to validate");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+ entry = gtk_entry_new ();
+ gtk_widget_show (entry);
+ gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
+ gtk_widget_set_usize (button, 60, -2);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
+ gtk_widget_set_usize (button, 60, -2);
+
+ char buf[16];
+ sprintf (buf, "%d", *intensity);
+ gtk_entry_set_text (GTK_ENTRY (entry), buf);
+
+ gtk_grab_add (dlg);
+ gtk_widget_show (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == IDOK)
+ *intensity = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return ret;
+}