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 g_bScreenUpdates = true;
3232 Sys_Printf("Dispatching wake msg...");
3233 DispatchRadiantMsg (RADIANT_WAKEUP);
3234 Sys_Printf("Done\n");
3238 void WINAPI QERApp_Sleep()
3240 g_pParentWnd->OnSleep();
3245 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3246 and not in OnDestroy because the info may be lost already?
3247 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3249 void MainFrame::OnDelete ()
3251 save_window_pos(m_pWidget, g_PrefsDlg.mWindowInfo.position);
3253 // surface inspector and patch inspector
3254 save_window_pos (g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd);
3255 save_window_pos (g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd);
3257 // entity inspector / group dialog
3258 // NOTE TTimo do we have to save a different window depending on the view mode?
3259 save_window_pos (g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd);
3261 if (g_PrefsDlg.m_bFloatingZ)
3262 save_window_pos (m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd);
3264 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED (m_pSplits[0])->child1_size;
3266 if (CurrentStyle() == eFloating)
3268 save_window_pos (m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd);
3269 save_window_pos (m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd);
3270 save_window_pos (m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd);
3271 save_window_pos (m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd);
3274 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state(g_pParentWnd->m_pWidget->window);
3277 void MainFrame::OnDestroy ()
3279 // shut down console output first
3280 // (we'll still get the info if we are running a log file anyway)
3281 g_qeglobals_gui.d_edit = NULL;
3284 Sys_Printf("MainFrame::OnDestroy\n");
3287 gtk_timeout_remove (s_idle_id);
3289 gtk_timeout_remove (m_nTimer);
3291 if (!g_qeglobals.disable_ini)
3293 Sys_Printf("Start writing prefs\n");
3294 Sys_Printf("MRU_Save... ");
3300 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split1");
3301 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED (w)->child1_size;
3302 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split2");
3303 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED (w)->child1_size;
3305 if (!FloatingGroupDialog())
3307 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3309 vsplit = m_pSplits[0];
3310 vsplit2 = m_pSplits[1];
3311 hsplit = m_pSplits[2];
3312 hsplit2 = m_pSplits[3];
3314 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED (vsplit)->child1_size;
3315 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED (hsplit2)->child1_size;
3317 if(CurrentStyle() == eRegular)
3318 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED (hsplit)->child1_size;
3320 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED (hsplit)->child1_size;
3322 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED (vsplit2)->child1_size;
3325 if (g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit)
3327 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
3328 g_PrefsDlg.m_bZVis = TRUE;
3330 g_PrefsDlg.m_bZVis = FALSE;
3333 g_PrefsDlg.SavePrefs();
3334 Sys_Printf("Done prefs\n");
3337 // spog - this may be better in another place..
3338 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3339 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
3341 delete m_pXYWnd; m_pXYWnd = NULL;
3342 delete m_pYZWnd; m_pYZWnd = NULL;
3343 delete m_pXZWnd; m_pXZWnd = NULL;
3344 delete m_pZWnd; m_pZWnd = NULL;
3345 delete m_pTexWnd; m_pTexWnd = NULL;
3346 delete m_pCamWnd; m_pCamWnd = NULL;
3348 if (g_pGroupDlg->m_pWidget)
3350 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3351 gtk_widget_destroy (g_pGroupDlg->m_pWidget);
3352 g_pGroupDlg->m_pWidget = NULL;
3355 if (strcmpi(currentmap, "unnamed.map") != 0)
3357 g_PrefsDlg.m_strLastMap = currentmap;
3358 g_PrefsDlg.SavePrefs ();
3360 Sys_Printf("CleanUpEntities...");
3362 Sys_Printf("Done.\n");
3364 Sys_Printf("Releasing brushes...");
3365 while (active_brushes.next != &active_brushes)
3366 Brush_Free (active_brushes.next, false);
3367 while (selected_brushes.next != &selected_brushes)
3368 Brush_Free (selected_brushes.next, false);
3369 while (filtered_brushes.next != &filtered_brushes)
3370 Brush_Free (filtered_brushes.next, false);
3371 Sys_Printf("Done.\n");
3373 Sys_Printf("Releasing entities...");
3374 while (entities.next != &entities)
3375 Entity_Free (entities.next);
3376 Sys_Printf("Done.\n");
3378 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3381 epair_t* pNextEPair = pEPair->next;
3383 free (pEPair->value);
3385 pEPair = pNextEPair;
3388 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3389 while (pEntity != NULL && pEntity != g_qeglobals.d_project_entity)
3391 entity_t* pNextEntity = pEntity->next;
3392 Entity_Free(pEntity);
3393 pEntity = pNextEntity;
3396 Sys_Printf("Freeing world entity...");
3398 Entity_Free(world_entity);
3399 Sys_Printf("Done.\n");
3401 Sys_Printf("Shutdown VFS...");
3403 Sys_Printf("Done.\n");
3405 Sys_Printf("FreeShaders...");
3406 QERApp_FreeShaders();
3407 Sys_Printf("Done.\n");
3410 // TTimo: now using profile.cpp code
3411 void MainFrame::LoadCommandMap()
3415 bool bUserCmdList = false;
3417 // verbose a little: count of user commands we recognized
3419 int iOverrideCount = 0;
3423 #if defined (__linux__) || defined (__APPLE__)
3424 strINI = g_PrefsDlg.m_rc_path->str;
3425 #elif defined(WIN32)
3426 strINI = g_strGameToolsPath;
3428 #error "WTF are you compiling this on"
3431 strINI += "shortcuts.ini";
3433 f = fopen (strINI.GetBuffer(), "r");
3437 // loop through all the commands
3438 for (int i = 0; i < g_nCommandCount; i++)
3441 if (read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ))
3445 Sys_Printf("Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3446 bUserCmdList = true;
3451 strBuff.TrimRight();
3452 strBuff.MakeLower();
3453 int nSpecial = strBuff.Find("+alt");
3454 g_Commands[i].m_nModifiers = 0;
3457 g_Commands[i].m_nModifiers |= RAD_ALT;
3458 FindReplace(strBuff, "+alt", "");
3460 nSpecial = strBuff.Find("+ctrl");
3463 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3464 FindReplace(strBuff, "+ctrl", "");
3466 nSpecial = strBuff.Find("+shift");
3469 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3470 FindReplace(strBuff, "+shift", "");
3473 strBuff.TrimRight();
3474 strBuff.MakeUpper();
3475 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3477 nLen = strBuff.GetLength();
3478 if (nLen == 1) // most often case.. deal with first
3480 g_Commands[i].m_nKey = __toascii(strBuff.GetAt(0));
3482 } else // special key
3484 for (j = 0; j < g_nKeyCount; j++)
3486 if (strBuff.CompareNoCase(g_Keys[j].m_strName) == 0)
3488 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3493 if (j == g_nKeyCount)
3495 Sys_Printf("WARNING: failed to parse user command %s\n", value);
3499 // maybe this new shortcut is overriding another one
3500 // then we need to disable the other binded key
3501 for (j = 0; j < g_nCommandCount; j++)
3505 if (g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers)
3508 g_Commands[j].m_nKey = 0;
3511 // it's the only one
3518 Sys_Printf("User's command list overrides %d default commands\n", iOverrideCount);
3519 Sys_Printf("Parsed %d custom shortcuts\n", iCount );
3522 Sys_Printf("Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer());
3525 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3526 // we also output the count of commands that are not binded .. dunno if it's much use ..
3527 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3528 void MainFrame::ShowMenuItemKeyBindings(GtkWidget* window)
3530 //!\todo Find a better way to get the global accelerator group..
3531 GtkAccelGroup *accel = GTK_ACCEL_GROUP(gtk_accel_groups_from_object(G_OBJECT(window))->data);
3537 for (i = 0; i < g_nCommandCount; i++)
3539 if (g_Commands[i].m_nKey == 0)
3545 item = g_object_get_data (G_OBJECT (m_pWidget), g_Commands[i].m_strMenu);
3548 Sys_FPrintf (SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3549 g_Commands[i].m_strCommand);
3554 if (g_Commands[i].m_nModifiers) // are there modifiers present?
3556 if (g_Commands[i].m_nModifiers & RAD_SHIFT)
3557 mods |= GDK_SHIFT_MASK;
3558 if (g_Commands[i].m_nModifiers & RAD_ALT)
3559 mods |= GDK_MOD1_MASK;
3560 if (g_Commands[i].m_nModifiers & RAD_CONTROL)
3561 mods |= GDK_CONTROL_MASK;
3564 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3565 if (gtk_accelerator_valid (g_Commands[i].m_nKey, (GdkModifierType)mods))
3568 // NOTE TTimo this is the important place where all the shortcuts are binded
3569 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);
3571 gtk_widget_add_accelerator (GTK_WIDGET (item), "activate", accel, g_Commands[i].m_nKey,
3572 (GdkModifierType)mods, GTK_ACCEL_VISIBLE);
3575 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (GTK_BIN (item)->child);
3579 g_free (accel_label->accel_string);
3580 accel_label->accel_string = NULL;
3582 gstring = g_string_new (accel_label->accel_string);
3583 g_string_append (gstring, " ");
3586 if (mods & GDK_SHIFT_MASK)
3588 g_string_append (gstring, "Shft");
3591 if (mods & GDK_CONTROL_MASK)
3594 g_string_append (gstring, "+");
3595 g_string_append (gstring, "Ctl");
3598 if (mods & GDK_MOD1_MASK)
3601 g_string_append (gstring, "+");
3602 g_string_append (gstring, "Alt");
3607 g_string_append (gstring, "+");
3608 if (g_Commands[i].m_nKey < 0x80 || (g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff))
3610 switch (g_Commands[i].m_nKey)
3613 g_string_append (gstring, "Space");
3616 g_string_append (gstring, "Backslash");
3619 g_string_append_c (gstring, toupper (g_Commands[i].m_nKey));
3626 tmp = gtk_accelerator_name (g_Commands[i].m_nKey, (GdkModifierType)0);
3627 if (tmp[0] != 0 && tmp[1] == 0)
3628 tmp[0] = toupper (tmp[0]);
3629 g_string_append (gstring, tmp);
3633 g_free (accel_label->accel_string);
3634 accel_label->accel_string = gstring->str;
3635 g_string_free (gstring, FALSE);
3637 if (!accel_label->accel_string)
3638 accel_label->accel_string = g_strdup ("");
3640 gtk_widget_queue_resize (GTK_WIDGET (accel_label));
3645 Sys_Printf("%d commands not bound to a key\n", iCount);
3648 void MainFrame::CreateQEChildren()
3650 // load the project file
3653 Sys_Printf("loading project file from the command line: %s\n", g_argv[1]);
3654 if (!QE_LoadProject(g_argv[1]))
3655 Error("Unable to load project file %s\n", g_argv[1]);
3659 const char* filename = NULL;
3662 bool bTriedTemplate = false;
3664 if (g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION) {
3665 // we need to regenerate from template
3666 Sys_Printf("last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION);
3667 g_PrefsDlg.m_strLastProject = "";
3670 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3672 while(r == NULL || *r == '\0' || access(r, R_OK) != 0 || !QE_LoadProject(r))
3676 // try default project location
3677 bTriedTemplate = true;
3678 // for all OSes, we look for the template in the base installation (no homepath here)
3679 strcpy(buf, g_pGameDescription->mEnginePath.GetBuffer());
3680 strcat(buf, g_pGameDescription->mBaseGame.GetBuffer());
3681 strcat(buf, "/scripts/");
3682 strcat(buf, PROJECT_TEMPLATE_NAME);
3687 gtk_MessageBox (NULL, _("Failed to load project file.\nPlease enter a valid project file."), _("Load Project"));
3689 filename = file_dialog (m_pWidget, TRUE, _("Choose Project File"), buf, "project");
3690 if (filename != NULL)
3693 Error("Cannot continue without loading a project...");
3701 void MainFrame::OnTimer()
3703 GdkModifierType mask;
3705 gdk_window_get_pointer (NULL, NULL, NULL, &mask);
3707 if ((mask & (GDK_BUTTON1_MASK|GDK_BUTTON2_MASK|GDK_BUTTON3_MASK)) == 0)
3709 QE_CountBrushesAndUpdateStatusBar();
3713 // see MainFrame::UpdateStatusText below
3714 if (m_bNeedStatusUpdate)
3716 for (int n = 0; n < 6; n++)
3718 if (m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL)
3719 gtk_label_set_text (GTK_LABEL (m_pStatusLabel[n]), m_strStatus[n]);
3721 m_bNeedStatusUpdate = false;
3725 void MainFrame::UpdateStatusText()
3727 m_bNeedStatusUpdate = true;
3730 void MainFrame::SetStatusText(int nPane, const char* pText)
3732 if (pText && nPane <= 5 && nPane >= 0)
3734 m_strStatus[nPane] = pText;
3738 void MainFrame::SetButtonMenuStates()
3741 g_bIgnoreCommands++;
3743 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
3744 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_angles);
3745 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
3746 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_names);
3747 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
3748 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_coordinates);
3749 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
3750 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_outline);
3751 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
3752 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
3753 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
3754 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_axis);
3755 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3756 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3757 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) ? FALSE : TRUE);
3758 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3759 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3760 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3761 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3762 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3763 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3764 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
3765 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3766 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD) != 0);
3767 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
3768 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3769 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT) != 0);
3770 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
3771 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3772 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS) != 0);
3773 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
3774 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3775 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT) != 0);
3776 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
3777 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3778 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS) != 0);
3779 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
3780 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3781 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK) != 0);
3782 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
3783 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3784 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP) != 0);
3785 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
3786 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3787 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP) != 0);
3788 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
3789 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3790 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL) != 0);
3791 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
3792 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3793 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) != 0);
3794 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3795 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3796 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3797 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3798 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3799 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3800 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
3801 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3802 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS) != 0);
3803 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
3804 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3805 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES) != 0);
3806 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
3807 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3808 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS) != 0);
3809 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
3810 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3811 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS) != 0);
3812 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
3813 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3814 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS) != 0);
3815 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
3816 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3817 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS) != 0);
3818 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
3819 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bTextureLock) ? TRUE : FALSE);
3820 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
3821 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bRotateLock) ? TRUE : FALSE);
3822 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
3823 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3824 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
3825 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bGLLighting) ? TRUE : FALSE);
3826 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
3827 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bSnap) ? TRUE : FALSE);
3829 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
3830 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3831 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
3832 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
3834 if (!g_pGameDescription->mNoPatch)
3836 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
3837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
3839 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
3840 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
3841 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
3842 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
3843 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
3844 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
3847 int id, n = g_PrefsDlg.m_nTextureScale;
3850 case 10 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3851 case 25 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3852 case 50 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3853 case 200 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3854 default : id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3856 SetTextureScale (id);
3858 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3860 if (g_qeglobals.d_project_entity)
3862 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3866 g_bIgnoreCommands--;
3869 void MainFrame::UpdateWindows(int nBits)
3871 if (!g_bScreenUpdates)
3873 #ifdef DBG_WINDOWPOS
3874 static int bean_count = 0;
3876 sprintf(bean_buf,"UpdateWindows %d",bean_count);
3877 CheckWatchit(bean_buf);
3881 if (nBits & (W_XY | W_XY_OVERLAY))
3884 m_pXYWnd->RedrawWindow ();
3886 m_pXZWnd->RedrawWindow ();
3888 m_pYZWnd->RedrawWindow ();
3891 if (nBits & W_CAMERA || ((nBits & W_CAMERA_IFON) && m_bCamPreview))
3894 m_pCamWnd->RedrawWindow ();
3897 if (nBits & (W_Z | W_Z_OVERLAY))
3900 m_pZWnd->RedrawWindow ();
3903 if (nBits & W_TEXTURE)
3906 m_pTexWnd->RedrawWindow ();
3908 #ifdef DBG_WINDOWPOS
3909 sprintf(bean_buf,"%d (end UpdateWidows)",bean_count);
3910 CheckWatchit(bean_buf);
3914 void MainFrame::RoutineProcessing()
3916 #ifdef DBG_WINDOWPOS
3917 static int bean_count = 0;
3919 sprintf(bean_buf,"RoutineProcessing %d",bean_count);
3920 CheckWatchit(bean_buf);
3927 double oldtime = 0.0;
3930 /* // checking KeyState works right
3932 a2 = GetKeyState(VK_MENU);
3935 Sys_Printf("VK_MENU: %d\n",a2);
3939 b2 = GetKeyState(VK_UP);
3942 Sys_Printf("VK_UP: %d\n",b2);
3946 time = Sys_DoubleTime ();
3947 delta = time - oldtime;
3952 // update the BSP process watcher
3954 m_pWatchBSP->RoutineProcessing();
3956 // run time dependant behavior
3958 m_pCamWnd->Cam_MouseControl(delta);
3962 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3963 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3964 UpdateWindows(nBits); // happens in rare cases but causes a stack overflow
3967 // Enable/disable the menu items
3970 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3971 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3972 if (!g_PrefsDlg.m_bWideToolbar)
3974 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3975 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3977 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3978 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3979 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3980 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3981 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3982 gtk_widget_set_sensitive (item, region_active);
3983 g_bIgnoreCommands++;
3984 // update the toolbar before displaying the menu:
3985 // show in use check box
3986 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3987 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3988 // show all check box
3989 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3990 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3991 g_bIgnoreCommands--;
3994 #ifdef DBG_WINDOWPOS
3995 sprintf(bean_buf,"%d (end RoutineProcessing)",bean_count);
3996 CheckWatchit(bean_buf);
4000 void MainFrame::DoWatchBSP()
4002 // network monitoring of the BSP process
4004 m_pWatchBSP = new CWatchBSP();
4007 void MainFrame::CleanPlugInMenu()
4009 GtkWidget *menu, *sep;
4012 // delete everything after the separator
4013 menu = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin"));
4014 sep = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin_separator"));
4015 m_nNextPlugInID = ID_PLUGIN_START;
4017 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4020 gtk_container_remove (GTK_CONTAINER (menu), GTK_WIDGET (lst->next->data));
4021 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4025 void MainFrame::AddPlugInMenuItem(IPlugIn* pPlugIn)
4027 GtkWidget *menu, *item, *parent;
4028 const char *menuText;
4030 parent = gtk_menu_item_new_with_label (pPlugIn->getMenuName());
4031 gtk_widget_show (parent);
4032 gtk_container_add (GTK_CONTAINER (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin")), parent);
4034 int nCount = pPlugIn->getCommandCount();
4037 menu = gtk_menu_new ();
4040 menuText = pPlugIn->getCommand(--nCount);
4041 if (menuText != NULL && strlen(menuText) > 0)
4043 if (!strcmp(menuText, "-"))
4045 item = gtk_menu_item_new ();
4046 gtk_widget_set_sensitive (item, FALSE);
4049 item = gtk_menu_item_new_with_label (menuText);
4050 gtk_signal_connect (GTK_OBJECT (item), "activate",
4051 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (m_nNextPlugInID));
4053 gtk_widget_show (item);
4054 gtk_container_add (GTK_CONTAINER (menu), item);
4055 pPlugIn->addMenuID(m_nNextPlugInID++);
4058 gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), menu);
4062 void MainFrame::OnPlugIn(unsigned int nID, char* str)
4064 m_PlugInMgr.Dispatch(nID, str);
4067 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype(IToolbarButton::EType type)
4071 case IToolbarButton::eSpace:
4072 return GTK_TOOLBAR_CHILD_SPACE;
4073 case IToolbarButton::eButton:
4074 return GTK_TOOLBAR_CHILD_BUTTON;
4075 case IToolbarButton::eToggleButton:
4076 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4077 case IToolbarButton::eRadioButton:
4078 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4080 Error("invalid toolbar button type");
4081 return (GtkToolbarChildType)0;
4084 void toolbar_insert(GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data)
4086 GtkWidget *w, *pixmap;
4087 GdkPixmap *gdkpixmap;
4090 load_plugin_bitmap(image, (void **)&gdkpixmap, (void **)&mask);
4091 pixmap = gtk_pixmap_new (gdkpixmap, mask);
4092 gdk_pixmap_unref (gdkpixmap);
4093 gdk_pixmap_unref (mask);
4094 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), gtktoolbarchildtype_for_toolbarbuttontype(type), NULL, text, tooltip, "", GTK_WIDGET (pixmap), handler, data);
4097 void SignalToolbarButton(GtkWidget *widget, gpointer data)
4099 const_cast<const IToolbarButton*>(reinterpret_cast<IToolbarButton*>(data))->activate();
4102 void MainFrame::AddPlugInToolbarButton(const IToolbarButton* button)
4104 GtkWidget*const toolbar = GTK_WIDGET(g_object_get_data (G_OBJECT (m_pWidget), "toolbar_plugin"));
4105 toolbar_insert(toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC(SignalToolbarButton), reinterpret_cast<gpointer>(const_cast<IToolbarButton*>(button)));
4108 void MainFrame::OnSelectionSelectNudgedown()
4110 NudgeSelection(3, g_qeglobals.d_gridsize);
4113 void MainFrame::OnSelectionSelectNudgeleft()
4115 NudgeSelection(0, g_qeglobals.d_gridsize);
4118 void MainFrame::OnSelectionSelectNudgeright()
4120 NudgeSelection(2, g_qeglobals.d_gridsize);
4123 void MainFrame::OnSelectionSelectNudgeup()
4125 NudgeSelection(1, g_qeglobals.d_gridsize);
4128 void MainFrame::NudgeSelection(int nDirection, float fAmount)
4130 if (ActiveXY()->RotateMode())
4133 if (ActiveXY()->GetViewType() == XY)
4137 if (g_pParentWnd->ActiveXY()->GetViewType() == XZ)
4143 if (nDirection == 2 || nDirection == 3)
4148 float fDeg = -fAmount;
4149 float fAdj = fAmount;
4151 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4153 strStatus.Format("Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4154 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2]);
4155 g_pParentWnd->SetStatusText(2, strStatus);
4156 Select_RotateAxis(nAxis, fDeg, false, true);
4157 Sys_UpdateWindows (W_ALL);
4159 if (ActiveXY()->ScaleMode())
4161 if (nDirection == 0 || nDirection == 3)
4166 v[0] = v[1] = v[2] = 1.0;
4179 Select_Scale((g_nScaleHow & SCALE_X) ? v[0] : 1.0,
4180 (g_nScaleHow & SCALE_Y) ? v[1] : 1.0,
4181 (g_nScaleHow & SCALE_Z) ? v[2] : 1.0);
4182 Sys_UpdateWindows (W_ALL);
4185 // 0 - left, 1 - up, 2 - right, 3 - down
4187 if (nDirection == 0)
4189 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4191 } else if (nDirection == 1)
4193 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4194 } else if (nDirection == 2)
4196 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4199 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4202 Nudge(nDim, fAmount);
4206 void MainFrame::Nudge(int nDim, float fNudge)
4209 vMove[0] = vMove[1] = vMove[2] = 0;
4210 vMove[nDim] = fNudge;
4212 if((g_qeglobals.d_select_mode == sel_vertex ||
4213 g_qeglobals.d_select_mode == sel_curvepoint)
4214 && g_qeglobals.d_num_move_points)
4215 Select_NudgePoint(vMove, true);
4217 Select_Move(vMove, true);
4218 Sys_UpdateWindows (W_ALL);
4221 void MainFrame::SetGridStatus()
4226 c1 = (g_PrefsDlg.m_bTextureLock) ? 'M' : ' ';
4227 c2 = (g_PrefsDlg.m_bRotateLock) ? 'R' : ' ';
4228 strStatus.Format("G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4229 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2);
4230 SetStatusText(4, strStatus);
4233 void MainFrame::UpdatePatchToolbarButtons()
4236 g_bIgnoreCommands++;
4237 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
4238 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
4239 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4240 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4241 g_bIgnoreCommands--;
4244 // =============================================================================
4247 void MainFrame::OnFileNew()
4249 if (ConfirmModified())
4253 void MainFrame::OnFileOpen()
4255 if (!ConfirmModified())
4261 if (!g_pGameDescription->noMapsInHome) {
4262 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4263 strcat(buf, "maps/");
4268 str = file_dialog (m_pWidget, TRUE, _("Open Map"), buf, MAP_MAJOR, "maps/");
4272 strcpy(currentmap,str);
4278 void MainFrame::OnFileImportmap()
4283 if (!g_pGameDescription->noMapsInHome) {
4284 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4285 strcat(buf, "maps/");
4290 str = file_dialog (m_pWidget, TRUE, _("Import Map"), buf, MAP_MAJOR, "maps/");
4294 Map_ImportFile(str);
4298 void MainFrame::OnFileSave()
4300 if (!strcmp(currentmap, "unnamed.map"))
4303 Map_SaveFile (currentmap, false);
4306 void MainFrame::OnFileSaveas()
4311 if (!g_pGameDescription->noMapsInHome) {
4312 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4313 strcat(buf, "maps/");
4318 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, _("Save Map"), buf, MAP_MAJOR, "maps/");
4322 strcpy (currentmap, str);
4324 Map_SaveFile (str, false); // ignore region
4328 void MainFrame::OnFileExportmap()
4333 if (!g_pGameDescription->noMapsInHome) {
4334 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4335 strcat(buf, "maps/");
4340 str = file_dialog (m_pWidget, FALSE, _("Export Selection"), buf, MAP_MAJOR, "maps/");
4344 Map_SaveSelected (str);
4348 void MainFrame::OnFileSaveregion()
4353 if (!g_pGameDescription->noMapsInHome) {
4354 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4355 strcat(buf, "maps/");
4360 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, _("Export Region"), buf, MAP_MAJOR, "maps/");
4364 Map_SaveFile (str, true); // ignore region
4368 void MainFrame::OnFileNewproject()
4370 char* name = DoNewProjectDlg ();
4372 // create a new project:
4373 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4374 // on linux we create under ~/.q3a, on win32 under strEnginePath
4375 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4376 if ((name != NULL) && (strlen (name) > 0))
4378 CString strNewBasePath;
4380 // NOTE TTimo this would probably not work right on *nix
4381 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4382 strNewBasePath += name;
4383 strNewBasePath += "/";
4385 CString strProjToLoad;
4386 CString strMapToLoad;
4388 // if the dir exists, ask the user if they want to continue anyway
4389 if (Q_mkdir (strNewBasePath.GetBuffer(), 0755) != 0)
4392 strMsg.Format("The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer ());
4394 if (gtk_MessageBox(m_pWidget, _(strMsg), _("Error"), MB_YESNO) != IDYES)
4396 Sys_Printf("New Project cancelled, directory already exists for project\n");
4403 strDir = strNewBasePath;
4405 Q_mkdir (strDir.GetBuffer(), 0755);
4407 strDir = strNewBasePath;
4408 strDir += "textures/";
4409 Q_mkdir (strDir.GetBuffer(), 0755);
4411 strDir = strNewBasePath;
4412 strDir += "scripts/";
4413 Q_mkdir (strDir.GetBuffer(), 0755);
4415 // print a warning for total conversions, since setting the basepath when required files are
4416 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4417 Sys_FPrintf(SYS_WRN, "*** Note: basepath unchanged\n");
4419 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name);
4421 strDir = strNewBasePath;
4422 strDir += "maps/autosave.map";
4423 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4425 // state that this is a user project file, no templating
4426 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4427 // create the project file
4428 strProjToLoad = strNewBasePath;
4429 strProjToLoad += "scripts/";
4430 strProjToLoad += name;
4431 strProjToLoad += ".";
4432 strProjToLoad += PROJECT_FILETYPE;
4433 QE_SaveProject(strProjToLoad.GetBuffer());
4438 void MainFrame::OnFileLoadproject()
4440 if (ConfirmModified())
4444 void MainFrame::OnFileProjectsettings()
4446 DoProjectSettings();
4449 void MainFrame::OnFilePointfile()
4451 if (g_qeglobals.d_pointfile_display_list)
4457 void MainFrame::OnMru(unsigned int nID)
4459 if (ConfirmModified())
4460 MRU_Activate (nID - ID_FILE_RECENT1);
4463 void MainFrame::OnFileExit()
4465 if (ConfirmModified())
4467 // stop printing during shutdown
4468 // NOTE: we should cleanly release GL contexts and stuff when exiting
4472 g_qeglobals_gui.d_edit = NULL;
4473 gtk_widget_destroy (m_pWidget);
4477 void MainFrame::OnFileCheckUpdate()
4482 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4484 URL += "&OS_dlup=1";
4486 URL += "&OS_dlup=2";
4488 URL += "&Version_dlup=" RADIANT_VERSION;
4489 g_PrefsDlg.mGamesDialog.AddPacksURL(URL);
4490 OpenURL(URL.GetBuffer());
4493 void MainFrame::OnEditUndo()
4498 void MainFrame::OnEditRedo()
4503 void MainFrame::OnEditCopybrush()
4508 void MainFrame::OnEditPastebrush()
4512 Undo_Start("paste");
4516 Undo_EndBrushList(&selected_brushes);
4520 void MainFrame::OnEditPastebrushToCamera()
4525 vec3_t mid, camorigin, delta;
4527 ActiveXY()->Paste();
4529 // Work out the delta
4530 Select_GetMid( mid );
4532 // Snap camera origin to grid
4533 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4534 camorigin[0] = floor(camorigin[0] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4535 camorigin[1] = floor(camorigin[1] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4536 camorigin[2] = floor(camorigin[2] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4538 VectorSubtract( camorigin, mid, delta );
4541 Select_Move( delta, false );
4543 Undo_Start("paste to camera");
4544 Undo_EndBrushList(&selected_brushes);
4549 void MainFrame::OnSelectionDelete()
4553 // ActiveXY()->UndoCopy();
4554 Undo_Start("delete");
4555 Undo_AddBrushList(&selected_brushes);
4556 //add all deleted entities to the undo
4557 for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next)
4559 Undo_AddEntity(brush->owner);
4561 // NOTE: Select_Delete does NOT delete entities
4563 Undo_EndBrushList(&selected_brushes);
4567 void MainFrame::OnEditMapinfo()
4572 void MainFrame::OnEditEntityinfo()
4577 void MainFrame::OnBrushScripts()
4582 void MainFrame::OnEditLoadprefab()
4584 const char *filename;
4587 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4589 CurPath = g_PrefsDlg.m_strPrefabPath;
4593 filename = file_dialog (m_pWidget, TRUE, _("Import Prefab"), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/");
4595 if (filename != NULL)
4597 Map_ImportFile(filename);
4601 void MainFrame::OnEditSaveprefab()
4603 const char *filename;
4606 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4608 CurPath = g_PrefsDlg.m_strPrefabPath;
4612 getcwd (tmp, PATH_MAX);
4617 filename = file_dialog (m_pWidget, FALSE, _("Export Prefab"), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/");
4618 if (filename != NULL)
4620 Map_SaveSelected(filename);
4624 void MainFrame::OnPrefs()
4626 int nView = g_PrefsDlg.m_nView;
4627 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4628 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4629 int nShader = g_PrefsDlg.m_nShader;
4630 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4631 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4632 g_PrefsDlg.LoadPrefs();
4634 if (g_PrefsDlg.DoModal() == IDOK)
4636 if ((g_PrefsDlg.m_nLatchedView != nView) ||
4637 (g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus) ||
4638 (g_PrefsDlg.m_bLatchedWideToolbar != bToolbar) ||
4639 (g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar) ||
4640 (g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar) ||
4641 (g_PrefsDlg.m_nLatchedShader != nShader) ||
4642 (g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality)
4643 || (g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ)
4645 gtk_MessageBox(m_pWidget, _("You must restart Radiant for the changes to take effect."));
4647 // if the view mode was switched to floating, set the Z window on by default
4648 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4649 // (and we simply hope there will be a SavePrefs before we die)
4650 if ((g_PrefsDlg.m_nView != nView) && ((EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating))
4652 g_PrefsDlg.m_bZVis = true;
4656 m_pTexWnd->UpdatePrefs();
4658 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
4659 g_bIgnoreCommands++;
4660 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
4661 (g_PrefsDlg.m_bSnap) ? TRUE : FALSE);
4662 g_bIgnoreCommands--;
4666 void MainFrame::OnTogglecamera()
4668 if (CurrentStyle() == eFloating) // floating views
4670 if (m_pCamWnd && m_pCamWnd->m_pParent)
4672 if (GTK_WIDGET_VISIBLE (m_pCamWnd->m_pParent))
4673 widget_delete_hide (m_pCamWnd->m_pParent);
4675 gtk_widget_show (m_pCamWnd->m_pParent);
4679 if (GTK_WIDGET_VISIBLE (m_pCamWnd->GetWidget ()))
4680 gtk_widget_hide (m_pCamWnd->GetWidget ());
4682 gtk_widget_show (m_pCamWnd->GetWidget ());
4686 void MainFrame::OnToggleconsole()
4688 if (FloatingGroupDialog()) // QE4 style
4690 if (inspector_mode == W_CONSOLE)
4692 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4693 widget_delete_hide (g_qeglobals_gui.d_entity);
4695 gtk_widget_show (g_qeglobals_gui.d_entity);
4698 gtk_widget_show (g_qeglobals_gui.d_entity);
4699 SetInspectorMode(W_CONSOLE);
4704 // trigger the entity inspector on/off
4705 void MainFrame::OnViewEntity()
4707 // make sure we're working with the current selection (bugzilla #436)
4708 if( ! GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4711 if (!FloatingGroupDialog())
4713 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_ENTITY)
4714 widget_delete_hide (g_qeglobals_gui.d_entity);
4717 gtk_widget_show (g_qeglobals_gui.d_entity);
4718 SetInspectorMode(W_ENTITY);
4722 if (inspector_mode == W_ENTITY)
4724 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4725 widget_delete_hide (g_qeglobals_gui.d_entity);
4727 gtk_widget_show (g_qeglobals_gui.d_entity);
4730 gtk_widget_show (g_qeglobals_gui.d_entity);
4731 SetInspectorMode(W_ENTITY);
4736 void MainFrame::OnViewGroups()
4738 if (!FloatingGroupDialog())
4740 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_GROUP)
4741 widget_delete_hide (g_qeglobals_gui.d_entity);
4744 gtk_widget_show (g_qeglobals_gui.d_entity);
4745 SetInspectorMode(W_GROUP);
4749 if (inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating)
4751 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4752 widget_delete_hide (g_qeglobals_gui.d_entity);
4754 gtk_widget_show (g_qeglobals_gui.d_entity);
4757 gtk_widget_show (g_qeglobals_gui.d_entity);
4758 SetInspectorMode(W_GROUP);
4763 void MainFrame::OnToggleview()
4765 if (CurrentStyle() == eFloating) // QE4 style
4767 if (m_pXYWnd && m_pXYWnd->m_pParent)
4769 if (GTK_WIDGET_VISIBLE (m_pXYWnd->m_pParent))
4770 widget_delete_hide (m_pXYWnd->m_pParent);
4772 gtk_widget_show (m_pXYWnd->m_pParent);
4777 void MainFrame::OnToggleviewXz()
4779 if (CurrentStyle() == eFloating) // QE4 style
4781 if (m_pXZWnd && m_pXZWnd->m_pParent)
4783 // get windowplacement doesn't actually save this so we will here
4784 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE (m_pXZWnd->m_pParent);
4785 if (g_PrefsDlg.m_bXZVis)
4786 widget_delete_hide (m_pXZWnd->m_pParent);
4788 gtk_widget_show (m_pXZWnd->m_pParent);
4789 g_PrefsDlg.m_bXZVis ^= 1;
4790 g_PrefsDlg.SavePrefs ();
4795 void MainFrame::OnToggleviewYz()
4797 if (CurrentStyle() == eFloating) // QE4 style
4799 if (m_pYZWnd && m_pYZWnd->m_pParent)
4801 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE (m_pYZWnd->m_pParent);
4802 if (g_PrefsDlg.m_bYZVis)
4803 widget_delete_hide (m_pYZWnd->m_pParent);
4805 gtk_widget_show (m_pYZWnd->m_pParent);
4806 g_PrefsDlg.m_bYZVis ^= 1;
4807 g_PrefsDlg.SavePrefs ();
4812 void MainFrame::OnTogglez()
4814 if ( g_pParentWnd->FloatingGroupDialog() ) // QE4 style
4816 if (m_pZWnd && m_pZWnd->m_pParent)
4818 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
4819 widget_delete_hide (m_pZWnd->m_pParent);
4821 gtk_widget_show (m_pZWnd->m_pParent);
4822 g_PrefsDlg.m_bZVis ^= 1;
4823 g_PrefsDlg.SavePrefs ();
4826 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4830 void MainFrame::OnViewCenter()
4832 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4833 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor((m_pCamWnd->Camera()->angles[YAW]+11)/22.5);
4834 Sys_UpdateWindows (W_CAMERA | W_XY_OVERLAY);
4837 void MainFrame::OnViewUpfloor()
4839 m_pCamWnd->Cam_ChangeFloor (true);
4842 void MainFrame::OnViewDownfloor()
4844 m_pCamWnd->Cam_ChangeFloor (false);
4847 void MainFrame::OnViewCenterview()
4849 if(CurrentStyle() == eSplit)
4851 GetXYWnd()->PositionView();
4852 GetXZWnd()->PositionView();
4853 GetYZWnd()->PositionView();
4854 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4857 m_pXYWnd->PositionView();
4858 Sys_UpdateWindows (W_XY);
4862 void MainFrame::OnViewNextview()
4864 if (CurrentStyle() == eSplit)
4866 GetXYWnd()->PositionView();
4867 GetXZWnd()->PositionView();
4868 GetYZWnd()->PositionView();
4869 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4872 if (m_pXYWnd->GetViewType() == XY)
4873 m_pXYWnd->SetViewType(XZ);
4875 if (m_pXYWnd->GetViewType() == XZ)
4876 m_pXYWnd->SetViewType(YZ);
4878 m_pXYWnd->SetViewType(XY);
4879 m_pXYWnd->PositionView();
4880 Sys_UpdateWindows (W_XY);
4884 void MainFrame::OnViewXy()
4886 if(!FloatingGroupDialog())
4888 m_pXYWnd->SetViewType(XY);
4889 m_pXYWnd->PositionView();
4891 Sys_UpdateWindows (W_XY);
4894 void MainFrame::OnViewSide()
4896 if (!FloatingGroupDialog())
4898 m_pXYWnd->SetViewType(XZ);
4899 m_pXYWnd->PositionView();
4901 Sys_UpdateWindows (W_XY);
4904 void MainFrame::OnViewFront()
4906 if (!FloatingGroupDialog())
4908 m_pXYWnd->SetViewType(YZ);
4909 m_pXYWnd->PositionView();
4911 Sys_UpdateWindows (W_XY);
4914 void MainFrame::OnView100()
4917 m_pXYWnd->SetScale(1);
4919 m_pXZWnd->SetScale(1);
4921 m_pYZWnd->SetScale(1);
4922 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4925 void MainFrame::OnViewZoomin()
4927 if (m_pXYWnd && m_pXYWnd->Active())
4929 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 5.0 / 4);
4930 if (m_pXYWnd->Scale() > 30)
4931 m_pXYWnd->SetScale(30);
4934 if (m_pXZWnd && m_pXZWnd->Active())
4936 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 5.0 / 4);
4937 if (m_pXZWnd->Scale() > 30)
4938 m_pXZWnd->SetScale(30);
4941 if (m_pYZWnd && m_pYZWnd->Active())
4943 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 5.0 / 4);
4944 if (m_pYZWnd->Scale() > 30)
4945 m_pYZWnd->SetScale(30);
4948 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4951 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4952 // we don't go below a zoom factor corresponding to 10% of the max world size
4953 // (this has to be computed against the window size)
4954 void MainFrame::OnViewZoomout()
4957 if (m_pXYWnd && m_pXYWnd->Active())
4959 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 4.0 / 5);
4960 min_scale = MIN(m_pXYWnd->Width(),m_pXYWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4961 if (m_pXYWnd->Scale() < min_scale) m_pXYWnd->SetScale (min_scale);
4964 if (m_pXZWnd && m_pXZWnd->Active())
4966 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 4.0 / 5);
4967 min_scale = MIN(m_pXZWnd->Width(),m_pXZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4968 if (m_pXZWnd->Scale() < min_scale) m_pXZWnd->SetScale (min_scale);
4971 if (m_pYZWnd && m_pYZWnd->Active())
4973 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 4.0 / 5);
4974 min_scale = MIN(m_pYZWnd->Width(),m_pYZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4975 if (m_pYZWnd->Scale() < min_scale) m_pYZWnd->SetScale (min_scale);
4977 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4980 void MainFrame::OnViewZ100()
4983 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4986 void MainFrame::OnViewZzoomin()
4991 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4994 void MainFrame::OnViewZzoomout()
4997 if (z.scale < 0.125)
4999 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
5002 void MainFrame::OnViewCubein()
5004 g_PrefsDlg.m_nCubicScale--;
5005 if (g_PrefsDlg.m_nCubicScale < 1)
5006 g_PrefsDlg.m_nCubicScale = 1;
5007 g_PrefsDlg.SavePrefs ();
5008 Sys_UpdateWindows(W_CAMERA);
5012 void MainFrame::OnViewCubeout()
5014 g_PrefsDlg.m_nCubicScale++;
5015 if (g_PrefsDlg.m_nCubicScale > 22)
5016 g_PrefsDlg.m_nCubicScale = 22;
5017 g_PrefsDlg.SavePrefs ();
5018 Sys_UpdateWindows(W_CAMERA);
5022 void MainFrame::OnViewShownames()
5024 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
5025 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
5026 g_bIgnoreCommands++;
5027 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5028 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE);
5029 g_bIgnoreCommands--;
5030 Sys_UpdateWindows (W_XY);
5033 void MainFrame::OnViewShowAngles()
5035 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
5036 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
5037 g_bIgnoreCommands++;
5038 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5039 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE);
5040 g_bIgnoreCommands--;
5041 Sys_UpdateWindows (W_XY);
5044 void MainFrame::OnViewShowblocks()
5046 g_qeglobals.show_blocks ^= 1;
5047 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showblocks"));
5048 g_bIgnoreCommands++;
5049 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.show_blocks ? TRUE : FALSE);
5050 g_bIgnoreCommands--;
5051 Sys_UpdateWindows (W_XY);
5054 void MainFrame::OnViewShowcoordinates()
5056 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
5057 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
5058 g_bIgnoreCommands++;
5059 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5060 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE);
5061 g_bIgnoreCommands--;
5062 Sys_UpdateWindows (W_XY|W_Z);
5065 void MainFrame::OnViewShowOutline()
5067 g_qeglobals.d_savedinfo.show_outline ^= 1;
5068 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
5069 g_bIgnoreCommands++;
5070 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5071 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE);
5072 g_bIgnoreCommands--;
5073 Sys_UpdateWindows (W_XY);
5076 void MainFrame::OnViewShowAxes()
5078 g_qeglobals.d_savedinfo.show_axis ^= 1;
5079 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
5080 g_bIgnoreCommands++;
5081 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5082 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE);
5083 g_bIgnoreCommands--;
5084 Sys_UpdateWindows (W_XY);
5087 void MainFrame::OnViewShowWorkzone()
5089 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showworkzone"));
5090 g_bIgnoreCommands++;
5091 if (g_qeglobals.d_show_work)
5093 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
5094 g_qeglobals.d_show_work = false;
5097 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5098 g_qeglobals.d_show_work = true;
5100 g_bIgnoreCommands--;
5101 Sys_UpdateWindows (W_XY);
5104 void MainFrame::OnViewHideshowHideselected()
5110 void MainFrame::OnViewHideshowShowhidden()
5112 Select_ShowAllHidden();
5116 sets the view mode for the entities
5117 called upon LoadPrefs too
5118 NOTE TTimo previous implementation had a SavePrefs call
5119 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5120 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5121 (otherwise we are always called following user action on the widget)
5123 void MainFrame::OnEntitiesSetViewAs(int mode)
5125 gpointer item = NULL;
5128 switch (g_PrefsDlg.m_nEntityShowState)
5131 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5134 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5136 case ENTITY_SELECTED:
5137 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5139 case ENTITY_SELECTED_SKIN:
5140 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5142 case ENTITY_SKINNED:
5143 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5145 case ENTITY_SKINNED_BOXED:
5146 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5149 g_bIgnoreCommands++;
5150 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5151 g_bIgnoreCommands--;
5157 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5158 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5159 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5161 case ID_VIEW_ENTITIESAS_WIREFRAME:
5162 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5163 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5165 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5166 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5167 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5169 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5170 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5171 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5173 case ID_VIEW_ENTITIESAS_SKINNED:
5174 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5175 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5177 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5178 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5179 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5182 Sys_FPrintf(SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n");
5188 Sys_FPrintf(SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n");
5192 g_bIgnoreCommands++;
5193 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5194 g_bIgnoreCommands--;
5196 Sys_UpdateWindows(W_ALL);
5199 void MainFrame::OnViewCubicclipping()
5203 g_PrefsDlg.m_bCubicClipping ^= 1;
5204 g_bIgnoreCommands++;
5205 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
5206 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5207 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
5208 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5209 g_bIgnoreCommands--;
5210 g_PrefsDlg.SavePrefs ();
5211 //Map_BuildBrushData ();
5212 Sys_UpdateWindows(W_CAMERA);
5215 void MainFrame::OnViewOpengllighting()
5217 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
5218 g_PrefsDlg.m_bGLLighting ^= 1;
5219 g_PrefsDlg.SavePrefs ();
5220 g_bIgnoreCommands++;
5221 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE);
5222 Sys_UpdateWindows (W_XY|W_CAMERA);
5223 g_bIgnoreCommands--;
5226 void MainFrame::OnSelectionDragedges()
5228 if (g_qeglobals.d_select_mode == sel_edge)
5230 g_qeglobals.d_select_mode = sel_brush;
5231 Sys_UpdateWindows (W_ALL);
5234 SetupVertexSelection ();
5235 if (g_qeglobals.d_numpoints)
5236 g_qeglobals.d_select_mode = sel_edge;
5237 Sys_UpdateWindows (W_ALL);
5241 void MainFrame::OnSelectionDragvertecies()
5243 if (g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint)
5245 g_qeglobals.d_select_mode = sel_brush;
5246 Sys_UpdateWindows (W_ALL);
5249 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5250 if (OnlyPatchesSelected())
5253 } else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5255 SetupVertexSelection ();
5256 if (g_qeglobals.d_numpoints)
5257 g_qeglobals.d_select_mode = sel_vertex;
5259 Sys_UpdateWindows (W_ALL);
5263 void MainFrame::OnSelectionClone()
5268 // called when the escape key is used (either on the main window or on an inspector)
5269 void MainFrame::OnSelectionDeselect()
5275 OnSelectMouserotate();
5278 OnSelectMousescale();
5283 ActiveXY()->KillPathMode();
5286 if (g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0)
5288 g_qeglobals.d_num_move_points = 0;
5289 Sys_UpdateWindows(W_ALL);
5293 SetStatusText(2, " ");
5298 void MainFrame::OnBrushFlipx()
5300 Undo_Start("flip X");
5301 Undo_AddBrushList(&selected_brushes);
5303 Select_FlipAxis (0);
5304 // spog - this does not work - it's a rotate not a flip
5306 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5308 if(b->owner->eclass->fixedsize)
5311 float a = FloatForKey(b->owner, "angle");
5312 a = div ((int)(180 - a), 180).rem;
5313 sprintf (buf, "%d", (int)a);
5314 SetKeyValue(b->owner, "angle", buf);
5315 Brush_Build(b,true,true,false,false); // don't filter
5319 Undo_EndBrushList(&selected_brushes);
5323 void MainFrame::OnBrushFlipy()
5325 Undo_Start("flip Y");
5326 Undo_AddBrushList(&selected_brushes);
5328 Select_FlipAxis (1);
5329 // spog - this does not work - it's a rotate not a flip
5331 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5333 if(b->owner->eclass->fixedsize)
5335 float a = FloatForKey(b->owner, "angle");
5336 if (a == 0 || a == 180 || a == 360)
5338 if ( a == 90 || a == 270)
5352 sprintf (buf, "%d", (int)a);
5353 SetKeyValue(b->owner, "angle", buf);
5354 Brush_Build(b,true,true,false,false); // don't filter
5359 Undo_EndBrushList(&selected_brushes);
5363 void MainFrame::OnBrushFlipz()
5365 Undo_Start("flip Z");
5366 Undo_AddBrushList(&selected_brushes);
5367 Select_FlipAxis (2);
5368 Undo_EndBrushList(&selected_brushes);
5372 void MainFrame::OnBrushRotatex()
5374 Undo_Start("rotate X");
5375 Undo_AddBrushList(&selected_brushes);
5376 Select_RotateAxis (0, 90);
5377 Undo_EndBrushList(&selected_brushes);
5381 void MainFrame::OnBrushRotatey()
5383 Undo_Start("rotate Y");
5384 Undo_AddBrushList(&selected_brushes);
5385 Select_RotateAxis (1, 90);
5386 Undo_EndBrushList(&selected_brushes);
5390 void MainFrame::OnBrushRotatez()
5392 Undo_Start("rotate Z");
5393 Undo_AddBrushList(&selected_brushes);
5394 Select_RotateAxis (2, 90);
5395 Undo_EndBrushList(&selected_brushes);
5399 void MainFrame::OnSelectionArbitraryrotation()
5401 Undo_Start("arbitrary rotation");
5402 Undo_AddBrushList(&selected_brushes);
5406 Undo_EndBrushList(&selected_brushes);
5410 void MainFrame::OnSelectScale()
5412 Undo_Start("scale");
5413 Undo_AddBrushList(&selected_brushes);
5415 Undo_EndBrushList(&selected_brushes);
5419 void MainFrame::OnSelectionMakehollow()
5422 // ActiveXY()->UndoCopy();
5423 Undo_Start("hollow");
5424 Undo_AddBrushList(&selected_brushes);
5426 Undo_EndBrushList(&selected_brushes);
5430 void MainFrame::OnSelectionCsgsubtract()
5432 Undo_Start("CSG subtract");
5437 void MainFrame::OnSelectionCsgmerge()
5439 Undo_Start("CSG merge");
5440 Undo_AddBrushList(&selected_brushes);
5442 Undo_EndBrushList(&selected_brushes);
5446 void MainFrame::OnSelectionNoOutline()
5448 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5449 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) ^ OUTLINE_ZBUF;
5450 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5451 g_bIgnoreCommands++;
5452 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5453 g_bIgnoreCommands--;
5454 Sys_UpdateWindows (W_CAMERA);
5457 void MainFrame::OnSelectionOutlineStyle()
5459 if ((g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) && (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL))
5460 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5461 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL)
5462 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5463 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF)
5464 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5466 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5467 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5468 g_bIgnoreCommands++;
5469 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5470 g_bIgnoreCommands--;
5471 Sys_UpdateWindows (W_CAMERA);
5474 void MainFrame::OnSelectionSelectcompletetall()
5477 ActiveXY()->UndoCopy();
5478 Select_CompleteTall ();
5481 void MainFrame::OnSelectionSelecttouching()
5486 void MainFrame::OnSelectionSelectpartialtall()
5488 Select_PartialTall();
5491 void MainFrame::OnSelectionSelectinside()
5496 void MainFrame::OnViewClipper()
5498 GtkWidget *w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_clipper"));
5499 g_bIgnoreCommands++;
5503 if (ActiveXY()->ClipMode())
5505 ActiveXY()->SetClipMode(false);
5506 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), FALSE);
5509 if (ActiveXY()->RotateMode())
5510 OnSelectMouserotate();
5511 ActiveXY()->SetClipMode(true);
5512 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
5515 g_bIgnoreCommands--;
5518 void MainFrame::OnClipSelected()
5520 if (m_pActiveXY && m_pActiveXY->ClipMode())
5522 Undo_Start("clip selected");
5523 Undo_AddBrushList(&selected_brushes);
5524 m_pActiveXY->Clip();
5525 Undo_EndBrushList(&selected_brushes);
5529 if (g_bPatchBendMode)
5530 Patch_BendHandleENTER();
5531 // else if (g_bPatchBendMode)
5532 // Patch_InsDelHandleENTER();
5536 void MainFrame::OnSplitSelected()
5540 Undo_Start("split selected");
5541 Undo_AddBrushList(&selected_brushes);
5542 m_pActiveXY->SplitClip();
5543 Undo_EndBrushList(&selected_brushes);
5548 void MainFrame::OnFlipClip()
5551 m_pActiveXY->FlipClip();
5554 void MainFrame::OnSelectionConnect()
5556 Undo_Start("connect selected entities");
5557 Undo_AddBrushList(&selected_brushes);
5559 Undo_EndBrushList(&selected_brushes);
5563 void MainFrame::OnSelectionUngroupentity()
5565 Undo_Start("ungroup selected entities");
5566 Undo_AddBrushList(&selected_brushes);
5568 Undo_EndBrushList(&selected_brushes);
5572 void MainFrame::OnSelectionMergeentity()
5574 Undo_Start("merge entity");
5575 Undo_AddBrushList(&selected_brushes);
5576 Select_MergeEntity();
5577 Undo_EndBrushList(&selected_brushes);
5581 void MainFrame::OnSelectionGroupworld()
5583 Undo_Start("group world");
5584 Undo_AddBrushList(&selected_brushes);
5585 Select_GroupEntity(world_entity);
5586 Undo_EndBrushList(&selected_brushes);
5590 void MainFrame::OnSelectionMakeDetail()
5592 Undo_Start("make detail");
5593 Undo_AddBrushList(&selected_brushes);
5594 Select_MakeDetail ();
5595 Undo_EndBrushList(&selected_brushes);
5599 void MainFrame::OnSelectionMakeStructural()
5601 Undo_Start("make structural");
5602 Undo_AddBrushList(&selected_brushes);
5603 Select_MakeStructural ();
5604 Undo_EndBrushList(&selected_brushes);
5608 void MainFrame::OnBspCommand (unsigned int nID)
5610 // make sure we don't attempt to region compile a map with the camera outside the region
5615 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5616 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5617 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2]);
5620 for (i=0 ; i<3 ; i++)
5622 if (vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i])
5624 Sys_FPrintf(SYS_ERR, "The camera must be in the region to start a region compile.\n");
5630 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5631 if (stricmp( currentmap, "unnamed.map") == 0)
5636 if (g_PrefsDlg.m_bSnapShots && (stricmp (currentmap, "unnamed.map") != 0))
5639 if (g_qeglobals.bBSPFrontendPlugin)
5641 char *cmd = (char*)g_slist_nth_data (g_BSPFrontendCommands, nID-CMD_BSPCOMMAND);
5642 g_BSPFrontendTable.m_pfnDispatchBSPCommand (cmd);
5645 RunBsp (bsp_commands[nID-CMD_BSPCOMMAND]);
5649 void MainFrame::OnGrid (unsigned int nID)
5651 if (nID == ID_GRID_025)
5653 g_qeglobals.d_gridsize = 0.25f;
5654 g_qeglobals.d_bSmallGrid = true;
5655 } else if (nID == ID_GRID_05)
5657 g_qeglobals.d_gridsize = 0.5f;
5658 g_qeglobals.d_bSmallGrid = true;
5663 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5664 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5665 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5666 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5667 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5668 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5669 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5670 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5671 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5673 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5674 g_qeglobals.d_bSmallGrid = false;
5679 // SnapTToGrid option: need to check everywhere the grid size is changed
5680 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5681 if (g_PrefsDlg.m_bSnapTToGrid)
5684 Sys_UpdateWindows (W_XY|W_Z);
5687 void MainFrame::OnSnaptogrid()
5689 g_PrefsDlg.m_bSnap ^= 1;
5690 g_PrefsDlg.SavePrefs ();
5692 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
5693 g_bIgnoreCommands++;
5694 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bSnap ? TRUE : FALSE);
5695 g_bIgnoreCommands--;
5698 void MainFrame::OnTexturesShowinuse()
5701 Texture_ShowInuse ();
5703 if (!g_bShowAllShaders)
5704 Sys_Printf("Already showing only in-use textures.\n");
5706 Sys_UpdateWindows( W_TEXTURE );
5710 void MainFrame::OnTexturesShowall()
5715 // do some triggering on/off, if the inspector is already up then hide it
5716 void MainFrame::OnTexturesInspector()
5721 void MainFrame::OnViewNearest(unsigned int nID)
5723 Texture_SetMode(nID);
5726 void MainFrame::OnTextureReplaceall()
5728 FindTextureDialog::show();
5731 void MainFrame::OnToggleLock()
5733 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5735 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
5736 g_bIgnoreCommands++;
5737 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE);
5738 g_bIgnoreCommands--;
5739 g_PrefsDlg.SavePrefs ();
5743 void MainFrame::OnToggleRotatelock()
5745 g_PrefsDlg.m_bRotateLock ^= 1;
5747 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
5748 g_bIgnoreCommands++;
5749 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE);
5750 g_bIgnoreCommands--;
5751 g_PrefsDlg.SavePrefs ();
5755 // use a dialog for direct selection of a texture menu
5756 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5757 void MainFrame::OnTexturesLoad()
5759 char def_path[NAME_MAX];
5762 // check if that works with fs_game (I suspect some more design is needed)
5763 // see how this is done in 1.2?
5764 strcpy (def_path, g_pGameDescription->mEnginePath.GetBuffer());
5765 strcat (def_path, g_pGameDescription->mBaseGame.GetBuffer());
5766 strcat (def_path, "/");
5768 char *dir = dir_dialog (m_pWidget, _("Load textures from path"), def_path);
5772 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5773 Sys_Printf("user select: '%s'\n", dir);
5774 // remove a potential trailing slash?
5775 if (dir[strlen(dir)-1]=='/' || dir[strlen(dir)-1]=='\\')
5776 dir[strlen(dir)-1] = '\0';
5777 char *pouic = MAX(strrchr(dir, '/'),strrchr(dir, '\\'));
5780 strcpy(texture_directory, pouic+1);
5781 Sys_Printf("Loading '%s'\n", texture_directory);
5782 Texture_ShowDirectory();
5785 Sys_FPrintf(SYS_WRN, "Failed to extract the directory\n");
5789 Sys_FPrintf(SYS_WRN, "texture load dialog cancelled\n");
5792 void MainFrame::OnTexturesReloadshaders()
5795 QERApp_ReloadShaders();
5797 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5798 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
5799 Sys_UpdateWindows (W_ALL);
5803 void MainFrame::OnTexturesShadersShow()
5805 g_PrefsDlg.m_bShowShaders ^= 1;
5806 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
5807 g_bIgnoreCommands++;
5808 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
5809 g_bIgnoreCommands--;
5810 Sys_UpdateWindows(W_TEXTURE);
5813 void MainFrame::SetTextureScale(int id)
5819 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5820 g_PrefsDlg.m_nTextureScale = 10;
5821 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_10"));
5823 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5824 g_PrefsDlg.m_nTextureScale = 25;
5825 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_25"));
5827 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5828 g_PrefsDlg.m_nTextureScale = 50;
5829 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_50"));
5831 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5832 g_PrefsDlg.m_nTextureScale = 200;
5833 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_200"));
5836 g_PrefsDlg.m_nTextureScale = 100;
5837 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_100"));
5841 g_bIgnoreCommands++;
5842 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5843 g_bIgnoreCommands--;
5845 Texture_ResetPosition();
5848 void MainFrame::OnTexturewindowScaleup()
5850 switch(g_PrefsDlg.m_nTextureScale) {
5851 // 200, all the way in, don't do anything
5853 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_200);
5856 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5859 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5862 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5867 void MainFrame::OnTexturewindowScaledown()
5869 switch(g_PrefsDlg.m_nTextureScale) {
5871 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5874 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5877 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5880 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_10);
5882 // 10, all the way out, don't do anything
5886 void MainFrame::OnTexturesLoadlist()
5888 DoTextureListDlg ();
5891 void MainFrame::OnTexturesShaderlistonly()
5893 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5894 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget),"menu_textures_shaderlistonly"));
5895 g_bIgnoreCommands++;
5896 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
5897 g_bIgnoreCommands--;
5901 void MainFrame::OnTextureWad(unsigned int nID)
5904 Texture_ShowDirectory (nID);
5905 Sys_UpdateWindows (W_ALL);
5909 void MainFrame::OnMiscBenchmark()
5911 m_pCamWnd->BenchMark();
5914 void MainFrame::OnColorSetoriginal()
5916 for (int i=0 ; i<3 ; i++)
5918 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5919 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5920 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5921 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5922 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5926 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5927 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5928 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5930 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5931 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5932 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5935 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5936 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5937 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5939 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5941 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5943 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5945 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5947 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5948 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5949 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5951 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5952 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5953 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5955 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5957 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5960 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5961 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5963 Sys_UpdateWindows (W_ALL);
5966 void MainFrame::OnColorSetqer()
5968 for (int i=0 ; i<3 ; i++)
5970 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5971 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5972 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5973 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5974 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5977 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5978 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5979 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5981 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5982 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5983 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5985 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5986 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5987 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5989 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5990 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5991 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5993 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5994 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5995 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5997 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5998 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5999 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6001 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6002 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6003 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6005 Sys_UpdateWindows (W_ALL);
6008 void MainFrame::OnColorSetblack()
6010 for (int i=0 ; i<3 ; i++)
6012 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6013 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
6014 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
6015 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6018 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
6019 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
6020 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
6022 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
6023 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
6024 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6026 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
6027 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
6028 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
6030 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6031 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6032 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6034 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6035 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6036 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6038 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
6039 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
6040 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
6042 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
6043 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
6044 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
6046 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6047 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6048 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6050 Sys_UpdateWindows (W_ALL);
6053 /* ydnar: to emulate maya/max/lightwave color schemes */
6054 void MainFrame::OnColorSetydnar()
6056 for (int i=0 ; i<3 ; i++)
6058 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6059 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
6060 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
6061 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
6062 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6065 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
6066 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
6067 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6069 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
6070 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
6071 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
6073 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6074 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6075 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6077 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6078 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6079 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6081 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6082 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6083 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6085 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6086 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6087 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6089 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6090 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6091 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6093 Sys_UpdateWindows (W_ALL);
6096 void MainFrame::OnTexturebk()
6098 DoColor(COLOR_TEXTUREBACK);
6099 Sys_UpdateWindows (W_ALL);
6102 void MainFrame::OnColorsXybk()
6104 DoColor(COLOR_GRIDBACK);
6105 Sys_UpdateWindows (W_ALL);
6108 void MainFrame::OnColorsMajor()
6110 DoColor(COLOR_GRIDMAJOR);
6111 Sys_UpdateWindows (W_ALL);
6114 void MainFrame::OnColorsMinor()
6116 DoColor(COLOR_GRIDMINOR);
6117 Sys_UpdateWindows (W_ALL);
6120 void MainFrame::OnColorsMajor_Alt()
6122 DoColor(COLOR_GRIDMAJOR_ALT);
6123 Sys_UpdateWindows (W_ALL);
6126 void MainFrame::OnColorsMinor_Alt()
6128 DoColor(COLOR_GRIDMINOR_ALT);
6129 Sys_UpdateWindows (W_ALL);
6132 void MainFrame::OnColorsGridtext()
6134 DoColor(COLOR_GRIDTEXT);
6135 Sys_UpdateWindows (W_ALL);
6138 void MainFrame::OnColorsGridblock()
6140 DoColor(COLOR_GRIDBLOCK);
6141 Sys_UpdateWindows (W_ALL);
6144 void MainFrame::OnColorsCameraBack()
6146 DoColor(COLOR_CAMERABACK);
6147 Sys_UpdateWindows (W_ALL);
6150 void MainFrame::OnColorsBrush()
6152 DoColor(COLOR_BRUSHES);
6153 Sys_UpdateWindows (W_ALL);
6156 void MainFrame::OnColorsSelectedbrush()
6158 DoColor(COLOR_SELBRUSHES);
6159 Sys_UpdateWindows (W_ALL);
6162 void MainFrame::OnColorsSelectedbrush3D()
6164 DoColor(COLOR_SELBRUSHES3D);
6165 Sys_UpdateWindows (W_ALL);
6168 void MainFrame::OnColorsClipper()
6170 DoColor(COLOR_CLIPPER);
6171 Sys_UpdateWindows (W_ALL);
6174 void MainFrame::OnColorsViewname()
6176 DoColor(COLOR_VIEWNAME);
6177 Sys_UpdateWindows (W_ALL);
6180 void MainFrame::OnMiscGamma()
6182 float fSave = g_qeglobals.d_savedinfo.fGamma;
6184 if (fSave != g_qeglobals.d_savedinfo.fGamma)
6186 gtk_MessageBox(m_pWidget, _("You must restart Radiant for Gamma settings to take effect."));
6189 void MainFrame::OnMiscFindbrush()
6194 void MainFrame::OnMiscNextleakspot()
6199 void MainFrame::OnMiscPreviousleakspot()
6204 void MainFrame::OnMiscPrintxy()
6209 void MainFrame::OnMiscSelectentitycolor()
6213 CString strColor = ValueForKey(edit_entity, "_color");
6214 if (strColor.GetLength() > 0)
6217 int n = sscanf(strColor,"%f %f %f", &fR, &fG, &fB);
6220 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6221 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6222 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6226 if (inspector_mode == W_ENTITY && (DoColor(COLOR_ENTITY)))
6229 sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6230 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6231 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
6233 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntValueField]), buffer);
6234 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntKeyField]), "_color");
6236 //DK - SOF change to get color to entity quickly
6237 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6238 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6241 Sys_UpdateWindows( W_ALL );
6245 void MainFrame::OnConvertcurves()
6249 for (brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
6253 for (face_t* f = pb->brush_faces ; f ; f=f->next)
6255 if (f->texdef.contents & CONTENTS_LADDER)
6257 f->texdef.contents &= ~CONTENTS_LADDER;
6258 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6263 Map_BuildBrushData();
6267 void MainFrame::OnRegionOff()
6272 void MainFrame::OnRegionSetxy()
6277 void MainFrame::OnRegionSettallbrush()
6279 Map_RegionTallBrush ();
6282 void MainFrame::OnRegionSetbrush()
6287 void MainFrame::OnRegionSetselection()
6289 Map_RegionSelectedBrushes ();
6292 void MainFrame::OnBrush3sided()
6294 Undo_Start("3 sided");
6295 Undo_AddBrushList(&selected_brushes);
6297 Undo_EndBrushList(&selected_brushes);
6301 void MainFrame::OnBrush4sided()
6303 Undo_Start("4 sided");
6304 Undo_AddBrushList(&selected_brushes);
6306 Undo_EndBrushList(&selected_brushes);
6310 void MainFrame::OnBrush5sided()
6312 Undo_Start("5 sided");
6313 Undo_AddBrushList(&selected_brushes);
6315 Undo_EndBrushList(&selected_brushes);
6319 void MainFrame::OnBrush6sided()
6321 Undo_Start("6 sided");
6322 Undo_AddBrushList(&selected_brushes);
6324 Undo_EndBrushList(&selected_brushes);
6328 void MainFrame::OnBrush7sided()
6330 Undo_Start("7 sided");
6331 Undo_AddBrushList(&selected_brushes);
6333 Undo_EndBrushList(&selected_brushes);
6337 void MainFrame::OnBrush8sided()
6339 Undo_Start("8 sided");
6340 Undo_AddBrushList(&selected_brushes);
6342 Undo_EndBrushList(&selected_brushes);
6346 void MainFrame::OnBrush9sided()
6348 Undo_Start("9 sided");
6349 Undo_AddBrushList(&selected_brushes);
6351 Undo_EndBrushList(&selected_brushes);
6355 void MainFrame::OnBrushArbitrarysided()
6357 Undo_Start("arbitrary sided");
6358 Undo_AddBrushList(&selected_brushes);
6360 Undo_EndBrushList(&selected_brushes);
6364 void MainFrame::OnBrushMakecone()
6366 Undo_Start("make cone");
6367 Undo_AddBrushList(&selected_brushes);
6369 Undo_EndBrushList(&selected_brushes);
6373 void MainFrame::OnBrushPrimitivesSphere()
6375 Undo_Start("make sphere");
6376 Undo_AddBrushList(&selected_brushes);
6378 DoSides(false, true);
6380 Undo_EndBrushList(&selected_brushes);
6384 void MainFrame::OnCurvePatchtube()
6386 Undo_Start("make curve cylinder");
6387 Undo_AddBrushList(&selected_brushes);
6388 Patch_BrushToMesh(false);
6389 Sys_UpdateWindows (W_ALL);
6390 Undo_EndBrushList(&selected_brushes);
6394 void MainFrame::OnCurvePatchdensetube()
6396 Undo_Start("dense cylinder");
6397 Undo_AddBrushList(&selected_brushes);
6399 Patch_BrushToMesh(false);
6400 OnCurveInsertAddrow();
6401 Sys_UpdateWindows (W_ALL);
6403 Undo_EndBrushList(&selected_brushes);
6407 void MainFrame::OnCurvePatchverydensetube()
6409 Undo_Start("very dense cylinder");
6410 Undo_AddBrushList(&selected_brushes);
6412 Patch_BrushToMesh(false);
6413 OnCurveInsertAddrow();
6414 OnCurveInsertInsertrow();
6415 OnCurveInsertAddrow();
6416 Sys_UpdateWindows (W_ALL);
6418 Undo_EndBrushList(&selected_brushes);
6422 void MainFrame::OnCurvePatchsquare()
6424 Undo_Start("square cylinder");
6425 Undo_AddBrushList(&selected_brushes);
6427 Patch_BrushToMesh(false, false, false, true);
6428 Sys_UpdateWindows (W_ALL);
6430 Undo_EndBrushList(&selected_brushes);
6434 void MainFrame::OnCurvePatchendcap()
6436 Undo_Start("make end cap");
6437 Undo_AddBrushList(&selected_brushes);
6438 Patch_BrushToMesh(false, false, true);
6439 Sys_UpdateWindows (W_ALL);
6440 Undo_EndBrushList(&selected_brushes);
6444 void MainFrame::OnCurvePatchbevel()
6446 Undo_Start("make bevel");
6447 Undo_AddBrushList(&selected_brushes);
6448 Patch_BrushToMesh(false, true, false);
6449 Sys_UpdateWindows (W_ALL);
6450 Undo_EndBrushList(&selected_brushes);
6454 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel()
6456 Undo_Start("square bevel");
6457 Undo_AddBrushList(&selected_brushes);
6459 Patch_BrushToMesh(false, true, false, true);
6460 Sys_UpdateWindows (W_ALL);
6462 Undo_EndBrushList(&selected_brushes);
6466 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap()
6468 Undo_Start("square endcap");
6469 Undo_AddBrushList(&selected_brushes);
6471 Patch_BrushToMesh(false, false, true, true);
6472 Sys_UpdateWindows (W_ALL);
6474 Undo_EndBrushList(&selected_brushes);
6478 void MainFrame::OnCurvePatchcone()
6480 Undo_Start("make curve cone");
6481 Undo_AddBrushList(&selected_brushes);
6482 Patch_BrushToMesh(true);
6483 Sys_UpdateWindows (W_ALL);
6484 Undo_EndBrushList(&selected_brushes);
6488 void MainFrame::OnCurveSimplepatchmesh()
6490 Undo_Start("make simpe patch mesh");
6491 Undo_AddBrushList(&selected_brushes);
6493 Undo_EndBrushList(&selected_brushes);
6497 void MainFrame::OnCurveInsertInsertcolumn()
6499 Undo_Start("insert (2) columns");
6500 Undo_AddBrushList(&selected_brushes);
6501 Patch_AdjustSelected(true, true, false);
6502 Sys_UpdateWindows(W_ALL);
6503 Undo_EndBrushList(&selected_brushes);
6507 void MainFrame::OnCurveInsertAddcolumn()
6509 Undo_Start("add (2) columns");
6510 Undo_AddBrushList(&selected_brushes);
6511 Patch_AdjustSelected(true, true, true);
6512 Sys_UpdateWindows(W_ALL);
6513 Undo_EndBrushList(&selected_brushes);
6517 void MainFrame::OnCurveInsertInsertrow()
6519 Undo_Start("insert (2) rows");
6520 Undo_AddBrushList(&selected_brushes);
6521 Patch_AdjustSelected(true, false, false);
6522 Sys_UpdateWindows(W_ALL);
6523 Undo_EndBrushList(&selected_brushes);
6527 void MainFrame::OnCurveInsertAddrow()
6529 Undo_Start("add (2) rows");
6530 Undo_AddBrushList(&selected_brushes);
6531 Patch_AdjustSelected(true, false, true);
6532 Sys_UpdateWindows(W_ALL);
6533 Undo_EndBrushList(&selected_brushes);
6537 void MainFrame::OnCurveDeleteFirstcolumn()
6539 Undo_Start("delete first (2) columns");
6540 Undo_AddBrushList(&selected_brushes);
6541 Patch_AdjustSelected(false, true, true);
6542 Sys_UpdateWindows(W_ALL);
6543 Undo_EndBrushList(&selected_brushes);
6547 void MainFrame::OnCurveDeleteLastcolumn()
6549 Undo_Start("delete last (2) columns");
6550 Undo_AddBrushList(&selected_brushes);
6551 Patch_AdjustSelected(false, true, false);
6552 Sys_UpdateWindows(W_ALL);
6553 Undo_EndBrushList(&selected_brushes);
6557 void MainFrame::OnCurveDeleteFirstrow()
6559 Undo_Start("delete first (2) rows");
6560 Undo_AddBrushList(&selected_brushes);
6561 Patch_AdjustSelected(false, false, true);
6562 Sys_UpdateWindows(W_ALL);
6563 Undo_EndBrushList(&selected_brushes);
6567 void MainFrame::OnCurveDeleteLastrow()
6569 Undo_Start("delete last (2) rows");
6570 Undo_AddBrushList(&selected_brushes);
6571 Patch_AdjustSelected(false, false, false);
6572 Sys_UpdateWindows(W_ALL);
6573 Undo_EndBrushList(&selected_brushes);
6577 void MainFrame::OnCurveNegative()
6579 Patch_ToggleInverted();
6580 //Sys_UpdateWindows(W_ALL);
6583 void MainFrame::OnCurveRedisperseRows()
6585 Undo_Start("redisperse rows");
6586 Undo_AddBrushList(&selected_brushes);
6587 Patch_DisperseRows();
6588 Sys_UpdateWindows (W_ALL);
6589 Undo_EndBrushList(&selected_brushes);
6593 void MainFrame::OnCurveRedisperseIntermediateCols()
6595 Undo_Start("redisperse im cols");
6596 Undo_AddBrushList(&selected_brushes);
6597 Patch_DisperseIntermediateColumns();
6598 Sys_UpdateWindows (W_ALL);
6599 Undo_EndBrushList(&selected_brushes);
6603 void MainFrame::OnCurveRedisperseIntermediateRows()
6605 Undo_Start("redisperse im rows");
6606 Undo_AddBrushList(&selected_brushes);
6607 Patch_DisperseIntermediateRows();
6608 Sys_UpdateWindows (W_ALL);
6609 Undo_EndBrushList(&selected_brushes);
6613 void MainFrame::OnCurveMatrixTranspose()
6616 Sys_UpdateWindows (W_ALL);
6619 void MainFrame::OnCurveCap()
6622 Sys_UpdateWindows (W_ALL);
6625 void MainFrame::OnCurveCyclecap()
6627 Patch_CycleCapSelected();
6628 Sys_UpdateWindows (W_ALL);
6631 void MainFrame::OnCurveOverlaySet()
6633 Patch_SetOverlays();
6634 Sys_UpdateWindows(W_ALL);
6637 void MainFrame::OnCurveOverlayClear()
6639 Patch_ClearOverlays();
6640 Sys_UpdateWindows(W_ALL);
6643 void MainFrame::OnCurveThicken()
6645 Undo_Start("curve thicken");
6646 Undo_AddBrushList(&selected_brushes);
6648 Undo_EndBrushList(&selected_brushes);
6653 this can no longer be trigger manually from the menu
6654 happens only once at startup
6656 void MainFrame::OnPluginsRefresh()
6662 // open the Q3Rad manual
6663 void MainFrame::OnHelp()
6665 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6667 help = g_strAppPath;
6668 help += "Q3Rad_Manual/index.htm";
6669 OpenURL(help.GetBuffer());
6672 // FIXME: we'll go towards a unified help thing soon
6673 void MainFrame::OnHelpLinks()
6676 link = g_strAppPath;
6677 link += "links.htm";
6678 OpenURL(link.GetBuffer());
6681 void MainFrame::OnHelpBugreport()
6683 OpenURL("http://www.qeradiant.com/faq/fom-serve/cache/138.html");
6686 void MainFrame::OnHelpCommandlist()
6688 DoCommandListDlg ();
6691 void MainFrame::OnHelpAbout()
6696 void MainFrame::OnPopupSelection()
6698 GtkWidget *menu, *item;
6699 const gchar *labels[] = { _("Select Complete Tall"), _("Select Touching"), _("Select Partial Tall"), _("Select Inside")};
6700 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6701 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6703 menu = gtk_menu_new ();
6705 for (int i = 0; i < 4; i++)
6707 item = gtk_menu_item_new_with_label (labels[i]);
6708 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (HandleCommand),
6709 GINT_TO_POINTER (ids[i]));
6710 gtk_widget_show (item);
6711 gtk_menu_append (GTK_MENU (menu), item);
6714 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6717 void MainFrame::OnViewChange()
6720 //HandlePopup(this, IDR_POPUP_VIEW);
6723 void MainFrame::OnTexturesPopup()
6725 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "render_quality_menu");
6726 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6729 void MainFrame::ToggleCamera()
6732 m_bCamPreview = false;
6734 m_bCamPreview = true;
6737 void MainFrame::OnViewCameraupdate()
6739 Sys_UpdateWindows(W_CAMERA);
6742 void MainFrame::OnSelectMouserotate()
6744 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mouserotate"));
6745 g_bIgnoreCommands++;
6749 if (ActiveXY()->ClipMode())
6751 if (ActiveXY()->RotateMode())
6753 // SetRotateMode(false) always works
6754 ActiveXY()->SetRotateMode(false);
6755 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6758 // may not work if no brush selected, see return value
6759 if (ActiveXY()->SetRotateMode(true))
6760 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6762 // if MFC called, we need to set back to FALSE ourselves
6763 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6766 g_bIgnoreCommands--;
6769 void MainFrame::OnSelectMousescale()
6771 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mousescale"));
6772 g_bIgnoreCommands++;
6776 if (ActiveXY()->ClipMode())
6778 if (ActiveXY()->RotateMode())
6780 // SetRotateMode(false) always works
6781 ActiveXY()->SetRotateMode(false);
6782 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6784 if (ActiveXY()->ScaleMode())
6786 ActiveXY()->SetScaleMode(false);
6787 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6790 ActiveXY()->SetScaleMode(true);
6791 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6794 g_bIgnoreCommands--;
6797 void MainFrame::OnScalelockx()
6799 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockx"));
6800 g_bIgnoreCommands++;
6802 if (g_nScaleHow & SCALE_X)
6804 g_nScaleHow ^= SCALE_X;
6805 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6808 g_nScaleHow |= SCALE_X;
6809 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6811 g_bIgnoreCommands--;
6814 void MainFrame::OnScalelocky()
6816 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelocky"));
6817 g_bIgnoreCommands++;
6819 if (g_nScaleHow & SCALE_Y)
6821 g_nScaleHow ^= SCALE_Y;
6822 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6825 g_nScaleHow |= SCALE_Y;
6826 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6828 g_bIgnoreCommands--;
6831 void MainFrame::OnScalelockz()
6833 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockz"));
6834 g_bIgnoreCommands++;
6836 if (g_nScaleHow & SCALE_Z)
6838 g_nScaleHow ^= SCALE_Z;
6839 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6842 g_nScaleHow |= SCALE_Z;
6843 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6845 g_bIgnoreCommands--;
6848 void MainFrame::OnDontselectcurve()
6850 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
6851 g_bIgnoreCommands++;
6852 g_PrefsDlg.m_bSelectCurves ^= 1;
6853 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
6854 g_bIgnoreCommands--;
6857 void MainFrame::OnPatchToggleBox()
6859 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
6860 g_bIgnoreCommands++;
6861 g_bPatchShowBounds ^= 1;
6862 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
6863 g_bIgnoreCommands--;
6864 Sys_UpdateWindows(W_ALL);
6867 void MainFrame::OnPatchWireframe()
6869 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_wireframe"));
6870 g_bIgnoreCommands++;
6871 g_bPatchWireFrame ^= 1;
6872 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWireFrame) ? TRUE : FALSE);
6873 g_bIgnoreCommands--;
6874 Sys_UpdateWindows(W_ALL);
6877 void MainFrame::OnPatchBend()
6879 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
6880 g_bIgnoreCommands++;
6882 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
6883 g_bIgnoreCommands--;
6884 Sys_UpdateWindows(W_ALL);
6887 void MainFrame::OnPatchWeld()
6889 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
6890 g_bIgnoreCommands++;
6892 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
6893 g_bIgnoreCommands--;
6894 Sys_UpdateWindows(W_ALL);
6897 void MainFrame::OnPatchDrilldown()
6899 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
6900 g_bIgnoreCommands++;
6901 g_bPatchDrillDown ^= 1;
6902 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
6903 g_bIgnoreCommands--;
6904 Sys_UpdateWindows(W_ALL);
6907 void MainFrame::OnShowEntities()
6909 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "view_entitiesas_menu"); // use pointer to existing menu object
6910 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6913 void MainFrame::OnDropGroupName()
6916 char* name = DoNameDlg ("Name Selection");
6921 Sys_UpdateWindows (W_ALL);
6927 void MainFrame::OnDropGroupNewgroup()
6932 void MainFrame::OnDropGroupRemove()
6935 Select_AddToGroup("World");
6936 Sys_UpdateWindows (W_ALL);
6940 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6941 void MainFrame::OnFaceFit()
6946 void MainFrame::OnDontselectmodel()
6948 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
6949 g_bIgnoreCommands++;
6950 g_PrefsDlg.m_bSelectModels ^= 1;
6951 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
6952 g_bIgnoreCommands--;
6955 void MainFrame::OnViewTexture()
6957 if (FloatingGroupDialog()) // QE4 style
6959 if (inspector_mode == W_TEXTURE)
6961 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
6962 widget_delete_hide (g_qeglobals_gui.d_entity);
6964 gtk_widget_show (g_qeglobals_gui.d_entity);
6967 gtk_widget_show (g_qeglobals_gui.d_entity);
6968 SetInspectorMode (W_TEXTURE);
6973 void MainFrame::OnPatchInspector()
6975 TogglePatchInspector();
6978 void MainFrame::OnCurveNegativeTextureX()
6980 Patch_InvertTexture(false);
6981 //Sys_UpdateWindows(W_ALL);
6984 void MainFrame::OnCurveNegativeTextureY()
6986 Patch_InvertTexture(true);
6987 //Sys_UpdateWindows(W_ALL);
6990 void MainFrame::OnCurveInsertcolumn()
6992 if (&selected_brushes == selected_brushes.next)
6994 Undo_Start("insert colum");
6995 Undo_AddBrushList(&selected_brushes);
6996 //Patch_AdjustSelectedRowCols(0, 2);
6997 Patch_AdjustSelected(true, true, true);
6998 Sys_UpdateWindows(W_ALL);
6999 Undo_EndBrushList(&selected_brushes);
7003 void MainFrame::OnCurveInsertrow()
7005 if (&selected_brushes == selected_brushes.next)
7007 Undo_Start("insert row");
7008 Undo_AddBrushList(&selected_brushes);
7009 //Patch_AdjustSelectedRowCols(2, 0);
7010 Patch_AdjustSelected(true, false, true);
7011 Sys_UpdateWindows(W_ALL);
7012 Undo_EndBrushList(&selected_brushes);
7016 void MainFrame::OnCurveDeletecolumn()
7018 if (&selected_brushes == selected_brushes.next)
7020 Undo_Start("delete column");
7021 Undo_AddBrushList(&selected_brushes);
7022 Patch_AdjustSelected(false, true, true);
7023 Sys_UpdateWindows(W_ALL);
7024 Undo_EndBrushList(&selected_brushes);
7028 void MainFrame::OnCurveDeleterow()
7030 if (&selected_brushes == selected_brushes.next)
7032 Undo_Start("delete row");
7033 Undo_AddBrushList(&selected_brushes);
7034 Patch_AdjustSelected(false, false, true);
7035 Sys_UpdateWindows(W_ALL);
7036 Undo_EndBrushList(&selected_brushes);
7040 void MainFrame::OnPatchTab()
7042 if (g_bPatchBendMode)
7043 Patch_BendHandleTAB();
7044 // else if (g_bPatchInsertMode)
7045 // Patch_InsDelHandleTAB();
7048 // check to see if the selected brush is part of a func group
7049 // if it is, deselect everything and reselect the next brush
7051 brush_t *b2, *b = selected_brushes.next;
7053 if (b != &selected_brushes)
7055 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7059 for (b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext)
7067 if (b2 == &e->brushes)
7070 Select_Brush(b2, false);
7071 Sys_UpdateWindows(W_ALL);
7077 void MainFrame::OnSelectFuncGroup()
7079 // check to see if the selected brush is part of a func group
7080 // if it is, deselect everything and reselect the next brush
7082 brush_t *b = selected_brushes.next;
7084 if (b != &selected_brushes)
7086 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7089 Select_SelectGroup(e);
7094 void MainFrame::OnCameraForward(bool keydown)
7096 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7100 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7101 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7102 Sys_UpdateWindows (nUpdate);
7107 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7109 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7113 void MainFrame::OnCameraBack(bool keydown)
7115 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7119 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7120 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7121 Sys_UpdateWindows (nUpdate);
7126 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7128 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7132 void MainFrame::OnCameraLeft(bool keydown)
7136 if (m_pCamWnd->m_bFreeMove)
7138 OnCameraStrafeleft(keydown);
7143 if (g_PrefsDlg.m_bCamDiscrete)
7147 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7148 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7149 Sys_UpdateWindows (nUpdate);
7154 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7156 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7160 void MainFrame::OnCameraRight(bool keydown)
7164 if (m_pCamWnd->m_bFreeMove)
7166 OnCameraStraferight(keydown);
7171 if (g_PrefsDlg.m_bCamDiscrete)
7175 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7176 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7177 Sys_UpdateWindows (nUpdate);
7182 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7184 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7188 void MainFrame::OnCameraUp()
7190 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7191 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7192 Sys_UpdateWindows (nUpdate);
7195 void MainFrame::OnCameraDown()
7197 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7198 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7199 Sys_UpdateWindows (nUpdate);
7202 void MainFrame::OnCameraAngleup()
7204 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
7205 if (m_pCamWnd->Camera()->angles[0] > 85)
7206 m_pCamWnd->Camera()->angles[0] = 85;
7207 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7210 void MainFrame::OnCameraAngledown()
7212 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7213 if (m_pCamWnd->Camera()->angles[0] < -85)
7214 m_pCamWnd->Camera()->angles[0] = -85;
7215 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7218 void MainFrame::OnCameraStrafeleft(bool keydown)
7220 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7223 if (!m_pCamWnd->m_bFreeMove)
7227 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7228 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7229 Sys_UpdateWindows (nUpdate);
7236 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7238 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7241 void MainFrame::OnCameraStraferight(bool keydown)
7243 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7246 if (!m_pCamWnd->m_bFreeMove)
7250 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7251 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7252 Sys_UpdateWindows (nUpdate);
7259 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7261 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7264 void MainFrame::OnGridToggle()
7266 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7267 Sys_UpdateWindows (W_XY|W_Z);
7270 void MainFrame::OnViewCrosshair()
7273 Sys_UpdateWindows (W_XY);
7276 void MainFrame::OnSelectionTextureRotateclock()
7278 Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7281 void MainFrame::OnSelectionTextureRotatecounter()
7283 Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7286 void MainFrame::OnSelectionTextureScaleup()
7288 Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7291 void MainFrame::OnSelectionTextureScaledown()
7293 Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7296 void MainFrame::OnSelectionTextureScaleLeft()
7298 Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7301 void MainFrame::OnSelectionTextureScaleRight()
7303 Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7306 void MainFrame::OnSelectionTextureShiftleft()
7308 Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7311 void MainFrame::OnSelectionTextureShiftright()
7313 Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7316 void MainFrame::OnSelectionTextureShiftup()
7318 Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7321 void MainFrame::OnSelectionTextureShiftdown()
7323 Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7326 void MainFrame::OnGridPrev()
7329 if (g_qeglobals.d_gridsize == 1)
7331 g_qeglobals.d_gridsize = 0.5;
7332 g_qeglobals.d_bSmallGrid = true;
7333 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7334 } else if (g_qeglobals.d_gridsize == 0.5)
7336 g_qeglobals.d_gridsize = 0.25;
7337 g_qeglobals.d_bSmallGrid = true;
7338 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7339 } else if (g_qeglobals.d_gridsize > 1)
7341 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7342 g_qeglobals.d_bSmallGrid = false;
7344 switch ((int)g_qeglobals.d_gridsize)
7346 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7347 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7348 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7349 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7350 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7351 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7352 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7353 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7354 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7360 // SnapTToGrid option: need to check everywhere the grid size is changed
7361 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7362 if (g_PrefsDlg.m_bSnapTToGrid)
7366 g_bIgnoreCommands++;
7367 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7368 g_bIgnoreCommands--;
7370 Sys_UpdateWindows(W_XY | W_Z);
7373 void MainFrame::OnGridNext()
7376 if (g_qeglobals.d_gridsize == 0.25)
7378 g_qeglobals.d_gridsize = 0.5;
7379 g_qeglobals.d_bSmallGrid = true;
7380 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7381 } else if (g_qeglobals.d_gridsize == 0.5)
7383 g_qeglobals.d_gridsize = 1;
7384 g_qeglobals.d_bSmallGrid = false;
7385 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7386 } else if (g_qeglobals.d_gridsize < 256)
7388 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7389 g_qeglobals.d_bSmallGrid = false;
7391 switch ((int)g_qeglobals.d_gridsize)
7393 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7394 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7395 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7396 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7397 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7398 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7399 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7400 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7401 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7402 default: item = NULL;
7408 // SnapTToGrid option: need to check everywhere the grid size is changed
7409 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7410 if (g_PrefsDlg.m_bSnapTToGrid)
7414 g_bIgnoreCommands++;
7415 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7416 g_bIgnoreCommands--;
7418 Sys_UpdateWindows(W_XY | W_Z);
7421 void MainFrame::OnSelectionMovedown()
7423 if (&selected_brushes == selected_brushes.next)
7425 Undo_Start("move down");
7426 Undo_AddBrushList(&selected_brushes);
7429 vAmt[0] = vAmt[1] = 0.0;
7430 vAmt[2] = -g_qeglobals.d_gridsize;
7432 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7434 Undo_EndBrushList(&selected_brushes);
7438 void MainFrame::OnSelectionMoveup()
7440 if (&selected_brushes == selected_brushes.next)
7442 Undo_Start("move up");
7443 Undo_AddBrushList(&selected_brushes);
7446 vAmt[0] = vAmt[1] = 0.0;
7447 vAmt[2] = g_qeglobals.d_gridsize;
7449 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7451 Undo_EndBrushList(&selected_brushes);
7455 void MainFrame::OnSelectionPrint()
7457 for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7461 void MainFrame::OnSelectionTogglesizepaint()
7463 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7464 Sys_UpdateWindows(W_XY);
7467 void MainFrame::OnPatchNaturalize()
7469 Patch_NaturalizeSelected();
7470 Sys_UpdateWindows (W_ALL);
7473 void MainFrame::OnSnapToGrid()
7475 if (&selected_brushes == selected_brushes.next)
7477 Undo_Start("snap selection to grid");
7478 Undo_AddBrushList(&selected_brushes);
7479 //Select_SnapToGrid();
7480 for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7483 Patch_SnapToGrid(pb->pPatch);
7485 Brush_SnapToGrid(pb);
7487 Sys_UpdateWindows (W_ALL);
7488 Undo_EndBrushList(&selected_brushes);
7492 void MainFrame::OnSelectAll()
7497 void MainFrame::OnSelectionInvert()
7500 Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7504 void PerformFiltering ()
7510 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7511 brush->bFiltered = FilterBrush( brush );
7513 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7514 brush->bFiltered = FilterBrush( brush );
7517 void MainFrame::OnFilterAreaportals()
7519 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7520 g_bIgnoreCommands++;
7521 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7522 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7524 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7525 g_bIgnoreCommands--;
7527 Sys_UpdateWindows (W_XY|W_CAMERA);
7530 void MainFrame::OnFilterCaulk()
7532 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7533 g_bIgnoreCommands++;
7534 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7535 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7537 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7538 g_bIgnoreCommands--;
7540 Sys_UpdateWindows (W_XY|W_CAMERA);
7543 void MainFrame::OnFilterClips()
7545 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7546 g_bIgnoreCommands++;
7547 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7548 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7550 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7551 g_bIgnoreCommands--;
7553 Sys_UpdateWindows (W_XY|W_CAMERA);
7556 void MainFrame::OnFilterBotClips()
7558 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7559 g_bIgnoreCommands++;
7560 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7561 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7563 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7564 g_bIgnoreCommands--;
7566 Sys_UpdateWindows (W_XY|W_CAMERA);
7569 void MainFrame::OnFilterStructural()
7571 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7572 g_bIgnoreCommands++;
7573 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7574 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7576 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7577 g_bIgnoreCommands--;
7579 Sys_UpdateWindows (W_XY|W_CAMERA);
7582 void MainFrame::OnFilterDetails()
7584 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7585 g_bIgnoreCommands++;
7586 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7587 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7589 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7590 g_bIgnoreCommands--;
7592 Sys_UpdateWindows (W_XY|W_CAMERA);
7595 void MainFrame::OnFilterEntities()
7597 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7598 g_bIgnoreCommands++;
7599 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7600 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7602 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7603 g_bIgnoreCommands--;
7605 Sys_UpdateWindows (W_XY|W_CAMERA);
7608 void MainFrame::OnFilterHintsskips()
7610 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7611 g_bIgnoreCommands++;
7612 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7613 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7615 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7616 g_bIgnoreCommands--;
7618 Sys_UpdateWindows (W_XY|W_CAMERA);
7621 void MainFrame::OnFilterLights()
7623 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7624 g_bIgnoreCommands++;
7625 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7626 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7628 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7629 g_bIgnoreCommands--;
7631 Sys_UpdateWindows (W_XY|W_CAMERA);
7634 void MainFrame::OnFilterLiquids()
7636 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7637 g_bIgnoreCommands++;
7638 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7639 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7641 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7642 g_bIgnoreCommands--;
7644 Sys_UpdateWindows (W_XY|W_CAMERA);
7647 void MainFrame::OnFilterModels()
7649 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7650 g_bIgnoreCommands++;
7651 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7652 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7654 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7655 g_bIgnoreCommands--;
7657 Sys_UpdateWindows (W_XY|W_CAMERA);
7660 void MainFrame::OnFilterPatches()
7662 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7663 g_bIgnoreCommands++;
7664 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7665 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7667 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7668 g_bIgnoreCommands--;
7670 Sys_UpdateWindows (W_XY|W_CAMERA);
7673 void MainFrame::OnFilterPaths()
7675 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7676 g_bIgnoreCommands++;
7677 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7678 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7680 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7681 g_bIgnoreCommands--;
7683 Sys_UpdateWindows (W_XY|W_CAMERA);
7686 void MainFrame::OnFilterClusterportals()
7688 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7689 g_bIgnoreCommands++;
7690 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7691 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7693 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7694 g_bIgnoreCommands--;
7696 Sys_UpdateWindows (W_XY|W_CAMERA);
7699 void MainFrame::OnFilterLightgrid()
7701 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7702 g_bIgnoreCommands++;
7703 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7704 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7706 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7707 g_bIgnoreCommands--;
7709 Sys_UpdateWindows (W_XY|W_CAMERA);
7712 void MainFrame::OnFilterTranslucent()
7714 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7715 g_bIgnoreCommands++;
7716 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7717 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7719 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7720 g_bIgnoreCommands--;
7722 Sys_UpdateWindows (W_XY|W_CAMERA);
7725 void MainFrame::OnFilterTriggers()
7727 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7728 g_bIgnoreCommands++;
7729 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7730 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7732 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7733 g_bIgnoreCommands--;
7735 Sys_UpdateWindows (W_XY|W_CAMERA);
7738 void MainFrame::OnFilterWorld()
7740 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7741 g_bIgnoreCommands++;
7742 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7743 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7745 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7746 g_bIgnoreCommands--;
7748 Sys_UpdateWindows (W_XY|W_CAMERA);
7758 // =============================================================================
7759 // leo: Unused functions, not called anywhere from the code (need to check)
7761 void MainFrame::OnViewConsole()
7763 if (FloatingGroupDialog()) // QE4 style
7765 if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7767 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7768 widget_delete_hide (g_qeglobals_gui.d_entity);
7770 gtk_widget_show (g_qeglobals_gui.d_entity);
7773 gtk_widget_show (g_qeglobals_gui.d_entity);
7774 SetInspectorMode(W_CONSOLE);
7779 void MainFrame::OnCurveFreeze()
7784 void MainFrame::OnCurveUnFreeze()
7786 Patch_UnFreeze(false);
7789 void MainFrame::OnCurveUnFreezeAll()
7791 Patch_UnFreeze(true);
7794 void MainFrame::OnSelectReselect()
7799 void MainFrame::OnSelectionTextureFit()
7801 // TODO: Add your command handler code here
7804 void MainFrame::OnPatchEnter()
7809 void MainFrame::OnDropGroupAddtoWorld()
7812 Select_AddToGroup("World");
7813 Sys_UpdateWindows (W_ALL);