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 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
126 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
127 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
128 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
129 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
130 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
131 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
132 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
133 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
134 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
135 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
136 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
137 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
138 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
139 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
140 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
141 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
142 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
143 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
144 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
145 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
146 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
147 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
148 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
149 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
150 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
151 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
152 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
153 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
154 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
155 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
156 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
157 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
158 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
159 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
160 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
161 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
162 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
163 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
164 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
165 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
166 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
167 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
168 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
169 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
170 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
171 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
172 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
173 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
174 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
175 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
176 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
177 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
178 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
179 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
180 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
181 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
182 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
183 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
184 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
185 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
186 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
187 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
188 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
189 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
190 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
191 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
192 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
193 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
194 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
195 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
196 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
197 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
198 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
199 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
200 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
201 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
202 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
203 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
204 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
205 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
206 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
207 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
208 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
209 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
210 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
211 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
212 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
213 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
214 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
215 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
216 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
217 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
218 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
219 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
220 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
221 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
222 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
223 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
224 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
225 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
226 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
227 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
228 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
229 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
230 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
231 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
232 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
233 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
234 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
235 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
236 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
237 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
238 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
239 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
240 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
241 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
242 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
243 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
244 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
245 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
246 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
247 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
248 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
249 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
250 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
251 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
252 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
253 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
254 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
255 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
256 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
257 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
258 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
259 {"FilterCaulk", '6', RAD_ALT , ID_FILTER_CAULK, "menu_filter_caulk"},
260 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
261 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
262 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
263 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
264 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
265 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
266 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
267 {"FilterStructural", 'D', RAD_CONTROL|RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
268 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
269 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
270 {"FilterTriggers", 'T', RAD_CONTROL|RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
271 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
272 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
273 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
276 int g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
280 {"Space", GDK_space},
281 {"Backspace", GDK_BackSpace},
282 {"Escape", GDK_Escape},
284 {"Insert", GDK_Insert},
285 {"Delete", GDK_Delete},
286 {"PageUp", GDK_Prior},
287 {"PageDown", GDK_Next},
291 {"Right", GDK_Right},
305 {"Return", GDK_Return},
306 {"Comma", GDK_comma},
307 {"Period", GDK_period},
308 {"Plus", GDK_KP_Add},
309 {"Multiply", GDK_multiply},
310 {"Subtract", GDK_KP_Subtract},
311 {"NumPad0", GDK_KP_0},
312 {"NumPad1", GDK_KP_1},
313 {"NumPad2", GDK_KP_2},
314 {"NumPad3", GDK_KP_3},
315 {"NumPad4", GDK_KP_4},
316 {"NumPad5", GDK_KP_5},
317 {"NumPad6", GDK_KP_6},
318 {"NumPad7", GDK_KP_7},
319 {"NumPad8", GDK_KP_8},
320 {"NumPad9", GDK_KP_9},
327 int g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
329 // =============================================================================
332 void WINAPI Sys_UpdateWindows (int nBits)
334 g_nUpdateBits |= nBits;
337 // =============================================================================
340 // Gef: Separate handling for keyup events
341 void HandleKeyUp (GtkWidget *widget, gpointer data)
343 int id = GPOINTER_TO_INT (data);
345 Sys_Printf("HandleKeyUp: %d\n", id);
348 if(g_bIgnoreCommands)
353 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (FALSE); break;
354 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (FALSE); break;
355 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (FALSE); break;
356 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (FALSE); break;
357 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (FALSE); break;
358 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (FALSE); break;
362 gint HandleCommand (GtkWidget *widget, gpointer data)
364 int id = GPOINTER_TO_INT (data);
366 Sys_Printf("HandleCommand %d\n", id);
369 if ( g_bIgnoreCommands ) {
371 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
376 if (id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END) g_pParentWnd->OnTextureWad (id);
377 else if (id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END) g_pParentWnd->OnBspCommand (id);
378 else if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4) g_pParentWnd->OnMru (id);
379 else if (id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE)
381 if (GTK_CHECK_MENU_ITEM (widget)->active)
382 g_pParentWnd->OnViewNearest (id);
383 } else if (id >= ID_GRID_025 && id <= ID_GRID_256) g_pParentWnd->OnGrid (id);
384 else if (id >= ID_PLUGIN_START && id <= ID_PLUGIN_END)
387 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
388 g_pParentWnd->OnPlugIn (id, str);
389 } else if (id >= ID_ENTITY_START && id <= ID_ENTITY_END)
392 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
393 g_pParentWnd->ActiveXY()->OnEntityCreate (str);
397 case ID_FILE_NEW: g_pParentWnd->OnFileNew (); break;
398 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
399 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen (); break;
400 case ID_FILE_SAVE: g_pParentWnd->OnFileSave (); break;
401 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas (); break;
402 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap (); break;
403 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion (); break;
404 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject (); break;
405 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject (); break;
406 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings (); break;
407 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile (); break;
408 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate (); break;
409 case ID_FILE_EXIT: g_pParentWnd->OnFileExit (); break;
410 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap (); break;
411 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo (); break;
412 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo (); break;
413 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush (); break;
414 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush (); break;
415 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera (); break;
416 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete (); break;
417 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo (); break;
418 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo (); break;
419 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts (); break;
420 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab (); break;
421 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab (); break;
422 case ID_PREFS: g_pParentWnd->OnPrefs (); break;
423 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera (); break;
424 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole (); break;
425 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity (); break;
426 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups (); break;
427 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview (); break;
428 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz (); break;
429 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz (); break;
430 case ID_TOGGLEZ: g_pParentWnd->OnTogglez (); break;
431 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter (); break;
432 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor (); break;
433 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor (); break;
434 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview (); break;
435 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview (); break;
436 case ID_VIEW_XY: g_pParentWnd->OnViewXy (); break;
437 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide (); break;
438 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront (); break;
439 case ID_VIEW_100: g_pParentWnd->OnView100 (); break;
440 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin (); break;
441 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout (); break;
442 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100 (); break;
443 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin (); break;
444 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout (); break;
445 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein (); break;
446 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout (); break;
447 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames (); break;
448 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks (); break;
449 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates (); break;
450 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline (); break;
451 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes (); break;
452 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone (); break;
453 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles (); break;
454 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected (); break;
455 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden (); break;
456 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
457 case ID_VIEW_ENTITIESAS_WIREFRAME:
458 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
459 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
460 case ID_VIEW_ENTITIESAS_SKINNED:
461 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
462 g_pParentWnd->OnEntitiesSetViewAs(id);
464 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping (); break;
465 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting (); break;
466 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges (); break;
467 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies (); break;
468 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone (); break;
469 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect (); break;
470 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx (); break;
471 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy (); break;
472 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz (); break;
473 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex (); break;
474 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey (); break;
475 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez (); break;
476 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation (); break;
477 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale (); break;
478 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow (); break;
479 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract (); break;
480 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge (); break;
481 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline (); break;
482 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle (); break;
483 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall (); break;
484 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching (); break;
485 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall (); break;
486 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside (); break;
487 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft (); break;
488 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright (); break;
489 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup (); break;
490 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown (); break;
491 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper (); break;
492 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected (); break;
493 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected (); break;
494 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip (); break;
495 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect (); break;
496 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity (); break;
497 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
498 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
499 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail (); break;
500 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural (); break;
501 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid (); break;
502 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse (); break;
503 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall (); break;
504 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector (); break;
505 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall (); break;
506 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock (); break;
507 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock (); break;
508 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad (); break;
509 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders (); break;
510 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow (); break;
511 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
512 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
513 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
514 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
515 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
516 g_pParentWnd->SetTextureScale (id);
518 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist (); break;
519 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly (); break;
520 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup (); break;
521 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown (); break;
522 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark (); break;
523 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal (); break;
524 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer (); break;
525 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack (); break;
526 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar (); break; /* ydnar */
527 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk (); break;
528 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk (); break;
529 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor (); break;
530 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor (); break;
531 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext (); break;
532 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock (); break;
533 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack (); break;
534 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush (); break;
535 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush (); break;
536 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D (); break;
537 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper (); break;
538 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname (); break;
539 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma (); break;
540 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush (); break;
541 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot (); break;
542 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot (); break;
543 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy (); break;
544 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor (); break;
545 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves (); break;
546 case ID_REGION_OFF: g_pParentWnd->OnRegionOff (); break;
547 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy (); break;
548 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush (); break;
549 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush (); break;
550 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection (); break;
551 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided (); break;
552 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided (); break;
553 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided (); break;
554 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided (); break;
555 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided (); break;
556 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided (); break;
557 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided (); break;
558 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided (); break;
559 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone (); break;
560 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere (); break;
561 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube (); break;
562 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube (); break;
563 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube (); break;
564 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare (); break;
565 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap (); break;
566 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel (); break;
567 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel (); break;
568 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap();break;
569 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone (); break;
570 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh (); break;
571 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn (); break;
572 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn (); break;
573 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow (); break;
574 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow (); break;
575 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn (); break;
576 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn (); break;
577 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow (); break;
578 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow (); break;
579 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative (); break;
580 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows (); break;
581 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols (); break;
582 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows (); break;
583 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose (); break;
584 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap (); break;
585 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap (); break;
586 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet (); break;
587 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear (); break;
588 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken (); break;
589 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh (); break;
590 case ID_HELP: g_pParentWnd->OnHelp (); break;
591 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
592 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
593 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist (); break;
594 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout (); break;
595 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel (); break;
596 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals (); break;
597 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk (); break;
598 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural (); break;
599 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips (); break;
600 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips (); break;
601 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails (); break;
602 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities (); break;
603 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips (); break;
604 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights (); break;
605 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids (); break;
606 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels (); break;
607 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches (); break;
608 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent (); break;
609 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers (); break;
610 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld (); break;
611 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths (); break;
612 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals (); break;
613 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid (); break;
615 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection (); break;
616 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange (); break;
617 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup (); break;
618 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera (); break;
619 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate (); break;
620 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate (); break;
621 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale (); break;
622 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx (); break;
623 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky (); break;
624 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz (); break;
625 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve (); break;
626 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox (); break;
627 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe (); break;
628 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend (); break;
629 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld (); break;
630 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown (); break;
631 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName (); break;
632 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup (); break;
633 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove (); break;
634 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities (); break;
636 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit (); break;
637 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture (); break;
638 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector (); break;
639 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX (); break;
640 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY (); break;
641 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn (); break;
642 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow (); break;
643 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn (); break;
644 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow (); break;
645 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab (); break;
646 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (TRUE); break;
647 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (TRUE); break;
648 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (TRUE); break;
649 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (TRUE); break;
650 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp (); break;
651 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown (); break;
652 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup (); break;
653 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown (); break;
654 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (TRUE); break;
655 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (TRUE); break;
656 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle (); break;
657 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole (); break;
658 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair (); break;
659 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit (); break;
660 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock (); break;
661 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter (); break;
662 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup (); break;
663 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown (); break;
664 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft (); break;
665 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright (); break;
666 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup (); break;
667 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown (); break;
668 case ID_GRID_PREV: g_pParentWnd->OnGridPrev (); break;
669 case ID_GRID_NEXT: g_pParentWnd->OnGridNext (); break;
670 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft (); break;
671 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight (); break;
672 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown (); break;
673 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup (); break;
674 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint (); break;
675 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint (); break;
676 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize (); break;
677 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid (); break;
678 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll (); break;
679 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert (); break;
685 static gint timer (gpointer data)
687 MainFrame *wnd = (MainFrame*)data;
692 static gint mainframe_delete (GtkWidget *widget, GdkEvent *event, gpointer data)
694 MainFrame *wnd = (MainFrame*)data;
698 if (ConfirmModified())
701 g_qeglobals_gui.d_edit = NULL;
706 static void mainframe_destroy (GtkWidget *widget, gpointer data)
708 MainFrame *wnd = (MainFrame*)data;
710 // avoid saving prefs when the app is minimized
711 if (g_pParentWnd->IsSleeping())
713 Sys_Printf("Shutdown while sleeping, not saving prefs\n");
714 g_qeglobals.disable_ini = true;
717 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
718 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
719 g_PrefsDlg.SavePrefs ();
724 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
725 // and modules / plugins decide to save some stuff
726 g_pParentWnd->GetPlugInMgr().Shutdown();
731 g_PrefsDlg.Destroy ();
732 g_dlgSurface.Destroy ();
733 g_dlgFind.Destroy ();
734 g_PatchDialog.Destroy ();
739 static gint mainframe_keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
741 unsigned int code = gdk_keyval_to_upper(event->keyval);
743 if(code == GDK_ISO_Left_Tab) {
748 Sys_Printf("key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK);
751 // return only if Texture Viewport is in main window, otherwise if Tex viewport is in it's own window
752 // the Filter GtkEntry won't release focus
753 if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus(GTK_WINDOW(widget)) )
754 if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) )
758 Sys_Printf("mainframe_keypress processing into a command\n");
760 for (int i = 0; i < g_nCommandCount; i++)
762 if (g_Commands[i].m_nKey == code) // find a match?
765 unsigned int nState = 0;
768 if ((event->state & GDK_CONTROL_MASK) != 0)
769 nState |= RAD_CONTROL;
770 if ((event->state & GDK_SHIFT_MASK) != 0)
772 if ((g_Commands[i].m_nModifiers & 0x7) == nState)
774 HandleCommand (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
775 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
784 static gint mainframe_keyrelease (GtkWidget* widget, GdkEventKey* event, gpointer data)
786 unsigned int code = gdk_keyval_to_upper(event->keyval);
788 if (gtk_accelerator_valid (event->keyval, (GdkModifierType)0))
791 for (int i = 0; i < g_nCommandCount; i++)
793 if (g_Commands[i].m_nKey == code) // find a match?
795 if(!g_Commands[i].m_nModifiers)
797 // Gef: Only call the handler if it's a key that needs keyup events
798 switch (g_Commands[i].m_nCommand)
800 case ID_CAMERA_FORWARD:
803 case ID_CAMERA_RIGHT:
804 case ID_CAMERA_STRAFELEFT:
805 case ID_CAMERA_STRAFERIGHT:
807 HandleKeyUp (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
808 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_release_event");
821 // =============================================================================
822 // Window creation functions
824 void AddMenuItem (GtkWidget* item, unsigned int id)
826 for (int i = 0; i < g_nCommandCount; i++)
827 if (g_Commands[i].m_nCommand == id)
829 g_object_set_data (G_OBJECT (g_pParentWnd->m_pWidget), g_Commands[i].m_strMenu, item);
834 void MainFrame::handle_help_command(int id)
836 OpenURL(mHelpURLs[id]->GetBuffer());
840 needed for hooking in Gtk+
842 void HandleHelpCommand (GtkWidget *widget, gpointer data)
844 int id = GPOINTER_TO_INT (data);
845 g_pParentWnd->handle_help_command(id);
848 void MainFrame::process_xlink (Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel)
851 pDoc = xmlParseFile(FileName.GetBuffer());
854 Sys_Printf("Processing .xlink file '%s'\n", FileName.GetBuffer());
856 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic(menu, menu_name);
857 // start walking the nodes, find the 'links' one
858 xmlNodePtr pNode = pDoc->children;
859 while (pNode && strcmp((const char*)pNode->name, "links"))
863 pNode = pNode->children;
866 if (!strcmp((const char*)pNode->name, "item"))
870 if (strstr((char *)xmlGetProp(pNode, (xmlChar *)"url"), "http://"))
874 *url = (char *)xmlGetProp(pNode, (xmlChar *)"url");
881 *url += (char *)xmlGetProp(pNode, (xmlChar *)"url");
883 mHelpURLs.push_back(url);
884 create_menu_item_with_mnemonic (menu_in_menu, (char *)xmlGetProp(pNode, (xmlChar *)"name"), GTK_SIGNAL_FUNC(HandleHelpCommand), mHelpURLs.size()-1);
893 Sys_Printf("'%s' not found / parse failed\n", FileName.GetBuffer());
897 void MainFrame::create_game_help_menu (GtkWidget *menu, GtkAccelGroup *accel)
900 list<CGameDescription *>::iterator iGame;
902 // start in the global dir
903 FileName = g_strAppPath;
904 FileName += "global.xlink";
905 process_xlink(FileName, "General", g_strAppPath.GetBuffer(), menu, accel);
907 for (iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++)
909 FileName = (*iGame)->mGameToolsPath;
910 FileName += "game.xlink";
911 process_xlink(FileName, (*iGame)->mGameName, (*iGame)->mGameToolsPath.GetBuffer(), menu, accel);
915 void MainFrame::create_main_menu (GtkWidget *window, GtkWidget *vbox)
917 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
918 GtkAccelGroup *accel;
921 accel = gtk_accel_group_new ();
922 global_accel = accel;
923 gtk_window_add_accel_group (GTK_WINDOW (window), accel);
925 handle_box = gtk_handle_box_new ();
926 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
927 gtk_widget_show (handle_box);
929 menu_bar = gtk_menu_bar_new ();
930 gtk_container_add (GTK_CONTAINER (handle_box), menu_bar);
931 gtk_widget_show (menu_bar);
934 menu = create_sub_menu_with_mnemonic (menu_bar, _("_File"));
935 if (g_PrefsDlg.m_bDetachableMenus)
938 create_menu_item_with_mnemonic (menu, _("_New Map"),
939 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEW);
940 menu_separator (menu);
942 //++timo temporary experimental stuff for sleep mode..
943 item = create_menu_item_with_mnemonic (menu, _("_Sleep"),
944 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SLEEP);
945 g_object_set_data (G_OBJECT (window), "menu_file_sleep", item );
946 menu_separator (menu);
949 item = create_menu_item_with_mnemonic (menu, _("_Open..."),
950 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_OPEN);
951 g_object_set_data (G_OBJECT (window), "menu_file_open", item);
952 create_menu_item_with_mnemonic (menu, _("_Import..."), // Hydra: give it it's proper name
953 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_IMPORTMAP);
954 item = create_menu_item_with_mnemonic (menu, _("_Save"),
955 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVE);
956 g_object_set_data (G_OBJECT (window), "menu_file_save", item);
957 create_menu_item_with_mnemonic (menu, _("Save _as..."),
958 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEAS);
959 create_menu_item_with_mnemonic (menu, _("Save s_elected..."),
960 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXPORTMAP);
961 menu_separator (menu);
962 item = create_menu_item_with_mnemonic (menu, _("Save re_gion..."),
963 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEREGION);
964 g_object_set_data (G_OBJECT (window), "menu_file_saveregion", item);
965 menu_separator (menu);
966 create_menu_item_with_mnemonic (menu, _("New p_roject..."),
967 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEWPROJECT);
968 create_menu_item_with_mnemonic (menu, _("Load _project..."),
969 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_LOADPROJECT);
970 create_menu_item_with_mnemonic (menu, _("Pro_ject settings..."),
971 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_PROJECTSETTINGS);
972 menu_separator (menu);
973 create_menu_item_with_mnemonic (menu, _("_Pointfile..."),
974 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_POINTFILE);
975 menu_separator (menu);
976 item = create_menu_item_with_mnemonic (menu, _("Recent Files"),
977 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT1);
978 g_object_set_data (G_OBJECT (item), "accel", accel);
979 gtk_widget_set_sensitive (item, FALSE);
980 MRU_AddWidget (item, 0);
981 item = create_menu_item_with_mnemonic (menu, "2",
982 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT2);
983 gtk_widget_hide (item);
984 MRU_AddWidget (item, 1);
985 item = create_menu_item_with_mnemonic (menu, "3",
986 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT3);
987 gtk_widget_hide (item);
988 MRU_AddWidget (item, 2);
989 item = create_menu_item_with_mnemonic (menu, "4",
990 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT4);
991 gtk_widget_hide (item);
992 MRU_AddWidget (item, 3);
993 menu_separator (menu);
994 item = create_menu_item_with_mnemonic (menu, _("Check for GtkRadiant update (web)"),
995 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_CHECKUPDATE);
996 // disable, the functionality is no longer available
997 gtk_widget_set_sensitive( item, FALSE );
999 create_menu_item_with_mnemonic (menu, _("E_xit"),
1000 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXIT);
1003 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Edit"));
1004 if (g_PrefsDlg.m_bDetachableMenus)
1005 menu_tearoff (menu);
1006 item = create_menu_item_with_mnemonic (menu, _("_Undo"),
1007 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_UNDO);
1008 g_object_set_data (G_OBJECT (window), "menu_edit_undo", item);
1009 item = create_menu_item_with_mnemonic (menu, _("_Redo"),
1010 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_REDO);
1011 g_object_set_data (G_OBJECT (window), "menu_edit_redo", item);
1012 menu_separator (menu);
1013 item = create_menu_item_with_mnemonic (menu, _("_Copy"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_COPYBRUSH);
1014 item = create_menu_item_with_mnemonic (menu, _("_Paste"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSH);
1015 item = create_menu_item_with_mnemonic (menu, _("P_aste To Camera"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSHTOCAMERA);
1016 item = create_menu_item_with_mnemonic (menu, _("_Delete"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1017 g_object_set_data (G_OBJECT (window), "menu_selection_delete", item);
1018 menu_separator (menu);
1019 create_menu_item_with_mnemonic (menu, _("Map Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_MAPINFO);
1020 create_menu_item_with_mnemonic (menu, _("Entity Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_ENTITYINFO);
1021 menu_separator (menu);
1022 create_menu_item_with_mnemonic (menu, _("Brush Scripts..."), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_SCRIPTS);
1023 menu_separator (menu);
1024 create_menu_item_with_mnemonic (menu, _("Load Pre_fab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_LOADPREFAB);
1025 create_menu_item_with_mnemonic (menu, _("Save Selection as Prefab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_SAVEPREFAB);
1026 menu_separator (menu);
1027 create_menu_item_with_mnemonic (menu, _("Preferences..."), GTK_SIGNAL_FUNC (HandleCommand), ID_PREFS);
1030 menu = create_sub_menu_with_mnemonic (menu_bar, _("_View"));
1031 if (g_PrefsDlg.m_bDetachableMenus)
1032 menu_tearoff (menu);
1034 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Toggle"));
1035 create_menu_item_with_mnemonic (menu_in_menu, _("Camera View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECAMERA);
1036 create_menu_item_with_mnemonic (menu_in_menu, _("Console View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECONSOLE);
1037 item = create_menu_item_with_mnemonic (menu_in_menu, _("Entity View"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITY);
1038 g_object_set_data (G_OBJECT (window), "menu_view_entity", item);
1039 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1040 create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW);
1041 create_menu_item_with_mnemonic (menu_in_menu, _("YZ (Side)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_YZ);
1042 create_menu_item_with_mnemonic (menu_in_menu, _("XZ (Front)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_XZ);
1043 create_menu_item_with_mnemonic (menu_in_menu, _("Z View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEZ);
1044 menu_separator (menu);
1045 item = create_menu_item_with_mnemonic (menu, _("_Center"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTER);
1046 item = create_menu_item_with_mnemonic (menu, _("_Center 2d"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTERVIEW);
1047 item = create_menu_item_with_mnemonic (menu, _("_Up Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_UPFLOOR);
1048 item = create_menu_item_with_mnemonic (menu, _("_Down Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_DOWNFLOOR);
1049 menu_separator (menu);
1050 item = create_menu_item_with_mnemonic (menu, _("_Next (XY, YZ, XY)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEXTVIEW);
1051 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Layout"));
1052 create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_XY);
1053 create_menu_item_with_mnemonic (menu_in_menu, _("YZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SIDE);
1054 create_menu_item_with_mnemonic (menu_in_menu, _("XZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_FRONT);
1055 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Zoom"));
1056 create_menu_item_with_mnemonic (menu_in_menu, _("_XY 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_100);
1057 item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMIN);
1058 item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMOUT);
1059 menu_separator (menu_in_menu);
1060 create_menu_item_with_mnemonic (menu_in_menu, _("_Z 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_Z100);
1061 item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoo_m In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMIN);
1062 g_object_set_data (G_OBJECT (window), "menu_view_zzoomin", item);
1063 item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoom O_ut"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMOUT);
1064 g_object_set_data (G_OBJECT (window), "menu_view_zzoomout", item);
1065 menu_separator (menu_in_menu);
1066 item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEIN);
1067 item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEOUT);
1068 menu_separator (menu);
1070 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Show"));
1071 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Angles"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWANGLES, FALSE);
1072 g_object_set_data (G_OBJECT (window), "menu_view_showangles", item);
1073 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Names"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWNAMES, TRUE);
1074 g_object_set_data (G_OBJECT (window), "menu_view_shownames", item);
1075 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Blocks"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWBLOCKS, FALSE);
1076 g_object_set_data (G_OBJECT (window), "menu_view_showblocks", item);
1077 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show C_oordinates"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWCOORDINATES, TRUE);
1078 g_object_set_data (G_OBJECT (window), "menu_view_showcoordinates", item);
1079 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Window Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWOUTLINE, TRUE);
1080 g_object_set_data (G_OBJECT (window), "menu_view_showoutline", item);
1081 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show ZBuffered Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_NOOUTLINE, TRUE);
1082 g_object_set_data (G_OBJECT (window), "menu_selection_nooutline", item);
1083 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Axes"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWAXES, TRUE);
1084 g_object_set_data (G_OBJECT (window), "menu_view_showaxes", item);
1085 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Workzone"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWWORKZONE, FALSE);
1086 g_object_set_data (G_OBJECT (window), "menu_view_showworkzone", item);
1088 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Filter"));
1089 create_check_menu_item_with_mnemonic (menu_in_menu, _("World"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_WORLD, FALSE);
1090 create_check_menu_item_with_mnemonic (menu_in_menu, _("Entities"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_ENTITIES, FALSE);
1091 create_check_menu_item_with_mnemonic (menu_in_menu, _("Areaportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_AREAPORTALS, FALSE);
1092 create_check_menu_item_with_mnemonic (menu_in_menu, _("Translucent"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRANSLUCENT, FALSE);
1093 create_check_menu_item_with_mnemonic (menu_in_menu, _("Liquids"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIQUIDS, FALSE);
1094 create_check_menu_item_with_mnemonic (menu_in_menu, _("Caulk"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CAULK, FALSE);
1095 create_check_menu_item_with_mnemonic (menu_in_menu, _("Clips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLIPS, FALSE);
1096 create_check_menu_item_with_mnemonic (menu_in_menu, _("Paths"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATHS, FALSE);
1097 create_check_menu_item_with_mnemonic (menu_in_menu, _("Clusterportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLUSTERPORTALS, FALSE);
1098 create_check_menu_item_with_mnemonic (menu_in_menu, _("Lights"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTS, FALSE);
1099 create_check_menu_item_with_mnemonic (menu_in_menu, _("Structural"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_STRUCTURAL, FALSE);
1100 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Lightgrid"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTGRID, FALSE);
1101 g_object_set_data (G_OBJECT (window), "menu_filter_lightgrid", item);
1102 create_check_menu_item_with_mnemonic (menu_in_menu, _("Patches"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATCHES, FALSE);
1103 create_check_menu_item_with_mnemonic (menu_in_menu, _("Details"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_DETAILS, FALSE);
1104 create_check_menu_item_with_mnemonic (menu_in_menu, _("Hints"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_HINTSSKIPS, FALSE);
1105 create_check_menu_item_with_mnemonic (menu_in_menu, _("Models"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_MODELS, FALSE);
1106 create_check_menu_item_with_mnemonic (menu_in_menu, _("Triggers"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRIGGERS, FALSE);
1107 create_check_menu_item_with_mnemonic (menu_in_menu, _("Botclips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_BOTCLIPS, FALSE);
1109 menu_separator (menu);
1110 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Hide/Show"));
1111 create_menu_item_with_mnemonic (menu_in_menu, _("Hide Selected"),
1112 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_HIDESELECTED);
1113 create_menu_item_with_mnemonic (menu_in_menu, _("Show Hidden"),
1114 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_SHOWHIDDEN);
1115 menu_separator (menu);
1116 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Entities as"));
1117 g_object_set_data (G_OBJECT (window), "view_entitiesas_menu", menu_in_menu);
1118 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("Bounding box"),
1119 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE);
1120 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_boundingbox", item);
1121 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Wireframe"),
1122 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE);
1123 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_wireframe", item);
1124 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Wireframe"),
1125 GTK_SIGNAL_FUNC (HandleCommand),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE);
1126 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedwireframe", item);
1127 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Skinned"),
1128 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE);
1129 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedskinned", item);
1130 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned"),
1131 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNED,FALSE);
1132 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinned", item);
1133 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned and Boxed"),
1134 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE);
1135 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinnedandboxed", item);
1136 menu_separator (menu);
1137 item = create_check_menu_item_with_mnemonic (menu, _("Cubic Clipping"),
1138 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBICCLIPPING, TRUE);
1139 g_object_set_data (G_OBJECT (window), "menu_view_cubicclipping", item);
1140 menu_separator (menu);
1141 item = create_check_menu_item_with_mnemonic (menu, _("OpenGL Lighting"),
1142 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_OPENGLLIGHTING, FALSE);
1143 g_object_set_data (G_OBJECT (window), "menu_view_opengllighting", item);
1146 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Selection"));
1147 if (g_PrefsDlg.m_bDetachableMenus)
1148 menu_tearoff (menu);
1150 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Drag"));
1151 create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Edges"),
1152 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGEDGES);
1153 create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Vertices"),
1154 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGVERTECIES);
1155 menu_separator (menu);
1156 create_menu_item_with_mnemonic (menu, _("_Clone"),
1157 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CLONE);
1158 item = create_menu_item_with_mnemonic (menu, _("Deselect"),
1159 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DESELECT);
1160 item = create_menu_item_with_mnemonic (menu, _("Invert"),
1161 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_INVERT);
1163 create_menu_item_with_mnemonic (menu, _("_Delete"),
1164 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1166 menu_separator (menu);
1167 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Flip"));
1168 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _X"),
1169 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPX);
1170 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Y"),
1171 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPY);
1172 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Z"),
1173 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPZ);
1174 menu_separator (menu);
1175 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Rotate"));
1176 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate X"),
1177 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEX);
1178 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Y"),
1179 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEY);
1180 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Z"),
1181 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEZ);
1182 create_menu_item_with_mnemonic (menu_in_menu, _("Arbitrary rotation..."),
1183 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_ARBITRARYROTATION);
1184 menu_separator (menu);
1185 create_menu_item_with_mnemonic (menu, _("Scale..."), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SCALE);
1186 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("CSG"));
1187 create_menu_item_with_mnemonic (menu_in_menu, _("Make _Hollow"),
1188 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKEHOLLOW);
1189 create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Subtract"),
1190 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGSUBTRACT);
1191 create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Merge"),
1192 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGMERGE);
1193 menu_separator (menu);
1194 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Select"));
1195 create_menu_item_with_mnemonic (menu_in_menu, _("Select Complete _Tall"),
1196 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTCOMPLETETALL);
1197 create_menu_item_with_mnemonic (menu_in_menu, _("Select T_ouching"),
1198 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTTOUCHING);
1199 create_menu_item_with_mnemonic (menu_in_menu, _("Select _Partial Tall"),
1200 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTPARTIALTALL);
1201 create_menu_item_with_mnemonic (menu_in_menu, _("Select _Inside"),
1202 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTINSIDE);
1204 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Left"),
1205 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1206 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Right"),
1207 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1208 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Up"),
1209 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1210 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Down"),
1211 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1213 menu_separator (menu);
1214 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Clipper"));
1215 create_menu_item_with_mnemonic (menu_in_menu, _("Toggle Clipper"),
1216 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CLIPPER);
1217 menu_separator (menu_in_menu);
1218 create_menu_item_with_mnemonic (menu_in_menu, _("Clip selection"),
1219 GTK_SIGNAL_FUNC (HandleCommand), ID_CLIP_SELECTED);
1220 create_menu_item_with_mnemonic (menu_in_menu, _("Split selection"),
1221 GTK_SIGNAL_FUNC (HandleCommand), ID_SPLIT_SELECTED);
1222 create_menu_item_with_mnemonic (menu_in_menu, _("Flip Clip orientation"),
1223 GTK_SIGNAL_FUNC (HandleCommand), ID_FLIP_CLIP);
1224 menu_separator (menu);
1225 create_menu_item_with_mnemonic (menu, _("Connect entities"),
1226 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CONNECT);
1227 create_menu_item_with_mnemonic (menu, _("Ungroup entity"),
1228 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_UNGROUPENTITY);
1229 create_menu_item_with_mnemonic (menu, _("Make detail"),
1230 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_DETAIL);
1231 create_menu_item_with_mnemonic (menu, _("Make structural"),
1232 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_STRUCTURAL);
1235 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Bsp"));
1237 menu_separator (menu);
1238 g_object_set_data (G_OBJECT (window), "menu_bsp", menu);
1241 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Grid"));
1242 if (g_PrefsDlg.m_bDetachableMenus)
1243 menu_tearoff (menu);
1245 item = create_radio_menu_item_with_mnemonic (menu, NULL, _("Grid0.25"),
1246 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_025, FALSE);
1247 g_object_set_data (G_OBJECT (window), "menu_grid_025", item);
1248 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid0.5"),
1249 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_05, FALSE);
1250 g_object_set_data (G_OBJECT (window), "menu_grid_05", item);
1251 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid1"),
1252 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_1, FALSE);
1253 g_object_set_data (G_OBJECT (window), "menu_grid_1", item);
1254 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid2"),
1255 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_2, FALSE);
1256 g_object_set_data (G_OBJECT (window), "menu_grid_2", item);
1257 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid4"),
1258 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_4, FALSE);
1259 g_object_set_data (G_OBJECT (window), "menu_grid_4", item);
1260 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid8"),
1261 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_8, TRUE);
1262 g_object_set_data (G_OBJECT (window), "menu_grid_8", item);
1263 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid16"),
1264 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_16, FALSE);
1265 g_object_set_data (G_OBJECT (window), "menu_grid_16", item);
1266 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid32"),
1267 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_32, FALSE);
1268 g_object_set_data (G_OBJECT (window), "menu_grid_32", item);
1269 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid64"),
1270 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_64, FALSE);
1271 g_object_set_data (G_OBJECT (window), "menu_grid_64", item);
1272 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid128"),
1273 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_128, FALSE);
1274 g_object_set_data (G_OBJECT (window), "menu_grid_128", item);
1275 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid256"),
1276 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_256, FALSE);
1277 g_object_set_data (G_OBJECT (window), "menu_grid_256", item);
1278 menu_separator (menu);
1279 item = create_check_menu_item_with_mnemonic (menu, _("Snap to grid"),
1280 GTK_SIGNAL_FUNC (HandleCommand), ID_SNAPTOGRID, TRUE);
1281 g_object_set_data (G_OBJECT (window), "menu_snaptogrid", item);
1284 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Textures"));
1285 if (g_PrefsDlg.m_bDetachableMenus)
1286 menu_tearoff (menu);
1288 item = create_check_menu_item_with_mnemonic (menu, _("Show In _Use"),
1289 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWINUSE, FALSE);
1290 g_object_set_data (G_OBJECT (window), "menu_textures_showinuse", item);
1291 item = create_check_menu_item_with_mnemonic (menu, _("Show _All"),
1292 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWALL, FALSE);
1293 g_object_set_data (G_OBJECT (window), "menu_textures_showall", item);
1294 menu_separator (menu);
1295 item = create_check_menu_item_with_mnemonic (menu, _("Show shaders"),
1296 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERS_SHOW, FALSE);
1297 g_object_set_data (G_OBJECT (window), "menu_textures_shaders_show", item);
1298 item = create_menu_item_with_mnemonic (menu, _("Flush & Reload Shaders"),
1299 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_RELOADSHADERS);
1300 g_object_set_data (G_OBJECT (window), "menu_textures_reloadshaders", item);
1301 item = create_menu_item_with_mnemonic (menu, _("Load directory..."),
1302 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOAD);
1303 g_object_set_data (G_OBJECT (window), "menu_textures_load", item);
1304 item = create_menu_item_with_mnemonic (menu, _("Directory list..."),
1305 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOADLIST);
1306 menu_separator (menu);
1308 item = create_menu_item_with_mnemonic (menu, _("_Surface Inspector"),
1309 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_INSPECTOR);
1310 menu_separator (menu);
1311 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Render Quality"));
1312 g_object_set_data (G_OBJECT (window), "render_quality_menu", menu_in_menu);
1313 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("_Wireframe"),
1314 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_WIREFRAME, FALSE);
1315 g_object_set_data (G_OBJECT (window), "menu_textures_wireframe", item);
1316 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Flat shade"),
1317 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_FLATSHADE, FALSE);
1318 g_object_set_data (G_OBJECT (window), "menu_textures_flatshade", item);
1319 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Nearest"),
1320 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEAREST, FALSE);
1321 g_object_set_data (G_OBJECT (window), "menu_view_nearest", item);
1322 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Nearest _Mipmap"),
1323 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEARESTMIPMAP, FALSE);
1324 g_object_set_data (G_OBJECT (window), "menu_view_nearestmipmap", item);
1325 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Linear"),
1326 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_LINEAR, FALSE);
1327 g_object_set_data (G_OBJECT (window), "menu_view_linear", item);
1328 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Bilinear"),
1329 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEAR, FALSE);
1330 g_object_set_data (G_OBJECT (window), "menu_view_bilinear", item);
1331 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("B_ilinear Mipmap"),
1332 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEARMIPMAP, FALSE);
1333 g_object_set_data (G_OBJECT (window), "menu_view_bilinearmipmap", item);
1334 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("T_rilinear"),
1335 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TRILINEAR, FALSE);
1336 g_object_set_data (G_OBJECT (window), "menu_view_trilinear", item);
1337 create_menu_item_with_mnemonic (menu, _("Find / Replace..."),
1338 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURE_REPLACEALL);
1340 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Lock"));
1341 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Moves"),
1342 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_LOCK, TRUE);
1343 g_object_set_data (G_OBJECT (window), "menu_toggle_lock", item);
1344 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Rotations"),
1345 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_ROTATELOCK, TRUE);
1346 g_object_set_data (G_OBJECT (window), "menu_toggle_rotatelock", item);
1347 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Window Scale"));
1348 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("200%"),
1349 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE);
1350 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_200", item);
1351 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("100%"),
1352 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE);
1353 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_100", item);
1354 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("50%"),
1355 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE);
1356 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_50", item);
1357 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("25%"),
1358 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE);
1359 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_25", item);
1360 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("10%"),
1361 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE);
1362 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_10", item);
1363 item = menu_separator (menu);
1364 item = create_check_menu_item_with_mnemonic (menu, _("shaderlist.txt only"),
1365 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERLISTONLY, FALSE);
1366 g_object_set_data (G_OBJECT (window), "menu_textures_shaderlistonly", item);
1367 item = menu_separator (menu);
1368 g_object_set_data (G_OBJECT (window), "menu_textures_separator", item);
1369 g_object_set_data (G_OBJECT (window), "menu_textures", menu);
1372 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Misc"));
1373 if (g_PrefsDlg.m_bDetachableMenus)
1374 menu_tearoff (menu);
1376 create_menu_item_with_mnemonic (menu, _("_Benchmark"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_BENCHMARK);
1377 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Colors"));
1378 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Themes"));
1379 create_menu_item_with_mnemonic (menu_3, _("QE4 Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETORIGINAL);
1380 create_menu_item_with_mnemonic (menu_3, _("Q3Radiant Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETQER);
1381 create_menu_item_with_mnemonic (menu_3, _("Black and Green"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETBLACK);
1382 create_menu_item_with_mnemonic (menu_3, _("Maya/Max/Lightwave Emulation"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETYDNAR);
1384 menu_separator (menu_in_menu);
1385 create_menu_item_with_mnemonic (menu_in_menu, _("_Texture Background..."),
1386 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREBK);
1387 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Background..."),
1388 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_XYBK);
1389 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major..."),
1390 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR);
1391 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor..."),
1392 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR);
1393 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major Small..."),
1394 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR_ALT);
1395 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor Small..."),
1396 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR_ALT);
1397 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Text..."),
1398 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDTEXT);
1399 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Block..."),
1400 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDBLOCK);
1401 create_menu_item_with_mnemonic (menu_in_menu, _("Default Brush..."),
1402 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_BRUSH);
1403 create_menu_item_with_mnemonic (menu_in_menu, _("Camera Background..."),
1404 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CAMERABACK);
1405 create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush..."),
1406 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH);
1407 create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush (Camera)..."),
1408 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH3D);
1409 create_menu_item_with_mnemonic (menu_in_menu, _("Clipper..."),
1410 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CLIPPER);
1411 create_menu_item_with_mnemonic (menu_in_menu, _("Active View name..."),
1412 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_VIEWNAME);
1414 create_menu_item_with_mnemonic (menu, _("_Gamma..."),
1415 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_GAMMA);
1416 create_menu_item_with_mnemonic (menu, _("Find brush..."),
1417 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_FINDBRUSH);
1418 item = create_menu_item_with_mnemonic (menu, _("Next leak spot"),
1419 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_NEXTLEAKSPOT);
1420 item = create_menu_item_with_mnemonic (menu, _("Previous leak spot"),
1421 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PREVIOUSLEAKSPOT);
1422 create_menu_item_with_mnemonic (menu, _("_Print XY View"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PRINTXY);
1423 item = create_menu_item_with_mnemonic (menu, _("_Select Entity Color..."),
1424 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_SELECTENTITYCOLOR);
1425 g_object_set_data (G_OBJECT (window), "menu_misc_selectentitycolor", item);
1428 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Region"));
1429 if (g_PrefsDlg.m_bDetachableMenus)
1430 menu_tearoff (menu);
1432 create_menu_item_with_mnemonic (menu, _("_Off"),
1433 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_OFF);
1434 create_menu_item_with_mnemonic (menu, _("_Set XY"),
1435 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETXY);
1436 create_menu_item_with_mnemonic (menu, _("Set _Tall Brush"),
1437 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETTALLBRUSH);
1438 create_menu_item_with_mnemonic (menu, _("Set _Brush"),
1439 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETBRUSH);
1440 create_menu_item_with_mnemonic (menu, _("Set Se_lected Brushes"),
1441 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETSELECTION);
1444 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Brush"));
1445 if (g_PrefsDlg.m_bDetachableMenus)
1446 menu_tearoff (menu);
1448 item = create_menu_item_with_mnemonic (menu, _("3 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_3SIDED);
1449 item = create_menu_item_with_mnemonic (menu, _("4 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_4SIDED);
1450 item = create_menu_item_with_mnemonic (menu, _("5 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_5SIDED);
1451 item = create_menu_item_with_mnemonic (menu, _("6 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_6SIDED);
1452 item = create_menu_item_with_mnemonic (menu, _("7 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_7SIDED);
1453 item = create_menu_item_with_mnemonic (menu, _("8 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_8SIDED);
1454 item = create_menu_item_with_mnemonic (menu, _("9 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_9SIDED);
1455 menu_separator (menu);
1456 create_menu_item_with_mnemonic (menu, _("Arbitrary sided..."),
1457 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ARBITRARYSIDED);
1458 menu_separator (menu);
1459 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Primitives"));
1460 create_menu_item_with_mnemonic (menu_in_menu, _("Cone..."),
1461 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_MAKECONE);
1462 create_menu_item_with_mnemonic (menu_in_menu, _("Sphere..."),
1463 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_PRIMITIVES_SPHERE);
1466 if (!g_pGameDescription->mNoPatch)
1468 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Curve"));
1469 if (g_PrefsDlg.m_bDetachableMenus)
1470 menu_tearoff (menu);
1472 create_menu_item_with_mnemonic (menu, _("Cylinder"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHTUBE);
1473 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More Cylinders"));
1474 create_menu_item_with_mnemonic (menu_in_menu, _("Dense Cylinder"),
1475 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHDENSETUBE);
1476 create_menu_item_with_mnemonic (menu_in_menu, _("Very Dense Cylinder"),
1477 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHVERYDENSETUBE);
1478 create_menu_item_with_mnemonic (menu_in_menu, _("Square Cylinder"),
1479 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHSQUARE);
1480 menu_separator (menu);
1481 create_menu_item_with_mnemonic (menu, _("End cap"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHENDCAP);
1482 create_menu_item_with_mnemonic (menu, _("Bevel"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHBEVEL);
1483 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More End caps, Bevels"));
1484 create_menu_item_with_mnemonic (menu_in_menu, _("Square Endcap"),
1485 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL);
1486 create_menu_item_with_mnemonic (menu_in_menu, _("Square Bevel"),
1487 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP);
1488 menu_separator (menu);
1489 create_menu_item_with_mnemonic (menu, _("Cone"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHCONE);
1490 item = create_menu_item_with_mnemonic (menu, _("Sphere"),
1491 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PRIMITIVES_SPHERE);
1492 gtk_widget_set_sensitive (item, FALSE);
1493 menu_separator (menu);
1494 item = create_menu_item_with_mnemonic (menu, _("Simple Patch Mesh..."),
1495 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_SIMPLEPATCHMESH);
1496 g_object_set_data (G_OBJECT (window), "menu_simplepatchmesh", item);
1497 menu_separator (menu);
1498 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Insert"));
1499 create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Columns"),
1500 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTCOLUMN);
1501 create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Columns"),
1502 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDCOLUMN);
1503 menu_separator (menu_in_menu);
1504 create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Rows"),
1505 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTROW);
1506 create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Rows"),
1507 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDROW);
1508 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Delete"));
1509 create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Columns"),
1510 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTCOLUMN);
1511 create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Columns"),
1512 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTCOLUMN);
1513 menu_separator (menu_in_menu);
1514 create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Rows"),
1515 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTROW);
1516 create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Rows"),
1517 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTROW);
1518 menu_separator (menu);
1519 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Matrix"));
1520 create_menu_item_with_mnemonic (menu_in_menu, _("Invert"),
1521 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVE);
1522 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Re-disperse"));
1523 create_menu_item_with_mnemonic (menu_3, _("Rows"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_ROWS);
1524 create_menu_item_with_mnemonic (menu_3, _("Cols (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS);
1525 create_menu_item_with_mnemonic (menu_3, _("Rows (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS);
1526 create_menu_item_with_mnemonic (menu_in_menu, _("Transpose"),
1527 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MATRIX_TRANSPOSE);
1528 menu_separator (menu);
1529 create_menu_item_with_mnemonic (menu, _("Cap Selection"),
1530 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CAP);
1531 create_menu_item_with_mnemonic (menu, _("Cycle Cap Texture"),
1532 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CYCLECAP);
1533 menu_separator (menu);
1534 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Overlay"));
1535 create_menu_item_with_mnemonic (menu_in_menu, _("Set"),
1536 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_SET);
1537 create_menu_item_with_mnemonic (menu_in_menu, _("Clear"),
1538 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_CLEAR);
1539 menu_separator (menu);
1540 create_menu_item_with_mnemonic (menu, _("Thicken..."), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_THICKEN);
1543 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Plugins"));
1544 if (g_PrefsDlg.m_bDetachableMenus)
1545 menu_tearoff (menu);
1548 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1550 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1551 item = menu_separator (menu);
1552 g_object_set_data (G_OBJECT (window), "menu_plugin_separator", item);
1553 g_object_set_data (G_OBJECT (window), "menu_plugin", menu);
1556 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Help"));
1557 if (g_PrefsDlg.m_bDetachableMenus)
1558 menu_tearoff (menu);
1560 item = create_menu_item_with_mnemonic (menu, _("Manual"),
1561 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP);
1562 gtk_widget_add_accelerator (item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1564 // this creates all the per-game drop downs for the game pack helps
1565 // it will take care of hooking the Sys_OpenURL calls etc.
1566 create_game_help_menu(menu, accel);
1568 // TTimo: this is in global.xlink now
1569 //create_menu_item_with_mnemonic (menu, "Links",
1570 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1571 create_menu_item_with_mnemonic (menu, _("Bug report"),
1572 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_BUGREPORT);
1573 create_menu_item_with_mnemonic (menu, _("Shortcuts list"),
1574 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_COMMANDLIST);
1575 create_menu_item_with_mnemonic (menu, _("_About"),
1576 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_ABOUT);
1579 // leo: Hidden menu to make the accelerators work,
1580 // this is a hack that needs to be changed later if someone has a better idea.
1582 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1583 menu = create_sub_menu_with_mnemonic (menu_bar, "Hidden");
1584 if (g_PrefsDlg.m_bDetachableMenus)
1585 menu_tearoff (menu);
1587 gtk_widget_hide (gtk_menu_get_attach_widget (GTK_MENU (menu)));
1589 create_menu_item_with_mnemonic (menu, "BendMode", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_BEND);
1590 create_menu_item_with_mnemonic (menu, "FitTexture", GTK_SIGNAL_FUNC (HandleCommand), IDC_BTN_FACEFIT);
1591 create_menu_item_with_mnemonic (menu, "ViewTextures", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TEXTURE);
1592 create_menu_item_with_mnemonic (menu, "PatchInspector", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_INSPECTOR);
1593 create_menu_item_with_mnemonic (menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREY);
1594 create_menu_item_with_mnemonic (menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREX);
1595 create_menu_item_with_mnemonic (menu, "IncPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTCOLUMN);
1596 create_menu_item_with_mnemonic (menu, "IncPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTROW);
1597 create_menu_item_with_mnemonic (menu, "DecPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETECOLUMN);
1598 create_menu_item_with_mnemonic (menu, "DecPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETEROW);
1599 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1600 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1601 create_menu_item_with_mnemonic (menu, "SelectNudgeDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1602 create_menu_item_with_mnemonic (menu, "CameraForward", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_FORWARD);
1603 create_menu_item_with_mnemonic (menu, "CameraBack", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_BACK);
1604 create_menu_item_with_mnemonic (menu, "CameraLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_LEFT);
1605 create_menu_item_with_mnemonic (menu, "CameraRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_RIGHT);
1606 create_menu_item_with_mnemonic (menu, "CameraUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_UP);
1607 create_menu_item_with_mnemonic (menu, "CameraDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_DOWN);
1608 create_menu_item_with_mnemonic (menu, "CameraAngleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEUP);
1609 create_menu_item_with_mnemonic (menu, "CameraAngleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEDOWN);
1610 create_menu_item_with_mnemonic (menu, "CameraStrafeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFERIGHT);
1611 create_menu_item_with_mnemonic (menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFELEFT);
1612 create_menu_item_with_mnemonic (menu, "ToggleGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_TOGGLE);
1613 create_menu_item_with_mnemonic (menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CROSSHAIR);
1614 create_menu_item_with_mnemonic (menu, "ToggleRealtime", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CAMERAUPDATE);
1615 create_menu_item_with_mnemonic (menu, "MouseRotate", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_MOUSEROTATE);
1616 create_menu_item_with_mnemonic (menu, "TexRotateClock", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECLOCK);
1617 create_menu_item_with_mnemonic (menu, "TexRotateCounter", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECOUNTER);
1618 create_menu_item_with_mnemonic (menu, "TexScaleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEUP);
1619 create_menu_item_with_mnemonic (menu, "TexScaleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEDOWN);
1620 create_menu_item_with_mnemonic (menu, "TexShiftLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTLEFT);
1621 create_menu_item_with_mnemonic (menu, "TexShiftRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTRIGHT);
1622 create_menu_item_with_mnemonic (menu, "TexShiftUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTUP);
1623 create_menu_item_with_mnemonic (menu, "TexShiftDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTDOWN);
1624 create_menu_item_with_mnemonic (menu, "GridDown", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_PREV);
1625 create_menu_item_with_mnemonic (menu, "GridUp", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_NEXT);
1626 create_menu_item_with_mnemonic (menu, "TexScaleLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALELEFT);
1627 create_menu_item_with_mnemonic (menu, "TexScaleRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALERIGHT);
1628 create_menu_item_with_mnemonic (menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEDOWN);
1629 create_menu_item_with_mnemonic (menu, "MoveSelectionUP", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEUP);
1630 create_menu_item_with_mnemonic (menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_PRINT);
1631 create_menu_item_with_mnemonic (menu, "ToggleSizePaint", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TOGGLESIZEPAINT);
1632 create_menu_item_with_mnemonic (menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1633 create_menu_item_with_mnemonic (menu, "SelectNudgeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1634 create_menu_item_with_mnemonic (menu, "SelectNudgeUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1635 create_menu_item_with_mnemonic (menu, "NaturalizePatch", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_NATURALIZE);
1636 create_menu_item_with_mnemonic (menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SNAPTOGRID);
1637 create_menu_item_with_mnemonic (menu, "SelectAllOfType", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_ALL);
1638 create_menu_item_with_mnemonic (menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_OUTLINESTYLE);
1639 create_menu_item_with_mnemonic (menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEUP);
1640 create_menu_item_with_mnemonic (menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEDOWN);
1642 g_bIgnoreCommands--;
1645 void MainFrame::create_main_toolbar (GtkWidget *window, GtkWidget *vbox)
1647 GtkWidget *handle_box, *toolbar, *w;
1649 handle_box = gtk_handle_box_new ();
1650 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1651 gtk_widget_show (handle_box);
1652 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1654 toolbar = gtk_toolbar_new ();
1655 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1656 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1657 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1658 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1660 gtk_widget_show (toolbar);
1662 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Open"), _("Open an existing map"), "",
1663 new_pixmap (window, "file_open.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1664 GINT_TO_POINTER (ID_FILE_OPEN));
1665 g_object_set_data (G_OBJECT (window), "tb_file_open", w);
1666 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Save"), _("Save the active map"), "",
1667 new_pixmap (window, "file_save.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1668 GINT_TO_POINTER (ID_FILE_SAVE));
1669 g_object_set_data (G_OBJECT (window), "tb_file_save", w);
1670 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1671 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Flip"), "",
1672 new_pixmap (window, "brush_flipx.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1673 GINT_TO_POINTER (ID_BRUSH_FLIPX));
1674 g_object_set_data (G_OBJECT (window), "tb_brush_flipx", w);
1675 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Rotate"), "",
1676 new_pixmap (window, "brush_rotatex.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1677 GINT_TO_POINTER (ID_BRUSH_ROTATEX));
1678 g_object_set_data (G_OBJECT (window), "tb_brush_rotatex", w);
1679 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Flip"), "",
1680 new_pixmap (window, "brush_flipy.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1681 GINT_TO_POINTER (ID_BRUSH_FLIPY));
1682 g_object_set_data (G_OBJECT (window), "tb_brush_flipy", w);
1683 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Rotate"), "",
1684 new_pixmap (window, "brush_rotatey.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1685 GINT_TO_POINTER (ID_BRUSH_ROTATEY));
1686 g_object_set_data (G_OBJECT (window), "tb_brush_rotatey", w);
1687 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Flip"), "",
1688 new_pixmap (window, "brush_flipz.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1689 GINT_TO_POINTER (ID_BRUSH_FLIPZ));
1690 g_object_set_data (G_OBJECT (window), "tb_brush_flipz", w);
1691 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Rotate"), "",
1692 new_pixmap (window, "brush_rotatez.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1693 GINT_TO_POINTER (ID_BRUSH_ROTATEZ));
1694 g_object_set_data (G_OBJECT (window), "tb_brush_rotatez", w);
1695 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1697 if (g_PrefsDlg.m_bWideToolbar)
1699 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Complete Tall"), "",
1700 new_pixmap (window, "selection_selectcompletetall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1701 GINT_TO_POINTER (ID_SELECTION_SELECTCOMPLETETALL));
1702 g_object_set_data (G_OBJECT (window), "tb_selection_selectcompletetall", w);
1703 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Touching"), "",
1704 new_pixmap (window, "selection_selecttouching.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1705 GINT_TO_POINTER (ID_SELECTION_SELECTTOUCHING));
1706 g_object_set_data (G_OBJECT (window), "tb_selection_selecttouching", w);
1707 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Partial Tall"), "",
1708 new_pixmap (window, "selection_selectpartialtall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1709 GINT_TO_POINTER (ID_SELECTION_SELECTPARTIALTALL));
1710 g_object_set_data (G_OBJECT (window), "tb_selection_selectpartialtall", w);
1711 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Inside"), "",
1712 new_pixmap (window, "selection_selectinside.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1713 GINT_TO_POINTER (ID_SELECTION_SELECTINSIDE));
1714 g_object_set_data (G_OBJECT (window), "tb_selection_selectinside", w);
1717 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Selection"), "",
1718 new_pixmap (window, "popup_selection.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1719 GINT_TO_POINTER (ID_POPUP_SELECTION));
1720 g_object_set_data (G_OBJECT (window), "tb_popup_selection", w);
1722 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1724 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Subtract"), "",
1725 new_pixmap (window, "selection_csgsubtract.bmp"),
1726 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGSUBTRACT));
1727 g_object_set_data (G_OBJECT (window), "tb_selection_csgsubtract", w);
1729 if (g_PrefsDlg.m_bWideToolbar)
1731 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Merge"), "",
1732 new_pixmap (window, "selection_csgmerge.bmp"),
1733 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGMERGE));
1734 g_object_set_data (G_OBJECT (window), "tb_selection_csgmerge", w);
1737 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Hollow"), "",
1738 new_pixmap (window, "selection_makehollow.bmp"),
1739 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_MAKEHOLLOW));
1740 g_object_set_data (G_OBJECT (window), "tb_selection_makehollow", w);
1742 if (g_PrefsDlg.m_bWideToolbar)
1744 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1745 "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1746 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1747 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1750 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1752 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Change views"), "",
1753 new_pixmap (window, "view_change.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1754 GINT_TO_POINTER (ID_VIEW_CHANGE));
1755 g_object_set_data (G_OBJECT (window), "tb_view_change", w);
1757 if (!g_PrefsDlg.m_bWideToolbar)
1759 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1762 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Texture view mode"), "",
1763 new_pixmap (window, "textures_popup.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1764 GINT_TO_POINTER (ID_TEXTURES_POPUP));
1765 g_object_set_data (G_OBJECT (window), "tb_textures_popup", w);
1767 if (g_PrefsDlg.m_bWideToolbar)
1769 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1770 "", _("Cubic clip the camera view"), "",
1771 new_pixmap (window, "view_cubicclipping.bmp"),
1772 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1773 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1776 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1778 if (!g_PrefsDlg.m_bWideToolbar)
1780 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1781 "", _("Camera preview"), "", new_pixmap (window, "view_cameratoggle.bmp"),
1782 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CAMERATOGGLE));
1783 g_object_set_data (G_OBJECT (window), "tb_view_cameratoggle", w);
1784 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Update Camera", "",
1785 new_pixmap (window, "view_cameraupdate.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1786 GINT_TO_POINTER (ID_VIEW_CAMERAUPDATE));
1787 g_object_set_data (G_OBJECT (window), "tb_view_cameraupdate", w);
1788 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1789 "", _("Cubic clip the camera view"), "",
1790 new_pixmap (window, "view_cubicclipping.bmp"),
1791 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1792 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1793 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1794 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1795 "", _("Entity inspector"), "", new_pixmap (window, "view_entity.bmp"),
1796 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_ENTITY));
1797 g_object_set_data (G_OBJECT (window), "tb_view_entity", w);
1798 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1799 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1800 "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1801 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1802 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1803 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1806 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1807 "", _("Free Rotation"), "", new_pixmap (window, "select_mouserotate.bmp"),
1808 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSEROTATE));
1809 g_object_set_data (G_OBJECT (window), "tb_select_mouserotate", w);
1810 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1811 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1812 "", _("Free Scaling"), "", new_pixmap (window, "select_mousescale.bmp"),
1813 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSESCALE));
1814 g_object_set_data (G_OBJECT (window), "tb_select_mousescale", w);
1815 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1816 "", _("Scale X"), "", new_pixmap (window, "scalelockx.bmp"),
1817 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKX));
1818 g_object_set_data (G_OBJECT (window), "tb_scalelockx", w);
1819 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1820 "", _("Scale Y"), "", new_pixmap (window, "scalelocky.bmp"),
1821 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKY));
1822 g_object_set_data (G_OBJECT (window), "tb_scalelocky", w);
1823 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1824 "", _("Scale Z"), "", new_pixmap (window, "scalelockz.bmp"),
1825 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKZ));
1826 g_object_set_data (G_OBJECT (window), "tb_scalelockz", w);
1828 if (g_PrefsDlg.m_bWideToolbar)
1830 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1831 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1832 "", _("Don't select model brushes"), "",
1833 new_pixmap (window, "dontselectmodel.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1834 GINT_TO_POINTER (ID_DONTSELECTMODEL));
1835 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1836 g_object_set_data (G_OBJECT (window), "tb_dontselectmodel", w);
1838 if (!g_pGameDescription->mNoPatch)
1840 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1841 "", _("Don't select curved brushes"), "",
1842 new_pixmap (window, "dontselectcurve.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1843 GINT_TO_POINTER (ID_DONTSELECTCURVE));
1844 g_object_set_data (G_OBJECT (window), "tb_dontselectcurve", w);
1848 // bug #292, patch toolbar option
1849 if (g_PrefsDlg.m_bPatchToolbar)
1851 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1852 "", _("Show patch bounding box"), "",
1853 new_pixmap (window, "patch_showboundingbox.bmp"),
1854 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_SHOWBOUNDINGBOX));
1855 g_object_set_data (G_OBJECT (window), "tb_patch_showboundingbox", w);
1856 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1857 "", _("Show patches as wireframes"), "",
1858 new_pixmap (window, "patch_wireframe.bmp"),
1859 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_WIREFRAME));
1860 g_object_set_data (G_OBJECT (window), "tb_patch_wireframe", w);
1861 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1862 "", _("Patch Bend mode"), "",
1863 new_pixmap (window, "patch_bend.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1864 GINT_TO_POINTER (ID_PATCH_BEND));
1865 g_object_set_data (G_OBJECT (window), "tb_patch_bend", w);
1866 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Put caps on the current patch"), "",
1867 new_pixmap (window, "curve_cap.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1868 GINT_TO_POINTER (ID_CURVE_CAP));
1869 g_object_set_data (G_OBJECT (window), "tb_curve_cap", w);
1870 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1871 "", _("Welds equal patch points during moves"), "",
1872 new_pixmap (window, "patch_weld.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1873 GINT_TO_POINTER (ID_PATCH_WELD));
1874 g_object_set_data (G_OBJECT (window), "tb_patch_weld", w);
1875 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1876 "", _("Selects drill down rows and columns"), "",
1877 new_pixmap (window, "patch_drilldown.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1878 GINT_TO_POINTER (ID_PATCH_DRILLDOWN));
1879 g_object_set_data (G_OBJECT (window), "tb_patch_drilldown", w);
1882 if (g_PrefsDlg.m_bWideToolbar)
1884 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1885 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Show Entities as"), "",
1886 new_pixmap (window, "show_entities.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1887 GINT_TO_POINTER (ID_SHOW_ENTITIES));
1888 g_object_set_data (G_OBJECT (window), "tb_show_entities", w);
1894 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1895 gtk_widget_hide (w);
1896 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1897 gtk_widget_hide (w);
1898 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1899 gtk_widget_hide (w);
1900 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1901 gtk_widget_hide (w);
1905 m_bCamPreview = true;
1906 g_nScaleHow = (SCALE_X | SCALE_Y | SCALE_Z);
1909 void MainFrame::create_plugin_toolbar (GtkWidget *window, GtkWidget *vbox)
1911 GtkWidget *handle_box, *toolbar;
1913 handle_box = gtk_handle_box_new ();
1914 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1915 if (g_PrefsDlg.m_bPluginToolbar)
1916 gtk_widget_show (handle_box);
1917 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1919 toolbar = gtk_toolbar_new();
1920 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1921 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1922 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1923 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1924 g_object_set_data (G_OBJECT (window), "toolbar_plugin", toolbar);
1925 gtk_widget_show (toolbar);
1928 void MainFrame::create_main_statusbar (GtkWidget *window, GtkWidget *vbox)
1930 GtkWidget *hbox, *hbox1;
1934 hbox = gtk_hbox_new (FALSE, 0);
1935 gtk_widget_show (hbox);
1936 gtk_widget_set_usize (hbox, -1, 24);
1937 gtk_container_border_width (GTK_CONTAINER (hbox), 1);
1938 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
1940 frame = gtk_frame_new ((char*)NULL);
1941 gtk_widget_show (frame);
1942 gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
1943 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1945 hbox1 = gtk_hbox_new (FALSE, 0);
1946 gtk_container_add (GTK_CONTAINER (frame), hbox1);
1947 gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
1948 gtk_widget_show (hbox1);
1950 label = gtk_label_new (_(" Label "));
1951 gtk_widget_show (label);
1952 gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, TRUE, 0);
1953 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1954 gtk_misc_set_padding (GTK_MISC (label), 3, 0);
1955 m_pStatusLabel[0] = label;
1957 for (int i = 1; i < 6; i++)
1959 frame = gtk_frame_new ((char*)NULL);
1960 gtk_widget_show (frame);
1961 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1962 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1964 label = gtk_label_new (_(" Label "));
1965 gtk_widget_show (label);
1966 gtk_container_add (GTK_CONTAINER (frame), label);
1967 m_pStatusLabel[i] = label;
1972 static gint mainframe_idle (gpointer user_data)
1974 g_pParentWnd->RoutineProcessing ();
1978 static void Sys_Iconify (GtkWidget *w);
1979 static void Sys_Restore (GtkWidget *w);
1981 inline void CHECK_RESTORE(GtkWidget* w)
1983 if (g_object_get_data (G_OBJECT (w), "was_mapped") != NULL)
1984 gtk_widget_show (w);
1988 // this is called when the window is restored from the iconified state
1989 static void mainframe_map (GtkWidget *widget)
1991 if (g_pParentWnd->IsSleeping ())
1992 g_pParentWnd->OnSleep ();
1994 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
1996 // restore previously visible windows
1997 CHECK_RESTORE (g_pParentWnd->GetCamWnd ()->m_pParent);
1998 if (g_PrefsDlg.m_bFloatingZ)
1999 CHECK_RESTORE (g_pParentWnd->GetZWnd ()->m_pParent);
2000 CHECK_RESTORE (g_pParentWnd->GetXYWnd ()->m_pParent);
2001 CHECK_RESTORE (g_pParentWnd->GetXZWnd ()->m_pParent);
2002 CHECK_RESTORE (g_pParentWnd->GetYZWnd ()->m_pParent);
2003 CHECK_RESTORE (g_pGroupDlg->m_pWidget);
2007 inline void CHECK_MINIMIZE(GtkWidget* w)
2009 g_object_set_data (G_OBJECT (w), "was_mapped", (void*)(GTK_WIDGET_VISIBLE (w) != 0));
2010 gtk_widget_hide (w);
2013 static void mainframe_unmap (GtkWidget *widget)
2016 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2018 // minimize all other windows when the main window is minimized
2019 CHECK_MINIMIZE (g_pParentWnd->GetCamWnd ()->m_pParent);
2020 if (g_PrefsDlg.m_bFloatingZ)
2021 CHECK_MINIMIZE (g_pParentWnd->GetZWnd ()->m_pParent);
2022 CHECK_MINIMIZE (g_pParentWnd->GetXYWnd ()->m_pParent);
2023 CHECK_MINIMIZE (g_pParentWnd->GetXZWnd ()->m_pParent);
2024 CHECK_MINIMIZE (g_pParentWnd->GetYZWnd ()->m_pParent);
2025 CHECK_MINIMIZE (g_pGroupDlg->m_pWidget);
2029 static GtkWidget* create_floating (MainFrame* mainframe)
2031 GtkWidget *wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2032 //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2033 gtk_window_set_transient_for (GTK_WINDOW (wnd), GTK_WINDOW (mainframe->m_pWidget));
2034 gtk_widget_set_events (wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2035 gtk_signal_connect (GTK_OBJECT (wnd), "delete_event", GTK_SIGNAL_FUNC (widget_delete_hide), NULL);
2036 gtk_signal_connect (GTK_OBJECT (wnd), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2037 gtk_signal_connect (GTK_OBJECT (wnd), "key_press_event",
2038 GTK_SIGNAL_FUNC (mainframe_keypress), mainframe);
2039 gtk_signal_connect (GTK_OBJECT (wnd), "key_release_event",
2040 GTK_SIGNAL_FUNC (mainframe_keyrelease), mainframe);
2041 gtk_signal_connect (GTK_OBJECT (wnd), "map_event",
2042 GTK_SIGNAL_FUNC (mainframe_map), mainframe);
2044 gtk_window_set_default_size (GTK_WINDOW (wnd), 100, 100);
2046 #ifdef DBG_WINDOWPOS
2047 Sys_Printf("create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd);
2053 void console_populate_popup(GtkTextView* textview, GtkMenu* menu, gpointer user_data)
2055 menu_separator(GTK_WIDGET(menu));
2057 GtkWidget* item = gtk_menu_item_new_with_label (_("Clear"));
2058 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (Sys_ClearPrintf), NULL);
2059 gtk_widget_show (item);
2060 gtk_menu_append (GTK_MENU (menu), item);
2063 void console_construct(GtkWidget* textview)
2065 g_signal_connect(G_OBJECT(textview), "populate-popup", G_CALLBACK(console_populate_popup), NULL);
2068 extern MemStream g_Clipboard;
2070 void Clipboard_CopyMap()
2072 g_Clipboard.SetLength(0);
2073 Map_Export (&g_Clipboard, "xmap", false, true);
2076 void Clipboard_PasteMap()
2078 if (g_Clipboard.GetLength() > 0)
2080 g_Clipboard.Seek(0, SEEK_SET);
2081 Map_Import(&g_Clipboard, "xmap", true);
2086 Platform-independent GTK clipboard support.
2087 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2089 #if defined (__linux__) || defined (__APPLE__)
2093 RADIANT_CLIPPINGS = 23,
2096 static const GtkTargetEntry clipboard_targets[] = {
2097 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2100 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner)
2104 GdkAtom type = GDK_NONE;
2106 len = g_Clipboard.GetLength();
2113 buffer = g_Clipboard.GetBuffer ();
2116 if(info == clipboard_targets[0].info)
2118 type = gdk_atom_intern(clipboard_targets[0].target, FALSE);
2121 gtk_selection_data_set (selection_data, type, 8, buffer, len);
2124 static void clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner)
2128 static void clipboard_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data)
2130 g_Clipboard.SetLength (0);
2132 if (data->length < 0)
2133 Sys_FPrintf(SYS_ERR, "Error retrieving selection\n");
2134 else if(strcmp(gdk_atom_name(data->type), clipboard_targets[0].target) == 0)
2135 g_Clipboard.Write (data->data, data->length);
2137 Clipboard_PasteMap();
2140 void clipboard_copy()
2142 Clipboard_CopyMap();
2144 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2146 gtk_clipboard_set_with_data (clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL);
2149 void clipboard_paste()
2151 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2153 gtk_clipboard_request_contents (clipboard, gdk_atom_intern(clipboard_targets[0].target, FALSE), clipboard_received, NULL);
2157 #elif defined(WIN32)
2159 void clipboard_copy()
2161 Clipboard_CopyMap();
2163 bool bClipped = false;
2164 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2167 if (::OpenClipboard(NULL))
2170 long lSize = g_Clipboard.GetLength();
2171 HANDLE h = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof(long));
2174 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2175 memcpy(cp, &lSize, sizeof(long));
2177 g_Clipboard.Seek(0, SEEK_SET);
2178 g_Clipboard.Read(cp, lSize);
2180 ::SetClipboardData(nClipboard, h);
2189 Sys_Printf("Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n");
2193 void clipboard_paste()
2195 bool bPasted = false;
2196 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2197 if (nClipboard > 0 && ::OpenClipboard(NULL))
2199 if(IsClipboardFormatAvailable(nClipboard))
2201 HANDLE h = ::GetClipboardData(nClipboard);
2204 g_Clipboard.SetLength(0);
2205 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2207 memcpy(&lSize, cp, sizeof(long));
2209 g_Clipboard.Write(cp, lSize);
2216 Clipboard_PasteMap();
2221 void MainFrame::Copy()
2226 void MainFrame::Paste()
2229 UpdateSurfaceDialog();
2233 #ifdef DBG_WINDOWPOS
2234 GtkWidget *watchit = NULL;
2236 void CheckWatchit(char *msg)
2238 static int width = 0;
2239 if ((watchit!=NULL) && (watchit->allocation.width != width))
2241 Sys_Printf("CheckWatchit %s: %d\n", msg, watchit->allocation.width);
2242 width = watchit->allocation.width;
2248 BOOL CALLBACK m_pCountMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2250 int *n = (int *) dwData;
2257 struct monitorInfo_s {
2258 GdkRectangle *win_monitors;
2262 BOOL CALLBACK m_pEnumMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2264 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2265 GdkRectangle *monitor;
2268 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2270 memset(&lpmi, 0, sizeof(MONITORINFOEX));
2271 lpmi.cbSize = sizeof(MONITORINFOEX);
2273 GetMonitorInfo( hMonitor, &lpmi );
2275 if( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2278 SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
2279 monitor->x = rect.left;
2280 monitor->y = rect.top;
2281 monitor->width = rect.right - rect.left;
2282 monitor->height = rect.bottom - rect.top;
2284 if (monitorInfo->i_win_mon != 0)
2286 GdkRectangle temp = *monitor;
2287 *monitor = monitorInfo->win_monitors[0];
2288 monitorInfo->win_monitors[0] = temp;
2291 monitor->x = lpmi.rcMonitor.left;
2292 monitor->y = lpmi.rcMonitor.top;
2293 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2294 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2297 monitorInfo->i_win_mon++;
2302 void PositionWindowOnPrimaryScreen(window_position_t& position)
2304 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2306 if( position.x <= primaryMonitorRect.x + 6 )
2307 position.x = primaryMonitorRect.x + 6;
2308 else if( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 )
2309 position.x = primaryMonitorRect.x + 6;
2311 if( position.y <= primaryMonitorRect.y + 6 )
2312 position.y = primaryMonitorRect.y + 6;
2313 else if( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 )
2314 position.y = primaryMonitorRect.y + 6;
2316 if( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 )
2317 position.w = primaryMonitorRect.width - 18;
2318 if( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 )
2319 position.h = primaryMonitorRect.height - 18;
2323 GtkWidget* create_framed_widget(GtkWidget* widget)
2325 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2326 gtk_widget_show (frame);
2327 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2328 gtk_container_add (GTK_CONTAINER (frame), widget);
2329 gtk_widget_show(widget);
2333 gboolean entry_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2335 gtk_window_remove_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2339 gboolean entry_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2341 gtk_window_add_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2345 GtkWidget* create_framed_texwnd(TexWnd* texwnd)
2347 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2348 gtk_widget_show (frame);
2349 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2351 GtkWidget* hbox = gtk_hbox_new (FALSE, 0);
2352 gtk_widget_show (hbox);
2353 gtk_container_add (GTK_CONTAINER (frame), hbox);
2355 GtkWidget* w = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,1,1,1)));
2356 gtk_widget_show (w);
2357 gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, TRUE, 0);
2358 g_qeglobals_gui.d_texture_scroll = w;
2360 GtkWidget* texbox = gtk_vbox_new (FALSE, 0);
2361 gtk_widget_show (texbox);
2362 gtk_box_pack_start (GTK_BOX (hbox), texbox, TRUE, TRUE, 0);
2364 w = gtk_entry_new ();
2365 gtk_box_pack_start (GTK_BOX (texbox), w, FALSE, FALSE, 0);
2366 texwnd->m_pFilter = w;
2367 g_signal_connect(G_OBJECT(w), "focus_in_event", G_CALLBACK(entry_focus_in), NULL);
2368 g_signal_connect(G_OBJECT(w), "focus_out_event", G_CALLBACK(entry_focus_out), NULL);
2370 w = texwnd->GetWidget ();
2371 gtk_box_pack_start (GTK_BOX (texbox), w, TRUE, TRUE, 0);
2372 gtk_widget_show (w);
2377 static ZWnd *create_floating_zwnd(MainFrame *mainframe)
2379 ZWnd *pZWnd = new ZWnd ();
2380 GtkWidget* wnd = create_floating (mainframe);
2382 gtk_window_set_title (GTK_WINDOW (wnd), "Z");
2384 pZWnd->m_pParent = wnd;
2387 GtkWidget* frame = create_framed_widget(pZWnd->GetWidget());
2388 gtk_container_add (GTK_CONTAINER (wnd), frame);
2391 gtk_widget_realize (wnd);
2393 // turn OFF minimize and maximize boxes.
2394 // Must be *after* realize, or wnd->window is NULL
2395 // should do the right thing on *nix, need to verify.
2396 gdk_window_set_decorations ( wnd->window,
2397 GdkWMDecoration(GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2398 //TODO 50 by observation, will vary depending on decoration sizes
2400 GdkGeometry geometry;
2401 geometry.min_width = 50;
2402 //we only care about width, but have to set this too, or get nasty bugs
2403 geometry.min_height = 10;
2404 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE);
2408 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2409 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2412 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posZWnd);
2414 if (g_PrefsDlg.m_bZVis)
2415 gtk_widget_show (wnd);
2420 static const int gutter = 12;
2422 void MainFrame::Create ()
2424 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2426 gtk_widget_set_events (window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2427 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2428 GTK_SIGNAL_FUNC (mainframe_delete), this);
2429 gtk_signal_connect (GTK_OBJECT (window), "destroy",
2430 GTK_SIGNAL_FUNC (mainframe_destroy), this);
2431 gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2432 GTK_SIGNAL_FUNC (mainframe_keypress), this);
2433 gtk_signal_connect (GTK_OBJECT (window), "key_release_event",
2434 GTK_SIGNAL_FUNC (mainframe_keyrelease), this);
2435 gtk_signal_connect (GTK_OBJECT (window), "map_event",
2436 GTK_SIGNAL_FUNC (mainframe_map), this);
2437 gtk_signal_connect (GTK_OBJECT (window), "unmap_event",
2438 GTK_SIGNAL_FUNC (mainframe_unmap), this);
2440 g_qeglobals_gui.d_main_window = window;
2443 // calculate gdk offset
2444 int n_win_monitors = 0;
2446 monitorInfo_s monitorInfo;
2448 // detect multiple monitors
2449 EnumDisplayMonitors (NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>(&n_win_monitors));
2451 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2452 monitorInfo.i_win_mon = 0;
2453 EnumDisplayMonitors (NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>(&monitorInfo));
2455 gdk_offset_x = G_MININT;
2456 gdk_offset_y = G_MININT;
2459 for( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2460 gdk_offset_x = MAX (gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x);
2461 gdk_offset_y = MAX (gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y);
2464 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 );
2466 if( g_PrefsDlg.m_bStartOnPrimMon )
2469 GdkDisplay *display;
2471 gint n_gdk_monitors = 0;
2475 // detect multiple monitors
2476 display = gdk_display_get_default ();
2477 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name (display), gdk_display_get_n_screens (display) );
2479 screen = gdk_display_get_screen( display, 1 );
2480 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2482 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2484 for( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2485 memset( &rect, 0, sizeof(rect) );
2486 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2487 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2490 memcpy( &primaryMonitorRect, &rect, sizeof(primaryMonitorRect) );
2494 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2497 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2498 primaryMonitorRect.width = gdk_screen_width ();
2499 primaryMonitorRect.height = gdk_screen_height ();
2504 load_window_pos(window, g_PrefsDlg.mWindowInfo.position);
2506 GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
2507 gtk_container_add (GTK_CONTAINER (window), vbox);
2508 gtk_widget_show (vbox);
2510 create_main_menu (window, vbox);
2512 create_main_toolbar (window, vbox);
2513 create_plugin_toolbar (window,vbox);
2515 m_nCurrentStyle = g_PrefsDlg.m_nView;
2517 g_pGroupDlg->Create ();
2522 gtk_widget_show (window);
2524 // not needed on win32, it's in the .rc
2529 load_pixmap ("icon.bmp", window, &pixmap, &mask);
2530 gdk_window_set_icon (window->window, NULL, pixmap, mask);
2534 if (CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft)
2537 GtkWidget* vsplit = gtk_vpaned_new ();
2538 m_pSplits[0] = vsplit;
2539 gtk_box_pack_start (GTK_BOX (vbox), vsplit, TRUE, TRUE, 0);
2540 gtk_widget_show (vsplit);
2543 GtkWidget* hsplit = gtk_hpaned_new ();
2544 m_pSplits[2] = hsplit;
2545 gtk_paned_add1 (GTK_PANED (vsplit), hsplit);
2546 gtk_widget_show (hsplit);
2549 GtkWidget* hsplit2 = gtk_hpaned_new ();
2550 m_pSplits[3] = hsplit2;
2551 gtk_paned_add2 (GTK_PANED (hsplit), hsplit2);
2552 gtk_widget_show (hsplit2);
2555 GtkWidget* vsplit2 = gtk_vpaned_new ();
2556 m_pSplits[1] = vsplit2;
2557 if (CurrentStyle() == eRegular)
2558 gtk_paned_add2 (GTK_PANED (hsplit2), vsplit2);
2560 gtk_paned_add1 (GTK_PANED (hsplit), vsplit2);
2561 gtk_widget_show (vsplit2);
2564 m_pCamWnd = new CamWnd ();
2566 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2567 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2571 m_pXYWnd = new XYWnd ();
2572 m_pXYWnd->SetViewType(XY);
2574 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget ());
2575 gtk_paned_add1 (GTK_PANED (hsplit2), frame);
2579 m_pZWnd = new ZWnd ();
2581 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget ());
2582 if (CurrentStyle() == eRegular)
2583 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2585 gtk_paned_add2 (GTK_PANED (hsplit2), frame);
2589 m_pTexWnd = new TexWnd ();
2591 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2592 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2597 GtkWidget* scr = gtk_scrolled_window_new (NULL, NULL);
2598 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2599 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
2600 gtk_widget_show (scr);
2601 gtk_paned_pack2 (GTK_PANED (vsplit), scr, FALSE, TRUE);
2604 GtkWidget* text = gtk_text_view_new ();
2605 gtk_widget_set_size_request(text, 0, -1); // allow shrinking
2606 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
2607 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), FALSE);
2608 gtk_container_add (GTK_CONTAINER (scr), text);
2609 gtk_widget_show (text);
2610 g_qeglobals_gui.d_edit = text;
2618 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nXYHeight+28);
2620 if (CurrentStyle() == eRegular)
2622 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nZWidth);
2623 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2627 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nCamWidth);
2628 while (gtk_events_pending ()) gtk_main_iteration ();
2629 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2632 while (gtk_events_pending ()) gtk_main_iteration ();
2634 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), g_PrefsDlg.mWindowInfo.nCamHeight);
2636 else if (CurrentStyle() == eFloating)
2639 GtkWidget* wnd = create_floating (this);
2640 gtk_window_set_title (GTK_WINDOW (wnd), "Camera");
2643 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2644 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2647 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posCamWnd);
2649 gtk_widget_show (wnd);
2651 m_pCamWnd = new CamWnd ();
2654 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget ());
2655 gtk_container_add (GTK_CONTAINER (wnd), frame);
2658 m_pCamWnd->m_pParent = wnd;
2661 if (g_PrefsDlg.m_bFloatingZ)
2663 m_pZWnd = create_floating_zwnd(this);
2666 GtkWidget* wnd = create_floating (this);
2667 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2670 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2671 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2674 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2676 m_pXYWnd = new XYWnd ();
2677 m_pXYWnd->SetViewType(XY);
2680 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2681 gtk_container_add (GTK_CONTAINER (wnd), frame);
2684 m_pXYWnd->m_pParent = wnd;
2686 gtk_widget_show (wnd);
2691 GtkWidget* wnd = create_floating (this);
2692 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2695 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2696 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2699 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2701 m_pZWnd = new ZWnd ();
2702 m_pZWnd->m_pParent = wnd;
2704 m_pXYWnd = new XYWnd ();
2705 m_pXYWnd->SetViewType(XY);
2706 m_pXYWnd->m_pParent = wnd;
2710 GtkWidget* hsplit = gtk_hpaned_new ();
2711 m_pSplits[0] = hsplit;
2712 gtk_container_add (GTK_CONTAINER (wnd), hsplit);
2713 gtk_widget_show (hsplit);
2716 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget());
2717 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2720 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2721 gtk_paned_add2 (GTK_PANED (hsplit), frame);
2725 gtk_widget_show (wnd);
2727 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nZFloatWidth);
2731 GtkWidget* wnd = create_floating (this);
2732 gtk_window_set_title (GTK_WINDOW (wnd), _("XZ View"));
2735 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2736 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2739 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXZWnd);
2741 m_pXZWnd = new XYWnd ();
2742 m_pXZWnd->m_pParent = wnd;
2743 m_pXZWnd->SetViewType(XZ);
2746 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2747 gtk_container_add (GTK_CONTAINER (wnd), frame);
2750 if (g_PrefsDlg.m_bXZVis)
2751 gtk_widget_show (wnd);
2755 GtkWidget* wnd = create_floating (this);
2756 gtk_window_set_title (GTK_WINDOW (wnd), _("YZ View"));
2759 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2760 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2763 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posYZWnd);
2765 m_pYZWnd = new XYWnd ();
2766 m_pYZWnd->m_pParent = wnd;
2767 m_pYZWnd->SetViewType(YZ);
2770 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2771 gtk_container_add (GTK_CONTAINER (wnd), frame);
2774 if (g_PrefsDlg.m_bYZVis)
2775 gtk_widget_show (wnd);
2778 m_pTexWnd = new TexWnd ();
2780 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2781 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2784 GtkWidget* w = gtk_label_new (_("Textures"));
2785 gtk_widget_show (w);
2786 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2790 g_pGroupDlg->Show ();
2795 GtkWidget* hsplit = gtk_hpaned_new ();
2796 m_pSplits[0] = hsplit;
2797 gtk_box_pack_start (GTK_BOX (vbox), hsplit, TRUE, TRUE, 0);
2798 gtk_widget_show (hsplit);
2801 GtkWidget* vsplit1 = gtk_vpaned_new ();
2802 m_pSplits[1] = vsplit1;
2803 gtk_paned_add1 (GTK_PANED (hsplit), vsplit1);
2804 gtk_widget_show (vsplit1);
2807 GtkWidget* vsplit2 = gtk_vpaned_new ();
2808 m_pSplits[2] = vsplit2;
2809 gtk_paned_add2 (GTK_PANED (hsplit), vsplit2);
2810 gtk_widget_show (vsplit2);
2812 m_pCamWnd = new CamWnd ();
2814 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2815 gtk_paned_add1 (GTK_PANED (vsplit1), frame);
2818 m_pXYWnd = new XYWnd ();
2819 m_pXYWnd->SetViewType(XY);
2821 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2822 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2825 m_pYZWnd = new XYWnd ();
2826 m_pYZWnd->SetViewType(YZ);
2828 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2829 gtk_paned_add2 (GTK_PANED (vsplit1), frame);
2832 m_pXZWnd = new XYWnd ();
2833 m_pXZWnd->SetViewType(XZ);
2835 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2836 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2842 // g_qeglobals_gui.d_edit = NULL;
2845 m_pTexWnd = new TexWnd ();
2846 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2849 GtkWidget* w = gtk_label_new (_("Textures"));
2850 gtk_widget_show (w);
2851 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2855 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2856 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2857 m_pZWnd = create_floating_zwnd(this);
2859 while (gtk_events_pending ())
2860 gtk_main_iteration ();
2863 int x = GTK_PANED (m_pSplits[0])->max_position/2 - gutter;
2864 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), x);
2868 int y = GTK_PANED (m_pSplits[1])->max_position/2 - gutter;
2869 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), y);
2870 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), y);
2874 if(g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED)
2875 gtk_window_maximize(GTK_WINDOW(window));
2877 gtk_widget_show (window);
2881 if (m_pXYWnd) // this is always true?
2883 m_pXYWnd->SetActive(true);
2885 m_bSplittersOK = true;
2886 Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
2888 g_pParentWnd->OnEntitiesSetViewAs(0);
2890 // m_wndTextureBar.Create (vbox);
2891 create_main_statusbar (window, vbox);
2894 ShowMenuItemKeyBindings(window);
2896 if (g_qeglobals_gui.d_edit != NULL)
2897 console_construct(g_qeglobals_gui.d_edit);
2899 // bool load_last = FALSE;
2902 SetButtonMenuStates();
2904 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2906 g_bIgnoreCommands++;
2907 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
2908 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
2909 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaderlistonly"));
2910 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
2911 g_bIgnoreCommands--;
2913 // if (g_PrefsDlg.m_bTextureBar)
2914 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2916 SetActiveXY(m_pXYWnd);
2918 s_idle_id = gtk_timeout_add (25, mainframe_idle, this);
2920 QGL_InitExtensions ();
2922 if (g_PrefsDlg.mLocalPrefs.mbEmpty)
2924 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2925 g_PrefsDlg.SavePrefs();
2928 // remove the pid file
2929 remove (g_pidGameFile.GetBuffer ());
2931 Sys_Printf ("Entering message loop\n");
2935 m_nTimer = gtk_timeout_add (1000, timer, this);
2938 // =============================================================================
2941 MainFrame::MainFrame()
2944 m_bSplittersOK = false;
2945 g_pParentWnd = this;
2946 m_pXYWnd = (XYWnd*)NULL;
2948 m_pTexWnd = (TexWnd*)NULL;
2949 m_pZWnd = (ZWnd*)NULL;
2950 m_pYZWnd = (XYWnd*)NULL;
2951 m_pXZWnd = (XYWnd*)NULL;
2952 m_pActiveXY = (XYWnd*)NULL;
2953 m_bCamPreview = true;
2955 for (int n = 0; n < 6; n++)
2956 m_pStatusLabel[n] = NULL;
2957 m_bNeedStatusUpdate = false;
2959 m_bSleeping = false;
2963 MainFrame::~MainFrame()
2965 while (g_BSPFrontendCommands)
2967 free (g_BSPFrontendCommands->data);
2968 g_BSPFrontendCommands = g_slist_remove (g_BSPFrontendCommands, g_BSPFrontendCommands->data);
2972 void MainFrame::ReleaseContexts ()
2975 m_pXYWnd->DestroyContext ();
2977 m_pYZWnd->DestroyContext ();
2979 m_pXZWnd->DestroyContext ();
2981 m_pCamWnd->DestroyContext ();
2983 m_pTexWnd->DestroyContext ();
2985 m_pZWnd->DestroyContext ();
2988 void MainFrame::CreateContexts ()
2991 m_pCamWnd->CreateContext ();
2993 m_pXYWnd->CreateContext ();
2995 m_pYZWnd->CreateContext ();
2997 m_pXZWnd->CreateContext ();
2999 m_pTexWnd->CreateContext ();
3001 m_pZWnd->CreateContext ();
3004 static void Sys_Iconify (GtkWidget *w)
3006 // we might not have been realized yet
3007 if (w->window == NULL)
3010 if (!GTK_WIDGET_MAPPED (w))
3013 #if defined (__linux__) || defined (__APPLE__)
3014 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Iconify\n");
3016 XWindowAttributes xattr;
3017 GdkWindowPrivate *Private;
3019 Private = (GdkWindowPrivate*)w->window;
3020 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (0));
3022 if (!Private->destroyed)
3024 xattr.map_state = IsUnmapped;
3025 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3027 if (xattr.map_state != IsUnmapped)
3028 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (1));
3030 XIconifyWindow (Private->xdisplay, Private->xwindow, 0);
3036 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_MINIMIZE);
3040 static void Sys_Restore (GtkWidget *w)
3042 // we might not have been realized yet
3043 if (w->window == NULL)
3046 if (!GTK_WIDGET_VISIBLE (w))
3049 #if defined (__linux__) || defined (__APPLE__)
3050 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Restore\n");
3052 XWindowAttributes xattr;
3053 GdkWindowPrivate *Private;
3055 Private = (GdkWindowPrivate*)w->window;
3057 xattr.map_state = IsUnmapped;
3058 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3060 if (xattr.map_state == IsUnmapped)
3061 XMapRaised (Private->xdisplay, Private->xwindow);
3066 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_RESTORE);
3074 void RefreshModelSkin (GSList **pModels, entitymodel_t *model)
3076 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3077 // so we avoid the fucked up ones, assuming they are at the end
3078 if (!model->strSkin)
3081 Sys_Printf("Dropping model %p with empty skin in RefreshModelSkin\n", model);
3084 // and also keeping it so we have an actual count of empty models
3085 g_slist_append (*pModels, model);
3088 // do we have this model already?
3089 if (g_slist_find (*pModels, model))
3093 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3094 Sys_Printf("Already processed model: %p %s\n", model, ((GString *)model->strSkin)->str);
3098 model->nTextureBind = Texture_LoadSkin(((GString *)model->strSkin)->str, &model->nSkinWidth, &model->nSkinHeight );
3099 if (model->nTextureBind != -1)
3100 Sys_Printf("LOADED SKIN: %s\n", ((GString *)model->strSkin)->str );
3102 Sys_Printf("Load skin failed: %s\n", ((GString *)model->strSkin)->str );
3103 *pModels = g_slist_append (*pModels, model);
3105 Sys_Printf("Processed model %p %s\n", model, ((GString *)model->strSkin)->str);
3109 void MainFrame::OnSleep()
3114 // useful when trying to debug crashes in the sleep code
3115 Sys_Printf("Going into sleep mode..\n");
3117 Sys_Printf("Dispatching sleep msg...");
3118 DispatchRadiantMsg (RADIANT_SLEEP);
3119 Sys_Printf("Done.\n");
3121 if (CurrentStyle() == eSplit)
3122 Sys_Iconify (m_pZWnd->m_pParent);
3124 Sys_Iconify (m_pWidget);
3126 QERApp_FreeShaders ();
3127 g_bScreenUpdates = false;
3130 Sys_Printf("Releasing contexts...");
3132 Sys_Printf("Done.\n");
3134 // free all the skins in the caches
3135 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3136 g_lstSkinCache.RemoveAll();
3139 Sys_Printf("Waking up\n");
3140 if (CurrentStyle() == eSplit)
3141 Sys_Restore (m_pZWnd->m_pParent);
3143 Sys_Restore (m_pWidget);
3146 Sys_Printf("Creating contexts...");
3148 Sys_Printf("Done.\n");
3150 Sys_Printf("Making current on camera...");
3151 m_pCamWnd->MakeCurrent ();
3152 Sys_Printf("Done.\n");
3154 Sys_Printf("Reloading shaders...");
3155 // reload the shader scripts and textures
3156 QERApp_ReloadShaders ();
3158 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3159 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
3160 Sys_Printf("Done.\n");
3162 // rebuild the patches by setting the bDirty flag on them
3163 for (brush_t* b=active_brushes.next ; b != &active_brushes ; b=b->next)
3166 b->pPatch->bDirty = true;
3169 Sys_Printf("Reloading skins...");
3170 // we have purged all the skins before going to sleep
3171 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3172 // namely, all entitymodel_t
3173 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3174 // (a single eclass_t can reference several entitymodel_t)
3175 // FIXME: and what's up with md3Class then? what is it used for?
3179 GSList *Models = NULL;
3180 for (ent = entities.next; ent != &entities; ent = ent->next)
3182 // if it's a model with skin then the fixedsize flag must be on
3183 // only if there IS a model .. we are not trying to load
3184 if (ent->eclass->fixedsize)
3186 if (ent->eclass->model)
3190 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3192 entitymodel_t *model;
3193 for (model = ent->eclass->model; model; model=model->pNext)
3194 RefreshModelSkin (&Models, model);
3195 } else if (ent->md3Class)
3197 entitymodel_t *model;
3198 for (model = ent->md3Class->model; model; model=model->pNext)
3199 RefreshModelSkin (&Models, model);
3203 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3208 for (e = g_md3Cache; e ; e = e->next)
3210 entitymodel_t *model;
3211 for (model = e->model; model; model=model->pNext)
3212 if (!g_slist_find (Models, model))
3214 Sys_Printf("model %p ", model);
3216 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3218 Sys_Printf("not found in main loop (no skin)\n");
3222 // clean the model list
3223 g_slist_free (Models);
3225 Sys_Printf("Done.\n");
3227 // bring back the GL font
3228 gtk_glwidget_create_font (m_pCamWnd->GetWidget ());
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::OnCameraForward(bool keydown)
7079 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7083 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7084 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7085 Sys_UpdateWindows (nUpdate);
7090 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7092 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7096 void MainFrame::OnCameraBack(bool keydown)
7098 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7102 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7103 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7104 Sys_UpdateWindows (nUpdate);
7109 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7111 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7115 void MainFrame::OnCameraLeft(bool keydown)
7119 if (m_pCamWnd->m_bFreeMove)
7121 OnCameraStrafeleft(keydown);
7126 if (g_PrefsDlg.m_bCamDiscrete)
7130 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7131 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7132 Sys_UpdateWindows (nUpdate);
7137 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7139 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7143 void MainFrame::OnCameraRight(bool keydown)
7147 if (m_pCamWnd->m_bFreeMove)
7149 OnCameraStraferight(keydown);
7154 if (g_PrefsDlg.m_bCamDiscrete)
7158 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7159 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7160 Sys_UpdateWindows (nUpdate);
7165 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7167 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7171 void MainFrame::OnCameraUp()
7173 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7174 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7175 Sys_UpdateWindows (nUpdate);
7178 void MainFrame::OnCameraDown()
7180 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7181 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7182 Sys_UpdateWindows (nUpdate);
7185 void MainFrame::OnCameraAngleup()
7187 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
7188 if (m_pCamWnd->Camera()->angles[0] > 85)
7189 m_pCamWnd->Camera()->angles[0] = 85;
7190 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7193 void MainFrame::OnCameraAngledown()
7195 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7196 if (m_pCamWnd->Camera()->angles[0] < -85)
7197 m_pCamWnd->Camera()->angles[0] = -85;
7198 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7201 void MainFrame::OnCameraStrafeleft(bool keydown)
7203 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7206 if (!m_pCamWnd->m_bFreeMove)
7210 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7211 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7212 Sys_UpdateWindows (nUpdate);
7219 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7221 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7224 void MainFrame::OnCameraStraferight(bool keydown)
7226 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7229 if (!m_pCamWnd->m_bFreeMove)
7233 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7234 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7235 Sys_UpdateWindows (nUpdate);
7242 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7244 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7247 void MainFrame::OnGridToggle()
7249 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7250 Sys_UpdateWindows (W_XY|W_Z);
7253 void MainFrame::OnViewCrosshair()
7256 Sys_UpdateWindows (W_XY);
7259 void MainFrame::OnSelectionTextureRotateclock()
7261 Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7264 void MainFrame::OnSelectionTextureRotatecounter()
7266 Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7269 void MainFrame::OnSelectionTextureScaleup()
7271 Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7274 void MainFrame::OnSelectionTextureScaledown()
7276 Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7279 void MainFrame::OnSelectionTextureScaleLeft()
7281 Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7284 void MainFrame::OnSelectionTextureScaleRight()
7286 Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7289 void MainFrame::OnSelectionTextureShiftleft()
7291 Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7294 void MainFrame::OnSelectionTextureShiftright()
7296 Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7299 void MainFrame::OnSelectionTextureShiftup()
7301 Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7304 void MainFrame::OnSelectionTextureShiftdown()
7306 Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7309 void MainFrame::OnGridPrev()
7312 if (g_qeglobals.d_gridsize == 1)
7314 g_qeglobals.d_gridsize = 0.5;
7315 g_qeglobals.d_bSmallGrid = true;
7316 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7317 } else if (g_qeglobals.d_gridsize == 0.5)
7319 g_qeglobals.d_gridsize = 0.25;
7320 g_qeglobals.d_bSmallGrid = true;
7321 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7322 } else if (g_qeglobals.d_gridsize > 1)
7324 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7325 g_qeglobals.d_bSmallGrid = false;
7327 switch ((int)g_qeglobals.d_gridsize)
7329 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7330 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7331 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7332 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7333 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7334 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7335 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7336 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7337 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7343 // SnapTToGrid option: need to check everywhere the grid size is changed
7344 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7345 if (g_PrefsDlg.m_bSnapTToGrid)
7349 g_bIgnoreCommands++;
7350 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7351 g_bIgnoreCommands--;
7353 Sys_UpdateWindows(W_XY | W_Z);
7356 void MainFrame::OnGridNext()
7359 if (g_qeglobals.d_gridsize == 0.25)
7361 g_qeglobals.d_gridsize = 0.5;
7362 g_qeglobals.d_bSmallGrid = true;
7363 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7364 } else if (g_qeglobals.d_gridsize == 0.5)
7366 g_qeglobals.d_gridsize = 1;
7367 g_qeglobals.d_bSmallGrid = false;
7368 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7369 } else if (g_qeglobals.d_gridsize < 256)
7371 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7372 g_qeglobals.d_bSmallGrid = false;
7374 switch ((int)g_qeglobals.d_gridsize)
7376 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7377 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7378 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7379 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7380 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7381 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7382 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7383 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7384 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7385 default: item = NULL;
7391 // SnapTToGrid option: need to check everywhere the grid size is changed
7392 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7393 if (g_PrefsDlg.m_bSnapTToGrid)
7397 g_bIgnoreCommands++;
7398 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7399 g_bIgnoreCommands--;
7401 Sys_UpdateWindows(W_XY | W_Z);
7404 void MainFrame::OnSelectionMovedown()
7406 if (&selected_brushes == selected_brushes.next)
7408 Undo_Start("move down");
7409 Undo_AddBrushList(&selected_brushes);
7412 vAmt[0] = vAmt[1] = 0.0;
7413 vAmt[2] = -g_qeglobals.d_gridsize;
7415 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7417 Undo_EndBrushList(&selected_brushes);
7421 void MainFrame::OnSelectionMoveup()
7423 if (&selected_brushes == selected_brushes.next)
7425 Undo_Start("move up");
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::OnSelectionPrint()
7440 for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7444 void MainFrame::OnSelectionTogglesizepaint()
7446 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7447 Sys_UpdateWindows(W_XY);
7450 void MainFrame::OnPatchNaturalize()
7452 Patch_NaturalizeSelected();
7453 Sys_UpdateWindows (W_ALL);
7456 void MainFrame::OnSnapToGrid()
7458 if (&selected_brushes == selected_brushes.next)
7460 Undo_Start("snap selection to grid");
7461 Undo_AddBrushList(&selected_brushes);
7462 //Select_SnapToGrid();
7463 for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7466 Patch_SnapToGrid(pb->pPatch);
7468 Brush_SnapToGrid(pb);
7470 Sys_UpdateWindows (W_ALL);
7471 Undo_EndBrushList(&selected_brushes);
7475 void MainFrame::OnSelectAll()
7480 void MainFrame::OnSelectionInvert()
7483 Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7487 void PerformFiltering ()
7491 // mattn - this should be removed - otherwise the filters from the
7492 // plugins are wiped away with each update
7494 // spog - deletes old filters list and creates new one when
7495 // g_qeglobals.d_savedinfo.exclude is updated
7496 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
7497 g_qeglobals.d_savedinfo.filters = FilterUpdate(g_qeglobals.d_savedinfo.filters);
7500 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7501 brush->bFiltered = FilterBrush( brush );
7503 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7504 brush->bFiltered = FilterBrush( brush );
7507 void MainFrame::OnFilterAreaportals()
7509 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7510 g_bIgnoreCommands++;
7511 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7512 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7514 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7515 g_bIgnoreCommands--;
7517 Sys_UpdateWindows (W_XY|W_CAMERA);
7520 void MainFrame::OnFilterCaulk()
7522 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7523 g_bIgnoreCommands++;
7524 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7525 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7527 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7528 g_bIgnoreCommands--;
7530 Sys_UpdateWindows (W_XY|W_CAMERA);
7533 void MainFrame::OnFilterClips()
7535 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7536 g_bIgnoreCommands++;
7537 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7538 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7540 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7541 g_bIgnoreCommands--;
7543 Sys_UpdateWindows (W_XY|W_CAMERA);
7546 void MainFrame::OnFilterBotClips()
7548 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7549 g_bIgnoreCommands++;
7550 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7551 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7553 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7554 g_bIgnoreCommands--;
7556 Sys_UpdateWindows (W_XY|W_CAMERA);
7559 void MainFrame::OnFilterStructural()
7561 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7562 g_bIgnoreCommands++;
7563 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7564 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7566 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7567 g_bIgnoreCommands--;
7569 Sys_UpdateWindows (W_XY|W_CAMERA);
7572 void MainFrame::OnFilterDetails()
7574 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7575 g_bIgnoreCommands++;
7576 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7577 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7579 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7580 g_bIgnoreCommands--;
7582 Sys_UpdateWindows (W_XY|W_CAMERA);
7585 void MainFrame::OnFilterEntities()
7587 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7588 g_bIgnoreCommands++;
7589 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7590 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7592 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7593 g_bIgnoreCommands--;
7595 Sys_UpdateWindows (W_XY|W_CAMERA);
7598 void MainFrame::OnFilterHintsskips()
7600 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7601 g_bIgnoreCommands++;
7602 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7603 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7605 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7606 g_bIgnoreCommands--;
7608 Sys_UpdateWindows (W_XY|W_CAMERA);
7611 void MainFrame::OnFilterLights()
7613 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7614 g_bIgnoreCommands++;
7615 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7616 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7618 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7619 g_bIgnoreCommands--;
7621 Sys_UpdateWindows (W_XY|W_CAMERA);
7624 void MainFrame::OnFilterLiquids()
7626 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7627 g_bIgnoreCommands++;
7628 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7629 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7631 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7632 g_bIgnoreCommands--;
7634 Sys_UpdateWindows (W_XY|W_CAMERA);
7637 void MainFrame::OnFilterModels()
7639 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7640 g_bIgnoreCommands++;
7641 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7642 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7644 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7645 g_bIgnoreCommands--;
7647 Sys_UpdateWindows (W_XY|W_CAMERA);
7650 void MainFrame::OnFilterPatches()
7652 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7653 g_bIgnoreCommands++;
7654 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7655 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7657 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7658 g_bIgnoreCommands--;
7660 Sys_UpdateWindows (W_XY|W_CAMERA);
7663 void MainFrame::OnFilterPaths()
7665 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7666 g_bIgnoreCommands++;
7667 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7668 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7670 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7671 g_bIgnoreCommands--;
7673 Sys_UpdateWindows (W_XY|W_CAMERA);
7676 void MainFrame::OnFilterClusterportals()
7678 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7679 g_bIgnoreCommands++;
7680 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7681 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7683 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7684 g_bIgnoreCommands--;
7686 Sys_UpdateWindows (W_XY|W_CAMERA);
7689 void MainFrame::OnFilterLightgrid()
7691 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7692 g_bIgnoreCommands++;
7693 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7694 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7696 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7697 g_bIgnoreCommands--;
7699 Sys_UpdateWindows (W_XY|W_CAMERA);
7702 void MainFrame::OnFilterTranslucent()
7704 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7705 g_bIgnoreCommands++;
7706 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7707 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7709 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7710 g_bIgnoreCommands--;
7712 Sys_UpdateWindows (W_XY|W_CAMERA);
7715 void MainFrame::OnFilterTriggers()
7717 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7718 g_bIgnoreCommands++;
7719 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7720 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7722 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7723 g_bIgnoreCommands--;
7725 Sys_UpdateWindows (W_XY|W_CAMERA);
7728 void MainFrame::OnFilterWorld()
7730 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7731 g_bIgnoreCommands++;
7732 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7733 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7735 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7736 g_bIgnoreCommands--;
7738 Sys_UpdateWindows (W_XY|W_CAMERA);
7748 // =============================================================================
7749 // leo: Unused functions, not called anywhere from the code (need to check)
7751 void MainFrame::OnViewConsole()
7753 if (FloatingGroupDialog()) // QE4 style
7755 if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7757 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7758 widget_delete_hide (g_qeglobals_gui.d_entity);
7760 gtk_widget_show (g_qeglobals_gui.d_entity);
7763 gtk_widget_show (g_qeglobals_gui.d_entity);
7764 SetInspectorMode(W_CONSOLE);
7769 void MainFrame::OnCurveFreeze()
7774 void MainFrame::OnCurveUnFreeze()
7776 Patch_UnFreeze(false);
7779 void MainFrame::OnCurveUnFreezeAll()
7781 Patch_UnFreeze(true);
7784 void MainFrame::OnSelectReselect()
7789 void MainFrame::OnSelectionTextureFit()
7791 // TODO: Add your command handler code here
7794 void MainFrame::OnPatchEnter()
7799 void MainFrame::OnDropGroupAddtoWorld()
7802 Select_AddToGroup("World");
7803 Sys_UpdateWindows (W_ALL);