2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 // Main Window for Q3Radiant
25 // Leonardo Zide (leo@lokigames.com)
31 #include <gdk/gdkwin32.h>
32 #define COMPILE_MULTIMON_STUBS
37 #include <glib/gi18n.h>
38 #include <gdk/gdkkeysyms.h>
39 #include <gdk/gdkprivate.h>
41 #if defined (__linux__) || defined (__APPLE__)
45 #include "groupdialog.h"
46 #include "patchdialog.h"
49 // use this to verbose what happens with the beyboard
55 CString g_strAppPath; ///< holds the full path of the executable
56 CString g_strDTDPath; ///< path to the DTD files
57 CString g_pidFile; ///< the global .pid file (only for global part of the startup)
58 CString g_pidGameFile; ///< the game-specific .pid file
59 CString g_strBitmapsPath; // directory where the bitmaps are stored
62 points to the game tools directory, for instance
63 C:\Program Files\Quake III Arena\GtkRadiant
65 this is one of the main variables that are configured by the game selection on startup
66 <g_strGameToolsPath>/plugins
67 <g_strGameToolsPath>/modules
70 CString g_strGameToolsPath; ///< this is set by g_PrefsDlg.mGamesDialog
71 CGameDescription *g_pGameDescription; ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
72 CString g_strPluginsDir; ///< name of plugins directory, always sub-directory of toolspath
73 CString g_strModulesDir; ///< name of modules directory, always sub-directory of toolspath
76 directory for temp files
77 NOTE: on *nix this is were we check for .pid
79 CString g_strTempPath;
80 MainFrame* g_pParentWnd = NULL; // used to precast to CMainFrame
81 PrefsDlg g_Preferences; // global prefs instance
82 PrefsDlg& g_PrefsDlg = g_Preferences; // reference used throughout
83 int g_nUpdateBits = 0; // window update flags
84 bool g_bScreenUpdates = true; // whether window painting is active, used in a few places
85 // to disable updates for speed reasons
86 // both of the above should be made members of CMainFrame
87 int g_bIgnoreCommands; // Used to ignore commands when checking menus/toolbars
88 GSList *g_BSPFrontendCommands; // List of commands in the BSP menu
90 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
91 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
93 extern bool g_bCrossHairs;
96 extern PatchDialog g_PatchDialog;
98 GtkAccelGroup* global_accel;
100 void Select_Ungroup ();
102 // command mapping stuff
104 // m_strCommand is the command string
105 // m_nKey is the GDK_??? equivelant
106 // m_nModifiers are key states as follows
113 #define SPEED_MOVE 32
114 #define SPEED_TURN 22.5
116 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
117 // - if you add a command here and you don't want a menu item, use the "hidden" menu
118 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
119 SCommandInfo g_Commands[] =
121 {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
122 {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
123 {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
124 // {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
125 {"SelectFuncGroup", 'G', 0x00, ID_SELECT_FUNC_GROUP, "menu_select_func_group"},
126 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
127 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
128 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
129 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
130 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
131 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
132 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
133 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
134 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
135 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
136 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
137 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
138 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
139 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
140 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
141 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
142 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
143 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
144 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
145 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
146 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
147 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
148 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
149 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
150 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
151 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
152 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
153 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
154 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
155 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
156 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
157 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
158 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
159 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
160 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
161 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
162 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
163 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
164 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
165 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
166 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
167 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
168 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
169 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
170 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
171 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
172 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
173 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
174 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
175 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
176 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
177 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
178 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
179 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
180 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
181 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
182 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
183 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
184 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
185 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
186 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
187 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
188 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
189 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
190 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
191 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
192 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
193 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
194 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
195 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
196 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
197 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
198 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
199 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
200 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
201 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
202 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
203 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
204 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
205 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
206 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
207 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
208 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
209 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
210 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
211 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
212 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
213 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
214 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
215 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
216 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
217 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
218 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
219 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
220 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
221 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
222 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
223 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
224 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
225 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
226 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
227 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
228 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
229 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
230 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
231 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
232 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
233 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
234 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
235 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
236 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
237 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
238 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
239 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
240 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
241 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
242 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
243 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
244 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
245 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
246 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
247 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
248 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
249 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
250 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
251 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
252 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
253 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
254 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
255 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
256 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
257 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
258 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
259 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
260 {"FilterCaulk", '6', RAD_ALT , ID_FILTER_CAULK, "menu_filter_caulk"},
261 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
262 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
263 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
264 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
265 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
266 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
267 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
268 {"FilterStructural", 'D', RAD_CONTROL|RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
269 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
270 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
271 {"FilterTriggers", 'T', RAD_CONTROL|RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
272 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
273 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
274 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
277 int g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
281 {"Space", GDK_space},
282 {"Backspace", GDK_BackSpace},
283 {"Escape", GDK_Escape},
285 {"Insert", GDK_Insert},
286 {"Delete", GDK_Delete},
287 {"PageUp", GDK_Prior},
288 {"PageDown", GDK_Next},
292 {"Right", GDK_Right},
306 {"Return", GDK_Return},
307 {"Comma", GDK_comma},
308 {"Period", GDK_period},
309 {"Plus", GDK_KP_Add},
310 {"Multiply", GDK_multiply},
311 {"Subtract", GDK_KP_Subtract},
312 {"NumPad0", GDK_KP_0},
313 {"NumPad1", GDK_KP_1},
314 {"NumPad2", GDK_KP_2},
315 {"NumPad3", GDK_KP_3},
316 {"NumPad4", GDK_KP_4},
317 {"NumPad5", GDK_KP_5},
318 {"NumPad6", GDK_KP_6},
319 {"NumPad7", GDK_KP_7},
320 {"NumPad8", GDK_KP_8},
321 {"NumPad9", GDK_KP_9},
328 int g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
330 // =============================================================================
333 void WINAPI Sys_UpdateWindows (int nBits)
335 g_nUpdateBits |= nBits;
338 // =============================================================================
341 // Gef: Separate handling for keyup events
342 void HandleKeyUp (GtkWidget *widget, gpointer data)
344 int id = GPOINTER_TO_INT (data);
346 Sys_Printf("HandleKeyUp: %d\n", id);
349 if(g_bIgnoreCommands)
354 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (FALSE); break;
355 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (FALSE); break;
356 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (FALSE); break;
357 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (FALSE); break;
358 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (FALSE); break;
359 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (FALSE); break;
363 gint HandleCommand (GtkWidget *widget, gpointer data)
365 int id = GPOINTER_TO_INT (data);
367 Sys_Printf("HandleCommand %d\n", id);
370 if ( g_bIgnoreCommands ) {
372 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
377 if (id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END) g_pParentWnd->OnTextureWad (id);
378 else if (id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END) g_pParentWnd->OnBspCommand (id);
379 else if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4) g_pParentWnd->OnMru (id);
380 else if (id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE)
382 if (GTK_CHECK_MENU_ITEM (widget)->active)
383 g_pParentWnd->OnViewNearest (id);
384 } else if (id >= ID_GRID_025 && id <= ID_GRID_256) g_pParentWnd->OnGrid (id);
385 else if (id >= ID_PLUGIN_START && id <= ID_PLUGIN_END)
388 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
389 g_pParentWnd->OnPlugIn (id, str);
390 } else if (id >= ID_ENTITY_START && id <= ID_ENTITY_END)
393 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
394 g_pParentWnd->ActiveXY()->OnEntityCreate (str);
398 case ID_FILE_NEW: g_pParentWnd->OnFileNew (); break;
399 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
400 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen (); break;
401 case ID_FILE_SAVE: g_pParentWnd->OnFileSave (); break;
402 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas (); break;
403 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap (); break;
404 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion (); break;
405 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject (); break;
406 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject (); break;
407 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings (); break;
408 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile (); break;
409 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate (); break;
410 case ID_FILE_EXIT: g_pParentWnd->OnFileExit (); break;
411 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap (); break;
412 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo (); break;
413 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo (); break;
414 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush (); break;
415 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush (); break;
416 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera (); break;
417 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete (); break;
418 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo (); break;
419 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo (); break;
420 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts (); break;
421 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab (); break;
422 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab (); break;
423 case ID_PREFS: g_pParentWnd->OnPrefs (); break;
424 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera (); break;
425 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole (); break;
426 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity (); break;
427 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups (); break;
428 case ID_SELECT_FUNC_GROUP: g_pParentWnd->OnSelectFuncGroup(); break;
429 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview (); break;
430 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz (); break;
431 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz (); break;
432 case ID_TOGGLEZ: g_pParentWnd->OnTogglez (); break;
433 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter (); break;
434 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor (); break;
435 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor (); break;
436 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview (); break;
437 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview (); break;
438 case ID_VIEW_XY: g_pParentWnd->OnViewXy (); break;
439 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide (); break;
440 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront (); break;
441 case ID_VIEW_100: g_pParentWnd->OnView100 (); break;
442 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin (); break;
443 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout (); break;
444 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100 (); break;
445 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin (); break;
446 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout (); break;
447 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein (); break;
448 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout (); break;
449 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames (); break;
450 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks (); break;
451 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates (); break;
452 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline (); break;
453 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes (); break;
454 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone (); break;
455 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles (); break;
456 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected (); break;
457 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden (); break;
458 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
459 case ID_VIEW_ENTITIESAS_WIREFRAME:
460 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
461 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
462 case ID_VIEW_ENTITIESAS_SKINNED:
463 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
464 g_pParentWnd->OnEntitiesSetViewAs(id);
466 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping (); break;
467 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting (); break;
468 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges (); break;
469 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies (); break;
470 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone (); break;
471 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect (); break;
472 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx (); break;
473 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy (); break;
474 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz (); break;
475 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex (); break;
476 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey (); break;
477 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez (); break;
478 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation (); break;
479 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale (); break;
480 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow (); break;
481 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract (); break;
482 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge (); break;
483 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline (); break;
484 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle (); break;
485 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall (); break;
486 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching (); break;
487 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall (); break;
488 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside (); break;
489 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft (); break;
490 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright (); break;
491 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup (); break;
492 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown (); break;
493 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper (); break;
494 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected (); break;
495 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected (); break;
496 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip (); break;
497 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect (); break;
498 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity (); break;
499 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
500 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
501 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail (); break;
502 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural (); break;
503 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid (); break;
504 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse (); break;
505 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall (); break;
506 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector (); break;
507 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall (); break;
508 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock (); break;
509 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock (); break;
510 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad (); break;
511 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders (); break;
512 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow (); break;
513 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
514 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
515 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
516 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
517 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
518 g_pParentWnd->SetTextureScale (id);
520 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist (); break;
521 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly (); break;
522 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup (); break;
523 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown (); break;
524 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark (); break;
525 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal (); break;
526 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer (); break;
527 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack (); break;
528 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar (); break; /* ydnar */
529 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk (); break;
530 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk (); break;
531 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor (); break;
532 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor (); break;
533 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext (); break;
534 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock (); break;
535 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack (); break;
536 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush (); break;
537 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush (); break;
538 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D (); break;
539 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper (); break;
540 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname (); break;
541 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma (); break;
542 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush (); break;
543 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot (); break;
544 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot (); break;
545 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy (); break;
546 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor (); break;
547 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves (); break;
548 case ID_REGION_OFF: g_pParentWnd->OnRegionOff (); break;
549 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy (); break;
550 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush (); break;
551 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush (); break;
552 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection (); break;
553 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided (); break;
554 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided (); break;
555 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided (); break;
556 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided (); break;
557 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided (); break;
558 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided (); break;
559 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided (); break;
560 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided (); break;
561 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone (); break;
562 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere (); break;
563 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube (); break;
564 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube (); break;
565 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube (); break;
566 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare (); break;
567 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap (); break;
568 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel (); break;
569 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel (); break;
570 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap();break;
571 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone (); break;
572 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh (); break;
573 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn (); break;
574 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn (); break;
575 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow (); break;
576 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow (); break;
577 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn (); break;
578 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn (); break;
579 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow (); break;
580 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow (); break;
581 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative (); break;
582 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows (); break;
583 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols (); break;
584 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows (); break;
585 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose (); break;
586 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap (); break;
587 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap (); break;
588 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet (); break;
589 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear (); break;
590 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken (); break;
591 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh (); break;
592 case ID_HELP: g_pParentWnd->OnHelp (); break;
593 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
594 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
595 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist (); break;
596 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout (); break;
597 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel (); break;
598 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals (); break;
599 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk (); break;
600 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural (); break;
601 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips (); break;
602 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips (); break;
603 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails (); break;
604 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities (); break;
605 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips (); break;
606 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights (); break;
607 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids (); break;
608 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels (); break;
609 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches (); break;
610 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent (); break;
611 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers (); break;
612 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld (); break;
613 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths (); break;
614 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals (); break;
615 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid (); break;
617 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection (); break;
618 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange (); break;
619 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup (); break;
620 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera (); break;
621 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate (); break;
622 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate (); break;
623 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale (); break;
624 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx (); break;
625 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky (); break;
626 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz (); break;
627 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve (); break;
628 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox (); break;
629 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe (); break;
630 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend (); break;
631 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld (); break;
632 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown (); break;
633 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName (); break;
634 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup (); break;
635 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove (); break;
636 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities (); break;
638 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit (); break;
639 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture (); break;
640 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector (); break;
641 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX (); break;
642 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY (); break;
643 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn (); break;
644 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow (); break;
645 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn (); break;
646 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow (); break;
647 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab (); break;
648 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (TRUE); break;
649 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (TRUE); break;
650 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (TRUE); break;
651 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (TRUE); break;
652 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp (); break;
653 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown (); break;
654 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup (); break;
655 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown (); break;
656 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (TRUE); break;
657 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (TRUE); break;
658 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle (); break;
659 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole (); break;
660 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair (); break;
661 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit (); break;
662 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock (); break;
663 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter (); break;
664 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup (); break;
665 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown (); break;
666 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft (); break;
667 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright (); break;
668 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup (); break;
669 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown (); break;
670 case ID_GRID_PREV: g_pParentWnd->OnGridPrev (); break;
671 case ID_GRID_NEXT: g_pParentWnd->OnGridNext (); break;
672 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft (); break;
673 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight (); break;
674 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown (); break;
675 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup (); break;
676 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint (); break;
677 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint (); break;
678 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize (); break;
679 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid (); break;
680 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll (); break;
681 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert (); break;
687 static gint timer (gpointer data)
689 MainFrame *wnd = (MainFrame*)data;
694 static gint mainframe_delete (GtkWidget *widget, GdkEvent *event, gpointer data)
696 MainFrame *wnd = (MainFrame*)data;
700 if (ConfirmModified())
703 g_qeglobals_gui.d_edit = NULL;
708 static void mainframe_destroy (GtkWidget *widget, gpointer data)
710 MainFrame *wnd = (MainFrame*)data;
712 // avoid saving prefs when the app is minimized
713 if (g_pParentWnd->IsSleeping())
715 Sys_Printf("Shutdown while sleeping, not saving prefs\n");
716 g_qeglobals.disable_ini = true;
719 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
720 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
721 g_PrefsDlg.SavePrefs ();
726 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
727 // and modules / plugins decide to save some stuff
728 g_pParentWnd->GetPlugInMgr().Shutdown();
733 g_PrefsDlg.Destroy ();
734 g_dlgSurface.Destroy ();
735 g_dlgFind.Destroy ();
736 g_PatchDialog.Destroy ();
741 static gint mainframe_keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
743 unsigned int code = gdk_keyval_to_upper(event->keyval);
745 if(code == GDK_ISO_Left_Tab) {
750 Sys_Printf("key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK);
753 // return only if Texture Viewport is in main window, otherwise if Tex viewport is in it's own window
754 // the Filter GtkEntry won't release focus
755 if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus(GTK_WINDOW(widget)) )
756 if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) )
760 Sys_Printf("mainframe_keypress processing into a command\n");
762 for (int i = 0; i < g_nCommandCount; i++)
764 if (g_Commands[i].m_nKey == code) // find a match?
767 unsigned int nState = 0;
770 if ((event->state & GDK_CONTROL_MASK) != 0)
771 nState |= RAD_CONTROL;
772 if ((event->state & GDK_SHIFT_MASK) != 0)
774 if ((g_Commands[i].m_nModifiers & 0x7) == nState)
776 HandleCommand (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
777 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
786 static gint mainframe_keyrelease (GtkWidget* widget, GdkEventKey* event, gpointer data)
788 unsigned int code = gdk_keyval_to_upper(event->keyval);
790 if (gtk_accelerator_valid (event->keyval, (GdkModifierType)0))
793 for (int i = 0; i < g_nCommandCount; i++)
795 if (g_Commands[i].m_nKey == code) // find a match?
797 if(!g_Commands[i].m_nModifiers)
799 // Gef: Only call the handler if it's a key that needs keyup events
800 switch (g_Commands[i].m_nCommand)
802 case ID_CAMERA_FORWARD:
805 case ID_CAMERA_RIGHT:
806 case ID_CAMERA_STRAFELEFT:
807 case ID_CAMERA_STRAFERIGHT:
809 HandleKeyUp (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
810 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_release_event");
823 // =============================================================================
824 // Window creation functions
826 void AddMenuItem (GtkWidget* item, unsigned int id)
828 for (int i = 0; i < g_nCommandCount; i++)
829 if (g_Commands[i].m_nCommand == id)
831 g_object_set_data (G_OBJECT (g_pParentWnd->m_pWidget), g_Commands[i].m_strMenu, item);
836 void MainFrame::handle_help_command(int id)
838 OpenURL(mHelpURLs[id]->GetBuffer());
842 needed for hooking in Gtk+
844 void HandleHelpCommand (GtkWidget *widget, gpointer data)
846 int id = GPOINTER_TO_INT (data);
847 g_pParentWnd->handle_help_command(id);
850 void MainFrame::process_xlink (Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel)
853 pDoc = xmlParseFile(FileName.GetBuffer());
856 Sys_Printf("Processing .xlink file '%s'\n", FileName.GetBuffer());
858 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic(menu, menu_name);
859 // start walking the nodes, find the 'links' one
860 xmlNodePtr pNode = pDoc->children;
861 while (pNode && strcmp((const char*)pNode->name, "links"))
865 pNode = pNode->children;
868 if (!strcmp((const char*)pNode->name, "item"))
872 if (strstr((char *)xmlGetProp(pNode, (xmlChar *)"url"), "http://"))
876 *url = (char *)xmlGetProp(pNode, (xmlChar *)"url");
883 *url += (char *)xmlGetProp(pNode, (xmlChar *)"url");
885 mHelpURLs.push_back(url);
886 create_menu_item_with_mnemonic (menu_in_menu, (char *)xmlGetProp(pNode, (xmlChar *)"name"), GTK_SIGNAL_FUNC(HandleHelpCommand), mHelpURLs.size()-1);
895 Sys_Printf("'%s' not found / parse failed\n", FileName.GetBuffer());
899 void MainFrame::create_game_help_menu (GtkWidget *menu, GtkAccelGroup *accel)
902 list<CGameDescription *>::iterator iGame;
904 // start in the global dir
905 FileName = g_strAppPath;
906 FileName += "global.xlink";
907 process_xlink(FileName, "General", g_strAppPath.GetBuffer(), menu, accel);
909 for (iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++)
911 FileName = (*iGame)->mGameToolsPath;
912 FileName += "game.xlink";
913 process_xlink(FileName, (*iGame)->mGameName, (*iGame)->mGameToolsPath.GetBuffer(), menu, accel);
917 void MainFrame::create_main_menu (GtkWidget *window, GtkWidget *vbox)
919 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
920 GtkAccelGroup *accel;
923 accel = gtk_accel_group_new ();
924 global_accel = accel;
925 gtk_window_add_accel_group (GTK_WINDOW (window), accel);
927 handle_box = gtk_handle_box_new ();
928 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
929 gtk_widget_show (handle_box);
931 menu_bar = gtk_menu_bar_new ();
932 gtk_container_add (GTK_CONTAINER (handle_box), menu_bar);
933 gtk_widget_show (menu_bar);
936 menu = create_sub_menu_with_mnemonic (menu_bar, _("_File"));
937 if (g_PrefsDlg.m_bDetachableMenus)
940 create_menu_item_with_mnemonic (menu, _("_New Map"),
941 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEW);
942 menu_separator (menu);
944 //++timo temporary experimental stuff for sleep mode..
945 item = create_menu_item_with_mnemonic (menu, _("_Sleep"),
946 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SLEEP);
947 g_object_set_data (G_OBJECT (window), "menu_file_sleep", item );
948 menu_separator (menu);
951 item = create_menu_item_with_mnemonic (menu, _("_Open..."),
952 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_OPEN);
953 g_object_set_data (G_OBJECT (window), "menu_file_open", item);
954 create_menu_item_with_mnemonic (menu, _("_Import..."), // Hydra: give it it's proper name
955 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_IMPORTMAP);
956 item = create_menu_item_with_mnemonic (menu, _("_Save"),
957 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVE);
958 g_object_set_data (G_OBJECT (window), "menu_file_save", item);
959 create_menu_item_with_mnemonic (menu, _("Save _as..."),
960 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEAS);
961 create_menu_item_with_mnemonic (menu, _("Save s_elected..."),
962 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXPORTMAP);
963 menu_separator (menu);
964 item = create_menu_item_with_mnemonic (menu, _("Save re_gion..."),
965 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEREGION);
966 g_object_set_data (G_OBJECT (window), "menu_file_saveregion", item);
967 menu_separator (menu);
968 create_menu_item_with_mnemonic (menu, _("New p_roject..."),
969 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEWPROJECT);
970 create_menu_item_with_mnemonic (menu, _("Load _project..."),
971 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_LOADPROJECT);
972 create_menu_item_with_mnemonic (menu, _("Pro_ject settings..."),
973 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_PROJECTSETTINGS);
974 menu_separator (menu);
975 create_menu_item_with_mnemonic (menu, _("_Pointfile..."),
976 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_POINTFILE);
977 menu_separator (menu);
978 item = create_menu_item_with_mnemonic (menu, _("Recent Files"),
979 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT1);
980 g_object_set_data (G_OBJECT (item), "accel", accel);
981 gtk_widget_set_sensitive (item, FALSE);
982 MRU_AddWidget (item, 0);
983 item = create_menu_item_with_mnemonic (menu, "2",
984 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT2);
985 gtk_widget_hide (item);
986 MRU_AddWidget (item, 1);
987 item = create_menu_item_with_mnemonic (menu, "3",
988 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT3);
989 gtk_widget_hide (item);
990 MRU_AddWidget (item, 2);
991 item = create_menu_item_with_mnemonic (menu, "4",
992 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT4);
993 gtk_widget_hide (item);
994 MRU_AddWidget (item, 3);
995 menu_separator (menu);
996 item = create_menu_item_with_mnemonic (menu, _("Check for GtkRadiant update (web)"),
997 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_CHECKUPDATE);
998 // disable, the functionality is no longer available
999 gtk_widget_set_sensitive( item, FALSE );
1001 create_menu_item_with_mnemonic (menu, _("E_xit"),
1002 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXIT);
1005 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Edit"));
1006 if (g_PrefsDlg.m_bDetachableMenus)
1007 menu_tearoff (menu);
1008 item = create_menu_item_with_mnemonic (menu, _("_Undo"),
1009 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_UNDO);
1010 g_object_set_data (G_OBJECT (window), "menu_edit_undo", item);
1011 item = create_menu_item_with_mnemonic (menu, _("_Redo"),
1012 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_REDO);
1013 g_object_set_data (G_OBJECT (window), "menu_edit_redo", item);
1014 menu_separator (menu);
1015 item = create_menu_item_with_mnemonic (menu, _("_Copy"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_COPYBRUSH);
1016 item = create_menu_item_with_mnemonic (menu, _("_Paste"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSH);
1017 item = create_menu_item_with_mnemonic (menu, _("P_aste To Camera"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSHTOCAMERA);
1018 item = create_menu_item_with_mnemonic (menu, _("_Delete"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1019 g_object_set_data (G_OBJECT (window), "menu_selection_delete", item);
1020 menu_separator (menu);
1021 create_menu_item_with_mnemonic (menu, _("Map Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_MAPINFO);
1022 create_menu_item_with_mnemonic (menu, _("Entity Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_ENTITYINFO);
1023 menu_separator (menu);
1024 create_menu_item_with_mnemonic (menu, _("Brush Scripts..."), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_SCRIPTS);
1025 menu_separator (menu);
1026 create_menu_item_with_mnemonic (menu, _("Load Pre_fab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_LOADPREFAB);
1027 create_menu_item_with_mnemonic (menu, _("Save Selection as Prefab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_SAVEPREFAB);
1028 menu_separator (menu);
1029 create_menu_item_with_mnemonic (menu, _("Preferences..."), GTK_SIGNAL_FUNC (HandleCommand), ID_PREFS);
1032 menu = create_sub_menu_with_mnemonic (menu_bar, _("_View"));
1033 if (g_PrefsDlg.m_bDetachableMenus)
1034 menu_tearoff (menu);
1036 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Toggle"));
1037 create_menu_item_with_mnemonic (menu_in_menu, _("Camera View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECAMERA);
1038 create_menu_item_with_mnemonic (menu_in_menu, _("Console View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECONSOLE);
1039 item = create_menu_item_with_mnemonic (menu_in_menu, _("Entity View"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITY);
1040 g_object_set_data (G_OBJECT (window), "menu_view_entity", item);
1041 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1042 create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW);
1043 create_menu_item_with_mnemonic (menu_in_menu, _("YZ (Side)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_YZ);
1044 create_menu_item_with_mnemonic (menu_in_menu, _("XZ (Front)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_XZ);
1045 create_menu_item_with_mnemonic (menu_in_menu, _("Z View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEZ);
1046 menu_separator (menu);
1047 item = create_menu_item_with_mnemonic (menu, _("_Center"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTER);
1048 item = create_menu_item_with_mnemonic (menu, _("_Center 2d"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTERVIEW);
1049 item = create_menu_item_with_mnemonic (menu, _("_Up Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_UPFLOOR);
1050 item = create_menu_item_with_mnemonic (menu, _("_Down Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_DOWNFLOOR);
1051 menu_separator (menu);
1052 item = create_menu_item_with_mnemonic (menu, _("_Next (XY, YZ, XY)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEXTVIEW);
1053 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Layout"));
1054 create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_XY);
1055 create_menu_item_with_mnemonic (menu_in_menu, _("YZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SIDE);
1056 create_menu_item_with_mnemonic (menu_in_menu, _("XZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_FRONT);
1057 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Zoom"));
1058 create_menu_item_with_mnemonic (menu_in_menu, _("_XY 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_100);
1059 item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMIN);
1060 item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMOUT);
1061 menu_separator (menu_in_menu);
1062 create_menu_item_with_mnemonic (menu_in_menu, _("_Z 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_Z100);
1063 item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoo_m In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMIN);
1064 g_object_set_data (G_OBJECT (window), "menu_view_zzoomin", item);
1065 item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoom O_ut"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMOUT);
1066 g_object_set_data (G_OBJECT (window), "menu_view_zzoomout", item);
1067 menu_separator (menu_in_menu);
1068 item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEIN);
1069 item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEOUT);
1070 menu_separator (menu);
1072 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Show"));
1073 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Angles"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWANGLES, FALSE);
1074 g_object_set_data (G_OBJECT (window), "menu_view_showangles", item);
1075 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Names"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWNAMES, TRUE);
1076 g_object_set_data (G_OBJECT (window), "menu_view_shownames", item);
1077 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Blocks"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWBLOCKS, FALSE);
1078 g_object_set_data (G_OBJECT (window), "menu_view_showblocks", item);
1079 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show C_oordinates"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWCOORDINATES, TRUE);
1080 g_object_set_data (G_OBJECT (window), "menu_view_showcoordinates", item);
1081 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Window Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWOUTLINE, TRUE);
1082 g_object_set_data (G_OBJECT (window), "menu_view_showoutline", item);
1083 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show ZBuffered Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_NOOUTLINE, TRUE);
1084 g_object_set_data (G_OBJECT (window), "menu_selection_nooutline", item);
1085 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Axes"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWAXES, TRUE);
1086 g_object_set_data (G_OBJECT (window), "menu_view_showaxes", item);
1087 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Workzone"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWWORKZONE, FALSE);
1088 g_object_set_data (G_OBJECT (window), "menu_view_showworkzone", item);
1090 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Filter"));
1091 create_check_menu_item_with_mnemonic (menu_in_menu, _("World"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_WORLD, FALSE);
1092 create_check_menu_item_with_mnemonic (menu_in_menu, _("Entities"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_ENTITIES, FALSE);
1093 create_check_menu_item_with_mnemonic (menu_in_menu, _("Areaportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_AREAPORTALS, FALSE);
1094 create_check_menu_item_with_mnemonic (menu_in_menu, _("Translucent"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRANSLUCENT, FALSE);
1095 create_check_menu_item_with_mnemonic (menu_in_menu, _("Liquids"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIQUIDS, FALSE);
1096 create_check_menu_item_with_mnemonic (menu_in_menu, _("Caulk"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CAULK, FALSE);
1097 create_check_menu_item_with_mnemonic (menu_in_menu, _("Clips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLIPS, FALSE);
1098 create_check_menu_item_with_mnemonic (menu_in_menu, _("Paths"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATHS, FALSE);
1099 create_check_menu_item_with_mnemonic (menu_in_menu, _("Clusterportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLUSTERPORTALS, FALSE);
1100 create_check_menu_item_with_mnemonic (menu_in_menu, _("Lights"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTS, FALSE);
1101 create_check_menu_item_with_mnemonic (menu_in_menu, _("Structural"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_STRUCTURAL, FALSE);
1102 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Lightgrid"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTGRID, FALSE);
1103 g_object_set_data (G_OBJECT (window), "menu_filter_lightgrid", item);
1104 create_check_menu_item_with_mnemonic (menu_in_menu, _("Patches"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATCHES, FALSE);
1105 create_check_menu_item_with_mnemonic (menu_in_menu, _("Details"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_DETAILS, FALSE);
1106 create_check_menu_item_with_mnemonic (menu_in_menu, _("Hints"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_HINTSSKIPS, FALSE);
1107 create_check_menu_item_with_mnemonic (menu_in_menu, _("Models"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_MODELS, FALSE);
1108 create_check_menu_item_with_mnemonic (menu_in_menu, _("Triggers"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRIGGERS, FALSE);
1109 create_check_menu_item_with_mnemonic (menu_in_menu, _("Botclips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_BOTCLIPS, FALSE);
1111 menu_separator (menu);
1112 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Hide/Show"));
1113 create_menu_item_with_mnemonic (menu_in_menu, _("Hide Selected"),
1114 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_HIDESELECTED);
1115 create_menu_item_with_mnemonic (menu_in_menu, _("Show Hidden"),
1116 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_SHOWHIDDEN);
1117 menu_separator (menu);
1118 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Entities as"));
1119 g_object_set_data (G_OBJECT (window), "view_entitiesas_menu", menu_in_menu);
1120 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("Bounding box"),
1121 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE);
1122 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_boundingbox", item);
1123 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Wireframe"),
1124 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE);
1125 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_wireframe", item);
1126 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Wireframe"),
1127 GTK_SIGNAL_FUNC (HandleCommand),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE);
1128 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedwireframe", item);
1129 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Skinned"),
1130 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE);
1131 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedskinned", item);
1132 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned"),
1133 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNED,FALSE);
1134 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinned", item);
1135 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned and Boxed"),
1136 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE);
1137 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinnedandboxed", item);
1138 menu_separator (menu);
1139 item = create_check_menu_item_with_mnemonic (menu, _("Cubic Clipping"),
1140 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBICCLIPPING, TRUE);
1141 g_object_set_data (G_OBJECT (window), "menu_view_cubicclipping", item);
1142 menu_separator (menu);
1143 item = create_check_menu_item_with_mnemonic (menu, _("OpenGL Lighting"),
1144 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_OPENGLLIGHTING, FALSE);
1145 g_object_set_data (G_OBJECT (window), "menu_view_opengllighting", item);
1148 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Selection"));
1149 if (g_PrefsDlg.m_bDetachableMenus)
1150 menu_tearoff (menu);
1152 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Drag"));
1153 create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Edges"),
1154 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGEDGES);
1155 create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Vertices"),
1156 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGVERTECIES);
1157 menu_separator (menu);
1158 create_menu_item_with_mnemonic (menu, _("_Clone"),
1159 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CLONE);
1160 item = create_menu_item_with_mnemonic (menu, _("Deselect"),
1161 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DESELECT);
1162 item = create_menu_item_with_mnemonic (menu, _("Invert"),
1163 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_INVERT);
1165 create_menu_item_with_mnemonic (menu, _("_Delete"),
1166 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1168 menu_separator (menu);
1169 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Flip"));
1170 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _X"),
1171 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPX);
1172 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Y"),
1173 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPY);
1174 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Z"),
1175 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPZ);
1176 menu_separator (menu);
1177 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Rotate"));
1178 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate X"),
1179 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEX);
1180 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Y"),
1181 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEY);
1182 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Z"),
1183 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEZ);
1184 create_menu_item_with_mnemonic (menu_in_menu, _("Arbitrary rotation..."),
1185 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_ARBITRARYROTATION);
1186 menu_separator (menu);
1187 create_menu_item_with_mnemonic (menu, _("Scale..."), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SCALE);
1188 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("CSG"));
1189 create_menu_item_with_mnemonic (menu_in_menu, _("Make _Hollow"),
1190 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKEHOLLOW);
1191 create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Subtract"),
1192 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGSUBTRACT);
1193 create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Merge"),
1194 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGMERGE);
1195 menu_separator (menu);
1196 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Select"));
1197 create_menu_item_with_mnemonic (menu_in_menu, _("Select Complete _Tall"),
1198 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTCOMPLETETALL);
1199 create_menu_item_with_mnemonic (menu_in_menu, _("Select T_ouching"),
1200 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTTOUCHING);
1201 create_menu_item_with_mnemonic (menu_in_menu, _("Select _Partial Tall"),
1202 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTPARTIALTALL);
1203 create_menu_item_with_mnemonic (menu_in_menu, _("Select _Inside"),
1204 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTINSIDE);
1205 create_menu_item_with_mnemonic (menu_in_menu, "Select Func _Group", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_FUNC_GROUP);
1207 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Left"),
1208 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1209 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Right"),
1210 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1211 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Up"),
1212 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1213 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Down"),
1214 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1216 menu_separator (menu);
1217 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Clipper"));
1218 create_menu_item_with_mnemonic (menu_in_menu, _("Toggle Clipper"),
1219 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CLIPPER);
1220 menu_separator (menu_in_menu);
1221 create_menu_item_with_mnemonic (menu_in_menu, _("Clip selection"),
1222 GTK_SIGNAL_FUNC (HandleCommand), ID_CLIP_SELECTED);
1223 create_menu_item_with_mnemonic (menu_in_menu, _("Split selection"),
1224 GTK_SIGNAL_FUNC (HandleCommand), ID_SPLIT_SELECTED);
1225 create_menu_item_with_mnemonic (menu_in_menu, _("Flip Clip orientation"),
1226 GTK_SIGNAL_FUNC (HandleCommand), ID_FLIP_CLIP);
1227 menu_separator (menu);
1228 create_menu_item_with_mnemonic (menu, _("Connect entities"),
1229 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CONNECT);
1230 create_menu_item_with_mnemonic (menu, _("Ungroup entity"),
1231 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_UNGROUPENTITY);
1232 create_menu_item_with_mnemonic (menu, _("Make detail"),
1233 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_DETAIL);
1234 create_menu_item_with_mnemonic (menu, _("Make structural"),
1235 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_STRUCTURAL);
1238 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Bsp"));
1240 menu_separator (menu);
1241 g_object_set_data (G_OBJECT (window), "menu_bsp", menu);
1244 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Grid"));
1245 if (g_PrefsDlg.m_bDetachableMenus)
1246 menu_tearoff (menu);
1248 item = create_radio_menu_item_with_mnemonic (menu, NULL, _("Grid0.25"),
1249 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_025, FALSE);
1250 g_object_set_data (G_OBJECT (window), "menu_grid_025", item);
1251 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid0.5"),
1252 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_05, FALSE);
1253 g_object_set_data (G_OBJECT (window), "menu_grid_05", item);
1254 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid1"),
1255 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_1, FALSE);
1256 g_object_set_data (G_OBJECT (window), "menu_grid_1", item);
1257 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid2"),
1258 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_2, FALSE);
1259 g_object_set_data (G_OBJECT (window), "menu_grid_2", item);
1260 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid4"),
1261 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_4, FALSE);
1262 g_object_set_data (G_OBJECT (window), "menu_grid_4", item);
1263 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid8"),
1264 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_8, TRUE);
1265 g_object_set_data (G_OBJECT (window), "menu_grid_8", item);
1266 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid16"),
1267 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_16, FALSE);
1268 g_object_set_data (G_OBJECT (window), "menu_grid_16", item);
1269 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid32"),
1270 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_32, FALSE);
1271 g_object_set_data (G_OBJECT (window), "menu_grid_32", item);
1272 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid64"),
1273 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_64, FALSE);
1274 g_object_set_data (G_OBJECT (window), "menu_grid_64", item);
1275 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid128"),
1276 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_128, FALSE);
1277 g_object_set_data (G_OBJECT (window), "menu_grid_128", item);
1278 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid256"),
1279 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_256, FALSE);
1280 g_object_set_data (G_OBJECT (window), "menu_grid_256", item);
1281 menu_separator (menu);
1282 item = create_check_menu_item_with_mnemonic (menu, _("Snap to grid"),
1283 GTK_SIGNAL_FUNC (HandleCommand), ID_SNAPTOGRID, TRUE);
1284 g_object_set_data (G_OBJECT (window), "menu_snaptogrid", item);
1287 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Textures"));
1288 if (g_PrefsDlg.m_bDetachableMenus)
1289 menu_tearoff (menu);
1291 item = create_check_menu_item_with_mnemonic (menu, _("Show In _Use"),
1292 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWINUSE, FALSE);
1293 g_object_set_data (G_OBJECT (window), "menu_textures_showinuse", item);
1294 item = create_check_menu_item_with_mnemonic (menu, _("Show _All"),
1295 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWALL, FALSE);
1296 g_object_set_data (G_OBJECT (window), "menu_textures_showall", item);
1297 menu_separator (menu);
1298 item = create_check_menu_item_with_mnemonic (menu, _("Show shaders"),
1299 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERS_SHOW, FALSE);
1300 g_object_set_data (G_OBJECT (window), "menu_textures_shaders_show", item);
1301 item = create_menu_item_with_mnemonic (menu, _("Flush & Reload Shaders"),
1302 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_RELOADSHADERS);
1303 g_object_set_data (G_OBJECT (window), "menu_textures_reloadshaders", item);
1304 item = create_menu_item_with_mnemonic (menu, _("Load directory..."),
1305 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOAD);
1306 g_object_set_data (G_OBJECT (window), "menu_textures_load", item);
1307 item = create_menu_item_with_mnemonic (menu, _("Directory list..."),
1308 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOADLIST);
1309 menu_separator (menu);
1311 item = create_menu_item_with_mnemonic (menu, _("_Surface Inspector"),
1312 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_INSPECTOR);
1313 menu_separator (menu);
1314 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Render Quality"));
1315 g_object_set_data (G_OBJECT (window), "render_quality_menu", menu_in_menu);
1316 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("_Wireframe"),
1317 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_WIREFRAME, FALSE);
1318 g_object_set_data (G_OBJECT (window), "menu_textures_wireframe", item);
1319 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Flat shade"),
1320 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_FLATSHADE, FALSE);
1321 g_object_set_data (G_OBJECT (window), "menu_textures_flatshade", item);
1322 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Nearest"),
1323 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEAREST, FALSE);
1324 g_object_set_data (G_OBJECT (window), "menu_view_nearest", item);
1325 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Nearest _Mipmap"),
1326 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEARESTMIPMAP, FALSE);
1327 g_object_set_data (G_OBJECT (window), "menu_view_nearestmipmap", item);
1328 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Linear"),
1329 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_LINEAR, FALSE);
1330 g_object_set_data (G_OBJECT (window), "menu_view_linear", item);
1331 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Bilinear"),
1332 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEAR, FALSE);
1333 g_object_set_data (G_OBJECT (window), "menu_view_bilinear", item);
1334 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("B_ilinear Mipmap"),
1335 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEARMIPMAP, FALSE);
1336 g_object_set_data (G_OBJECT (window), "menu_view_bilinearmipmap", item);
1337 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("T_rilinear"),
1338 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TRILINEAR, FALSE);
1339 g_object_set_data (G_OBJECT (window), "menu_view_trilinear", item);
1340 create_menu_item_with_mnemonic (menu, _("Find / Replace..."),
1341 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURE_REPLACEALL);
1343 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Lock"));
1344 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Moves"),
1345 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_LOCK, TRUE);
1346 g_object_set_data (G_OBJECT (window), "menu_toggle_lock", item);
1347 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Rotations"),
1348 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_ROTATELOCK, TRUE);
1349 g_object_set_data (G_OBJECT (window), "menu_toggle_rotatelock", item);
1350 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Window Scale"));
1351 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("200%"),
1352 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE);
1353 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_200", item);
1354 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("100%"),
1355 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE);
1356 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_100", item);
1357 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("50%"),
1358 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE);
1359 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_50", item);
1360 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("25%"),
1361 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE);
1362 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_25", item);
1363 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("10%"),
1364 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE);
1365 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_10", item);
1366 item = menu_separator (menu);
1367 item = create_check_menu_item_with_mnemonic (menu, _("shaderlist.txt only"),
1368 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERLISTONLY, FALSE);
1369 g_object_set_data (G_OBJECT (window), "menu_textures_shaderlistonly", item);
1370 item = menu_separator (menu);
1371 g_object_set_data (G_OBJECT (window), "menu_textures_separator", item);
1372 g_object_set_data (G_OBJECT (window), "menu_textures", menu);
1375 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Misc"));
1376 if (g_PrefsDlg.m_bDetachableMenus)
1377 menu_tearoff (menu);
1379 create_menu_item_with_mnemonic (menu, _("_Benchmark"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_BENCHMARK);
1380 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Colors"));
1381 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Themes"));
1382 create_menu_item_with_mnemonic (menu_3, _("QE4 Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETORIGINAL);
1383 create_menu_item_with_mnemonic (menu_3, _("Q3Radiant Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETQER);
1384 create_menu_item_with_mnemonic (menu_3, _("Black and Green"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETBLACK);
1385 create_menu_item_with_mnemonic (menu_3, _("Maya/Max/Lightwave Emulation"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETYDNAR);
1387 menu_separator (menu_in_menu);
1388 create_menu_item_with_mnemonic (menu_in_menu, _("_Texture Background..."),
1389 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREBK);
1390 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Background..."),
1391 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_XYBK);
1392 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major..."),
1393 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR);
1394 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor..."),
1395 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR);
1396 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major Small..."),
1397 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR_ALT);
1398 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor Small..."),
1399 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR_ALT);
1400 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Text..."),
1401 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDTEXT);
1402 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Block..."),
1403 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDBLOCK);
1404 create_menu_item_with_mnemonic (menu_in_menu, _("Default Brush..."),
1405 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_BRUSH);
1406 create_menu_item_with_mnemonic (menu_in_menu, _("Camera Background..."),
1407 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CAMERABACK);
1408 create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush..."),
1409 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH);
1410 create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush (Camera)..."),
1411 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH3D);
1412 create_menu_item_with_mnemonic (menu_in_menu, _("Clipper..."),
1413 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CLIPPER);
1414 create_menu_item_with_mnemonic (menu_in_menu, _("Active View name..."),
1415 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_VIEWNAME);
1417 create_menu_item_with_mnemonic (menu, _("_Gamma..."),
1418 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_GAMMA);
1419 create_menu_item_with_mnemonic (menu, _("Find brush..."),
1420 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_FINDBRUSH);
1421 item = create_menu_item_with_mnemonic (menu, _("Next leak spot"),
1422 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_NEXTLEAKSPOT);
1423 item = create_menu_item_with_mnemonic (menu, _("Previous leak spot"),
1424 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PREVIOUSLEAKSPOT);
1425 create_menu_item_with_mnemonic (menu, _("_Print XY View"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PRINTXY);
1426 item = create_menu_item_with_mnemonic (menu, _("_Select Entity Color..."),
1427 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_SELECTENTITYCOLOR);
1428 g_object_set_data (G_OBJECT (window), "menu_misc_selectentitycolor", item);
1431 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Region"));
1432 if (g_PrefsDlg.m_bDetachableMenus)
1433 menu_tearoff (menu);
1435 create_menu_item_with_mnemonic (menu, _("_Off"),
1436 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_OFF);
1437 create_menu_item_with_mnemonic (menu, _("_Set XY"),
1438 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETXY);
1439 create_menu_item_with_mnemonic (menu, _("Set _Tall Brush"),
1440 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETTALLBRUSH);
1441 create_menu_item_with_mnemonic (menu, _("Set _Brush"),
1442 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETBRUSH);
1443 create_menu_item_with_mnemonic (menu, _("Set Se_lected Brushes"),
1444 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETSELECTION);
1447 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Brush"));
1448 if (g_PrefsDlg.m_bDetachableMenus)
1449 menu_tearoff (menu);
1451 item = create_menu_item_with_mnemonic (menu, _("3 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_3SIDED);
1452 item = create_menu_item_with_mnemonic (menu, _("4 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_4SIDED);
1453 item = create_menu_item_with_mnemonic (menu, _("5 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_5SIDED);
1454 item = create_menu_item_with_mnemonic (menu, _("6 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_6SIDED);
1455 item = create_menu_item_with_mnemonic (menu, _("7 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_7SIDED);
1456 item = create_menu_item_with_mnemonic (menu, _("8 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_8SIDED);
1457 item = create_menu_item_with_mnemonic (menu, _("9 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_9SIDED);
1458 menu_separator (menu);
1459 create_menu_item_with_mnemonic (menu, _("Arbitrary sided..."),
1460 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ARBITRARYSIDED);
1461 menu_separator (menu);
1462 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Primitives"));
1463 create_menu_item_with_mnemonic (menu_in_menu, _("Cone..."),
1464 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_MAKECONE);
1465 create_menu_item_with_mnemonic (menu_in_menu, _("Sphere..."),
1466 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_PRIMITIVES_SPHERE);
1469 if (!g_pGameDescription->mNoPatch)
1471 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Curve"));
1472 if (g_PrefsDlg.m_bDetachableMenus)
1473 menu_tearoff (menu);
1475 create_menu_item_with_mnemonic (menu, _("Cylinder"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHTUBE);
1476 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More Cylinders"));
1477 create_menu_item_with_mnemonic (menu_in_menu, _("Dense Cylinder"),
1478 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHDENSETUBE);
1479 create_menu_item_with_mnemonic (menu_in_menu, _("Very Dense Cylinder"),
1480 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHVERYDENSETUBE);
1481 create_menu_item_with_mnemonic (menu_in_menu, _("Square Cylinder"),
1482 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHSQUARE);
1483 menu_separator (menu);
1484 create_menu_item_with_mnemonic (menu, _("End cap"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHENDCAP);
1485 create_menu_item_with_mnemonic (menu, _("Bevel"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHBEVEL);
1486 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More End caps, Bevels"));
1487 create_menu_item_with_mnemonic (menu_in_menu, _("Square Endcap"),
1488 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL);
1489 create_menu_item_with_mnemonic (menu_in_menu, _("Square Bevel"),
1490 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP);
1491 menu_separator (menu);
1492 create_menu_item_with_mnemonic (menu, _("Cone"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHCONE);
1493 item = create_menu_item_with_mnemonic (menu, _("Sphere"),
1494 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PRIMITIVES_SPHERE);
1495 gtk_widget_set_sensitive (item, FALSE);
1496 menu_separator (menu);
1497 item = create_menu_item_with_mnemonic (menu, _("Simple Patch Mesh..."),
1498 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_SIMPLEPATCHMESH);
1499 g_object_set_data (G_OBJECT (window), "menu_simplepatchmesh", item);
1500 menu_separator (menu);
1501 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Insert"));
1502 create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Columns"),
1503 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTCOLUMN);
1504 create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Columns"),
1505 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDCOLUMN);
1506 menu_separator (menu_in_menu);
1507 create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Rows"),
1508 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTROW);
1509 create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Rows"),
1510 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDROW);
1511 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Delete"));
1512 create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Columns"),
1513 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTCOLUMN);
1514 create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Columns"),
1515 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTCOLUMN);
1516 menu_separator (menu_in_menu);
1517 create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Rows"),
1518 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTROW);
1519 create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Rows"),
1520 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTROW);
1521 menu_separator (menu);
1522 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Matrix"));
1523 create_menu_item_with_mnemonic (menu_in_menu, _("Invert"),
1524 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVE);
1525 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Re-disperse"));
1526 create_menu_item_with_mnemonic (menu_3, _("Rows"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_ROWS);
1527 create_menu_item_with_mnemonic (menu_3, _("Cols (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS);
1528 create_menu_item_with_mnemonic (menu_3, _("Rows (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS);
1529 create_menu_item_with_mnemonic (menu_in_menu, _("Transpose"),
1530 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MATRIX_TRANSPOSE);
1531 menu_separator (menu);
1532 create_menu_item_with_mnemonic (menu, _("Cap Selection"),
1533 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CAP);
1534 create_menu_item_with_mnemonic (menu, _("Cycle Cap Texture"),
1535 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CYCLECAP);
1536 menu_separator (menu);
1537 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Overlay"));
1538 create_menu_item_with_mnemonic (menu_in_menu, _("Set"),
1539 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_SET);
1540 create_menu_item_with_mnemonic (menu_in_menu, _("Clear"),
1541 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_CLEAR);
1542 menu_separator (menu);
1543 create_menu_item_with_mnemonic (menu, _("Thicken..."), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_THICKEN);
1546 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Plugins"));
1547 if (g_PrefsDlg.m_bDetachableMenus)
1548 menu_tearoff (menu);
1551 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1553 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1554 item = menu_separator (menu);
1555 g_object_set_data (G_OBJECT (window), "menu_plugin_separator", item);
1556 g_object_set_data (G_OBJECT (window), "menu_plugin", menu);
1559 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Help"));
1560 if (g_PrefsDlg.m_bDetachableMenus)
1561 menu_tearoff (menu);
1563 item = create_menu_item_with_mnemonic (menu, _("Manual"),
1564 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP);
1565 gtk_widget_add_accelerator (item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1567 // this creates all the per-game drop downs for the game pack helps
1568 // it will take care of hooking the Sys_OpenURL calls etc.
1569 create_game_help_menu(menu, accel);
1571 // TTimo: this is in global.xlink now
1572 //create_menu_item_with_mnemonic (menu, "Links",
1573 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1574 create_menu_item_with_mnemonic (menu, _("Bug report"),
1575 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_BUGREPORT);
1576 create_menu_item_with_mnemonic (menu, _("Shortcuts list"),
1577 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_COMMANDLIST);
1578 create_menu_item_with_mnemonic (menu, _("_About"),
1579 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_ABOUT);
1582 // leo: Hidden menu to make the accelerators work,
1583 // this is a hack that needs to be changed later if someone has a better idea.
1585 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1586 menu = create_sub_menu_with_mnemonic (menu_bar, "Hidden");
1587 if (g_PrefsDlg.m_bDetachableMenus)
1588 menu_tearoff (menu);
1590 gtk_widget_hide (gtk_menu_get_attach_widget (GTK_MENU (menu)));
1592 create_menu_item_with_mnemonic (menu, "BendMode", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_BEND);
1593 create_menu_item_with_mnemonic (menu, "FitTexture", GTK_SIGNAL_FUNC (HandleCommand), IDC_BTN_FACEFIT);
1594 create_menu_item_with_mnemonic (menu, "ViewTextures", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TEXTURE);
1595 create_menu_item_with_mnemonic (menu, "PatchInspector", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_INSPECTOR);
1596 create_menu_item_with_mnemonic (menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREY);
1597 create_menu_item_with_mnemonic (menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREX);
1598 create_menu_item_with_mnemonic (menu, "IncPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTCOLUMN);
1599 create_menu_item_with_mnemonic (menu, "IncPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTROW);
1600 create_menu_item_with_mnemonic (menu, "DecPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETECOLUMN);
1601 create_menu_item_with_mnemonic (menu, "DecPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETEROW);
1602 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1603 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1604 create_menu_item_with_mnemonic (menu, "SelectNudgeDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1605 create_menu_item_with_mnemonic (menu, "CameraForward", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_FORWARD);
1606 create_menu_item_with_mnemonic (menu, "CameraBack", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_BACK);
1607 create_menu_item_with_mnemonic (menu, "CameraLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_LEFT);
1608 create_menu_item_with_mnemonic (menu, "CameraRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_RIGHT);
1609 create_menu_item_with_mnemonic (menu, "CameraUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_UP);
1610 create_menu_item_with_mnemonic (menu, "CameraDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_DOWN);
1611 create_menu_item_with_mnemonic (menu, "CameraAngleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEUP);
1612 create_menu_item_with_mnemonic (menu, "CameraAngleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEDOWN);
1613 create_menu_item_with_mnemonic (menu, "CameraStrafeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFERIGHT);
1614 create_menu_item_with_mnemonic (menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFELEFT);
1615 create_menu_item_with_mnemonic (menu, "ToggleGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_TOGGLE);
1616 create_menu_item_with_mnemonic (menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CROSSHAIR);
1617 create_menu_item_with_mnemonic (menu, "ToggleRealtime", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CAMERAUPDATE);
1618 create_menu_item_with_mnemonic (menu, "MouseRotate", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_MOUSEROTATE);
1619 create_menu_item_with_mnemonic (menu, "TexRotateClock", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECLOCK);
1620 create_menu_item_with_mnemonic (menu, "TexRotateCounter", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECOUNTER);
1621 create_menu_item_with_mnemonic (menu, "TexScaleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEUP);
1622 create_menu_item_with_mnemonic (menu, "TexScaleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEDOWN);
1623 create_menu_item_with_mnemonic (menu, "TexShiftLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTLEFT);
1624 create_menu_item_with_mnemonic (menu, "TexShiftRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTRIGHT);
1625 create_menu_item_with_mnemonic (menu, "TexShiftUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTUP);
1626 create_menu_item_with_mnemonic (menu, "TexShiftDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTDOWN);
1627 create_menu_item_with_mnemonic (menu, "GridDown", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_PREV);
1628 create_menu_item_with_mnemonic (menu, "GridUp", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_NEXT);
1629 create_menu_item_with_mnemonic (menu, "TexScaleLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALELEFT);
1630 create_menu_item_with_mnemonic (menu, "TexScaleRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALERIGHT);
1631 create_menu_item_with_mnemonic (menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEDOWN);
1632 create_menu_item_with_mnemonic (menu, "MoveSelectionUP", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEUP);
1633 create_menu_item_with_mnemonic (menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_PRINT);
1634 create_menu_item_with_mnemonic (menu, "ToggleSizePaint", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TOGGLESIZEPAINT);
1635 create_menu_item_with_mnemonic (menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1636 create_menu_item_with_mnemonic (menu, "SelectNudgeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1637 create_menu_item_with_mnemonic (menu, "SelectNudgeUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1638 create_menu_item_with_mnemonic (menu, "NaturalizePatch", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_NATURALIZE);
1639 create_menu_item_with_mnemonic (menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SNAPTOGRID);
1640 create_menu_item_with_mnemonic (menu, "SelectAllOfType", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_ALL);
1641 create_menu_item_with_mnemonic (menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_OUTLINESTYLE);
1642 create_menu_item_with_mnemonic (menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEUP);
1643 create_menu_item_with_mnemonic (menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEDOWN);
1645 g_bIgnoreCommands--;
1648 void MainFrame::create_main_toolbar (GtkWidget *window, GtkWidget *vbox)
1650 GtkWidget *handle_box, *toolbar, *w;
1652 handle_box = gtk_handle_box_new ();
1653 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1654 gtk_widget_show (handle_box);
1655 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1657 toolbar = gtk_toolbar_new ();
1658 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1659 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1660 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1661 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1663 gtk_widget_show (toolbar);
1665 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Open"), _("Open an existing map"), "",
1666 new_pixmap (window, "file_open.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1667 GINT_TO_POINTER (ID_FILE_OPEN));
1668 g_object_set_data (G_OBJECT (window), "tb_file_open", w);
1669 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Save"), _("Save the active map"), "",
1670 new_pixmap (window, "file_save.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1671 GINT_TO_POINTER (ID_FILE_SAVE));
1672 g_object_set_data (G_OBJECT (window), "tb_file_save", w);
1673 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1674 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Flip"), "",
1675 new_pixmap (window, "brush_flipx.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1676 GINT_TO_POINTER (ID_BRUSH_FLIPX));
1677 g_object_set_data (G_OBJECT (window), "tb_brush_flipx", w);
1678 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Rotate"), "",
1679 new_pixmap (window, "brush_rotatex.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1680 GINT_TO_POINTER (ID_BRUSH_ROTATEX));
1681 g_object_set_data (G_OBJECT (window), "tb_brush_rotatex", w);
1682 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Flip"), "",
1683 new_pixmap (window, "brush_flipy.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1684 GINT_TO_POINTER (ID_BRUSH_FLIPY));
1685 g_object_set_data (G_OBJECT (window), "tb_brush_flipy", w);
1686 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Rotate"), "",
1687 new_pixmap (window, "brush_rotatey.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1688 GINT_TO_POINTER (ID_BRUSH_ROTATEY));
1689 g_object_set_data (G_OBJECT (window), "tb_brush_rotatey", w);
1690 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Flip"), "",
1691 new_pixmap (window, "brush_flipz.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1692 GINT_TO_POINTER (ID_BRUSH_FLIPZ));
1693 g_object_set_data (G_OBJECT (window), "tb_brush_flipz", w);
1694 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Rotate"), "",
1695 new_pixmap (window, "brush_rotatez.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1696 GINT_TO_POINTER (ID_BRUSH_ROTATEZ));
1697 g_object_set_data (G_OBJECT (window), "tb_brush_rotatez", w);
1698 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1700 if (g_PrefsDlg.m_bWideToolbar)
1702 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Complete Tall"), "",
1703 new_pixmap (window, "selection_selectcompletetall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1704 GINT_TO_POINTER (ID_SELECTION_SELECTCOMPLETETALL));
1705 g_object_set_data (G_OBJECT (window), "tb_selection_selectcompletetall", w);
1706 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Touching"), "",
1707 new_pixmap (window, "selection_selecttouching.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1708 GINT_TO_POINTER (ID_SELECTION_SELECTTOUCHING));
1709 g_object_set_data (G_OBJECT (window), "tb_selection_selecttouching", w);
1710 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Partial Tall"), "",
1711 new_pixmap (window, "selection_selectpartialtall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1712 GINT_TO_POINTER (ID_SELECTION_SELECTPARTIALTALL));
1713 g_object_set_data (G_OBJECT (window), "tb_selection_selectpartialtall", w);
1714 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Inside"), "",
1715 new_pixmap (window, "selection_selectinside.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1716 GINT_TO_POINTER (ID_SELECTION_SELECTINSIDE));
1717 g_object_set_data (G_OBJECT (window), "tb_selection_selectinside", w);
1720 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Selection"), "",
1721 new_pixmap (window, "popup_selection.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1722 GINT_TO_POINTER (ID_POPUP_SELECTION));
1723 g_object_set_data (G_OBJECT (window), "tb_popup_selection", w);
1725 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1727 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Subtract"), "",
1728 new_pixmap (window, "selection_csgsubtract.bmp"),
1729 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGSUBTRACT));
1730 g_object_set_data (G_OBJECT (window), "tb_selection_csgsubtract", w);
1732 if (g_PrefsDlg.m_bWideToolbar)
1734 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Merge"), "",
1735 new_pixmap (window, "selection_csgmerge.bmp"),
1736 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGMERGE));
1737 g_object_set_data (G_OBJECT (window), "tb_selection_csgmerge", w);
1740 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Hollow"), "",
1741 new_pixmap (window, "selection_makehollow.bmp"),
1742 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_MAKEHOLLOW));
1743 g_object_set_data (G_OBJECT (window), "tb_selection_makehollow", w);
1745 if (g_PrefsDlg.m_bWideToolbar)
1747 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1748 "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1749 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1750 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1753 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1755 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Change views"), "",
1756 new_pixmap (window, "view_change.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1757 GINT_TO_POINTER (ID_VIEW_CHANGE));
1758 g_object_set_data (G_OBJECT (window), "tb_view_change", w);
1760 if (!g_PrefsDlg.m_bWideToolbar)
1762 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1765 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Texture view mode"), "",
1766 new_pixmap (window, "textures_popup.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1767 GINT_TO_POINTER (ID_TEXTURES_POPUP));
1768 g_object_set_data (G_OBJECT (window), "tb_textures_popup", w);
1770 if (g_PrefsDlg.m_bWideToolbar)
1772 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1773 "", _("Cubic clip the camera view"), "",
1774 new_pixmap (window, "view_cubicclipping.bmp"),
1775 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1776 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1779 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1781 if (!g_PrefsDlg.m_bWideToolbar)
1783 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1784 "", _("Camera preview"), "", new_pixmap (window, "view_cameratoggle.bmp"),
1785 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CAMERATOGGLE));
1786 g_object_set_data (G_OBJECT (window), "tb_view_cameratoggle", w);
1787 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Update Camera", "",
1788 new_pixmap (window, "view_cameraupdate.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1789 GINT_TO_POINTER (ID_VIEW_CAMERAUPDATE));
1790 g_object_set_data (G_OBJECT (window), "tb_view_cameraupdate", w);
1791 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1792 "", _("Cubic clip the camera view"), "",
1793 new_pixmap (window, "view_cubicclipping.bmp"),
1794 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1795 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1796 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1797 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1798 "", _("Entity inspector"), "", new_pixmap (window, "view_entity.bmp"),
1799 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_ENTITY));
1800 g_object_set_data (G_OBJECT (window), "tb_view_entity", w);
1801 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1802 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1803 "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1804 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1805 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1806 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1809 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1810 "", _("Free Rotation"), "", new_pixmap (window, "select_mouserotate.bmp"),
1811 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSEROTATE));
1812 g_object_set_data (G_OBJECT (window), "tb_select_mouserotate", w);
1813 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1814 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1815 "", _("Free Scaling"), "", new_pixmap (window, "select_mousescale.bmp"),
1816 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSESCALE));
1817 g_object_set_data (G_OBJECT (window), "tb_select_mousescale", w);
1818 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1819 "", _("Scale X"), "", new_pixmap (window, "scalelockx.bmp"),
1820 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKX));
1821 g_object_set_data (G_OBJECT (window), "tb_scalelockx", w);
1822 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1823 "", _("Scale Y"), "", new_pixmap (window, "scalelocky.bmp"),
1824 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKY));
1825 g_object_set_data (G_OBJECT (window), "tb_scalelocky", w);
1826 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1827 "", _("Scale Z"), "", new_pixmap (window, "scalelockz.bmp"),
1828 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKZ));
1829 g_object_set_data (G_OBJECT (window), "tb_scalelockz", w);
1831 if (g_PrefsDlg.m_bWideToolbar)
1833 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1834 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1835 "", _("Don't select model brushes"), "",
1836 new_pixmap (window, "dontselectmodel.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1837 GINT_TO_POINTER (ID_DONTSELECTMODEL));
1838 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1839 g_object_set_data (G_OBJECT (window), "tb_dontselectmodel", w);
1841 if (!g_pGameDescription->mNoPatch)
1843 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1844 "", _("Don't select curved brushes"), "",
1845 new_pixmap (window, "dontselectcurve.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1846 GINT_TO_POINTER (ID_DONTSELECTCURVE));
1847 g_object_set_data (G_OBJECT (window), "tb_dontselectcurve", w);
1851 // bug #292, patch toolbar option
1852 if (g_PrefsDlg.m_bPatchToolbar)
1854 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855 "", _("Show patch bounding box"), "",
1856 new_pixmap (window, "patch_showboundingbox.bmp"),
1857 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_SHOWBOUNDINGBOX));
1858 g_object_set_data (G_OBJECT (window), "tb_patch_showboundingbox", w);
1859 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860 "", _("Show patches as wireframes"), "",
1861 new_pixmap (window, "patch_wireframe.bmp"),
1862 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_WIREFRAME));
1863 g_object_set_data (G_OBJECT (window), "tb_patch_wireframe", w);
1864 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1865 "", _("Patch Bend mode"), "",
1866 new_pixmap (window, "patch_bend.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1867 GINT_TO_POINTER (ID_PATCH_BEND));
1868 g_object_set_data (G_OBJECT (window), "tb_patch_bend", w);
1869 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Put caps on the current patch"), "",
1870 new_pixmap (window, "curve_cap.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1871 GINT_TO_POINTER (ID_CURVE_CAP));
1872 g_object_set_data (G_OBJECT (window), "tb_curve_cap", w);
1873 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874 "", _("Welds equal patch points during moves"), "",
1875 new_pixmap (window, "patch_weld.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1876 GINT_TO_POINTER (ID_PATCH_WELD));
1877 g_object_set_data (G_OBJECT (window), "tb_patch_weld", w);
1878 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1879 "", _("Selects drill down rows and columns"), "",
1880 new_pixmap (window, "patch_drilldown.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1881 GINT_TO_POINTER (ID_PATCH_DRILLDOWN));
1882 g_object_set_data (G_OBJECT (window), "tb_patch_drilldown", w);
1885 if (g_PrefsDlg.m_bWideToolbar)
1887 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1888 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Show Entities as"), "",
1889 new_pixmap (window, "show_entities.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1890 GINT_TO_POINTER (ID_SHOW_ENTITIES));
1891 g_object_set_data (G_OBJECT (window), "tb_show_entities", w);
1897 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1898 gtk_widget_hide (w);
1899 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1900 gtk_widget_hide (w);
1901 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1902 gtk_widget_hide (w);
1903 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1904 gtk_widget_hide (w);
1908 m_bCamPreview = true;
1909 g_nScaleHow = (SCALE_X | SCALE_Y | SCALE_Z);
1912 void MainFrame::create_plugin_toolbar (GtkWidget *window, GtkWidget *vbox)
1914 GtkWidget *handle_box, *toolbar;
1916 handle_box = gtk_handle_box_new ();
1917 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1918 if (g_PrefsDlg.m_bPluginToolbar)
1919 gtk_widget_show (handle_box);
1920 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1922 toolbar = gtk_toolbar_new();
1923 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1924 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1925 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1926 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1927 g_object_set_data (G_OBJECT (window), "toolbar_plugin", toolbar);
1928 gtk_widget_show (toolbar);
1931 void MainFrame::create_main_statusbar (GtkWidget *window, GtkWidget *vbox)
1933 GtkWidget *hbox, *hbox1;
1937 hbox = gtk_hbox_new (FALSE, 0);
1938 gtk_widget_show (hbox);
1939 gtk_widget_set_usize (hbox, -1, 24);
1940 gtk_container_border_width (GTK_CONTAINER (hbox), 1);
1941 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
1943 frame = gtk_frame_new ((char*)NULL);
1944 gtk_widget_show (frame);
1945 gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
1946 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1948 hbox1 = gtk_hbox_new (FALSE, 0);
1949 gtk_container_add (GTK_CONTAINER (frame), hbox1);
1950 gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
1951 gtk_widget_show (hbox1);
1953 label = gtk_label_new (_(" Label "));
1954 gtk_widget_show (label);
1955 gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, TRUE, 0);
1956 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1957 gtk_misc_set_padding (GTK_MISC (label), 3, 0);
1958 m_pStatusLabel[0] = label;
1960 for (int i = 1; i < 6; i++)
1962 frame = gtk_frame_new ((char*)NULL);
1963 gtk_widget_show (frame);
1964 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1965 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1967 label = gtk_label_new (_(" Label "));
1968 gtk_widget_show (label);
1969 gtk_container_add (GTK_CONTAINER (frame), label);
1970 m_pStatusLabel[i] = label;
1975 static gint mainframe_idle (gpointer user_data)
1977 g_pParentWnd->RoutineProcessing ();
1981 static void Sys_Iconify (GtkWidget *w);
1982 static void Sys_Restore (GtkWidget *w);
1984 inline void CHECK_RESTORE(GtkWidget* w)
1986 if (g_object_get_data (G_OBJECT (w), "was_mapped") != NULL)
1987 gtk_widget_show (w);
1991 // this is called when the window is restored from the iconified state
1992 static void mainframe_map (GtkWidget *widget)
1994 if (g_pParentWnd->IsSleeping ())
1995 g_pParentWnd->OnSleep ();
1997 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
1999 // restore previously visible windows
2000 CHECK_RESTORE (g_pParentWnd->GetCamWnd ()->m_pParent);
2001 if (g_PrefsDlg.m_bFloatingZ)
2002 CHECK_RESTORE (g_pParentWnd->GetZWnd ()->m_pParent);
2003 CHECK_RESTORE (g_pParentWnd->GetXYWnd ()->m_pParent);
2004 CHECK_RESTORE (g_pParentWnd->GetXZWnd ()->m_pParent);
2005 CHECK_RESTORE (g_pParentWnd->GetYZWnd ()->m_pParent);
2006 CHECK_RESTORE (g_pGroupDlg->m_pWidget);
2010 inline void CHECK_MINIMIZE(GtkWidget* w)
2012 g_object_set_data (G_OBJECT (w), "was_mapped", (void*)(GTK_WIDGET_VISIBLE (w) != 0));
2013 gtk_widget_hide (w);
2016 static void mainframe_unmap (GtkWidget *widget)
2019 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2021 // minimize all other windows when the main window is minimized
2022 CHECK_MINIMIZE (g_pParentWnd->GetCamWnd ()->m_pParent);
2023 if (g_PrefsDlg.m_bFloatingZ)
2024 CHECK_MINIMIZE (g_pParentWnd->GetZWnd ()->m_pParent);
2025 CHECK_MINIMIZE (g_pParentWnd->GetXYWnd ()->m_pParent);
2026 CHECK_MINIMIZE (g_pParentWnd->GetXZWnd ()->m_pParent);
2027 CHECK_MINIMIZE (g_pParentWnd->GetYZWnd ()->m_pParent);
2028 CHECK_MINIMIZE (g_pGroupDlg->m_pWidget);
2032 static GtkWidget* create_floating (MainFrame* mainframe)
2034 GtkWidget *wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2035 //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2036 gtk_window_set_transient_for (GTK_WINDOW (wnd), GTK_WINDOW (mainframe->m_pWidget));
2037 gtk_widget_set_events (wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2038 gtk_signal_connect (GTK_OBJECT (wnd), "delete_event", GTK_SIGNAL_FUNC (widget_delete_hide), NULL);
2039 gtk_signal_connect (GTK_OBJECT (wnd), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2040 gtk_signal_connect (GTK_OBJECT (wnd), "key_press_event",
2041 GTK_SIGNAL_FUNC (mainframe_keypress), mainframe);
2042 gtk_signal_connect (GTK_OBJECT (wnd), "key_release_event",
2043 GTK_SIGNAL_FUNC (mainframe_keyrelease), mainframe);
2044 gtk_signal_connect (GTK_OBJECT (wnd), "map_event",
2045 GTK_SIGNAL_FUNC (mainframe_map), mainframe);
2047 gtk_window_set_default_size (GTK_WINDOW (wnd), 100, 100);
2049 #ifdef DBG_WINDOWPOS
2050 Sys_Printf("create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd);
2056 void console_populate_popup(GtkTextView* textview, GtkMenu* menu, gpointer user_data)
2058 menu_separator(GTK_WIDGET(menu));
2060 GtkWidget* item = gtk_menu_item_new_with_label (_("Clear"));
2061 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (Sys_ClearPrintf), NULL);
2062 gtk_widget_show (item);
2063 gtk_menu_append (GTK_MENU (menu), item);
2066 void console_construct(GtkWidget* textview)
2068 g_signal_connect(G_OBJECT(textview), "populate-popup", G_CALLBACK(console_populate_popup), NULL);
2071 extern MemStream g_Clipboard;
2073 void Clipboard_CopyMap()
2075 g_Clipboard.SetLength(0);
2076 Map_Export (&g_Clipboard, "xmap", false, true);
2079 void Clipboard_PasteMap()
2081 if (g_Clipboard.GetLength() > 0)
2083 g_Clipboard.Seek(0, SEEK_SET);
2084 Map_Import(&g_Clipboard, "xmap", true);
2089 Platform-independent GTK clipboard support.
2090 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2092 #if defined (__linux__) || defined (__APPLE__)
2096 RADIANT_CLIPPINGS = 23,
2099 static const GtkTargetEntry clipboard_targets[] = {
2100 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2103 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner)
2107 GdkAtom type = GDK_NONE;
2109 len = g_Clipboard.GetLength();
2116 buffer = g_Clipboard.GetBuffer ();
2119 if(info == clipboard_targets[0].info)
2121 type = gdk_atom_intern(clipboard_targets[0].target, FALSE);
2124 gtk_selection_data_set (selection_data, type, 8, buffer, len);
2127 static void clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner)
2131 static void clipboard_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data)
2133 g_Clipboard.SetLength (0);
2135 if (data->length < 0)
2136 Sys_FPrintf(SYS_ERR, "Error retrieving selection\n");
2137 else if(strcmp(gdk_atom_name(data->type), clipboard_targets[0].target) == 0)
2138 g_Clipboard.Write (data->data, data->length);
2140 Clipboard_PasteMap();
2143 void clipboard_copy()
2145 Clipboard_CopyMap();
2147 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2149 gtk_clipboard_set_with_data (clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL);
2152 void clipboard_paste()
2154 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2156 gtk_clipboard_request_contents (clipboard, gdk_atom_intern(clipboard_targets[0].target, FALSE), clipboard_received, NULL);
2160 #elif defined(WIN32)
2162 void clipboard_copy()
2164 Clipboard_CopyMap();
2166 bool bClipped = false;
2167 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2170 if (::OpenClipboard(NULL))
2173 long lSize = g_Clipboard.GetLength();
2174 HANDLE h = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof(long));
2177 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2178 memcpy(cp, &lSize, sizeof(long));
2180 g_Clipboard.Seek(0, SEEK_SET);
2181 g_Clipboard.Read(cp, lSize);
2183 ::SetClipboardData(nClipboard, h);
2192 Sys_Printf("Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n");
2196 void clipboard_paste()
2198 bool bPasted = false;
2199 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2200 if (nClipboard > 0 && ::OpenClipboard(NULL))
2202 if(IsClipboardFormatAvailable(nClipboard))
2204 HANDLE h = ::GetClipboardData(nClipboard);
2207 g_Clipboard.SetLength(0);
2208 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2210 memcpy(&lSize, cp, sizeof(long));
2212 g_Clipboard.Write(cp, lSize);
2219 Clipboard_PasteMap();
2224 void MainFrame::Copy()
2229 void MainFrame::Paste()
2232 UpdateSurfaceDialog();
2236 #ifdef DBG_WINDOWPOS
2237 GtkWidget *watchit = NULL;
2239 void CheckWatchit(char *msg)
2241 static int width = 0;
2242 if ((watchit!=NULL) && (watchit->allocation.width != width))
2244 Sys_Printf("CheckWatchit %s: %d\n", msg, watchit->allocation.width);
2245 width = watchit->allocation.width;
2251 BOOL CALLBACK m_pCountMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2253 int *n = (int *) dwData;
2260 struct monitorInfo_s {
2261 GdkRectangle *win_monitors;
2265 BOOL CALLBACK m_pEnumMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2267 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2268 GdkRectangle *monitor;
2271 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2273 memset(&lpmi, 0, sizeof(MONITORINFOEX));
2274 lpmi.cbSize = sizeof(MONITORINFOEX);
2276 GetMonitorInfo( hMonitor, &lpmi );
2278 if( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2281 SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
2282 monitor->x = rect.left;
2283 monitor->y = rect.top;
2284 monitor->width = rect.right - rect.left;
2285 monitor->height = rect.bottom - rect.top;
2287 if (monitorInfo->i_win_mon != 0)
2289 GdkRectangle temp = *monitor;
2290 *monitor = monitorInfo->win_monitors[0];
2291 monitorInfo->win_monitors[0] = temp;
2294 monitor->x = lpmi.rcMonitor.left;
2295 monitor->y = lpmi.rcMonitor.top;
2296 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2297 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2300 monitorInfo->i_win_mon++;
2305 void PositionWindowOnPrimaryScreen(window_position_t& position)
2307 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2309 if( position.x <= primaryMonitorRect.x + 6 )
2310 position.x = primaryMonitorRect.x + 6;
2311 else if( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 )
2312 position.x = primaryMonitorRect.x + 6;
2314 if( position.y <= primaryMonitorRect.y + 6 )
2315 position.y = primaryMonitorRect.y + 6;
2316 else if( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 )
2317 position.y = primaryMonitorRect.y + 6;
2319 if( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 )
2320 position.w = primaryMonitorRect.width - 18;
2321 if( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 )
2322 position.h = primaryMonitorRect.height - 18;
2326 GtkWidget* create_framed_widget(GtkWidget* widget)
2328 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2329 gtk_widget_show (frame);
2330 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2331 gtk_container_add (GTK_CONTAINER (frame), widget);
2332 gtk_widget_show(widget);
2336 gboolean entry_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2338 gtk_window_remove_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2342 gboolean entry_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2344 gtk_window_add_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2348 GtkWidget* create_framed_texwnd(TexWnd* texwnd)
2350 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2351 gtk_widget_show (frame);
2352 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2354 GtkWidget* hbox = gtk_hbox_new (FALSE, 0);
2355 gtk_widget_show (hbox);
2356 gtk_container_add (GTK_CONTAINER (frame), hbox);
2358 GtkWidget* w = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,1,1,1)));
2359 gtk_widget_show (w);
2360 gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, TRUE, 0);
2361 g_qeglobals_gui.d_texture_scroll = w;
2363 GtkWidget* texbox = gtk_vbox_new (FALSE, 0);
2364 gtk_widget_show (texbox);
2365 gtk_box_pack_start (GTK_BOX (hbox), texbox, TRUE, TRUE, 0);
2367 w = gtk_entry_new ();
2368 gtk_box_pack_start (GTK_BOX (texbox), w, FALSE, FALSE, 0);
2369 texwnd->m_pFilter = w;
2370 g_signal_connect(G_OBJECT(w), "focus_in_event", G_CALLBACK(entry_focus_in), NULL);
2371 g_signal_connect(G_OBJECT(w), "focus_out_event", G_CALLBACK(entry_focus_out), NULL);
2373 w = texwnd->GetWidget ();
2374 gtk_box_pack_start (GTK_BOX (texbox), w, TRUE, TRUE, 0);
2375 gtk_widget_show (w);
2380 static ZWnd *create_floating_zwnd(MainFrame *mainframe)
2382 ZWnd *pZWnd = new ZWnd ();
2383 GtkWidget* wnd = create_floating (mainframe);
2385 gtk_window_set_title (GTK_WINDOW (wnd), "Z");
2387 pZWnd->m_pParent = wnd;
2390 GtkWidget* frame = create_framed_widget(pZWnd->GetWidget());
2391 gtk_container_add (GTK_CONTAINER (wnd), frame);
2394 gtk_widget_realize (wnd);
2396 // turn OFF minimize and maximize boxes.
2397 // Must be *after* realize, or wnd->window is NULL
2398 // should do the right thing on *nix, need to verify.
2399 gdk_window_set_decorations ( wnd->window,
2400 GdkWMDecoration(GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2401 //TODO 50 by observation, will vary depending on decoration sizes
2403 GdkGeometry geometry;
2404 geometry.min_width = 50;
2405 //we only care about width, but have to set this too, or get nasty bugs
2406 geometry.min_height = 10;
2407 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE);
2411 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2412 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2415 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posZWnd);
2417 if (g_PrefsDlg.m_bZVis)
2418 gtk_widget_show (wnd);
2423 static const int gutter = 12;
2425 void MainFrame::Create ()
2427 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2429 gtk_widget_set_events (window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2430 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2431 GTK_SIGNAL_FUNC (mainframe_delete), this);
2432 gtk_signal_connect (GTK_OBJECT (window), "destroy",
2433 GTK_SIGNAL_FUNC (mainframe_destroy), this);
2434 gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2435 GTK_SIGNAL_FUNC (mainframe_keypress), this);
2436 gtk_signal_connect (GTK_OBJECT (window), "key_release_event",
2437 GTK_SIGNAL_FUNC (mainframe_keyrelease), this);
2438 gtk_signal_connect (GTK_OBJECT (window), "map_event",
2439 GTK_SIGNAL_FUNC (mainframe_map), this);
2440 gtk_signal_connect (GTK_OBJECT (window), "unmap_event",
2441 GTK_SIGNAL_FUNC (mainframe_unmap), this);
2443 g_qeglobals_gui.d_main_window = window;
2446 // calculate gdk offset
2447 int n_win_monitors = 0;
2449 monitorInfo_s monitorInfo;
2451 // detect multiple monitors
2452 EnumDisplayMonitors (NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>(&n_win_monitors));
2454 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2455 monitorInfo.i_win_mon = 0;
2456 EnumDisplayMonitors (NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>(&monitorInfo));
2458 gdk_offset_x = G_MININT;
2459 gdk_offset_y = G_MININT;
2462 for( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2463 gdk_offset_x = MAX (gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x);
2464 gdk_offset_y = MAX (gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y);
2467 Sys_Printf( "GDK's coordinate system is offset by %d over the x-axis and %d over the y-axis from Windows' coordinate system.\n", gdk_offset_x, gdk_offset_y );
2469 if( g_PrefsDlg.m_bStartOnPrimMon )
2472 GdkDisplay *display;
2474 gint n_gdk_monitors = 0;
2478 // detect multiple monitors
2479 display = gdk_display_get_default ();
2480 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name (display), gdk_display_get_n_screens (display) );
2482 screen = gdk_display_get_screen( display, 1 );
2483 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2485 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2487 for( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2488 memset( &rect, 0, sizeof(rect) );
2489 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2490 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2493 memcpy( &primaryMonitorRect, &rect, sizeof(primaryMonitorRect) );
2497 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2500 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2501 primaryMonitorRect.width = gdk_screen_width ();
2502 primaryMonitorRect.height = gdk_screen_height ();
2507 load_window_pos(window, g_PrefsDlg.mWindowInfo.position);
2509 GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
2510 gtk_container_add (GTK_CONTAINER (window), vbox);
2511 gtk_widget_show (vbox);
2513 create_main_menu (window, vbox);
2515 create_main_toolbar (window, vbox);
2516 create_plugin_toolbar (window,vbox);
2518 m_nCurrentStyle = g_PrefsDlg.m_nView;
2520 g_pGroupDlg->Create ();
2525 gtk_widget_show (window);
2527 // not needed on win32, it's in the .rc
2532 load_pixmap ("icon.bmp", window, &pixmap, &mask);
2533 gdk_window_set_icon (window->window, NULL, pixmap, mask);
2537 if (CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft)
2540 GtkWidget* vsplit = gtk_vpaned_new ();
2541 m_pSplits[0] = vsplit;
2542 gtk_box_pack_start (GTK_BOX (vbox), vsplit, TRUE, TRUE, 0);
2543 gtk_widget_show (vsplit);
2546 GtkWidget* hsplit = gtk_hpaned_new ();
2547 m_pSplits[2] = hsplit;
2548 gtk_paned_add1 (GTK_PANED (vsplit), hsplit);
2549 gtk_widget_show (hsplit);
2552 GtkWidget* hsplit2 = gtk_hpaned_new ();
2553 m_pSplits[3] = hsplit2;
2554 gtk_paned_add2 (GTK_PANED (hsplit), hsplit2);
2555 gtk_widget_show (hsplit2);
2558 GtkWidget* vsplit2 = gtk_vpaned_new ();
2559 m_pSplits[1] = vsplit2;
2560 if (CurrentStyle() == eRegular)
2561 gtk_paned_add2 (GTK_PANED (hsplit2), vsplit2);
2563 gtk_paned_add1 (GTK_PANED (hsplit), vsplit2);
2564 gtk_widget_show (vsplit2);
2567 m_pCamWnd = new CamWnd ();
2569 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2570 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2574 m_pXYWnd = new XYWnd ();
2575 m_pXYWnd->SetViewType(XY);
2577 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget ());
2578 gtk_paned_add1 (GTK_PANED (hsplit2), frame);
2582 m_pZWnd = new ZWnd ();
2584 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget ());
2585 if (CurrentStyle() == eRegular)
2586 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2588 gtk_paned_add2 (GTK_PANED (hsplit2), frame);
2592 m_pTexWnd = new TexWnd ();
2594 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2595 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2600 GtkWidget* scr = gtk_scrolled_window_new (NULL, NULL);
2601 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2602 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
2603 gtk_widget_show (scr);
2604 gtk_paned_pack2 (GTK_PANED (vsplit), scr, FALSE, TRUE);
2607 GtkWidget* text = gtk_text_view_new ();
2608 gtk_widget_set_size_request(text, 0, -1); // allow shrinking
2609 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
2610 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), FALSE);
2611 gtk_container_add (GTK_CONTAINER (scr), text);
2612 gtk_widget_show (text);
2613 g_qeglobals_gui.d_edit = text;
2621 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nXYHeight+28);
2623 if (CurrentStyle() == eRegular)
2625 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nZWidth);
2626 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2630 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nCamWidth);
2631 while (gtk_events_pending ()) gtk_main_iteration ();
2632 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2635 while (gtk_events_pending ()) gtk_main_iteration ();
2637 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), g_PrefsDlg.mWindowInfo.nCamHeight);
2639 else if (CurrentStyle() == eFloating)
2642 GtkWidget* wnd = create_floating (this);
2643 gtk_window_set_title (GTK_WINDOW (wnd), "Camera");
2646 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2647 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2650 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posCamWnd);
2652 gtk_widget_show (wnd);
2654 m_pCamWnd = new CamWnd ();
2657 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget ());
2658 gtk_container_add (GTK_CONTAINER (wnd), frame);
2661 m_pCamWnd->m_pParent = wnd;
2664 if (g_PrefsDlg.m_bFloatingZ)
2666 m_pZWnd = create_floating_zwnd(this);
2669 GtkWidget* wnd = create_floating (this);
2670 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2673 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2674 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2677 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2679 m_pXYWnd = new XYWnd ();
2680 m_pXYWnd->SetViewType(XY);
2683 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2684 gtk_container_add (GTK_CONTAINER (wnd), frame);
2687 m_pXYWnd->m_pParent = wnd;
2689 gtk_widget_show (wnd);
2694 GtkWidget* wnd = create_floating (this);
2695 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2698 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2699 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2702 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2704 m_pZWnd = new ZWnd ();
2705 m_pZWnd->m_pParent = wnd;
2707 m_pXYWnd = new XYWnd ();
2708 m_pXYWnd->SetViewType(XY);
2709 m_pXYWnd->m_pParent = wnd;
2713 GtkWidget* hsplit = gtk_hpaned_new ();
2714 m_pSplits[0] = hsplit;
2715 gtk_container_add (GTK_CONTAINER (wnd), hsplit);
2716 gtk_widget_show (hsplit);
2719 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget());
2720 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2723 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2724 gtk_paned_add2 (GTK_PANED (hsplit), frame);
2728 gtk_widget_show (wnd);
2730 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nZFloatWidth);
2734 GtkWidget* wnd = create_floating (this);
2735 gtk_window_set_title (GTK_WINDOW (wnd), _("XZ View"));
2738 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2739 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2742 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXZWnd);
2744 m_pXZWnd = new XYWnd ();
2745 m_pXZWnd->m_pParent = wnd;
2746 m_pXZWnd->SetViewType(XZ);
2749 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2750 gtk_container_add (GTK_CONTAINER (wnd), frame);
2753 if (g_PrefsDlg.m_bXZVis)
2754 gtk_widget_show (wnd);
2758 GtkWidget* wnd = create_floating (this);
2759 gtk_window_set_title (GTK_WINDOW (wnd), _("YZ View"));
2762 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2763 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2766 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posYZWnd);
2768 m_pYZWnd = new XYWnd ();
2769 m_pYZWnd->m_pParent = wnd;
2770 m_pYZWnd->SetViewType(YZ);
2773 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2774 gtk_container_add (GTK_CONTAINER (wnd), frame);
2777 if (g_PrefsDlg.m_bYZVis)
2778 gtk_widget_show (wnd);
2781 m_pTexWnd = new TexWnd ();
2783 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2784 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2787 GtkWidget* w = gtk_label_new (_("Textures"));
2788 gtk_widget_show (w);
2789 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2793 g_pGroupDlg->Show ();
2798 GtkWidget* hsplit = gtk_hpaned_new ();
2799 m_pSplits[0] = hsplit;
2800 gtk_box_pack_start (GTK_BOX (vbox), hsplit, TRUE, TRUE, 0);
2801 gtk_widget_show (hsplit);
2804 GtkWidget* vsplit1 = gtk_vpaned_new ();
2805 m_pSplits[1] = vsplit1;
2806 gtk_paned_add1 (GTK_PANED (hsplit), vsplit1);
2807 gtk_widget_show (vsplit1);
2810 GtkWidget* vsplit2 = gtk_vpaned_new ();
2811 m_pSplits[2] = vsplit2;
2812 gtk_paned_add2 (GTK_PANED (hsplit), vsplit2);
2813 gtk_widget_show (vsplit2);
2815 m_pCamWnd = new CamWnd ();
2817 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2818 gtk_paned_add1 (GTK_PANED (vsplit1), frame);
2821 m_pXYWnd = new XYWnd ();
2822 m_pXYWnd->SetViewType(XY);
2824 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2825 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2828 m_pYZWnd = new XYWnd ();
2829 m_pYZWnd->SetViewType(YZ);
2831 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2832 gtk_paned_add2 (GTK_PANED (vsplit1), frame);
2835 m_pXZWnd = new XYWnd ();
2836 m_pXZWnd->SetViewType(XZ);
2838 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2839 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2845 // g_qeglobals_gui.d_edit = NULL;
2848 m_pTexWnd = new TexWnd ();
2849 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2852 GtkWidget* w = gtk_label_new (_("Textures"));
2853 gtk_widget_show (w);
2854 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2858 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2859 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2860 m_pZWnd = create_floating_zwnd(this);
2862 while (gtk_events_pending ())
2863 gtk_main_iteration ();
2866 int x = GTK_PANED (m_pSplits[0])->max_position/2 - gutter;
2867 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), x);
2871 int y = GTK_PANED (m_pSplits[1])->max_position/2 - gutter;
2872 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), y);
2873 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), y);
2877 if(g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED)
2878 gtk_window_maximize(GTK_WINDOW(window));
2880 gtk_widget_show (window);
2884 if (m_pXYWnd) // this is always true?
2886 m_pXYWnd->SetActive(true);
2888 m_bSplittersOK = true;
2889 Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
2891 g_pParentWnd->OnEntitiesSetViewAs(0);
2893 // m_wndTextureBar.Create (vbox);
2894 create_main_statusbar (window, vbox);
2897 ShowMenuItemKeyBindings(window);
2899 if (g_qeglobals_gui.d_edit != NULL)
2900 console_construct(g_qeglobals_gui.d_edit);
2902 // bool load_last = FALSE;
2905 SetButtonMenuStates();
2907 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2909 g_bIgnoreCommands++;
2910 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
2911 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
2912 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaderlistonly"));
2913 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
2914 g_bIgnoreCommands--;
2916 // if (g_PrefsDlg.m_bTextureBar)
2917 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2919 SetActiveXY(m_pXYWnd);
2921 s_idle_id = gtk_timeout_add (25, mainframe_idle, this);
2923 QGL_InitExtensions ();
2925 if (g_PrefsDlg.mLocalPrefs.mbEmpty)
2927 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2928 g_PrefsDlg.SavePrefs();
2931 // remove the pid file
2932 remove (g_pidGameFile.GetBuffer ());
2934 Sys_Printf ("Entering message loop\n");
2938 m_nTimer = gtk_timeout_add (1000, timer, this);
2941 // =============================================================================
2944 MainFrame::MainFrame()
2947 m_bSplittersOK = false;
2948 g_pParentWnd = this;
2949 m_pXYWnd = (XYWnd*)NULL;
2951 m_pTexWnd = (TexWnd*)NULL;
2952 m_pZWnd = (ZWnd*)NULL;
2953 m_pYZWnd = (XYWnd*)NULL;
2954 m_pXZWnd = (XYWnd*)NULL;
2955 m_pActiveXY = (XYWnd*)NULL;
2956 m_bCamPreview = true;
2958 for (int n = 0; n < 6; n++)
2959 m_pStatusLabel[n] = NULL;
2960 m_bNeedStatusUpdate = false;
2962 m_bSleeping = false;
2966 MainFrame::~MainFrame()
2968 while (g_BSPFrontendCommands)
2970 free (g_BSPFrontendCommands->data);
2971 g_BSPFrontendCommands = g_slist_remove (g_BSPFrontendCommands, g_BSPFrontendCommands->data);
2975 void MainFrame::ReleaseContexts ()
2978 m_pXYWnd->DestroyContext ();
2980 m_pYZWnd->DestroyContext ();
2982 m_pXZWnd->DestroyContext ();
2984 m_pCamWnd->DestroyContext ();
2986 m_pTexWnd->DestroyContext ();
2988 m_pZWnd->DestroyContext ();
2991 void MainFrame::CreateContexts ()
2994 m_pCamWnd->CreateContext ();
2996 m_pXYWnd->CreateContext ();
2998 m_pYZWnd->CreateContext ();
3000 m_pXZWnd->CreateContext ();
3002 m_pTexWnd->CreateContext ();
3004 m_pZWnd->CreateContext ();
3007 static void Sys_Iconify (GtkWidget *w)
3009 // we might not have been realized yet
3010 if (w->window == NULL)
3013 if (!GTK_WIDGET_MAPPED (w))
3016 #if defined (__linux__) || defined (__APPLE__)
3017 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Iconify\n");
3019 XWindowAttributes xattr;
3020 GdkWindowPrivate *Private;
3022 Private = (GdkWindowPrivate*)w->window;
3023 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (0));
3025 if (!Private->destroyed)
3027 xattr.map_state = IsUnmapped;
3028 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3030 if (xattr.map_state != IsUnmapped)
3031 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (1));
3033 XIconifyWindow (Private->xdisplay, Private->xwindow, 0);
3039 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_MINIMIZE);
3043 static void Sys_Restore (GtkWidget *w)
3045 // we might not have been realized yet
3046 if (w->window == NULL)
3049 if (!GTK_WIDGET_VISIBLE (w))
3052 #if defined (__linux__) || defined (__APPLE__)
3053 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Restore\n");
3055 XWindowAttributes xattr;
3056 GdkWindowPrivate *Private;
3058 Private = (GdkWindowPrivate*)w->window;
3060 xattr.map_state = IsUnmapped;
3061 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3063 if (xattr.map_state == IsUnmapped)
3064 XMapRaised (Private->xdisplay, Private->xwindow);
3069 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_RESTORE);
3077 void RefreshModelSkin (GSList **pModels, entitymodel_t *model)
3079 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3080 // so we avoid the fucked up ones, assuming they are at the end
3081 if (!model->strSkin)
3084 Sys_Printf("Dropping model %p with empty skin in RefreshModelSkin\n", model);
3087 // and also keeping it so we have an actual count of empty models
3088 g_slist_append (*pModels, model);
3091 // do we have this model already?
3092 if (g_slist_find (*pModels, model))
3096 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3097 Sys_Printf("Already processed model: %p %s\n", model, ((GString *)model->strSkin)->str);
3101 model->nTextureBind = Texture_LoadSkin(((GString *)model->strSkin)->str, &model->nSkinWidth, &model->nSkinHeight );
3102 if (model->nTextureBind != -1)
3103 Sys_Printf("LOADED SKIN: %s\n", ((GString *)model->strSkin)->str );
3105 Sys_Printf("Load skin failed: %s\n", ((GString *)model->strSkin)->str );
3106 *pModels = g_slist_append (*pModels, model);
3108 Sys_Printf("Processed model %p %s\n", model, ((GString *)model->strSkin)->str);
3112 void MainFrame::OnSleep()
3117 // useful when trying to debug crashes in the sleep code
3118 Sys_Printf("Going into sleep mode..\n");
3120 Sys_Printf("Dispatching sleep msg...");
3121 DispatchRadiantMsg (RADIANT_SLEEP);
3122 Sys_Printf("Done.\n");
3124 if (CurrentStyle() == eSplit)
3125 Sys_Iconify (m_pZWnd->m_pParent);
3127 Sys_Iconify (m_pWidget);
3129 QERApp_FreeShaders ();
3130 g_bScreenUpdates = false;
3133 Sys_Printf("Releasing contexts...");
3135 Sys_Printf("Done.\n");
3137 // free all the skins in the caches
3138 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3139 g_lstSkinCache.RemoveAll();
3142 Sys_Printf("Waking up\n");
3143 if (CurrentStyle() == eSplit)
3144 Sys_Restore (m_pZWnd->m_pParent);
3146 Sys_Restore (m_pWidget);
3149 Sys_Printf("Creating contexts...");
3151 Sys_Printf("Done.\n");
3153 Sys_Printf("Making current on camera...");
3154 m_pCamWnd->MakeCurrent ();
3155 Sys_Printf("Done.\n");
3157 Sys_Printf("Reloading shaders...");
3158 // reload the shader scripts and textures
3159 QERApp_ReloadShaders ();
3161 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3162 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
3163 Sys_Printf("Done.\n");
3165 // rebuild the patches by setting the bDirty flag on them
3166 for (brush_t* b=active_brushes.next ; b != &active_brushes ; b=b->next)
3169 b->pPatch->bDirty = true;
3172 Sys_Printf("Reloading skins...");
3173 // we have purged all the skins before going to sleep
3174 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3175 // namely, all entitymodel_t
3176 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3177 // (a single eclass_t can reference several entitymodel_t)
3178 // FIXME: and what's up with md3Class then? what is it used for?
3182 GSList *Models = NULL;
3183 for (ent = entities.next; ent != &entities; ent = ent->next)
3185 // if it's a model with skin then the fixedsize flag must be on
3186 // only if there IS a model .. we are not trying to load
3187 if (ent->eclass->fixedsize)
3189 if (ent->eclass->model)
3193 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3195 entitymodel_t *model;
3196 for (model = ent->eclass->model; model; model=model->pNext)
3197 RefreshModelSkin (&Models, model);
3198 } else if (ent->md3Class)
3200 entitymodel_t *model;
3201 for (model = ent->md3Class->model; model; model=model->pNext)
3202 RefreshModelSkin (&Models, model);
3206 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3211 for (e = g_md3Cache; e ; e = e->next)
3213 entitymodel_t *model;
3214 for (model = e->model; model; model=model->pNext)
3215 if (!g_slist_find (Models, model))
3217 Sys_Printf("model %p ", model);
3219 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3221 Sys_Printf("not found in main loop (no skin)\n");
3225 // clean the model list
3226 g_slist_free (Models);
3228 Sys_Printf("Done.\n");
3230 // bring back the GL font
3231 gtk_glwidget_create_font (m_pCamWnd->GetWidget ());
3233 g_bScreenUpdates = true;
3235 Sys_Printf("Dispatching wake msg...");
3236 DispatchRadiantMsg (RADIANT_WAKEUP);
3237 Sys_Printf("Done\n");
3241 void WINAPI QERApp_Sleep()
3243 g_pParentWnd->OnSleep();
3248 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3249 and not in OnDestroy because the info may be lost already?
3250 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3252 void MainFrame::OnDelete ()
3254 save_window_pos(m_pWidget, g_PrefsDlg.mWindowInfo.position);
3256 // surface inspector and patch inspector
3257 save_window_pos (g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd);
3258 save_window_pos (g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd);
3260 // entity inspector / group dialog
3261 // NOTE TTimo do we have to save a different window depending on the view mode?
3262 save_window_pos (g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd);
3264 if (g_PrefsDlg.m_bFloatingZ)
3265 save_window_pos (m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd);
3267 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED (m_pSplits[0])->child1_size;
3269 if (CurrentStyle() == eFloating)
3271 save_window_pos (m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd);
3272 save_window_pos (m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd);
3273 save_window_pos (m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd);
3274 save_window_pos (m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd);
3277 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state(g_pParentWnd->m_pWidget->window);
3280 void MainFrame::OnDestroy ()
3282 // shut down console output first
3283 // (we'll still get the info if we are running a log file anyway)
3284 g_qeglobals_gui.d_edit = NULL;
3287 Sys_Printf("MainFrame::OnDestroy\n");
3290 gtk_timeout_remove (s_idle_id);
3292 gtk_timeout_remove (m_nTimer);
3294 if (!g_qeglobals.disable_ini)
3296 Sys_Printf("Start writing prefs\n");
3297 Sys_Printf("MRU_Save... ");
3303 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split1");
3304 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED (w)->child1_size;
3305 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split2");
3306 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED (w)->child1_size;
3308 if (!FloatingGroupDialog())
3310 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3312 vsplit = m_pSplits[0];
3313 vsplit2 = m_pSplits[1];
3314 hsplit = m_pSplits[2];
3315 hsplit2 = m_pSplits[3];
3317 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED (vsplit)->child1_size;
3318 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED (hsplit2)->child1_size;
3320 if(CurrentStyle() == eRegular)
3321 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED (hsplit)->child1_size;
3323 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED (hsplit)->child1_size;
3325 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED (vsplit2)->child1_size;
3328 if (g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit)
3330 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
3331 g_PrefsDlg.m_bZVis = TRUE;
3333 g_PrefsDlg.m_bZVis = FALSE;
3336 g_PrefsDlg.SavePrefs();
3337 Sys_Printf("Done prefs\n");
3340 // spog - this may be better in another place..
3341 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3342 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
3344 delete m_pXYWnd; m_pXYWnd = NULL;
3345 delete m_pYZWnd; m_pYZWnd = NULL;
3346 delete m_pXZWnd; m_pXZWnd = NULL;
3347 delete m_pZWnd; m_pZWnd = NULL;
3348 delete m_pTexWnd; m_pTexWnd = NULL;
3349 delete m_pCamWnd; m_pCamWnd = NULL;
3351 if (g_pGroupDlg->m_pWidget)
3353 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3354 gtk_widget_destroy (g_pGroupDlg->m_pWidget);
3355 g_pGroupDlg->m_pWidget = NULL;
3358 if (strcmpi(currentmap, "unnamed.map") != 0)
3360 g_PrefsDlg.m_strLastMap = currentmap;
3361 g_PrefsDlg.SavePrefs ();
3363 Sys_Printf("CleanUpEntities...");
3365 Sys_Printf("Done.\n");
3367 Sys_Printf("Releasing brushes...");
3368 while (active_brushes.next != &active_brushes)
3369 Brush_Free (active_brushes.next, false);
3370 while (selected_brushes.next != &selected_brushes)
3371 Brush_Free (selected_brushes.next, false);
3372 while (filtered_brushes.next != &filtered_brushes)
3373 Brush_Free (filtered_brushes.next, false);
3374 Sys_Printf("Done.\n");
3376 Sys_Printf("Releasing entities...");
3377 while (entities.next != &entities)
3378 Entity_Free (entities.next);
3379 Sys_Printf("Done.\n");
3381 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3384 epair_t* pNextEPair = pEPair->next;
3386 free (pEPair->value);
3388 pEPair = pNextEPair;
3391 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3392 while (pEntity != NULL && pEntity != g_qeglobals.d_project_entity)
3394 entity_t* pNextEntity = pEntity->next;
3395 Entity_Free(pEntity);
3396 pEntity = pNextEntity;
3399 Sys_Printf("Freeing world entity...");
3401 Entity_Free(world_entity);
3402 Sys_Printf("Done.\n");
3404 Sys_Printf("Shutdown VFS...");
3406 Sys_Printf("Done.\n");
3408 Sys_Printf("FreeShaders...");
3409 QERApp_FreeShaders();
3410 Sys_Printf("Done.\n");
3413 // TTimo: now using profile.cpp code
3414 void MainFrame::LoadCommandMap()
3418 bool bUserCmdList = false;
3420 // verbose a little: count of user commands we recognized
3422 int iOverrideCount = 0;
3426 #if defined (__linux__) || defined (__APPLE__)
3427 strINI = g_PrefsDlg.m_rc_path->str;
3428 #elif defined(WIN32)
3429 strINI = g_strGameToolsPath;
3431 #error "WTF are you compiling this on"
3434 strINI += "shortcuts.ini";
3436 f = fopen (strINI.GetBuffer(), "r");
3440 // loop through all the commands
3441 for (int i = 0; i < g_nCommandCount; i++)
3444 if (read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ))
3448 Sys_Printf("Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3449 bUserCmdList = true;
3454 strBuff.TrimRight();
3455 strBuff.MakeLower();
3456 int nSpecial = strBuff.Find("+alt");
3457 g_Commands[i].m_nModifiers = 0;
3460 g_Commands[i].m_nModifiers |= RAD_ALT;
3461 FindReplace(strBuff, "+alt", "");
3463 nSpecial = strBuff.Find("+ctrl");
3466 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3467 FindReplace(strBuff, "+ctrl", "");
3469 nSpecial = strBuff.Find("+shift");
3472 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3473 FindReplace(strBuff, "+shift", "");
3476 strBuff.TrimRight();
3477 strBuff.MakeUpper();
3478 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3480 nLen = strBuff.GetLength();
3481 if (nLen == 1) // most often case.. deal with first
3483 g_Commands[i].m_nKey = __toascii(strBuff.GetAt(0));
3485 } else // special key
3487 for (j = 0; j < g_nKeyCount; j++)
3489 if (strBuff.CompareNoCase(g_Keys[j].m_strName) == 0)
3491 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3496 if (j == g_nKeyCount)
3498 Sys_Printf("WARNING: failed to parse user command %s\n", value);
3502 // maybe this new shortcut is overriding another one
3503 // then we need to disable the other binded key
3504 for (j = 0; j < g_nCommandCount; j++)
3508 if (g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers)
3511 g_Commands[j].m_nKey = 0;
3514 // it's the only one
3521 Sys_Printf("User's command list overrides %d default commands\n", iOverrideCount);
3522 Sys_Printf("Parsed %d custom shortcuts\n", iCount );
3525 Sys_Printf("Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer());
3528 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3529 // we also output the count of commands that are not binded .. dunno if it's much use ..
3530 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3531 void MainFrame::ShowMenuItemKeyBindings(GtkWidget* window)
3533 //!\todo Find a better way to get the global accelerator group..
3534 GtkAccelGroup *accel = GTK_ACCEL_GROUP(gtk_accel_groups_from_object(G_OBJECT(window))->data);
3540 for (i = 0; i < g_nCommandCount; i++)
3542 if (g_Commands[i].m_nKey == 0)
3548 item = g_object_get_data (G_OBJECT (m_pWidget), g_Commands[i].m_strMenu);
3551 Sys_FPrintf (SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3552 g_Commands[i].m_strCommand);
3557 if (g_Commands[i].m_nModifiers) // are there modifiers present?
3559 if (g_Commands[i].m_nModifiers & RAD_SHIFT)
3560 mods |= GDK_SHIFT_MASK;
3561 if (g_Commands[i].m_nModifiers & RAD_ALT)
3562 mods |= GDK_MOD1_MASK;
3563 if (g_Commands[i].m_nModifiers & RAD_CONTROL)
3564 mods |= GDK_CONTROL_MASK;
3567 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3568 if (gtk_accelerator_valid (g_Commands[i].m_nKey, (GdkModifierType)mods))
3571 // NOTE TTimo this is the important place where all the shortcuts are binded
3572 Sys_Printf("Calling gtk_widget_add_accelerator on command: %s menu: %s key: %d mods: %d\n", g_Commands[i].m_strCommand, g_Commands[i].m_strMenu, g_Commands[i].m_nKey, mods);
3574 gtk_widget_add_accelerator (GTK_WIDGET (item), "activate", accel, g_Commands[i].m_nKey,
3575 (GdkModifierType)mods, GTK_ACCEL_VISIBLE);
3578 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (GTK_BIN (item)->child);
3582 g_free (accel_label->accel_string);
3583 accel_label->accel_string = NULL;
3585 gstring = g_string_new (accel_label->accel_string);
3586 g_string_append (gstring, " ");
3589 if (mods & GDK_SHIFT_MASK)
3591 g_string_append (gstring, "Shft");
3594 if (mods & GDK_CONTROL_MASK)
3597 g_string_append (gstring, "+");
3598 g_string_append (gstring, "Ctl");
3601 if (mods & GDK_MOD1_MASK)
3604 g_string_append (gstring, "+");
3605 g_string_append (gstring, "Alt");
3610 g_string_append (gstring, "+");
3611 if (g_Commands[i].m_nKey < 0x80 || (g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff))
3613 switch (g_Commands[i].m_nKey)
3616 g_string_append (gstring, "Space");
3619 g_string_append (gstring, "Backslash");
3622 g_string_append_c (gstring, toupper (g_Commands[i].m_nKey));
3629 tmp = gtk_accelerator_name (g_Commands[i].m_nKey, (GdkModifierType)0);
3630 if (tmp[0] != 0 && tmp[1] == 0)
3631 tmp[0] = toupper (tmp[0]);
3632 g_string_append (gstring, tmp);
3636 g_free (accel_label->accel_string);
3637 accel_label->accel_string = gstring->str;
3638 g_string_free (gstring, FALSE);
3640 if (!accel_label->accel_string)
3641 accel_label->accel_string = g_strdup ("");
3643 gtk_widget_queue_resize (GTK_WIDGET (accel_label));
3648 Sys_Printf("%d commands not bound to a key\n", iCount);
3651 void MainFrame::CreateQEChildren()
3653 // load the project file
3656 Sys_Printf("loading project file from the command line: %s\n", g_argv[1]);
3657 if (!QE_LoadProject(g_argv[1]))
3658 Error("Unable to load project file %s\n", g_argv[1]);
3662 const char* filename = NULL;
3665 bool bTriedTemplate = false;
3667 if (g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION) {
3668 // we need to regenerate from template
3669 Sys_Printf("last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION);
3670 g_PrefsDlg.m_strLastProject = "";
3673 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3675 while(r == NULL || *r == '\0' || access(r, R_OK) != 0 || !QE_LoadProject(r))
3679 // try default project location
3680 bTriedTemplate = true;
3681 // for all OSes, we look for the template in the base installation (no homepath here)
3682 strcpy(buf, g_pGameDescription->mEnginePath.GetBuffer());
3683 strcat(buf, g_pGameDescription->mBaseGame.GetBuffer());
3684 strcat(buf, "/scripts/");
3685 strcat(buf, PROJECT_TEMPLATE_NAME);
3690 gtk_MessageBox (NULL, _("Failed to load project file.\nPlease enter a valid project file."), _("Load Project"));
3692 filename = file_dialog (m_pWidget, TRUE, _("Choose Project File"), buf, "project");
3693 if (filename != NULL)
3696 Error("Cannot continue without loading a project...");
3704 void MainFrame::OnTimer()
3706 GdkModifierType mask;
3708 gdk_window_get_pointer (NULL, NULL, NULL, &mask);
3710 if ((mask & (GDK_BUTTON1_MASK|GDK_BUTTON2_MASK|GDK_BUTTON3_MASK)) == 0)
3712 QE_CountBrushesAndUpdateStatusBar();
3716 // see MainFrame::UpdateStatusText below
3717 if (m_bNeedStatusUpdate)
3719 for (int n = 0; n < 6; n++)
3721 if (m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL)
3722 gtk_label_set_text (GTK_LABEL (m_pStatusLabel[n]), m_strStatus[n]);
3724 m_bNeedStatusUpdate = false;
3728 void MainFrame::UpdateStatusText()
3730 m_bNeedStatusUpdate = true;
3733 void MainFrame::SetStatusText(int nPane, const char* pText)
3735 if (pText && nPane <= 5 && nPane >= 0)
3737 m_strStatus[nPane] = pText;
3741 void MainFrame::SetButtonMenuStates()
3744 g_bIgnoreCommands++;
3746 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
3747 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_angles);
3748 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
3749 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_names);
3750 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
3751 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_coordinates);
3752 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
3753 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_outline);
3754 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
3755 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
3756 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
3757 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_axis);
3758 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3759 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3760 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) ? FALSE : TRUE);
3761 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3762 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3763 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3764 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3765 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3766 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3767 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
3768 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3769 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD) != 0);
3770 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
3771 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3772 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT) != 0);
3773 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
3774 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3775 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS) != 0);
3776 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
3777 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3778 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT) != 0);
3779 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
3780 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3781 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS) != 0);
3782 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
3783 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3784 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK) != 0);
3785 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
3786 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3787 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP) != 0);
3788 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
3789 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3790 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP) != 0);
3791 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
3792 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3793 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL) != 0);
3794 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
3795 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3796 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) != 0);
3797 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3798 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3799 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3800 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3801 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3802 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3803 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
3804 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3805 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS) != 0);
3806 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
3807 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3808 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES) != 0);
3809 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
3810 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3811 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS) != 0);
3812 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
3813 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3814 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS) != 0);
3815 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
3816 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3817 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS) != 0);
3818 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
3819 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3820 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS) != 0);
3821 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
3822 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bTextureLock) ? TRUE : FALSE);
3823 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
3824 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bRotateLock) ? TRUE : FALSE);
3825 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
3826 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3827 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
3828 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bGLLighting) ? TRUE : FALSE);
3829 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
3830 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bSnap) ? TRUE : FALSE);
3832 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
3833 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3834 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
3835 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
3837 if (!g_pGameDescription->mNoPatch)
3839 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
3840 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
3842 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
3843 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
3844 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
3845 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
3846 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
3847 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
3850 int id, n = g_PrefsDlg.m_nTextureScale;
3853 case 10 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3854 case 25 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3855 case 50 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3856 case 200 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3857 default : id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3859 SetTextureScale (id);
3861 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3863 if (g_qeglobals.d_project_entity)
3865 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3869 g_bIgnoreCommands--;
3872 void MainFrame::UpdateWindows(int nBits)
3874 if (!g_bScreenUpdates)
3876 #ifdef DBG_WINDOWPOS
3877 static int bean_count = 0;
3879 sprintf(bean_buf,"UpdateWindows %d",bean_count);
3880 CheckWatchit(bean_buf);
3884 if (nBits & (W_XY | W_XY_OVERLAY))
3887 m_pXYWnd->RedrawWindow ();
3889 m_pXZWnd->RedrawWindow ();
3891 m_pYZWnd->RedrawWindow ();
3894 if (nBits & W_CAMERA || ((nBits & W_CAMERA_IFON) && m_bCamPreview))
3897 m_pCamWnd->RedrawWindow ();
3900 if (nBits & (W_Z | W_Z_OVERLAY))
3903 m_pZWnd->RedrawWindow ();
3906 if (nBits & W_TEXTURE)
3909 m_pTexWnd->RedrawWindow ();
3911 #ifdef DBG_WINDOWPOS
3912 sprintf(bean_buf,"%d (end UpdateWidows)",bean_count);
3913 CheckWatchit(bean_buf);
3917 void MainFrame::RoutineProcessing()
3919 #ifdef DBG_WINDOWPOS
3920 static int bean_count = 0;
3922 sprintf(bean_buf,"RoutineProcessing %d",bean_count);
3923 CheckWatchit(bean_buf);
3930 double oldtime = 0.0;
3933 /* // checking KeyState works right
3935 a2 = GetKeyState(VK_MENU);
3938 Sys_Printf("VK_MENU: %d\n",a2);
3942 b2 = GetKeyState(VK_UP);
3945 Sys_Printf("VK_UP: %d\n",b2);
3949 time = Sys_DoubleTime ();
3950 delta = time - oldtime;
3955 // update the BSP process watcher
3957 m_pWatchBSP->RoutineProcessing();
3959 // run time dependant behavior
3961 m_pCamWnd->Cam_MouseControl(delta);
3965 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3966 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3967 UpdateWindows(nBits); // happens in rare cases but causes a stack overflow
3970 // Enable/disable the menu items
3973 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3974 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3975 if (!g_PrefsDlg.m_bWideToolbar)
3977 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3978 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3980 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3981 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3982 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3983 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3984 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3985 gtk_widget_set_sensitive (item, region_active);
3986 g_bIgnoreCommands++;
3987 // update the toolbar before displaying the menu:
3988 // show in use check box
3989 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3990 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3991 // show all check box
3992 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3993 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3994 g_bIgnoreCommands--;
3997 #ifdef DBG_WINDOWPOS
3998 sprintf(bean_buf,"%d (end RoutineProcessing)",bean_count);
3999 CheckWatchit(bean_buf);
4003 void MainFrame::DoWatchBSP()
4005 // network monitoring of the BSP process
4007 m_pWatchBSP = new CWatchBSP();
4010 void MainFrame::CleanPlugInMenu()
4012 GtkWidget *menu, *sep;
4015 // delete everything after the separator
4016 menu = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin"));
4017 sep = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin_separator"));
4018 m_nNextPlugInID = ID_PLUGIN_START;
4020 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4023 gtk_container_remove (GTK_CONTAINER (menu), GTK_WIDGET (lst->next->data));
4024 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4028 void MainFrame::AddPlugInMenuItem(IPlugIn* pPlugIn)
4030 GtkWidget *menu, *item, *parent;
4031 const char *menuText;
4033 parent = gtk_menu_item_new_with_label (pPlugIn->getMenuName());
4034 gtk_widget_show (parent);
4035 gtk_container_add (GTK_CONTAINER (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin")), parent);
4037 int nCount = pPlugIn->getCommandCount();
4040 menu = gtk_menu_new ();
4043 menuText = pPlugIn->getCommand(--nCount);
4044 if (menuText != NULL && strlen(menuText) > 0)
4046 if (!strcmp(menuText, "-"))
4048 item = gtk_menu_item_new ();
4049 gtk_widget_set_sensitive (item, FALSE);
4052 item = gtk_menu_item_new_with_label (menuText);
4053 gtk_signal_connect (GTK_OBJECT (item), "activate",
4054 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (m_nNextPlugInID));
4056 gtk_widget_show (item);
4057 gtk_container_add (GTK_CONTAINER (menu), item);
4058 pPlugIn->addMenuID(m_nNextPlugInID++);
4061 gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), menu);
4065 void MainFrame::OnPlugIn(unsigned int nID, char* str)
4067 m_PlugInMgr.Dispatch(nID, str);
4070 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype(IToolbarButton::EType type)
4074 case IToolbarButton::eSpace:
4075 return GTK_TOOLBAR_CHILD_SPACE;
4076 case IToolbarButton::eButton:
4077 return GTK_TOOLBAR_CHILD_BUTTON;
4078 case IToolbarButton::eToggleButton:
4079 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4080 case IToolbarButton::eRadioButton:
4081 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4083 Error("invalid toolbar button type");
4084 return (GtkToolbarChildType)0;
4087 void toolbar_insert(GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data)
4089 GtkWidget *w, *pixmap;
4090 GdkPixmap *gdkpixmap;
4093 load_plugin_bitmap(image, (void **)&gdkpixmap, (void **)&mask);
4094 pixmap = gtk_pixmap_new (gdkpixmap, mask);
4095 gdk_pixmap_unref (gdkpixmap);
4096 gdk_pixmap_unref (mask);
4097 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), gtktoolbarchildtype_for_toolbarbuttontype(type), NULL, text, tooltip, "", GTK_WIDGET (pixmap), handler, data);
4100 void SignalToolbarButton(GtkWidget *widget, gpointer data)
4102 const_cast<const IToolbarButton*>(reinterpret_cast<IToolbarButton*>(data))->activate();
4105 void MainFrame::AddPlugInToolbarButton(const IToolbarButton* button)
4107 GtkWidget*const toolbar = GTK_WIDGET(g_object_get_data (G_OBJECT (m_pWidget), "toolbar_plugin"));
4108 toolbar_insert(toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC(SignalToolbarButton), reinterpret_cast<gpointer>(const_cast<IToolbarButton*>(button)));
4111 void MainFrame::OnSelectionSelectNudgedown()
4113 NudgeSelection(3, g_qeglobals.d_gridsize);
4116 void MainFrame::OnSelectionSelectNudgeleft()
4118 NudgeSelection(0, g_qeglobals.d_gridsize);
4121 void MainFrame::OnSelectionSelectNudgeright()
4123 NudgeSelection(2, g_qeglobals.d_gridsize);
4126 void MainFrame::OnSelectionSelectNudgeup()
4128 NudgeSelection(1, g_qeglobals.d_gridsize);
4131 void MainFrame::NudgeSelection(int nDirection, float fAmount)
4133 if (ActiveXY()->RotateMode())
4136 if (ActiveXY()->GetViewType() == XY)
4140 if (g_pParentWnd->ActiveXY()->GetViewType() == XZ)
4146 if (nDirection == 2 || nDirection == 3)
4151 float fDeg = -fAmount;
4152 float fAdj = fAmount;
4154 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4156 strStatus.Format("Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4157 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2]);
4158 g_pParentWnd->SetStatusText(2, strStatus);
4159 Select_RotateAxis(nAxis, fDeg, false, true);
4160 Sys_UpdateWindows (W_ALL);
4162 if (ActiveXY()->ScaleMode())
4164 if (nDirection == 0 || nDirection == 3)
4169 v[0] = v[1] = v[2] = 1.0;
4182 Select_Scale((g_nScaleHow & SCALE_X) ? v[0] : 1.0,
4183 (g_nScaleHow & SCALE_Y) ? v[1] : 1.0,
4184 (g_nScaleHow & SCALE_Z) ? v[2] : 1.0);
4185 Sys_UpdateWindows (W_ALL);
4188 // 0 - left, 1 - up, 2 - right, 3 - down
4190 if (nDirection == 0)
4192 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4194 } else if (nDirection == 1)
4196 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4197 } else if (nDirection == 2)
4199 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4202 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4205 Nudge(nDim, fAmount);
4209 void MainFrame::Nudge(int nDim, float fNudge)
4212 vMove[0] = vMove[1] = vMove[2] = 0;
4213 vMove[nDim] = fNudge;
4215 if((g_qeglobals.d_select_mode == sel_vertex ||
4216 g_qeglobals.d_select_mode == sel_curvepoint)
4217 && g_qeglobals.d_num_move_points)
4218 Select_NudgePoint(vMove, true);
4220 Select_Move(vMove, true);
4221 Sys_UpdateWindows (W_ALL);
4224 void MainFrame::SetGridStatus()
4229 c1 = (g_PrefsDlg.m_bTextureLock) ? 'M' : ' ';
4230 c2 = (g_PrefsDlg.m_bRotateLock) ? 'R' : ' ';
4231 strStatus.Format("G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4232 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2);
4233 SetStatusText(4, strStatus);
4236 void MainFrame::UpdatePatchToolbarButtons()
4239 g_bIgnoreCommands++;
4240 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
4241 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
4242 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4243 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4244 g_bIgnoreCommands--;
4247 // =============================================================================
4250 void MainFrame::OnFileNew()
4252 if (ConfirmModified())
4256 void MainFrame::OnFileOpen()
4258 if (!ConfirmModified())
4264 if (!g_pGameDescription->noMapsInHome) {
4265 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4266 strcat(buf, "maps/");
4271 str = file_dialog (m_pWidget, TRUE, _("Open Map"), buf, MAP_MAJOR, "maps/");
4275 strcpy(currentmap,str);
4281 void MainFrame::OnFileImportmap()
4286 if (!g_pGameDescription->noMapsInHome) {
4287 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4288 strcat(buf, "maps/");
4293 str = file_dialog (m_pWidget, TRUE, _("Import Map"), buf, MAP_MAJOR, "maps/");
4297 Map_ImportFile(str);
4301 void MainFrame::OnFileSave()
4303 if (!strcmp(currentmap, "unnamed.map"))
4306 Map_SaveFile (currentmap, false);
4309 void MainFrame::OnFileSaveas()
4314 if (!g_pGameDescription->noMapsInHome) {
4315 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4316 strcat(buf, "maps/");
4321 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, _("Save Map"), buf, MAP_MAJOR, "maps/");
4325 strcpy (currentmap, str);
4327 Map_SaveFile (str, false); // ignore region
4331 void MainFrame::OnFileExportmap()
4336 if (!g_pGameDescription->noMapsInHome) {
4337 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4338 strcat(buf, "maps/");
4343 str = file_dialog (m_pWidget, FALSE, _("Export Selection"), buf, MAP_MAJOR, "maps/");
4347 Map_SaveSelected (str);
4351 void MainFrame::OnFileSaveregion()
4356 if (!g_pGameDescription->noMapsInHome) {
4357 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4358 strcat(buf, "maps/");
4363 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, _("Export Region"), buf, MAP_MAJOR, "maps/");
4367 Map_SaveFile (str, true); // ignore region
4371 void MainFrame::OnFileNewproject()
4373 char* name = DoNewProjectDlg ();
4375 // create a new project:
4376 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4377 // on linux we create under ~/.q3a, on win32 under strEnginePath
4378 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4379 if ((name != NULL) && (strlen (name) > 0))
4381 CString strNewBasePath;
4383 // NOTE TTimo this would probably not work right on *nix
4384 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4385 strNewBasePath += name;
4386 strNewBasePath += "/";
4388 CString strProjToLoad;
4389 CString strMapToLoad;
4391 // if the dir exists, ask the user if they want to continue anyway
4392 if (Q_mkdir (strNewBasePath.GetBuffer(), 0755) != 0)
4395 strMsg.Format("The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer ());
4397 if (gtk_MessageBox(m_pWidget, _(strMsg), _("Error"), MB_YESNO) != IDYES)
4399 Sys_Printf("New Project cancelled, directory already exists for project\n");
4406 strDir = strNewBasePath;
4408 Q_mkdir (strDir.GetBuffer(), 0755);
4410 strDir = strNewBasePath;
4411 strDir += "textures/";
4412 Q_mkdir (strDir.GetBuffer(), 0755);
4414 strDir = strNewBasePath;
4415 strDir += "scripts/";
4416 Q_mkdir (strDir.GetBuffer(), 0755);
4418 // print a warning for total conversions, since setting the basepath when required files are
4419 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4420 Sys_FPrintf(SYS_WRN, "*** Note: basepath unchanged\n");
4422 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name);
4424 strDir = strNewBasePath;
4425 strDir += "maps/autosave.map";
4426 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4428 // state that this is a user project file, no templating
4429 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4430 // create the project file
4431 strProjToLoad = strNewBasePath;
4432 strProjToLoad += "scripts/";
4433 strProjToLoad += name;
4434 strProjToLoad += ".";
4435 strProjToLoad += PROJECT_FILETYPE;
4436 QE_SaveProject(strProjToLoad.GetBuffer());
4441 void MainFrame::OnFileLoadproject()
4443 if (ConfirmModified())
4447 void MainFrame::OnFileProjectsettings()
4449 DoProjectSettings();
4452 void MainFrame::OnFilePointfile()
4454 if (g_qeglobals.d_pointfile_display_list)
4460 void MainFrame::OnMru(unsigned int nID)
4462 if (ConfirmModified())
4463 MRU_Activate (nID - ID_FILE_RECENT1);
4466 void MainFrame::OnFileExit()
4468 if (ConfirmModified())
4470 // stop printing during shutdown
4471 // NOTE: we should cleanly release GL contexts and stuff when exiting
4475 g_qeglobals_gui.d_edit = NULL;
4476 gtk_widget_destroy (m_pWidget);
4480 void MainFrame::OnFileCheckUpdate()
4485 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4487 URL += "&OS_dlup=1";
4489 URL += "&OS_dlup=2";
4491 URL += "&Version_dlup=" RADIANT_VERSION;
4492 g_PrefsDlg.mGamesDialog.AddPacksURL(URL);
4493 OpenURL(URL.GetBuffer());
4496 void MainFrame::OnEditUndo()
4501 void MainFrame::OnEditRedo()
4506 void MainFrame::OnEditCopybrush()
4511 void MainFrame::OnEditPastebrush()
4515 Undo_Start("paste");
4519 Undo_EndBrushList(&selected_brushes);
4523 void MainFrame::OnEditPastebrushToCamera()
4528 vec3_t mid, camorigin, delta;
4530 ActiveXY()->Paste();
4532 // Work out the delta
4533 Select_GetMid( mid );
4535 // Snap camera origin to grid
4536 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4537 camorigin[0] = floor(camorigin[0] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4538 camorigin[1] = floor(camorigin[1] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4539 camorigin[2] = floor(camorigin[2] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4541 VectorSubtract( camorigin, mid, delta );
4544 Select_Move( delta, false );
4546 Undo_Start("paste to camera");
4547 Undo_EndBrushList(&selected_brushes);
4552 void MainFrame::OnSelectionDelete()
4556 // ActiveXY()->UndoCopy();
4557 Undo_Start("delete");
4558 Undo_AddBrushList(&selected_brushes);
4559 //add all deleted entities to the undo
4560 for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next)
4562 Undo_AddEntity(brush->owner);
4564 // NOTE: Select_Delete does NOT delete entities
4566 Undo_EndBrushList(&selected_brushes);
4570 void MainFrame::OnEditMapinfo()
4575 void MainFrame::OnEditEntityinfo()
4580 void MainFrame::OnBrushScripts()
4585 void MainFrame::OnEditLoadprefab()
4587 const char *filename;
4590 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4592 CurPath = g_PrefsDlg.m_strPrefabPath;
4596 filename = file_dialog (m_pWidget, TRUE, _("Import Prefab"), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/");
4598 if (filename != NULL)
4600 Map_ImportFile(filename);
4604 void MainFrame::OnEditSaveprefab()
4606 const char *filename;
4609 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4611 CurPath = g_PrefsDlg.m_strPrefabPath;
4615 getcwd (tmp, PATH_MAX);
4620 filename = file_dialog (m_pWidget, FALSE, _("Export Prefab"), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/");
4621 if (filename != NULL)
4623 Map_SaveSelected(filename);
4627 void MainFrame::OnPrefs()
4629 int nView = g_PrefsDlg.m_nView;
4630 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4631 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4632 int nShader = g_PrefsDlg.m_nShader;
4633 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4634 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4635 g_PrefsDlg.LoadPrefs();
4637 if (g_PrefsDlg.DoModal() == IDOK)
4639 if ((g_PrefsDlg.m_nLatchedView != nView) ||
4640 (g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus) ||
4641 (g_PrefsDlg.m_bLatchedWideToolbar != bToolbar) ||
4642 (g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar) ||
4643 (g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar) ||
4644 (g_PrefsDlg.m_nLatchedShader != nShader) ||
4645 (g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality)
4646 || (g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ)
4648 gtk_MessageBox(m_pWidget, _("You must restart Radiant for the changes to take effect."));
4650 // if the view mode was switched to floating, set the Z window on by default
4651 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4652 // (and we simply hope there will be a SavePrefs before we die)
4653 if ((g_PrefsDlg.m_nView != nView) && ((EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating))
4655 g_PrefsDlg.m_bZVis = true;
4659 m_pTexWnd->UpdatePrefs();
4661 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
4662 g_bIgnoreCommands++;
4663 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
4664 (g_PrefsDlg.m_bSnap) ? TRUE : FALSE);
4665 g_bIgnoreCommands--;
4669 void MainFrame::OnTogglecamera()
4671 if (CurrentStyle() == eFloating) // floating views
4673 if (m_pCamWnd && m_pCamWnd->m_pParent)
4675 if (GTK_WIDGET_VISIBLE (m_pCamWnd->m_pParent))
4676 widget_delete_hide (m_pCamWnd->m_pParent);
4678 gtk_widget_show (m_pCamWnd->m_pParent);
4682 if (GTK_WIDGET_VISIBLE (m_pCamWnd->GetWidget ()))
4683 gtk_widget_hide (m_pCamWnd->GetWidget ());
4685 gtk_widget_show (m_pCamWnd->GetWidget ());
4689 void MainFrame::OnToggleconsole()
4691 if (FloatingGroupDialog()) // QE4 style
4693 if (inspector_mode == W_CONSOLE)
4695 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4696 widget_delete_hide (g_qeglobals_gui.d_entity);
4698 gtk_widget_show (g_qeglobals_gui.d_entity);
4701 gtk_widget_show (g_qeglobals_gui.d_entity);
4702 SetInspectorMode(W_CONSOLE);
4707 // trigger the entity inspector on/off
4708 void MainFrame::OnViewEntity()
4710 // make sure we're working with the current selection (bugzilla #436)
4711 if( ! GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4714 if (!FloatingGroupDialog())
4716 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_ENTITY)
4717 widget_delete_hide (g_qeglobals_gui.d_entity);
4720 gtk_widget_show (g_qeglobals_gui.d_entity);
4721 SetInspectorMode(W_ENTITY);
4725 if (inspector_mode == W_ENTITY)
4727 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4728 widget_delete_hide (g_qeglobals_gui.d_entity);
4730 gtk_widget_show (g_qeglobals_gui.d_entity);
4733 gtk_widget_show (g_qeglobals_gui.d_entity);
4734 SetInspectorMode(W_ENTITY);
4739 void MainFrame::OnViewGroups()
4741 if (!FloatingGroupDialog())
4743 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_GROUP)
4744 widget_delete_hide (g_qeglobals_gui.d_entity);
4747 gtk_widget_show (g_qeglobals_gui.d_entity);
4748 SetInspectorMode(W_GROUP);
4752 if (inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating)
4754 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4755 widget_delete_hide (g_qeglobals_gui.d_entity);
4757 gtk_widget_show (g_qeglobals_gui.d_entity);
4760 gtk_widget_show (g_qeglobals_gui.d_entity);
4761 SetInspectorMode(W_GROUP);
4766 void MainFrame::OnToggleview()
4768 if (CurrentStyle() == eFloating) // QE4 style
4770 if (m_pXYWnd && m_pXYWnd->m_pParent)
4772 if (GTK_WIDGET_VISIBLE (m_pXYWnd->m_pParent))
4773 widget_delete_hide (m_pXYWnd->m_pParent);
4775 gtk_widget_show (m_pXYWnd->m_pParent);
4780 void MainFrame::OnToggleviewXz()
4782 if (CurrentStyle() == eFloating) // QE4 style
4784 if (m_pXZWnd && m_pXZWnd->m_pParent)
4786 // get windowplacement doesn't actually save this so we will here
4787 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE (m_pXZWnd->m_pParent);
4788 if (g_PrefsDlg.m_bXZVis)
4789 widget_delete_hide (m_pXZWnd->m_pParent);
4791 gtk_widget_show (m_pXZWnd->m_pParent);
4792 g_PrefsDlg.m_bXZVis ^= 1;
4793 g_PrefsDlg.SavePrefs ();
4798 void MainFrame::OnToggleviewYz()
4800 if (CurrentStyle() == eFloating) // QE4 style
4802 if (m_pYZWnd && m_pYZWnd->m_pParent)
4804 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE (m_pYZWnd->m_pParent);
4805 if (g_PrefsDlg.m_bYZVis)
4806 widget_delete_hide (m_pYZWnd->m_pParent);
4808 gtk_widget_show (m_pYZWnd->m_pParent);
4809 g_PrefsDlg.m_bYZVis ^= 1;
4810 g_PrefsDlg.SavePrefs ();
4815 void MainFrame::OnTogglez()
4817 if ( g_pParentWnd->FloatingGroupDialog() ) // QE4 style
4819 if (m_pZWnd && m_pZWnd->m_pParent)
4821 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
4822 widget_delete_hide (m_pZWnd->m_pParent);
4824 gtk_widget_show (m_pZWnd->m_pParent);
4825 g_PrefsDlg.m_bZVis ^= 1;
4826 g_PrefsDlg.SavePrefs ();
4829 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4833 void MainFrame::OnViewCenter()
4835 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4836 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor((m_pCamWnd->Camera()->angles[YAW]+11)/22.5);
4837 Sys_UpdateWindows (W_CAMERA | W_XY_OVERLAY);
4840 void MainFrame::OnViewUpfloor()
4842 m_pCamWnd->Cam_ChangeFloor (true);
4845 void MainFrame::OnViewDownfloor()
4847 m_pCamWnd->Cam_ChangeFloor (false);
4850 void MainFrame::OnViewCenterview()
4852 if(CurrentStyle() == eSplit)
4854 GetXYWnd()->PositionView();
4855 GetXZWnd()->PositionView();
4856 GetYZWnd()->PositionView();
4857 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4860 m_pXYWnd->PositionView();
4861 Sys_UpdateWindows (W_XY);
4865 void MainFrame::OnViewNextview()
4867 if (CurrentStyle() == eSplit)
4869 GetXYWnd()->PositionView();
4870 GetXZWnd()->PositionView();
4871 GetYZWnd()->PositionView();
4872 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4875 if (m_pXYWnd->GetViewType() == XY)
4876 m_pXYWnd->SetViewType(XZ);
4878 if (m_pXYWnd->GetViewType() == XZ)
4879 m_pXYWnd->SetViewType(YZ);
4881 m_pXYWnd->SetViewType(XY);
4882 m_pXYWnd->PositionView();
4883 Sys_UpdateWindows (W_XY);
4887 void MainFrame::OnViewXy()
4889 if(!FloatingGroupDialog())
4891 m_pXYWnd->SetViewType(XY);
4892 m_pXYWnd->PositionView();
4894 Sys_UpdateWindows (W_XY);
4897 void MainFrame::OnViewSide()
4899 if (!FloatingGroupDialog())
4901 m_pXYWnd->SetViewType(XZ);
4902 m_pXYWnd->PositionView();
4904 Sys_UpdateWindows (W_XY);
4907 void MainFrame::OnViewFront()
4909 if (!FloatingGroupDialog())
4911 m_pXYWnd->SetViewType(YZ);
4912 m_pXYWnd->PositionView();
4914 Sys_UpdateWindows (W_XY);
4917 void MainFrame::OnView100()
4920 m_pXYWnd->SetScale(1);
4922 m_pXZWnd->SetScale(1);
4924 m_pYZWnd->SetScale(1);
4925 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4928 void MainFrame::OnViewZoomin()
4930 if (m_pXYWnd && m_pXYWnd->Active())
4932 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 5.0 / 4);
4933 if (m_pXYWnd->Scale() > 30)
4934 m_pXYWnd->SetScale(30);
4937 if (m_pXZWnd && m_pXZWnd->Active())
4939 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 5.0 / 4);
4940 if (m_pXZWnd->Scale() > 30)
4941 m_pXZWnd->SetScale(30);
4944 if (m_pYZWnd && m_pYZWnd->Active())
4946 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 5.0 / 4);
4947 if (m_pYZWnd->Scale() > 30)
4948 m_pYZWnd->SetScale(30);
4951 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4954 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4955 // we don't go below a zoom factor corresponding to 10% of the max world size
4956 // (this has to be computed against the window size)
4957 void MainFrame::OnViewZoomout()
4960 if (m_pXYWnd && m_pXYWnd->Active())
4962 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 4.0 / 5);
4963 min_scale = MIN(m_pXYWnd->Width(),m_pXYWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4964 if (m_pXYWnd->Scale() < min_scale) m_pXYWnd->SetScale (min_scale);
4967 if (m_pXZWnd && m_pXZWnd->Active())
4969 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 4.0 / 5);
4970 min_scale = MIN(m_pXZWnd->Width(),m_pXZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4971 if (m_pXZWnd->Scale() < min_scale) m_pXZWnd->SetScale (min_scale);
4974 if (m_pYZWnd && m_pYZWnd->Active())
4976 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 4.0 / 5);
4977 min_scale = MIN(m_pYZWnd->Width(),m_pYZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4978 if (m_pYZWnd->Scale() < min_scale) m_pYZWnd->SetScale (min_scale);
4980 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4983 void MainFrame::OnViewZ100()
4986 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4989 void MainFrame::OnViewZzoomin()
4994 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4997 void MainFrame::OnViewZzoomout()
5000 if (z.scale < 0.125)
5002 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
5005 void MainFrame::OnViewCubein()
5007 g_PrefsDlg.m_nCubicScale--;
5008 if (g_PrefsDlg.m_nCubicScale < 1)
5009 g_PrefsDlg.m_nCubicScale = 1;
5010 g_PrefsDlg.SavePrefs ();
5011 Sys_UpdateWindows(W_CAMERA);
5015 void MainFrame::OnViewCubeout()
5017 g_PrefsDlg.m_nCubicScale++;
5018 if (g_PrefsDlg.m_nCubicScale > 22)
5019 g_PrefsDlg.m_nCubicScale = 22;
5020 g_PrefsDlg.SavePrefs ();
5021 Sys_UpdateWindows(W_CAMERA);
5025 void MainFrame::OnViewShownames()
5027 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
5028 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
5029 g_bIgnoreCommands++;
5030 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5031 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE);
5032 g_bIgnoreCommands--;
5033 Sys_UpdateWindows (W_XY);
5036 void MainFrame::OnViewShowAngles()
5038 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
5039 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
5040 g_bIgnoreCommands++;
5041 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5042 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE);
5043 g_bIgnoreCommands--;
5044 Sys_UpdateWindows (W_XY);
5047 void MainFrame::OnViewShowblocks()
5049 g_qeglobals.show_blocks ^= 1;
5050 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showblocks"));
5051 g_bIgnoreCommands++;
5052 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.show_blocks ? TRUE : FALSE);
5053 g_bIgnoreCommands--;
5054 Sys_UpdateWindows (W_XY);
5057 void MainFrame::OnViewShowcoordinates()
5059 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
5060 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
5061 g_bIgnoreCommands++;
5062 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5063 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE);
5064 g_bIgnoreCommands--;
5065 Sys_UpdateWindows (W_XY|W_Z);
5068 void MainFrame::OnViewShowOutline()
5070 g_qeglobals.d_savedinfo.show_outline ^= 1;
5071 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
5072 g_bIgnoreCommands++;
5073 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5074 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE);
5075 g_bIgnoreCommands--;
5076 Sys_UpdateWindows (W_XY);
5079 void MainFrame::OnViewShowAxes()
5081 g_qeglobals.d_savedinfo.show_axis ^= 1;
5082 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
5083 g_bIgnoreCommands++;
5084 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5085 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE);
5086 g_bIgnoreCommands--;
5087 Sys_UpdateWindows (W_XY);
5090 void MainFrame::OnViewShowWorkzone()
5092 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showworkzone"));
5093 g_bIgnoreCommands++;
5094 if (g_qeglobals.d_show_work)
5096 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
5097 g_qeglobals.d_show_work = false;
5100 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5101 g_qeglobals.d_show_work = true;
5103 g_bIgnoreCommands--;
5104 Sys_UpdateWindows (W_XY);
5107 void MainFrame::OnViewHideshowHideselected()
5113 void MainFrame::OnViewHideshowShowhidden()
5115 Select_ShowAllHidden();
5119 sets the view mode for the entities
5120 called upon LoadPrefs too
5121 NOTE TTimo previous implementation had a SavePrefs call
5122 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5123 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5124 (otherwise we are always called following user action on the widget)
5126 void MainFrame::OnEntitiesSetViewAs(int mode)
5128 gpointer item = NULL;
5131 switch (g_PrefsDlg.m_nEntityShowState)
5134 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5137 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5139 case ENTITY_SELECTED:
5140 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5142 case ENTITY_SELECTED_SKIN:
5143 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5145 case ENTITY_SKINNED:
5146 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5148 case ENTITY_SKINNED_BOXED:
5149 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5152 g_bIgnoreCommands++;
5153 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5154 g_bIgnoreCommands--;
5160 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5161 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5162 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5164 case ID_VIEW_ENTITIESAS_WIREFRAME:
5165 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5166 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5168 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5169 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5170 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5172 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5173 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5174 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5176 case ID_VIEW_ENTITIESAS_SKINNED:
5177 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5178 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5180 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5181 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5182 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5185 Sys_FPrintf(SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n");
5191 Sys_FPrintf(SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n");
5195 g_bIgnoreCommands++;
5196 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5197 g_bIgnoreCommands--;
5199 Sys_UpdateWindows(W_ALL);
5202 void MainFrame::OnViewCubicclipping()
5206 g_PrefsDlg.m_bCubicClipping ^= 1;
5207 g_bIgnoreCommands++;
5208 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
5209 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5210 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
5211 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5212 g_bIgnoreCommands--;
5213 g_PrefsDlg.SavePrefs ();
5214 //Map_BuildBrushData ();
5215 Sys_UpdateWindows(W_CAMERA);
5218 void MainFrame::OnViewOpengllighting()
5220 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
5221 g_PrefsDlg.m_bGLLighting ^= 1;
5222 g_PrefsDlg.SavePrefs ();
5223 g_bIgnoreCommands++;
5224 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE);
5225 Sys_UpdateWindows (W_XY|W_CAMERA);
5226 g_bIgnoreCommands--;
5229 void MainFrame::OnSelectionDragedges()
5231 if (g_qeglobals.d_select_mode == sel_edge)
5233 g_qeglobals.d_select_mode = sel_brush;
5234 Sys_UpdateWindows (W_ALL);
5237 SetupVertexSelection ();
5238 if (g_qeglobals.d_numpoints)
5239 g_qeglobals.d_select_mode = sel_edge;
5240 Sys_UpdateWindows (W_ALL);
5244 void MainFrame::OnSelectionDragvertecies()
5246 if (g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint)
5248 g_qeglobals.d_select_mode = sel_brush;
5249 Sys_UpdateWindows (W_ALL);
5252 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5253 if (OnlyPatchesSelected())
5256 } else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5258 SetupVertexSelection ();
5259 if (g_qeglobals.d_numpoints)
5260 g_qeglobals.d_select_mode = sel_vertex;
5262 Sys_UpdateWindows (W_ALL);
5266 void MainFrame::OnSelectionClone()
5271 // called when the escape key is used (either on the main window or on an inspector)
5272 void MainFrame::OnSelectionDeselect()
5278 OnSelectMouserotate();
5281 OnSelectMousescale();
5286 ActiveXY()->KillPathMode();
5289 if (g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0)
5291 g_qeglobals.d_num_move_points = 0;
5292 Sys_UpdateWindows(W_ALL);
5296 SetStatusText(2, " ");
5301 void MainFrame::OnBrushFlipx()
5303 Undo_Start("flip X");
5304 Undo_AddBrushList(&selected_brushes);
5306 Select_FlipAxis (0);
5307 // spog - this does not work - it's a rotate not a flip
5309 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5311 if(b->owner->eclass->fixedsize)
5314 float a = FloatForKey(b->owner, "angle");
5315 a = div ((int)(180 - a), 180).rem;
5316 sprintf (buf, "%d", (int)a);
5317 SetKeyValue(b->owner, "angle", buf);
5318 Brush_Build(b,true,true,false,false); // don't filter
5322 Undo_EndBrushList(&selected_brushes);
5326 void MainFrame::OnBrushFlipy()
5328 Undo_Start("flip Y");
5329 Undo_AddBrushList(&selected_brushes);
5331 Select_FlipAxis (1);
5332 // spog - this does not work - it's a rotate not a flip
5334 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5336 if(b->owner->eclass->fixedsize)
5338 float a = FloatForKey(b->owner, "angle");
5339 if (a == 0 || a == 180 || a == 360)
5341 if ( a == 90 || a == 270)
5355 sprintf (buf, "%d", (int)a);
5356 SetKeyValue(b->owner, "angle", buf);
5357 Brush_Build(b,true,true,false,false); // don't filter
5362 Undo_EndBrushList(&selected_brushes);
5366 void MainFrame::OnBrushFlipz()
5368 Undo_Start("flip Z");
5369 Undo_AddBrushList(&selected_brushes);
5370 Select_FlipAxis (2);
5371 Undo_EndBrushList(&selected_brushes);
5375 void MainFrame::OnBrushRotatex()
5377 Undo_Start("rotate X");
5378 Undo_AddBrushList(&selected_brushes);
5379 Select_RotateAxis (0, 90);
5380 Undo_EndBrushList(&selected_brushes);
5384 void MainFrame::OnBrushRotatey()
5386 Undo_Start("rotate Y");
5387 Undo_AddBrushList(&selected_brushes);
5388 Select_RotateAxis (1, 90);
5389 Undo_EndBrushList(&selected_brushes);
5393 void MainFrame::OnBrushRotatez()
5395 Undo_Start("rotate Z");
5396 Undo_AddBrushList(&selected_brushes);
5397 Select_RotateAxis (2, 90);
5398 Undo_EndBrushList(&selected_brushes);
5402 void MainFrame::OnSelectionArbitraryrotation()
5404 Undo_Start("arbitrary rotation");
5405 Undo_AddBrushList(&selected_brushes);
5409 Undo_EndBrushList(&selected_brushes);
5413 void MainFrame::OnSelectScale()
5415 Undo_Start("scale");
5416 Undo_AddBrushList(&selected_brushes);
5418 Undo_EndBrushList(&selected_brushes);
5422 void MainFrame::OnSelectionMakehollow()
5425 // ActiveXY()->UndoCopy();
5426 Undo_Start("hollow");
5427 Undo_AddBrushList(&selected_brushes);
5429 Undo_EndBrushList(&selected_brushes);
5433 void MainFrame::OnSelectionCsgsubtract()
5435 Undo_Start("CSG subtract");
5440 void MainFrame::OnSelectionCsgmerge()
5442 Undo_Start("CSG merge");
5443 Undo_AddBrushList(&selected_brushes);
5445 Undo_EndBrushList(&selected_brushes);
5449 void MainFrame::OnSelectionNoOutline()
5451 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5452 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) ^ OUTLINE_ZBUF;
5453 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5454 g_bIgnoreCommands++;
5455 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5456 g_bIgnoreCommands--;
5457 Sys_UpdateWindows (W_CAMERA);
5460 void MainFrame::OnSelectionOutlineStyle()
5462 if ((g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) && (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL))
5463 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5464 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL)
5465 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5466 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF)
5467 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5469 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5470 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5471 g_bIgnoreCommands++;
5472 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5473 g_bIgnoreCommands--;
5474 Sys_UpdateWindows (W_CAMERA);
5477 void MainFrame::OnSelectionSelectcompletetall()
5480 ActiveXY()->UndoCopy();
5481 Select_CompleteTall ();
5484 void MainFrame::OnSelectionSelecttouching()
5489 void MainFrame::OnSelectionSelectpartialtall()
5491 Select_PartialTall();
5494 void MainFrame::OnSelectionSelectinside()
5499 void MainFrame::OnViewClipper()
5501 GtkWidget *w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_clipper"));
5502 g_bIgnoreCommands++;
5506 if (ActiveXY()->ClipMode())
5508 ActiveXY()->SetClipMode(false);
5509 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), FALSE);
5512 if (ActiveXY()->RotateMode())
5513 OnSelectMouserotate();
5514 ActiveXY()->SetClipMode(true);
5515 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
5518 g_bIgnoreCommands--;
5521 void MainFrame::OnClipSelected()
5523 if (m_pActiveXY && m_pActiveXY->ClipMode())
5525 Undo_Start("clip selected");
5526 Undo_AddBrushList(&selected_brushes);
5527 m_pActiveXY->Clip();
5528 Undo_EndBrushList(&selected_brushes);
5532 if (g_bPatchBendMode)
5533 Patch_BendHandleENTER();
5534 // else if (g_bPatchBendMode)
5535 // Patch_InsDelHandleENTER();
5539 void MainFrame::OnSplitSelected()
5543 Undo_Start("split selected");
5544 Undo_AddBrushList(&selected_brushes);
5545 m_pActiveXY->SplitClip();
5546 Undo_EndBrushList(&selected_brushes);
5551 void MainFrame::OnFlipClip()
5554 m_pActiveXY->FlipClip();
5557 void MainFrame::OnSelectionConnect()
5559 Undo_Start("connect selected entities");
5560 Undo_AddBrushList(&selected_brushes);
5562 Undo_EndBrushList(&selected_brushes);
5566 void MainFrame::OnSelectionUngroupentity()
5568 Undo_Start("ungroup selected entities");
5569 Undo_AddBrushList(&selected_brushes);
5571 Undo_EndBrushList(&selected_brushes);
5575 void MainFrame::OnSelectionMergeentity()
5577 Undo_Start("merge entity");
5578 Undo_AddBrushList(&selected_brushes);
5579 Select_MergeEntity();
5580 Undo_EndBrushList(&selected_brushes);
5584 void MainFrame::OnSelectionGroupworld()
5586 Undo_Start("group world");
5587 Undo_AddBrushList(&selected_brushes);
5588 Select_GroupEntity(world_entity);
5589 Undo_EndBrushList(&selected_brushes);
5593 void MainFrame::OnSelectionMakeDetail()
5595 Undo_Start("make detail");
5596 Undo_AddBrushList(&selected_brushes);
5597 Select_MakeDetail ();
5598 Undo_EndBrushList(&selected_brushes);
5602 void MainFrame::OnSelectionMakeStructural()
5604 Undo_Start("make structural");
5605 Undo_AddBrushList(&selected_brushes);
5606 Select_MakeStructural ();
5607 Undo_EndBrushList(&selected_brushes);
5611 void MainFrame::OnBspCommand (unsigned int nID)
5613 // make sure we don't attempt to region compile a map with the camera outside the region
5618 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5619 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5620 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2]);
5623 for (i=0 ; i<3 ; i++)
5625 if (vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i])
5627 Sys_FPrintf(SYS_ERR, "The camera must be in the region to start a region compile.\n");
5633 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5634 if (stricmp( currentmap, "unnamed.map") == 0)
5639 if (g_PrefsDlg.m_bSnapShots && (stricmp (currentmap, "unnamed.map") != 0))
5642 if (g_qeglobals.bBSPFrontendPlugin)
5644 char *cmd = (char*)g_slist_nth_data (g_BSPFrontendCommands, nID-CMD_BSPCOMMAND);
5645 g_BSPFrontendTable.m_pfnDispatchBSPCommand (cmd);
5648 RunBsp (bsp_commands[nID-CMD_BSPCOMMAND]);
5652 void MainFrame::OnGrid (unsigned int nID)
5654 if (nID == ID_GRID_025)
5656 g_qeglobals.d_gridsize = 0.25f;
5657 g_qeglobals.d_bSmallGrid = true;
5658 } else if (nID == ID_GRID_05)
5660 g_qeglobals.d_gridsize = 0.5f;
5661 g_qeglobals.d_bSmallGrid = true;
5666 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5667 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5668 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5669 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5670 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5671 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5672 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5673 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5674 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5676 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5677 g_qeglobals.d_bSmallGrid = false;
5682 // SnapTToGrid option: need to check everywhere the grid size is changed
5683 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5684 if (g_PrefsDlg.m_bSnapTToGrid)
5687 Sys_UpdateWindows (W_XY|W_Z);
5690 void MainFrame::OnSnaptogrid()
5692 g_PrefsDlg.m_bSnap ^= 1;
5693 g_PrefsDlg.SavePrefs ();
5695 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
5696 g_bIgnoreCommands++;
5697 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bSnap ? TRUE : FALSE);
5698 g_bIgnoreCommands--;
5701 void MainFrame::OnTexturesShowinuse()
5704 Texture_ShowInuse ();
5706 if (!g_bShowAllShaders)
5707 Sys_Printf("Already showing only in-use textures.\n");
5709 Sys_UpdateWindows( W_TEXTURE );
5713 void MainFrame::OnTexturesShowall()
5718 // do some triggering on/off, if the inspector is already up then hide it
5719 void MainFrame::OnTexturesInspector()
5724 void MainFrame::OnViewNearest(unsigned int nID)
5726 Texture_SetMode(nID);
5729 void MainFrame::OnTextureReplaceall()
5731 FindTextureDialog::show();
5734 void MainFrame::OnToggleLock()
5736 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5738 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
5739 g_bIgnoreCommands++;
5740 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE);
5741 g_bIgnoreCommands--;
5742 g_PrefsDlg.SavePrefs ();
5746 void MainFrame::OnToggleRotatelock()
5748 g_PrefsDlg.m_bRotateLock ^= 1;
5750 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
5751 g_bIgnoreCommands++;
5752 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE);
5753 g_bIgnoreCommands--;
5754 g_PrefsDlg.SavePrefs ();
5758 // use a dialog for direct selection of a texture menu
5759 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5760 void MainFrame::OnTexturesLoad()
5762 char def_path[NAME_MAX];
5765 // check if that works with fs_game (I suspect some more design is needed)
5766 // see how this is done in 1.2?
5767 strcpy (def_path, g_pGameDescription->mEnginePath.GetBuffer());
5768 strcat (def_path, g_pGameDescription->mBaseGame.GetBuffer());
5769 strcat (def_path, "/");
5771 char *dir = dir_dialog (m_pWidget, _("Load textures from path"), def_path);
5775 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5776 Sys_Printf("user select: '%s'\n", dir);
5777 // remove a potential trailing slash?
5778 if (dir[strlen(dir)-1]=='/' || dir[strlen(dir)-1]=='\\')
5779 dir[strlen(dir)-1] = '\0';
5780 char *pouic = MAX(strrchr(dir, '/'),strrchr(dir, '\\'));
5783 strcpy(texture_directory, pouic+1);
5784 Sys_Printf("Loading '%s'\n", texture_directory);
5785 Texture_ShowDirectory();
5788 Sys_FPrintf(SYS_WRN, "Failed to extract the directory\n");
5792 Sys_FPrintf(SYS_WRN, "texture load dialog cancelled\n");
5795 void MainFrame::OnTexturesReloadshaders()
5798 QERApp_ReloadShaders();
5800 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5801 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
5802 Sys_UpdateWindows (W_ALL);
5806 void MainFrame::OnTexturesShadersShow()
5808 g_PrefsDlg.m_bShowShaders ^= 1;
5809 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
5810 g_bIgnoreCommands++;
5811 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
5812 g_bIgnoreCommands--;
5813 Sys_UpdateWindows(W_TEXTURE);
5816 void MainFrame::SetTextureScale(int id)
5822 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5823 g_PrefsDlg.m_nTextureScale = 10;
5824 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_10"));
5826 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5827 g_PrefsDlg.m_nTextureScale = 25;
5828 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_25"));
5830 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5831 g_PrefsDlg.m_nTextureScale = 50;
5832 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_50"));
5834 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5835 g_PrefsDlg.m_nTextureScale = 200;
5836 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_200"));
5839 g_PrefsDlg.m_nTextureScale = 100;
5840 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_100"));
5844 g_bIgnoreCommands++;
5845 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5846 g_bIgnoreCommands--;
5848 Texture_ResetPosition();
5851 void MainFrame::OnTexturewindowScaleup()
5853 switch(g_PrefsDlg.m_nTextureScale) {
5854 // 200, all the way in, don't do anything
5856 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_200);
5859 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5862 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5865 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5870 void MainFrame::OnTexturewindowScaledown()
5872 switch(g_PrefsDlg.m_nTextureScale) {
5874 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5877 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5880 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5883 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_10);
5885 // 10, all the way out, don't do anything
5889 void MainFrame::OnTexturesLoadlist()
5891 DoTextureListDlg ();
5894 void MainFrame::OnTexturesShaderlistonly()
5896 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5897 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget),"menu_textures_shaderlistonly"));
5898 g_bIgnoreCommands++;
5899 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
5900 g_bIgnoreCommands--;
5904 void MainFrame::OnTextureWad(unsigned int nID)
5907 Texture_ShowDirectory (nID);
5908 Sys_UpdateWindows (W_ALL);
5912 void MainFrame::OnMiscBenchmark()
5914 m_pCamWnd->BenchMark();
5917 void MainFrame::OnColorSetoriginal()
5919 for (int i=0 ; i<3 ; i++)
5921 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5922 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5923 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5924 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5925 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5929 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5930 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5931 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5933 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5935 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5938 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5939 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5942 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5943 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5946 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5947 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5948 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5950 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5951 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5952 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5954 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5955 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5958 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5960 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5962 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5963 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5964 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5966 Sys_UpdateWindows (W_ALL);
5969 void MainFrame::OnColorSetqer()
5971 for (int i=0 ; i<3 ; i++)
5973 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5974 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5975 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5976 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5977 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5980 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5981 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5982 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5984 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5985 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5986 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5988 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5989 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5990 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5992 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5993 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5994 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5996 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5997 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5998 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6000 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6001 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6002 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6004 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6005 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6006 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6008 Sys_UpdateWindows (W_ALL);
6011 void MainFrame::OnColorSetblack()
6013 for (int i=0 ; i<3 ; i++)
6015 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6016 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
6017 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
6018 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6021 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
6022 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
6023 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
6025 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
6026 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
6027 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6029 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
6030 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
6031 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
6033 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6034 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6035 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6037 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6038 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6039 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6041 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
6042 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
6043 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
6045 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
6046 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
6047 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
6049 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6050 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6051 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6053 Sys_UpdateWindows (W_ALL);
6056 /* ydnar: to emulate maya/max/lightwave color schemes */
6057 void MainFrame::OnColorSetydnar()
6059 for (int i=0 ; i<3 ; i++)
6061 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6062 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
6063 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
6064 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
6065 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6068 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
6069 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
6070 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6072 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
6073 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
6074 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
6076 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6077 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6078 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6080 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6081 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6082 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6084 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6085 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6086 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6088 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6089 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6090 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6092 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6093 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6094 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6096 Sys_UpdateWindows (W_ALL);
6099 void MainFrame::OnTexturebk()
6101 DoColor(COLOR_TEXTUREBACK);
6102 Sys_UpdateWindows (W_ALL);
6105 void MainFrame::OnColorsXybk()
6107 DoColor(COLOR_GRIDBACK);
6108 Sys_UpdateWindows (W_ALL);
6111 void MainFrame::OnColorsMajor()
6113 DoColor(COLOR_GRIDMAJOR);
6114 Sys_UpdateWindows (W_ALL);
6117 void MainFrame::OnColorsMinor()
6119 DoColor(COLOR_GRIDMINOR);
6120 Sys_UpdateWindows (W_ALL);
6123 void MainFrame::OnColorsMajor_Alt()
6125 DoColor(COLOR_GRIDMAJOR_ALT);
6126 Sys_UpdateWindows (W_ALL);
6129 void MainFrame::OnColorsMinor_Alt()
6131 DoColor(COLOR_GRIDMINOR_ALT);
6132 Sys_UpdateWindows (W_ALL);
6135 void MainFrame::OnColorsGridtext()
6137 DoColor(COLOR_GRIDTEXT);
6138 Sys_UpdateWindows (W_ALL);
6141 void MainFrame::OnColorsGridblock()
6143 DoColor(COLOR_GRIDBLOCK);
6144 Sys_UpdateWindows (W_ALL);
6147 void MainFrame::OnColorsCameraBack()
6149 DoColor(COLOR_CAMERABACK);
6150 Sys_UpdateWindows (W_ALL);
6153 void MainFrame::OnColorsBrush()
6155 DoColor(COLOR_BRUSHES);
6156 Sys_UpdateWindows (W_ALL);
6159 void MainFrame::OnColorsSelectedbrush()
6161 DoColor(COLOR_SELBRUSHES);
6162 Sys_UpdateWindows (W_ALL);
6165 void MainFrame::OnColorsSelectedbrush3D()
6167 DoColor(COLOR_SELBRUSHES3D);
6168 Sys_UpdateWindows (W_ALL);
6171 void MainFrame::OnColorsClipper()
6173 DoColor(COLOR_CLIPPER);
6174 Sys_UpdateWindows (W_ALL);
6177 void MainFrame::OnColorsViewname()
6179 DoColor(COLOR_VIEWNAME);
6180 Sys_UpdateWindows (W_ALL);
6183 void MainFrame::OnMiscGamma()
6185 float fSave = g_qeglobals.d_savedinfo.fGamma;
6187 if (fSave != g_qeglobals.d_savedinfo.fGamma)
6189 gtk_MessageBox(m_pWidget, _("You must restart Radiant for Gamma settings to take effect."));
6192 void MainFrame::OnMiscFindbrush()
6197 void MainFrame::OnMiscNextleakspot()
6202 void MainFrame::OnMiscPreviousleakspot()
6207 void MainFrame::OnMiscPrintxy()
6212 void MainFrame::OnMiscSelectentitycolor()
6216 CString strColor = ValueForKey(edit_entity, "_color");
6217 if (strColor.GetLength() > 0)
6220 int n = sscanf(strColor,"%f %f %f", &fR, &fG, &fB);
6223 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6224 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6225 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6229 if (inspector_mode == W_ENTITY && (DoColor(COLOR_ENTITY)))
6232 sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6233 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6234 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
6236 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntValueField]), buffer);
6237 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntKeyField]), "_color");
6239 //DK - SOF change to get color to entity quickly
6240 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6241 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6244 Sys_UpdateWindows( W_ALL );
6248 void MainFrame::OnConvertcurves()
6252 for (brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
6256 for (face_t* f = pb->brush_faces ; f ; f=f->next)
6258 if (f->texdef.contents & CONTENTS_LADDER)
6260 f->texdef.contents &= ~CONTENTS_LADDER;
6261 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6266 Map_BuildBrushData();
6270 void MainFrame::OnRegionOff()
6275 void MainFrame::OnRegionSetxy()
6280 void MainFrame::OnRegionSettallbrush()
6282 Map_RegionTallBrush ();
6285 void MainFrame::OnRegionSetbrush()
6290 void MainFrame::OnRegionSetselection()
6292 Map_RegionSelectedBrushes ();
6295 void MainFrame::OnBrush3sided()
6297 Undo_Start("3 sided");
6298 Undo_AddBrushList(&selected_brushes);
6300 Undo_EndBrushList(&selected_brushes);
6304 void MainFrame::OnBrush4sided()
6306 Undo_Start("4 sided");
6307 Undo_AddBrushList(&selected_brushes);
6309 Undo_EndBrushList(&selected_brushes);
6313 void MainFrame::OnBrush5sided()
6315 Undo_Start("5 sided");
6316 Undo_AddBrushList(&selected_brushes);
6318 Undo_EndBrushList(&selected_brushes);
6322 void MainFrame::OnBrush6sided()
6324 Undo_Start("6 sided");
6325 Undo_AddBrushList(&selected_brushes);
6327 Undo_EndBrushList(&selected_brushes);
6331 void MainFrame::OnBrush7sided()
6333 Undo_Start("7 sided");
6334 Undo_AddBrushList(&selected_brushes);
6336 Undo_EndBrushList(&selected_brushes);
6340 void MainFrame::OnBrush8sided()
6342 Undo_Start("8 sided");
6343 Undo_AddBrushList(&selected_brushes);
6345 Undo_EndBrushList(&selected_brushes);
6349 void MainFrame::OnBrush9sided()
6351 Undo_Start("9 sided");
6352 Undo_AddBrushList(&selected_brushes);
6354 Undo_EndBrushList(&selected_brushes);
6358 void MainFrame::OnBrushArbitrarysided()
6360 Undo_Start("arbitrary sided");
6361 Undo_AddBrushList(&selected_brushes);
6363 Undo_EndBrushList(&selected_brushes);
6367 void MainFrame::OnBrushMakecone()
6369 Undo_Start("make cone");
6370 Undo_AddBrushList(&selected_brushes);
6372 Undo_EndBrushList(&selected_brushes);
6376 void MainFrame::OnBrushPrimitivesSphere()
6378 Undo_Start("make sphere");
6379 Undo_AddBrushList(&selected_brushes);
6381 DoSides(false, true);
6383 Undo_EndBrushList(&selected_brushes);
6387 void MainFrame::OnCurvePatchtube()
6389 Undo_Start("make curve cylinder");
6390 Undo_AddBrushList(&selected_brushes);
6391 Patch_BrushToMesh(false);
6392 Sys_UpdateWindows (W_ALL);
6393 Undo_EndBrushList(&selected_brushes);
6397 void MainFrame::OnCurvePatchdensetube()
6399 Undo_Start("dense cylinder");
6400 Undo_AddBrushList(&selected_brushes);
6402 Patch_BrushToMesh(false);
6403 OnCurveInsertAddrow();
6404 Sys_UpdateWindows (W_ALL);
6406 Undo_EndBrushList(&selected_brushes);
6410 void MainFrame::OnCurvePatchverydensetube()
6412 Undo_Start("very dense cylinder");
6413 Undo_AddBrushList(&selected_brushes);
6415 Patch_BrushToMesh(false);
6416 OnCurveInsertAddrow();
6417 OnCurveInsertInsertrow();
6418 OnCurveInsertAddrow();
6419 Sys_UpdateWindows (W_ALL);
6421 Undo_EndBrushList(&selected_brushes);
6425 void MainFrame::OnCurvePatchsquare()
6427 Undo_Start("square cylinder");
6428 Undo_AddBrushList(&selected_brushes);
6430 Patch_BrushToMesh(false, false, false, true);
6431 Sys_UpdateWindows (W_ALL);
6433 Undo_EndBrushList(&selected_brushes);
6437 void MainFrame::OnCurvePatchendcap()
6439 Undo_Start("make end cap");
6440 Undo_AddBrushList(&selected_brushes);
6441 Patch_BrushToMesh(false, false, true);
6442 Sys_UpdateWindows (W_ALL);
6443 Undo_EndBrushList(&selected_brushes);
6447 void MainFrame::OnCurvePatchbevel()
6449 Undo_Start("make bevel");
6450 Undo_AddBrushList(&selected_brushes);
6451 Patch_BrushToMesh(false, true, false);
6452 Sys_UpdateWindows (W_ALL);
6453 Undo_EndBrushList(&selected_brushes);
6457 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel()
6459 Undo_Start("square bevel");
6460 Undo_AddBrushList(&selected_brushes);
6462 Patch_BrushToMesh(false, true, false, true);
6463 Sys_UpdateWindows (W_ALL);
6465 Undo_EndBrushList(&selected_brushes);
6469 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap()
6471 Undo_Start("square endcap");
6472 Undo_AddBrushList(&selected_brushes);
6474 Patch_BrushToMesh(false, false, true, true);
6475 Sys_UpdateWindows (W_ALL);
6477 Undo_EndBrushList(&selected_brushes);
6481 void MainFrame::OnCurvePatchcone()
6483 Undo_Start("make curve cone");
6484 Undo_AddBrushList(&selected_brushes);
6485 Patch_BrushToMesh(true);
6486 Sys_UpdateWindows (W_ALL);
6487 Undo_EndBrushList(&selected_brushes);
6491 void MainFrame::OnCurveSimplepatchmesh()
6493 Undo_Start("make simpe patch mesh");
6494 Undo_AddBrushList(&selected_brushes);
6496 Undo_EndBrushList(&selected_brushes);
6500 void MainFrame::OnCurveInsertInsertcolumn()
6502 Undo_Start("insert (2) columns");
6503 Undo_AddBrushList(&selected_brushes);
6504 Patch_AdjustSelected(true, true, false);
6505 Sys_UpdateWindows(W_ALL);
6506 Undo_EndBrushList(&selected_brushes);
6510 void MainFrame::OnCurveInsertAddcolumn()
6512 Undo_Start("add (2) columns");
6513 Undo_AddBrushList(&selected_brushes);
6514 Patch_AdjustSelected(true, true, true);
6515 Sys_UpdateWindows(W_ALL);
6516 Undo_EndBrushList(&selected_brushes);
6520 void MainFrame::OnCurveInsertInsertrow()
6522 Undo_Start("insert (2) rows");
6523 Undo_AddBrushList(&selected_brushes);
6524 Patch_AdjustSelected(true, false, false);
6525 Sys_UpdateWindows(W_ALL);
6526 Undo_EndBrushList(&selected_brushes);
6530 void MainFrame::OnCurveInsertAddrow()
6532 Undo_Start("add (2) rows");
6533 Undo_AddBrushList(&selected_brushes);
6534 Patch_AdjustSelected(true, false, true);
6535 Sys_UpdateWindows(W_ALL);
6536 Undo_EndBrushList(&selected_brushes);
6540 void MainFrame::OnCurveDeleteFirstcolumn()
6542 Undo_Start("delete first (2) columns");
6543 Undo_AddBrushList(&selected_brushes);
6544 Patch_AdjustSelected(false, true, true);
6545 Sys_UpdateWindows(W_ALL);
6546 Undo_EndBrushList(&selected_brushes);
6550 void MainFrame::OnCurveDeleteLastcolumn()
6552 Undo_Start("delete last (2) columns");
6553 Undo_AddBrushList(&selected_brushes);
6554 Patch_AdjustSelected(false, true, false);
6555 Sys_UpdateWindows(W_ALL);
6556 Undo_EndBrushList(&selected_brushes);
6560 void MainFrame::OnCurveDeleteFirstrow()
6562 Undo_Start("delete first (2) rows");
6563 Undo_AddBrushList(&selected_brushes);
6564 Patch_AdjustSelected(false, false, true);
6565 Sys_UpdateWindows(W_ALL);
6566 Undo_EndBrushList(&selected_brushes);
6570 void MainFrame::OnCurveDeleteLastrow()
6572 Undo_Start("delete last (2) rows");
6573 Undo_AddBrushList(&selected_brushes);
6574 Patch_AdjustSelected(false, false, false);
6575 Sys_UpdateWindows(W_ALL);
6576 Undo_EndBrushList(&selected_brushes);
6580 void MainFrame::OnCurveNegative()
6582 Patch_ToggleInverted();
6583 //Sys_UpdateWindows(W_ALL);
6586 void MainFrame::OnCurveRedisperseRows()
6588 Undo_Start("redisperse rows");
6589 Undo_AddBrushList(&selected_brushes);
6590 Patch_DisperseRows();
6591 Sys_UpdateWindows (W_ALL);
6592 Undo_EndBrushList(&selected_brushes);
6596 void MainFrame::OnCurveRedisperseIntermediateCols()
6598 Undo_Start("redisperse im cols");
6599 Undo_AddBrushList(&selected_brushes);
6600 Patch_DisperseIntermediateColumns();
6601 Sys_UpdateWindows (W_ALL);
6602 Undo_EndBrushList(&selected_brushes);
6606 void MainFrame::OnCurveRedisperseIntermediateRows()
6608 Undo_Start("redisperse im rows");
6609 Undo_AddBrushList(&selected_brushes);
6610 Patch_DisperseIntermediateRows();
6611 Sys_UpdateWindows (W_ALL);
6612 Undo_EndBrushList(&selected_brushes);
6616 void MainFrame::OnCurveMatrixTranspose()
6619 Sys_UpdateWindows (W_ALL);
6622 void MainFrame::OnCurveCap()
6625 Sys_UpdateWindows (W_ALL);
6628 void MainFrame::OnCurveCyclecap()
6630 Patch_CycleCapSelected();
6631 Sys_UpdateWindows (W_ALL);
6634 void MainFrame::OnCurveOverlaySet()
6636 Patch_SetOverlays();
6637 Sys_UpdateWindows(W_ALL);
6640 void MainFrame::OnCurveOverlayClear()
6642 Patch_ClearOverlays();
6643 Sys_UpdateWindows(W_ALL);
6646 void MainFrame::OnCurveThicken()
6648 Undo_Start("curve thicken");
6649 Undo_AddBrushList(&selected_brushes);
6651 Undo_EndBrushList(&selected_brushes);
6656 this can no longer be trigger manually from the menu
6657 happens only once at startup
6659 void MainFrame::OnPluginsRefresh()
6665 // open the Q3Rad manual
6666 void MainFrame::OnHelp()
6668 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6670 help = g_strAppPath;
6671 help += "Q3Rad_Manual/index.htm";
6672 OpenURL(help.GetBuffer());
6675 // FIXME: we'll go towards a unified help thing soon
6676 void MainFrame::OnHelpLinks()
6679 link = g_strAppPath;
6680 link += "links.htm";
6681 OpenURL(link.GetBuffer());
6684 void MainFrame::OnHelpBugreport()
6686 OpenURL("http://www.qeradiant.com/faq/fom-serve/cache/138.html");
6689 void MainFrame::OnHelpCommandlist()
6691 DoCommandListDlg ();
6694 void MainFrame::OnHelpAbout()
6699 void MainFrame::OnPopupSelection()
6701 GtkWidget *menu, *item;
6702 const gchar *labels[] = { _("Select Complete Tall"), _("Select Touching"), _("Select Partial Tall"), _("Select Inside")};
6703 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6704 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6706 menu = gtk_menu_new ();
6708 for (int i = 0; i < 4; i++)
6710 item = gtk_menu_item_new_with_label (labels[i]);
6711 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (HandleCommand),
6712 GINT_TO_POINTER (ids[i]));
6713 gtk_widget_show (item);
6714 gtk_menu_append (GTK_MENU (menu), item);
6717 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6720 void MainFrame::OnViewChange()
6723 //HandlePopup(this, IDR_POPUP_VIEW);
6726 void MainFrame::OnTexturesPopup()
6728 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "render_quality_menu");
6729 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6732 void MainFrame::ToggleCamera()
6735 m_bCamPreview = false;
6737 m_bCamPreview = true;
6740 void MainFrame::OnViewCameraupdate()
6742 Sys_UpdateWindows(W_CAMERA);
6745 void MainFrame::OnSelectMouserotate()
6747 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mouserotate"));
6748 g_bIgnoreCommands++;
6752 if (ActiveXY()->ClipMode())
6754 if (ActiveXY()->RotateMode())
6756 // SetRotateMode(false) always works
6757 ActiveXY()->SetRotateMode(false);
6758 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6761 // may not work if no brush selected, see return value
6762 if (ActiveXY()->SetRotateMode(true))
6763 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6765 // if MFC called, we need to set back to FALSE ourselves
6766 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6769 g_bIgnoreCommands--;
6772 void MainFrame::OnSelectMousescale()
6774 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mousescale"));
6775 g_bIgnoreCommands++;
6779 if (ActiveXY()->ClipMode())
6781 if (ActiveXY()->RotateMode())
6783 // SetRotateMode(false) always works
6784 ActiveXY()->SetRotateMode(false);
6785 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6787 if (ActiveXY()->ScaleMode())
6789 ActiveXY()->SetScaleMode(false);
6790 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6793 ActiveXY()->SetScaleMode(true);
6794 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6797 g_bIgnoreCommands--;
6800 void MainFrame::OnScalelockx()
6802 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockx"));
6803 g_bIgnoreCommands++;
6805 if (g_nScaleHow & SCALE_X)
6807 g_nScaleHow ^= SCALE_X;
6808 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6811 g_nScaleHow |= SCALE_X;
6812 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6814 g_bIgnoreCommands--;
6817 void MainFrame::OnScalelocky()
6819 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelocky"));
6820 g_bIgnoreCommands++;
6822 if (g_nScaleHow & SCALE_Y)
6824 g_nScaleHow ^= SCALE_Y;
6825 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6828 g_nScaleHow |= SCALE_Y;
6829 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6831 g_bIgnoreCommands--;
6834 void MainFrame::OnScalelockz()
6836 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockz"));
6837 g_bIgnoreCommands++;
6839 if (g_nScaleHow & SCALE_Z)
6841 g_nScaleHow ^= SCALE_Z;
6842 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6845 g_nScaleHow |= SCALE_Z;
6846 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6848 g_bIgnoreCommands--;
6851 void MainFrame::OnDontselectcurve()
6853 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
6854 g_bIgnoreCommands++;
6855 g_PrefsDlg.m_bSelectCurves ^= 1;
6856 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
6857 g_bIgnoreCommands--;
6860 void MainFrame::OnPatchToggleBox()
6862 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
6863 g_bIgnoreCommands++;
6864 g_bPatchShowBounds ^= 1;
6865 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
6866 g_bIgnoreCommands--;
6867 Sys_UpdateWindows(W_ALL);
6870 void MainFrame::OnPatchWireframe()
6872 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_wireframe"));
6873 g_bIgnoreCommands++;
6874 g_bPatchWireFrame ^= 1;
6875 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWireFrame) ? TRUE : FALSE);
6876 g_bIgnoreCommands--;
6877 Sys_UpdateWindows(W_ALL);
6880 void MainFrame::OnPatchBend()
6882 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
6883 g_bIgnoreCommands++;
6885 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
6886 g_bIgnoreCommands--;
6887 Sys_UpdateWindows(W_ALL);
6890 void MainFrame::OnPatchWeld()
6892 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
6893 g_bIgnoreCommands++;
6895 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
6896 g_bIgnoreCommands--;
6897 Sys_UpdateWindows(W_ALL);
6900 void MainFrame::OnPatchDrilldown()
6902 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
6903 g_bIgnoreCommands++;
6904 g_bPatchDrillDown ^= 1;
6905 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
6906 g_bIgnoreCommands--;
6907 Sys_UpdateWindows(W_ALL);
6910 void MainFrame::OnShowEntities()
6912 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "view_entitiesas_menu"); // use pointer to existing menu object
6913 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6916 void MainFrame::OnDropGroupName()
6919 char* name = DoNameDlg ("Name Selection");
6924 Sys_UpdateWindows (W_ALL);
6930 void MainFrame::OnDropGroupNewgroup()
6935 void MainFrame::OnDropGroupRemove()
6938 Select_AddToGroup("World");
6939 Sys_UpdateWindows (W_ALL);
6943 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6944 void MainFrame::OnFaceFit()
6949 void MainFrame::OnDontselectmodel()
6951 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
6952 g_bIgnoreCommands++;
6953 g_PrefsDlg.m_bSelectModels ^= 1;
6954 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
6955 g_bIgnoreCommands--;
6958 void MainFrame::OnViewTexture()
6960 if (FloatingGroupDialog()) // QE4 style
6962 if (inspector_mode == W_TEXTURE)
6964 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
6965 widget_delete_hide (g_qeglobals_gui.d_entity);
6967 gtk_widget_show (g_qeglobals_gui.d_entity);
6970 gtk_widget_show (g_qeglobals_gui.d_entity);
6971 SetInspectorMode (W_TEXTURE);
6976 void MainFrame::OnPatchInspector()
6978 TogglePatchInspector();
6981 void MainFrame::OnCurveNegativeTextureX()
6983 Patch_InvertTexture(false);
6984 //Sys_UpdateWindows(W_ALL);
6987 void MainFrame::OnCurveNegativeTextureY()
6989 Patch_InvertTexture(true);
6990 //Sys_UpdateWindows(W_ALL);
6993 void MainFrame::OnCurveInsertcolumn()
6995 if (&selected_brushes == selected_brushes.next)
6997 Undo_Start("insert colum");
6998 Undo_AddBrushList(&selected_brushes);
6999 //Patch_AdjustSelectedRowCols(0, 2);
7000 Patch_AdjustSelected(true, true, true);
7001 Sys_UpdateWindows(W_ALL);
7002 Undo_EndBrushList(&selected_brushes);
7006 void MainFrame::OnCurveInsertrow()
7008 if (&selected_brushes == selected_brushes.next)
7010 Undo_Start("insert row");
7011 Undo_AddBrushList(&selected_brushes);
7012 //Patch_AdjustSelectedRowCols(2, 0);
7013 Patch_AdjustSelected(true, false, true);
7014 Sys_UpdateWindows(W_ALL);
7015 Undo_EndBrushList(&selected_brushes);
7019 void MainFrame::OnCurveDeletecolumn()
7021 if (&selected_brushes == selected_brushes.next)
7023 Undo_Start("delete column");
7024 Undo_AddBrushList(&selected_brushes);
7025 Patch_AdjustSelected(false, true, true);
7026 Sys_UpdateWindows(W_ALL);
7027 Undo_EndBrushList(&selected_brushes);
7031 void MainFrame::OnCurveDeleterow()
7033 if (&selected_brushes == selected_brushes.next)
7035 Undo_Start("delete row");
7036 Undo_AddBrushList(&selected_brushes);
7037 Patch_AdjustSelected(false, false, true);
7038 Sys_UpdateWindows(W_ALL);
7039 Undo_EndBrushList(&selected_brushes);
7043 void MainFrame::OnPatchTab()
7045 if (g_bPatchBendMode)
7046 Patch_BendHandleTAB();
7047 // else if (g_bPatchInsertMode)
7048 // Patch_InsDelHandleTAB();
7051 // check to see if the selected brush is part of a func group
7052 // if it is, deselect everything and reselect the next brush
7054 brush_t *b2, *b = selected_brushes.next;
7056 if (b != &selected_brushes)
7058 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7062 for (b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext)
7070 if (b2 == &e->brushes)
7073 Select_Brush(b2, false);
7074 Sys_UpdateWindows(W_ALL);
7080 void MainFrame::OnSelectFuncGroup()
7082 // check to see if the selected brush is part of a func group
7083 // if it is, deselect everything and reselect the next brush
7085 brush_t *b2, *b = selected_brushes.next;
7087 if (b != &selected_brushes)
7089 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7092 Select_SelectGroup(e);
7097 void MainFrame::OnCameraForward(bool keydown)
7099 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7103 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7104 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7105 Sys_UpdateWindows (nUpdate);
7110 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7112 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7116 void MainFrame::OnCameraBack(bool keydown)
7118 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7122 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7123 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7124 Sys_UpdateWindows (nUpdate);
7129 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7131 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7135 void MainFrame::OnCameraLeft(bool keydown)
7139 if (m_pCamWnd->m_bFreeMove)
7141 OnCameraStrafeleft(keydown);
7146 if (g_PrefsDlg.m_bCamDiscrete)
7150 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7151 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7152 Sys_UpdateWindows (nUpdate);
7157 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7159 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7163 void MainFrame::OnCameraRight(bool keydown)
7167 if (m_pCamWnd->m_bFreeMove)
7169 OnCameraStraferight(keydown);
7174 if (g_PrefsDlg.m_bCamDiscrete)
7178 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7179 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7180 Sys_UpdateWindows (nUpdate);
7185 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7187 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7191 void MainFrame::OnCameraUp()
7193 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7194 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7195 Sys_UpdateWindows (nUpdate);
7198 void MainFrame::OnCameraDown()
7200 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7201 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7202 Sys_UpdateWindows (nUpdate);
7205 void MainFrame::OnCameraAngleup()
7207 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
7208 if (m_pCamWnd->Camera()->angles[0] > 85)
7209 m_pCamWnd->Camera()->angles[0] = 85;
7210 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7213 void MainFrame::OnCameraAngledown()
7215 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7216 if (m_pCamWnd->Camera()->angles[0] < -85)
7217 m_pCamWnd->Camera()->angles[0] = -85;
7218 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7221 void MainFrame::OnCameraStrafeleft(bool keydown)
7223 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7226 if (!m_pCamWnd->m_bFreeMove)
7230 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7231 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7232 Sys_UpdateWindows (nUpdate);
7239 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7241 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7244 void MainFrame::OnCameraStraferight(bool keydown)
7246 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7249 if (!m_pCamWnd->m_bFreeMove)
7253 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7254 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7255 Sys_UpdateWindows (nUpdate);
7262 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7264 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7267 void MainFrame::OnGridToggle()
7269 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7270 Sys_UpdateWindows (W_XY|W_Z);
7273 void MainFrame::OnViewCrosshair()
7276 Sys_UpdateWindows (W_XY);
7279 void MainFrame::OnSelectionTextureRotateclock()
7281 Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7284 void MainFrame::OnSelectionTextureRotatecounter()
7286 Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7289 void MainFrame::OnSelectionTextureScaleup()
7291 Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7294 void MainFrame::OnSelectionTextureScaledown()
7296 Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7299 void MainFrame::OnSelectionTextureScaleLeft()
7301 Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7304 void MainFrame::OnSelectionTextureScaleRight()
7306 Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7309 void MainFrame::OnSelectionTextureShiftleft()
7311 Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7314 void MainFrame::OnSelectionTextureShiftright()
7316 Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7319 void MainFrame::OnSelectionTextureShiftup()
7321 Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7324 void MainFrame::OnSelectionTextureShiftdown()
7326 Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7329 void MainFrame::OnGridPrev()
7332 if (g_qeglobals.d_gridsize == 1)
7334 g_qeglobals.d_gridsize = 0.5;
7335 g_qeglobals.d_bSmallGrid = true;
7336 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7337 } else if (g_qeglobals.d_gridsize == 0.5)
7339 g_qeglobals.d_gridsize = 0.25;
7340 g_qeglobals.d_bSmallGrid = true;
7341 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7342 } else if (g_qeglobals.d_gridsize > 1)
7344 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7345 g_qeglobals.d_bSmallGrid = false;
7347 switch ((int)g_qeglobals.d_gridsize)
7349 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7350 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7351 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7352 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7353 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7354 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7355 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7356 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7357 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7363 // SnapTToGrid option: need to check everywhere the grid size is changed
7364 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7365 if (g_PrefsDlg.m_bSnapTToGrid)
7369 g_bIgnoreCommands++;
7370 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7371 g_bIgnoreCommands--;
7373 Sys_UpdateWindows(W_XY | W_Z);
7376 void MainFrame::OnGridNext()
7379 if (g_qeglobals.d_gridsize == 0.25)
7381 g_qeglobals.d_gridsize = 0.5;
7382 g_qeglobals.d_bSmallGrid = true;
7383 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7384 } else if (g_qeglobals.d_gridsize == 0.5)
7386 g_qeglobals.d_gridsize = 1;
7387 g_qeglobals.d_bSmallGrid = false;
7388 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7389 } else if (g_qeglobals.d_gridsize < 256)
7391 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7392 g_qeglobals.d_bSmallGrid = false;
7394 switch ((int)g_qeglobals.d_gridsize)
7396 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7397 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7398 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7399 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7400 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7401 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7402 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7403 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7404 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7405 default: item = NULL;
7411 // SnapTToGrid option: need to check everywhere the grid size is changed
7412 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7413 if (g_PrefsDlg.m_bSnapTToGrid)
7417 g_bIgnoreCommands++;
7418 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7419 g_bIgnoreCommands--;
7421 Sys_UpdateWindows(W_XY | W_Z);
7424 void MainFrame::OnSelectionMovedown()
7426 if (&selected_brushes == selected_brushes.next)
7428 Undo_Start("move down");
7429 Undo_AddBrushList(&selected_brushes);
7432 vAmt[0] = vAmt[1] = 0.0;
7433 vAmt[2] = -g_qeglobals.d_gridsize;
7435 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7437 Undo_EndBrushList(&selected_brushes);
7441 void MainFrame::OnSelectionMoveup()
7443 if (&selected_brushes == selected_brushes.next)
7445 Undo_Start("move up");
7446 Undo_AddBrushList(&selected_brushes);
7449 vAmt[0] = vAmt[1] = 0.0;
7450 vAmt[2] = g_qeglobals.d_gridsize;
7452 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7454 Undo_EndBrushList(&selected_brushes);
7458 void MainFrame::OnSelectionPrint()
7460 for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7464 void MainFrame::OnSelectionTogglesizepaint()
7466 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7467 Sys_UpdateWindows(W_XY);
7470 void MainFrame::OnPatchNaturalize()
7472 Patch_NaturalizeSelected();
7473 Sys_UpdateWindows (W_ALL);
7476 void MainFrame::OnSnapToGrid()
7478 if (&selected_brushes == selected_brushes.next)
7480 Undo_Start("snap selection to grid");
7481 Undo_AddBrushList(&selected_brushes);
7482 //Select_SnapToGrid();
7483 for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7486 Patch_SnapToGrid(pb->pPatch);
7488 Brush_SnapToGrid(pb);
7490 Sys_UpdateWindows (W_ALL);
7491 Undo_EndBrushList(&selected_brushes);
7495 void MainFrame::OnSelectAll()
7500 void MainFrame::OnSelectionInvert()
7503 Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7507 void PerformFiltering ()
7511 // mattn - this should be removed - otherwise the filters from the
7512 // plugins are wiped away with each update
7514 // spog - deletes old filters list and creates new one when
7515 // g_qeglobals.d_savedinfo.exclude is updated
7516 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
7517 g_qeglobals.d_savedinfo.filters = FilterUpdate(g_qeglobals.d_savedinfo.filters);
7520 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7521 brush->bFiltered = FilterBrush( brush );
7523 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7524 brush->bFiltered = FilterBrush( brush );
7527 void MainFrame::OnFilterAreaportals()
7529 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7530 g_bIgnoreCommands++;
7531 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7532 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7534 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7535 g_bIgnoreCommands--;
7537 Sys_UpdateWindows (W_XY|W_CAMERA);
7540 void MainFrame::OnFilterCaulk()
7542 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7543 g_bIgnoreCommands++;
7544 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7545 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7547 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7548 g_bIgnoreCommands--;
7550 Sys_UpdateWindows (W_XY|W_CAMERA);
7553 void MainFrame::OnFilterClips()
7555 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7556 g_bIgnoreCommands++;
7557 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7558 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7560 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7561 g_bIgnoreCommands--;
7563 Sys_UpdateWindows (W_XY|W_CAMERA);
7566 void MainFrame::OnFilterBotClips()
7568 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7569 g_bIgnoreCommands++;
7570 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7571 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7573 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7574 g_bIgnoreCommands--;
7576 Sys_UpdateWindows (W_XY|W_CAMERA);
7579 void MainFrame::OnFilterStructural()
7581 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7582 g_bIgnoreCommands++;
7583 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7584 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7586 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7587 g_bIgnoreCommands--;
7589 Sys_UpdateWindows (W_XY|W_CAMERA);
7592 void MainFrame::OnFilterDetails()
7594 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7595 g_bIgnoreCommands++;
7596 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7597 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7599 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7600 g_bIgnoreCommands--;
7602 Sys_UpdateWindows (W_XY|W_CAMERA);
7605 void MainFrame::OnFilterEntities()
7607 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7608 g_bIgnoreCommands++;
7609 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7610 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7612 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7613 g_bIgnoreCommands--;
7615 Sys_UpdateWindows (W_XY|W_CAMERA);
7618 void MainFrame::OnFilterHintsskips()
7620 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7621 g_bIgnoreCommands++;
7622 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7623 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7625 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7626 g_bIgnoreCommands--;
7628 Sys_UpdateWindows (W_XY|W_CAMERA);
7631 void MainFrame::OnFilterLights()
7633 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7634 g_bIgnoreCommands++;
7635 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7636 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7638 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7639 g_bIgnoreCommands--;
7641 Sys_UpdateWindows (W_XY|W_CAMERA);
7644 void MainFrame::OnFilterLiquids()
7646 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7647 g_bIgnoreCommands++;
7648 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7649 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7651 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7652 g_bIgnoreCommands--;
7654 Sys_UpdateWindows (W_XY|W_CAMERA);
7657 void MainFrame::OnFilterModels()
7659 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7660 g_bIgnoreCommands++;
7661 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7662 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7664 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7665 g_bIgnoreCommands--;
7667 Sys_UpdateWindows (W_XY|W_CAMERA);
7670 void MainFrame::OnFilterPatches()
7672 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7673 g_bIgnoreCommands++;
7674 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7675 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7677 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7678 g_bIgnoreCommands--;
7680 Sys_UpdateWindows (W_XY|W_CAMERA);
7683 void MainFrame::OnFilterPaths()
7685 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7686 g_bIgnoreCommands++;
7687 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7688 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7690 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7691 g_bIgnoreCommands--;
7693 Sys_UpdateWindows (W_XY|W_CAMERA);
7696 void MainFrame::OnFilterClusterportals()
7698 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7699 g_bIgnoreCommands++;
7700 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7701 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7703 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7704 g_bIgnoreCommands--;
7706 Sys_UpdateWindows (W_XY|W_CAMERA);
7709 void MainFrame::OnFilterLightgrid()
7711 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7712 g_bIgnoreCommands++;
7713 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7714 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7716 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7717 g_bIgnoreCommands--;
7719 Sys_UpdateWindows (W_XY|W_CAMERA);
7722 void MainFrame::OnFilterTranslucent()
7724 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7725 g_bIgnoreCommands++;
7726 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7727 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7729 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7730 g_bIgnoreCommands--;
7732 Sys_UpdateWindows (W_XY|W_CAMERA);
7735 void MainFrame::OnFilterTriggers()
7737 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7738 g_bIgnoreCommands++;
7739 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7740 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7742 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7743 g_bIgnoreCommands--;
7745 Sys_UpdateWindows (W_XY|W_CAMERA);
7748 void MainFrame::OnFilterWorld()
7750 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7751 g_bIgnoreCommands++;
7752 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7753 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7755 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7756 g_bIgnoreCommands--;
7758 Sys_UpdateWindows (W_XY|W_CAMERA);
7768 // =============================================================================
7769 // leo: Unused functions, not called anywhere from the code (need to check)
7771 void MainFrame::OnViewConsole()
7773 if (FloatingGroupDialog()) // QE4 style
7775 if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7777 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7778 widget_delete_hide (g_qeglobals_gui.d_entity);
7780 gtk_widget_show (g_qeglobals_gui.d_entity);
7783 gtk_widget_show (g_qeglobals_gui.d_entity);
7784 SetInspectorMode(W_CONSOLE);
7789 void MainFrame::OnCurveFreeze()
7794 void MainFrame::OnCurveUnFreeze()
7796 Patch_UnFreeze(false);
7799 void MainFrame::OnCurveUnFreezeAll()
7801 Patch_UnFreeze(true);
7804 void MainFrame::OnSelectReselect()
7809 void MainFrame::OnSelectionTextureFit()
7811 // TODO: Add your command handler code here
7814 void MainFrame::OnPatchEnter()
7819 void MainFrame::OnDropGroupAddtoWorld()
7822 Select_AddToGroup("World");
7823 Sys_UpdateWindows (W_ALL);