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
58 see http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 for the two below
60 CString g_pidFile; ///< the global .pid file (only for global part of the startup)
61 CString g_pidGameFile; ///< the game-specific .pid file
62 CString g_strBitmapsPath; // directory where the bitmaps are stored
65 points to the game tools directory, for instance
66 C:\Program Files\Quake III Arena\GtkRadiant
68 this is one of the main variables that are configured by the game selection on startup
69 <g_strGameToolsPath>/plugins
70 <g_strGameToolsPath>/modules
73 CString g_strGameToolsPath; ///< this is set by g_PrefsDlg.mGamesDialog
74 CGameDescription *g_pGameDescription; ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
75 CString g_strPluginsDir; ///< name of plugins directory, always sub-directory of toolspath
76 CString g_strModulesDir; ///< name of modules directory, always sub-directory of toolspath
79 directory for temp files
80 NOTE: on *nix this is were we check for .pid
82 CString g_strTempPath;
83 MainFrame* g_pParentWnd = NULL; // used to precast to CMainFrame
84 PrefsDlg g_Preferences; // global prefs instance
85 PrefsDlg& g_PrefsDlg = g_Preferences; // reference used throughout
86 int g_nUpdateBits = 0; // window update flags
87 bool g_bScreenUpdates = true; // whether window painting is active, used in a few places
88 // to disable updates for speed reasons
89 // both of the above should be made members of CMainFrame
90 int g_bIgnoreCommands; // Used to ignore commands when checking menus/toolbars
91 GSList *g_BSPFrontendCommands; // List of commands in the BSP menu
93 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
94 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
96 extern bool g_bCrossHairs;
99 extern PatchDialog g_PatchDialog;
101 GtkAccelGroup* global_accel;
103 void Select_Ungroup ();
105 // command mapping stuff
107 // m_strCommand is the command string
108 // m_nKey is the GDK_??? equivelant
109 // m_nModifiers are key states as follows
116 #define SPEED_MOVE 32
117 #define SPEED_TURN 22.5
119 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
120 // - if you add a command here and you don't want a menu item, use the "hidden" menu
121 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
122 SCommandInfo g_Commands[] =
124 {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
125 {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
126 {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
127 // {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
128 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
129 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
130 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
131 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
132 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
133 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
134 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
135 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
136 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
137 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
138 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
139 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
140 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
141 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
142 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
143 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
144 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
145 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
146 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
147 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
148 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
149 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
150 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
151 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
152 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
153 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
154 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
155 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
156 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
157 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
158 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
159 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
160 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
161 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
162 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
163 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
164 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
165 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
166 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
167 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
168 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
169 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
170 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
171 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
172 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
173 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
174 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
175 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
176 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
177 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
178 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
179 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
180 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
181 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
182 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
183 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
184 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
185 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
186 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
187 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
188 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
189 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
190 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
191 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
192 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
193 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
194 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
195 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
196 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
197 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
198 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
199 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
200 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
201 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
202 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
203 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
204 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
205 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
206 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
207 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
208 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
209 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
210 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
211 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
212 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
213 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
214 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
215 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
216 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
217 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
218 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
219 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
220 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
221 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
222 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
223 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
224 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
225 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
226 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
227 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
228 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
229 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
230 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
231 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
232 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
233 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
234 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
235 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
236 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
237 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
238 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
239 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
240 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
241 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
242 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
243 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
244 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
245 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
246 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
247 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
248 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
249 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
250 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
251 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
252 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
253 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
254 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
255 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
256 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
257 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
258 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
259 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
260 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
261 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
262 {"FilterCaulk", '6', RAD_ALT , ID_FILTER_CAULK, "menu_filter_caulk"},
263 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
264 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
265 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
266 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
267 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
268 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
269 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
270 {"FilterStructural", 'D', RAD_CONTROL|RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
271 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
272 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
273 {"FilterTriggers", 'T', RAD_CONTROL|RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
274 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
275 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
276 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
279 int g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
283 {"Space", GDK_space},
284 {"Backspace", GDK_BackSpace},
285 {"Escape", GDK_Escape},
287 {"Insert", GDK_Insert},
288 {"Delete", GDK_Delete},
289 {"PageUp", GDK_Prior},
290 {"PageDown", GDK_Next},
294 {"Right", GDK_Right},
308 {"Return", GDK_Return},
309 {"Comma", GDK_comma},
310 {"Period", GDK_period},
311 {"Plus", GDK_KP_Add},
312 {"Multiply", GDK_multiply},
313 {"Subtract", GDK_KP_Subtract},
314 {"NumPad0", GDK_KP_0},
315 {"NumPad1", GDK_KP_1},
316 {"NumPad2", GDK_KP_2},
317 {"NumPad3", GDK_KP_3},
318 {"NumPad4", GDK_KP_4},
319 {"NumPad5", GDK_KP_5},
320 {"NumPad6", GDK_KP_6},
321 {"NumPad7", GDK_KP_7},
322 {"NumPad8", GDK_KP_8},
323 {"NumPad9", GDK_KP_9},
330 int g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
332 // =============================================================================
335 void WINAPI Sys_UpdateWindows (int nBits)
337 g_nUpdateBits |= nBits;
340 // =============================================================================
343 // Gef: Separate handling for keyup events
344 void HandleKeyUp (GtkWidget *widget, gpointer data)
346 int id = GPOINTER_TO_INT (data);
348 Sys_Printf("HandleKeyUp: %d\n", id);
351 if(g_bIgnoreCommands)
356 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (FALSE); break;
357 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (FALSE); break;
358 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (FALSE); break;
359 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (FALSE); break;
360 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (FALSE); break;
361 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (FALSE); break;
365 gint HandleCommand (GtkWidget *widget, gpointer data)
367 int id = GPOINTER_TO_INT (data);
369 Sys_Printf("HandleCommand %d\n", id);
372 if ( g_bIgnoreCommands ) {
374 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
379 if (id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END) g_pParentWnd->OnTextureWad (id);
380 else if (id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END) g_pParentWnd->OnBspCommand (id);
381 else if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4) g_pParentWnd->OnMru (id);
382 else if (id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE)
384 if (GTK_CHECK_MENU_ITEM (widget)->active)
385 g_pParentWnd->OnViewNearest (id);
386 } else if (id >= ID_GRID_025 && id <= ID_GRID_256) g_pParentWnd->OnGrid (id);
387 else if (id >= ID_PLUGIN_START && id <= ID_PLUGIN_END)
390 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
391 g_pParentWnd->OnPlugIn (id, str);
392 } else if (id >= ID_ENTITY_START && id <= ID_ENTITY_END)
395 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
396 g_pParentWnd->ActiveXY()->OnEntityCreate (str);
400 case ID_FILE_NEW: g_pParentWnd->OnFileNew (); break;
401 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
402 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen (); break;
403 case ID_FILE_SAVE: g_pParentWnd->OnFileSave (); break;
404 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas (); break;
405 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap (); break;
406 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion (); break;
407 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject (); break;
408 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject (); break;
409 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings (); break;
410 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile (); break;
411 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate (); break;
412 case ID_FILE_EXIT: g_pParentWnd->OnFileExit (); break;
413 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap (); break;
414 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo (); break;
415 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo (); break;
416 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush (); break;
417 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush (); break;
418 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera (); break;
419 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete (); break;
420 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo (); break;
421 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo (); break;
422 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts (); break;
423 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab (); break;
424 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab (); break;
425 case ID_PREFS: g_pParentWnd->OnPrefs (); break;
426 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera (); break;
427 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole (); break;
428 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity (); break;
429 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups (); break;
430 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview (); break;
431 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz (); break;
432 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz (); break;
433 case ID_TOGGLEZ: g_pParentWnd->OnTogglez (); break;
434 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter (); break;
435 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor (); break;
436 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor (); break;
437 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview (); break;
438 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview (); break;
439 case ID_VIEW_XY: g_pParentWnd->OnViewXy (); break;
440 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide (); break;
441 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront (); break;
442 case ID_VIEW_100: g_pParentWnd->OnView100 (); break;
443 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin (); break;
444 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout (); break;
445 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100 (); break;
446 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin (); break;
447 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout (); break;
448 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein (); break;
449 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout (); break;
450 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames (); break;
451 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks (); break;
452 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates (); break;
453 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline (); break;
454 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes (); break;
455 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone (); break;
456 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles (); break;
457 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected (); break;
458 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden (); break;
459 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
460 case ID_VIEW_ENTITIESAS_WIREFRAME:
461 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
462 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
463 case ID_VIEW_ENTITIESAS_SKINNED:
464 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
465 g_pParentWnd->OnEntitiesSetViewAs(id);
467 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping (); break;
468 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting (); break;
469 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges (); break;
470 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies (); break;
471 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone (); break;
472 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect (); break;
473 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx (); break;
474 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy (); break;
475 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz (); break;
476 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex (); break;
477 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey (); break;
478 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez (); break;
479 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation (); break;
480 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale (); break;
481 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow (); break;
482 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract (); break;
483 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge (); break;
484 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline (); break;
485 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle (); break;
486 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall (); break;
487 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching (); break;
488 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall (); break;
489 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside (); break;
490 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft (); break;
491 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright (); break;
492 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup (); break;
493 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown (); break;
494 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper (); break;
495 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected (); break;
496 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected (); break;
497 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip (); break;
498 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect (); break;
499 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity (); break;
500 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
501 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
502 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail (); break;
503 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural (); break;
504 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid (); break;
505 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse (); break;
506 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall (); break;
507 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector (); break;
508 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall (); break;
509 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock (); break;
510 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock (); break;
511 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad (); break;
512 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders (); break;
513 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow (); break;
514 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
515 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
516 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
517 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
518 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
519 g_pParentWnd->SetTextureScale (id);
521 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist (); break;
522 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly (); break;
523 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup (); break;
524 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown (); break;
525 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark (); break;
526 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal (); break;
527 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer (); break;
528 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack (); break;
529 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar (); break; /* ydnar */
530 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk (); break;
531 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk (); break;
532 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor (); break;
533 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor (); break;
534 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext (); break;
535 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock (); break;
536 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack (); break;
537 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush (); break;
538 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush (); break;
539 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D (); break;
540 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper (); break;
541 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname (); break;
542 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma (); break;
543 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush (); break;
544 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot (); break;
545 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot (); break;
546 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy (); break;
547 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor (); break;
548 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves (); break;
549 case ID_REGION_OFF: g_pParentWnd->OnRegionOff (); break;
550 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy (); break;
551 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush (); break;
552 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush (); break;
553 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection (); break;
554 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided (); break;
555 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided (); break;
556 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided (); break;
557 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided (); break;
558 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided (); break;
559 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided (); break;
560 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided (); break;
561 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided (); break;
562 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone (); break;
563 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere (); break;
564 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube (); break;
565 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube (); break;
566 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube (); break;
567 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare (); break;
568 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap (); break;
569 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel (); break;
570 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel (); break;
571 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap();break;
572 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone (); break;
573 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh (); break;
574 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn (); break;
575 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn (); break;
576 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow (); break;
577 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow (); break;
578 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn (); break;
579 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn (); break;
580 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow (); break;
581 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow (); break;
582 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative (); break;
583 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows (); break;
584 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols (); break;
585 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows (); break;
586 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose (); break;
587 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap (); break;
588 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap (); break;
589 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet (); break;
590 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear (); break;
591 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken (); break;
592 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh (); break;
593 case ID_HELP: g_pParentWnd->OnHelp (); break;
594 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
595 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
596 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist (); break;
597 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout (); break;
598 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel (); break;
599 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals (); break;
600 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk (); break;
601 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural (); break;
602 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips (); break;
603 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips (); break;
604 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails (); break;
605 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities (); break;
606 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips (); break;
607 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights (); break;
608 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids (); break;
609 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels (); break;
610 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches (); break;
611 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent (); break;
612 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers (); break;
613 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld (); break;
614 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths (); break;
615 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals (); break;
616 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid (); break;
618 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection (); break;
619 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange (); break;
620 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup (); break;
621 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera (); break;
622 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate (); break;
623 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate (); break;
624 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale (); break;
625 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx (); break;
626 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky (); break;
627 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz (); break;
628 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve (); break;
629 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox (); break;
630 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe (); break;
631 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend (); break;
632 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld (); break;
633 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown (); break;
634 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName (); break;
635 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup (); break;
636 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove (); break;
637 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities (); break;
639 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit (); break;
640 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture (); break;
641 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector (); break;
642 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX (); break;
643 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY (); break;
644 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn (); break;
645 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow (); break;
646 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn (); break;
647 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow (); break;
648 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab (); break;
649 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (TRUE); break;
650 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (TRUE); break;
651 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (TRUE); break;
652 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (TRUE); break;
653 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp (); break;
654 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown (); break;
655 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup (); break;
656 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown (); break;
657 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (TRUE); break;
658 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (TRUE); break;
659 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle (); break;
660 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole (); break;
661 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair (); break;
662 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit (); break;
663 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock (); break;
664 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter (); break;
665 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup (); break;
666 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown (); break;
667 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft (); break;
668 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright (); break;
669 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup (); break;
670 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown (); break;
671 case ID_GRID_PREV: g_pParentWnd->OnGridPrev (); break;
672 case ID_GRID_NEXT: g_pParentWnd->OnGridNext (); break;
673 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft (); break;
674 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight (); break;
675 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown (); break;
676 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup (); break;
677 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint (); break;
678 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint (); break;
679 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize (); break;
680 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid (); break;
681 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll (); break;
682 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert (); break;
688 static gint timer (gpointer data)
690 MainFrame *wnd = (MainFrame*)data;
695 static gint mainframe_delete (GtkWidget *widget, GdkEvent *event, gpointer data)
697 MainFrame *wnd = (MainFrame*)data;
701 if (ConfirmModified())
704 g_qeglobals_gui.d_edit = NULL;
709 static void mainframe_destroy (GtkWidget *widget, gpointer data)
711 MainFrame *wnd = (MainFrame*)data;
713 // avoid saving prefs when the app is minimized
714 if (g_pParentWnd->IsSleeping())
716 Sys_Printf("Shutdown while sleeping, not saving prefs\n");
717 g_qeglobals.disable_ini = true;
720 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
721 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
722 g_PrefsDlg.SavePrefs ();
727 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
728 // and modules / plugins decide to save some stuff
729 g_pParentWnd->GetPlugInMgr().Shutdown();
734 g_PrefsDlg.Destroy ();
735 g_dlgSurface.Destroy ();
736 g_dlgFind.Destroy ();
737 g_PatchDialog.Destroy ();
742 static gint mainframe_keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
744 unsigned int code = gdk_keyval_to_upper(event->keyval);
746 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=924
747 if(code == GDK_ISO_Left_Tab) {
752 Sys_Printf("key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK);
755 // BUG: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=865
756 // return only if Texture Viewport is in main window, otherwise if Tex viewport is in it's own window
757 // the Filter GtkEntry won't release focus
758 if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus(GTK_WINDOW(widget)) )
759 if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) )
763 Sys_Printf("mainframe_keypress processing into a command\n");
765 for (int i = 0; i < g_nCommandCount; i++)
767 if (g_Commands[i].m_nKey == code) // find a match?
770 unsigned int nState = 0;
773 if ((event->state & GDK_CONTROL_MASK) != 0)
774 nState |= RAD_CONTROL;
775 if ((event->state & GDK_SHIFT_MASK) != 0)
777 if ((g_Commands[i].m_nModifiers & 0x7) == nState)
779 HandleCommand (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
780 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
789 static gint mainframe_keyrelease (GtkWidget* widget, GdkEventKey* event, gpointer data)
791 unsigned int code = gdk_keyval_to_upper(event->keyval);
793 if (gtk_accelerator_valid (event->keyval, (GdkModifierType)0))
796 for (int i = 0; i < g_nCommandCount; i++)
798 if (g_Commands[i].m_nKey == code) // find a match?
800 if(!g_Commands[i].m_nModifiers)
802 // Gef: Only call the handler if it's a key that needs keyup events
803 switch (g_Commands[i].m_nCommand)
805 case ID_CAMERA_FORWARD:
808 case ID_CAMERA_RIGHT:
809 case ID_CAMERA_STRAFELEFT:
810 case ID_CAMERA_STRAFERIGHT:
812 HandleKeyUp (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
813 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_release_event");
826 // =============================================================================
827 // Window creation functions
829 void AddMenuItem (GtkWidget* item, unsigned int id)
831 for (int i = 0; i < g_nCommandCount; i++)
832 if (g_Commands[i].m_nCommand == id)
834 g_object_set_data (G_OBJECT (g_pParentWnd->m_pWidget), g_Commands[i].m_strMenu, item);
839 void MainFrame::handle_help_command(int id)
841 OpenURL(mHelpURLs[id]->GetBuffer());
845 needed for hooking in Gtk+
847 void HandleHelpCommand (GtkWidget *widget, gpointer data)
849 int id = GPOINTER_TO_INT (data);
850 g_pParentWnd->handle_help_command(id);
853 void MainFrame::process_xlink (Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel)
856 pDoc = xmlParseFile(FileName.GetBuffer());
859 Sys_Printf("Processing .xlink file '%s'\n", FileName.GetBuffer());
861 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic(menu, menu_name);
862 // start walking the nodes, find the 'links' one
863 xmlNodePtr pNode = pDoc->children;
864 while (pNode && strcmp((const char*)pNode->name, "links"))
868 pNode = pNode->children;
871 if (!strcmp((const char*)pNode->name, "item"))
875 if (strstr((char *)xmlGetProp(pNode, (xmlChar *)"url"), "http://"))
879 *url = (char *)xmlGetProp(pNode, (xmlChar *)"url");
886 *url += (char *)xmlGetProp(pNode, (xmlChar *)"url");
888 mHelpURLs.push_back(url);
889 create_menu_item_with_mnemonic (menu_in_menu, (char *)xmlGetProp(pNode, (xmlChar *)"name"), GTK_SIGNAL_FUNC(HandleHelpCommand), mHelpURLs.size()-1);
898 Sys_Printf("'%s' not found / parse failed\n", FileName.GetBuffer());
902 void MainFrame::create_game_help_menu (GtkWidget *menu, GtkAccelGroup *accel)
905 list<CGameDescription *>::iterator iGame;
907 // start in the global dir
908 FileName = g_strAppPath;
909 FileName += "global.xlink";
910 process_xlink(FileName, "General", g_strAppPath.GetBuffer(), menu, accel);
912 for (iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++)
914 FileName = (*iGame)->mGameToolsPath;
915 FileName += "game.xlink";
916 process_xlink(FileName, (*iGame)->mGameName, (*iGame)->mGameToolsPath.GetBuffer(), menu, accel);
920 void MainFrame::create_main_menu (GtkWidget *window, GtkWidget *vbox)
922 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
923 GtkAccelGroup *accel;
926 accel = gtk_accel_group_new ();
927 global_accel = accel;
928 gtk_window_add_accel_group (GTK_WINDOW (window), accel);
930 handle_box = gtk_handle_box_new ();
931 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
932 gtk_widget_show (handle_box);
934 menu_bar = gtk_menu_bar_new ();
935 gtk_container_add (GTK_CONTAINER (handle_box), menu_bar);
936 gtk_widget_show (menu_bar);
939 menu = create_sub_menu_with_mnemonic (menu_bar, _("_File"));
940 if (g_PrefsDlg.m_bDetachableMenus)
943 create_menu_item_with_mnemonic (menu, _("_New Map"),
944 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEW);
945 menu_separator (menu);
947 //++timo temporary experimental stuff for sleep mode..
948 item = create_menu_item_with_mnemonic (menu, _("_Sleep"),
949 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SLEEP);
950 g_object_set_data (G_OBJECT (window), "menu_file_sleep", item );
951 menu_separator (menu);
954 item = create_menu_item_with_mnemonic (menu, _("_Open..."),
955 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_OPEN);
956 g_object_set_data (G_OBJECT (window), "menu_file_open", item);
957 create_menu_item_with_mnemonic (menu, _("_Import..."), // Hydra: give it it's proper name
958 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_IMPORTMAP);
959 item = create_menu_item_with_mnemonic (menu, _("_Save"),
960 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVE);
961 g_object_set_data (G_OBJECT (window), "menu_file_save", item);
962 create_menu_item_with_mnemonic (menu, _("Save _as..."),
963 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEAS);
964 create_menu_item_with_mnemonic (menu, _("Save s_elected..."),
965 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXPORTMAP);
966 menu_separator (menu);
967 item = create_menu_item_with_mnemonic (menu, _("Save re_gion..."),
968 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEREGION);
969 g_object_set_data (G_OBJECT (window), "menu_file_saveregion", item);
970 menu_separator (menu);
971 create_menu_item_with_mnemonic (menu, _("New p_roject..."),
972 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEWPROJECT);
973 create_menu_item_with_mnemonic (menu, _("Load _project..."),
974 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_LOADPROJECT);
975 create_menu_item_with_mnemonic (menu, _("Pro_ject settings..."),
976 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_PROJECTSETTINGS);
977 menu_separator (menu);
978 create_menu_item_with_mnemonic (menu, _("_Pointfile..."),
979 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_POINTFILE);
980 menu_separator (menu);
981 item = create_menu_item_with_mnemonic (menu, _("Recent Files"),
982 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT1);
983 g_object_set_data (G_OBJECT (item), "accel", accel);
984 gtk_widget_set_sensitive (item, FALSE);
985 MRU_AddWidget (item, 0);
986 item = create_menu_item_with_mnemonic (menu, "2",
987 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT2);
988 gtk_widget_hide (item);
989 MRU_AddWidget (item, 1);
990 item = create_menu_item_with_mnemonic (menu, "3",
991 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT3);
992 gtk_widget_hide (item);
993 MRU_AddWidget (item, 2);
994 item = create_menu_item_with_mnemonic (menu, "4",
995 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT4);
996 gtk_widget_hide (item);
997 MRU_AddWidget (item, 3);
998 menu_separator (menu);
999 item = create_menu_item_with_mnemonic (menu, _("Check for GtkRadiant update (web)"),
1000 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_CHECKUPDATE);
1001 // disable, the functionality is no longer available
1002 gtk_widget_set_sensitive( item, FALSE );
1004 create_menu_item_with_mnemonic (menu, _("E_xit"),
1005 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXIT);
1008 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Edit"));
1009 if (g_PrefsDlg.m_bDetachableMenus)
1010 menu_tearoff (menu);
1011 item = create_menu_item_with_mnemonic (menu, _("_Undo"),
1012 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_UNDO);
1013 g_object_set_data (G_OBJECT (window), "menu_edit_undo", item);
1014 item = create_menu_item_with_mnemonic (menu, _("_Redo"),
1015 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_REDO);
1016 g_object_set_data (G_OBJECT (window), "menu_edit_redo", item);
1017 menu_separator (menu);
1018 item = create_menu_item_with_mnemonic (menu, _("_Copy"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_COPYBRUSH);
1019 item = create_menu_item_with_mnemonic (menu, _("_Paste"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSH);
1020 item = create_menu_item_with_mnemonic (menu, _("P_aste To Camera"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSHTOCAMERA);
1021 item = create_menu_item_with_mnemonic (menu, _("_Delete"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1022 g_object_set_data (G_OBJECT (window), "menu_selection_delete", item);
1023 menu_separator (menu);
1024 create_menu_item_with_mnemonic (menu, _("Map Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_MAPINFO);
1025 create_menu_item_with_mnemonic (menu, _("Entity Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_ENTITYINFO);
1026 menu_separator (menu);
1027 create_menu_item_with_mnemonic (menu, _("Brush Scripts..."), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_SCRIPTS);
1028 menu_separator (menu);
1029 create_menu_item_with_mnemonic (menu, _("Load Pre_fab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_LOADPREFAB);
1030 create_menu_item_with_mnemonic (menu, _("Save Selection as Prefab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_SAVEPREFAB);
1031 menu_separator (menu);
1032 create_menu_item_with_mnemonic (menu, _("Preferences..."), GTK_SIGNAL_FUNC (HandleCommand), ID_PREFS);
1035 menu = create_sub_menu_with_mnemonic (menu_bar, _("_View"));
1036 if (g_PrefsDlg.m_bDetachableMenus)
1037 menu_tearoff (menu);
1039 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Toggle"));
1040 create_menu_item_with_mnemonic (menu_in_menu, _("Camera View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECAMERA);
1041 create_menu_item_with_mnemonic (menu_in_menu, _("Console View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECONSOLE);
1042 item = create_menu_item_with_mnemonic (menu_in_menu, _("Entity View"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITY);
1043 g_object_set_data (G_OBJECT (window), "menu_view_entity", item);
1044 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1045 create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW);
1046 create_menu_item_with_mnemonic (menu_in_menu, _("YZ (Side)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_YZ);
1047 create_menu_item_with_mnemonic (menu_in_menu, _("XZ (Front)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_XZ);
1048 create_menu_item_with_mnemonic (menu_in_menu, _("Z View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEZ);
1049 menu_separator (menu);
1050 item = create_menu_item_with_mnemonic (menu, _("_Center"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTER);
1051 item = create_menu_item_with_mnemonic (menu, _("_Center 2d"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTERVIEW);
1052 item = create_menu_item_with_mnemonic (menu, _("_Up Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_UPFLOOR);
1053 item = create_menu_item_with_mnemonic (menu, _("_Down Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_DOWNFLOOR);
1054 menu_separator (menu);
1055 item = create_menu_item_with_mnemonic (menu, _("_Next (XY, YZ, XY)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEXTVIEW);
1056 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Layout"));
1057 create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_XY);
1058 create_menu_item_with_mnemonic (menu_in_menu, _("YZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SIDE);
1059 create_menu_item_with_mnemonic (menu_in_menu, _("XZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_FRONT);
1060 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Zoom"));
1061 create_menu_item_with_mnemonic (menu_in_menu, _("_XY 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_100);
1062 item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMIN);
1063 item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMOUT);
1064 menu_separator (menu_in_menu);
1065 create_menu_item_with_mnemonic (menu_in_menu, _("_Z 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_Z100);
1066 item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoo_m In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMIN);
1067 g_object_set_data (G_OBJECT (window), "menu_view_zzoomin", item);
1068 item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoom O_ut"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMOUT);
1069 g_object_set_data (G_OBJECT (window), "menu_view_zzoomout", item);
1070 menu_separator (menu_in_menu);
1071 item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEIN);
1072 item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEOUT);
1073 menu_separator (menu);
1075 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Show"));
1076 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Angles"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWANGLES, FALSE);
1077 g_object_set_data (G_OBJECT (window), "menu_view_showangles", item);
1078 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Names"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWNAMES, TRUE);
1079 g_object_set_data (G_OBJECT (window), "menu_view_shownames", item);
1080 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Blocks"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWBLOCKS, FALSE);
1081 g_object_set_data (G_OBJECT (window), "menu_view_showblocks", item);
1082 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show C_oordinates"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWCOORDINATES, TRUE);
1083 g_object_set_data (G_OBJECT (window), "menu_view_showcoordinates", item);
1084 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Window Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWOUTLINE, TRUE);
1085 g_object_set_data (G_OBJECT (window), "menu_view_showoutline", item);
1086 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show ZBuffered Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_NOOUTLINE, TRUE);
1087 g_object_set_data (G_OBJECT (window), "menu_selection_nooutline", item);
1088 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Axes"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWAXES, TRUE);
1089 g_object_set_data (G_OBJECT (window), "menu_view_showaxes", item);
1090 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Workzone"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWWORKZONE, FALSE);
1091 g_object_set_data (G_OBJECT (window), "menu_view_showworkzone", item);
1093 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Filter"));
1094 create_check_menu_item_with_mnemonic (menu_in_menu, _("World"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_WORLD, FALSE);
1095 create_check_menu_item_with_mnemonic (menu_in_menu, _("Entities"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_ENTITIES, FALSE);
1096 create_check_menu_item_with_mnemonic (menu_in_menu, _("Areaportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_AREAPORTALS, FALSE);
1097 create_check_menu_item_with_mnemonic (menu_in_menu, _("Translucent"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRANSLUCENT, FALSE);
1098 create_check_menu_item_with_mnemonic (menu_in_menu, _("Liquids"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIQUIDS, FALSE);
1099 create_check_menu_item_with_mnemonic (menu_in_menu, _("Caulk"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CAULK, FALSE);
1100 create_check_menu_item_with_mnemonic (menu_in_menu, _("Clips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLIPS, FALSE);
1101 create_check_menu_item_with_mnemonic (menu_in_menu, _("Paths"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATHS, FALSE);
1102 create_check_menu_item_with_mnemonic (menu_in_menu, _("Clusterportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLUSTERPORTALS, FALSE);
1103 create_check_menu_item_with_mnemonic (menu_in_menu, _("Lights"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTS, FALSE);
1104 create_check_menu_item_with_mnemonic (menu_in_menu, _("Structural"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_STRUCTURAL, FALSE);
1105 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Lightgrid"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTGRID, FALSE);
1106 g_object_set_data (G_OBJECT (window), "menu_filter_lightgrid", item);
1107 create_check_menu_item_with_mnemonic (menu_in_menu, _("Patches"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATCHES, FALSE);
1108 create_check_menu_item_with_mnemonic (menu_in_menu, _("Details"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_DETAILS, FALSE);
1109 create_check_menu_item_with_mnemonic (menu_in_menu, _("Hints"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_HINTSSKIPS, FALSE);
1110 create_check_menu_item_with_mnemonic (menu_in_menu, _("Models"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_MODELS, FALSE);
1111 create_check_menu_item_with_mnemonic (menu_in_menu, _("Triggers"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRIGGERS, FALSE);
1112 create_check_menu_item_with_mnemonic (menu_in_menu, _("Botclips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_BOTCLIPS, FALSE);
1114 menu_separator (menu);
1115 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Hide/Show"));
1116 create_menu_item_with_mnemonic (menu_in_menu, _("Hide Selected"),
1117 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_HIDESELECTED);
1118 create_menu_item_with_mnemonic (menu_in_menu, _("Show Hidden"),
1119 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_SHOWHIDDEN);
1120 menu_separator (menu);
1121 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Entities as"));
1122 g_object_set_data (G_OBJECT (window), "view_entitiesas_menu", menu_in_menu);
1123 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("Bounding box"),
1124 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE);
1125 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_boundingbox", item);
1126 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Wireframe"),
1127 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE);
1128 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_wireframe", item);
1129 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Wireframe"),
1130 GTK_SIGNAL_FUNC (HandleCommand),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE);
1131 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedwireframe", item);
1132 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Skinned"),
1133 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE);
1134 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedskinned", item);
1135 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned"),
1136 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNED,FALSE);
1137 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinned", item);
1138 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned and Boxed"),
1139 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE);
1140 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinnedandboxed", item);
1141 menu_separator (menu);
1142 item = create_check_menu_item_with_mnemonic (menu, _("Cubic Clipping"),
1143 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBICCLIPPING, TRUE);
1144 g_object_set_data (G_OBJECT (window), "menu_view_cubicclipping", item);
1145 menu_separator (menu);
1146 item = create_check_menu_item_with_mnemonic (menu, _("OpenGL Lighting"),
1147 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_OPENGLLIGHTING, FALSE);
1148 g_object_set_data (G_OBJECT (window), "menu_view_opengllighting", item);
1151 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Selection"));
1152 if (g_PrefsDlg.m_bDetachableMenus)
1153 menu_tearoff (menu);
1155 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Drag"));
1156 create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Edges"),
1157 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGEDGES);
1158 create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Vertices"),
1159 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGVERTECIES);
1160 menu_separator (menu);
1161 create_menu_item_with_mnemonic (menu, _("_Clone"),
1162 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CLONE);
1163 item = create_menu_item_with_mnemonic (menu, _("Deselect"),
1164 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DESELECT);
1165 item = create_menu_item_with_mnemonic (menu, _("Invert"),
1166 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_INVERT);
1168 create_menu_item_with_mnemonic (menu, _("_Delete"),
1169 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1171 menu_separator (menu);
1172 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Flip"));
1173 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _X"),
1174 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPX);
1175 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Y"),
1176 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPY);
1177 create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Z"),
1178 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPZ);
1179 menu_separator (menu);
1180 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Rotate"));
1181 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate X"),
1182 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEX);
1183 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Y"),
1184 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEY);
1185 create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Z"),
1186 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEZ);
1187 create_menu_item_with_mnemonic (menu_in_menu, _("Arbitrary rotation..."),
1188 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_ARBITRARYROTATION);
1189 menu_separator (menu);
1190 create_menu_item_with_mnemonic (menu, _("Scale..."), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SCALE);
1191 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("CSG"));
1192 create_menu_item_with_mnemonic (menu_in_menu, _("Make _Hollow"),
1193 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKEHOLLOW);
1194 create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Subtract"),
1195 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGSUBTRACT);
1196 create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Merge"),
1197 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGMERGE);
1198 menu_separator (menu);
1199 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Select"));
1200 create_menu_item_with_mnemonic (menu_in_menu, _("Select Complete _Tall"),
1201 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTCOMPLETETALL);
1202 create_menu_item_with_mnemonic (menu_in_menu, _("Select T_ouching"),
1203 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTTOUCHING);
1204 create_menu_item_with_mnemonic (menu_in_menu, _("Select _Partial Tall"),
1205 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTPARTIALTALL);
1206 create_menu_item_with_mnemonic (menu_in_menu, _("Select _Inside"),
1207 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTINSIDE);
1209 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Left"),
1210 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1211 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Right"),
1212 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1213 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Up"),
1214 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1215 create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Down"),
1216 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1218 menu_separator (menu);
1219 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Clipper"));
1220 create_menu_item_with_mnemonic (menu_in_menu, _("Toggle Clipper"),
1221 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CLIPPER);
1222 menu_separator (menu_in_menu);
1223 create_menu_item_with_mnemonic (menu_in_menu, _("Clip selection"),
1224 GTK_SIGNAL_FUNC (HandleCommand), ID_CLIP_SELECTED);
1225 create_menu_item_with_mnemonic (menu_in_menu, _("Split selection"),
1226 GTK_SIGNAL_FUNC (HandleCommand), ID_SPLIT_SELECTED);
1227 create_menu_item_with_mnemonic (menu_in_menu, _("Flip Clip orientation"),
1228 GTK_SIGNAL_FUNC (HandleCommand), ID_FLIP_CLIP);
1229 menu_separator (menu);
1230 create_menu_item_with_mnemonic (menu, _("Connect entities"),
1231 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CONNECT);
1232 create_menu_item_with_mnemonic (menu, _("Ungroup entity"),
1233 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_UNGROUPENTITY);
1234 create_menu_item_with_mnemonic (menu, _("Make detail"),
1235 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_DETAIL);
1236 create_menu_item_with_mnemonic (menu, _("Make structural"),
1237 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_STRUCTURAL);
1240 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Bsp"));
1242 menu_separator (menu);
1243 g_object_set_data (G_OBJECT (window), "menu_bsp", menu);
1246 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Grid"));
1247 if (g_PrefsDlg.m_bDetachableMenus)
1248 menu_tearoff (menu);
1250 item = create_radio_menu_item_with_mnemonic (menu, NULL, _("Grid0.25"),
1251 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_025, FALSE);
1252 g_object_set_data (G_OBJECT (window), "menu_grid_025", item);
1253 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid0.5"),
1254 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_05, FALSE);
1255 g_object_set_data (G_OBJECT (window), "menu_grid_05", item);
1256 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid1"),
1257 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_1, FALSE);
1258 g_object_set_data (G_OBJECT (window), "menu_grid_1", item);
1259 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid2"),
1260 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_2, FALSE);
1261 g_object_set_data (G_OBJECT (window), "menu_grid_2", item);
1262 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid4"),
1263 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_4, FALSE);
1264 g_object_set_data (G_OBJECT (window), "menu_grid_4", item);
1265 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid8"),
1266 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_8, TRUE);
1267 g_object_set_data (G_OBJECT (window), "menu_grid_8", item);
1268 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid16"),
1269 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_16, FALSE);
1270 g_object_set_data (G_OBJECT (window), "menu_grid_16", item);
1271 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid32"),
1272 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_32, FALSE);
1273 g_object_set_data (G_OBJECT (window), "menu_grid_32", item);
1274 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid64"),
1275 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_64, FALSE);
1276 g_object_set_data (G_OBJECT (window), "menu_grid_64", item);
1277 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid128"),
1278 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_128, FALSE);
1279 g_object_set_data (G_OBJECT (window), "menu_grid_128", item);
1280 item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid256"),
1281 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_256, FALSE);
1282 g_object_set_data (G_OBJECT (window), "menu_grid_256", item);
1283 menu_separator (menu);
1284 item = create_check_menu_item_with_mnemonic (menu, _("Snap to grid"),
1285 GTK_SIGNAL_FUNC (HandleCommand), ID_SNAPTOGRID, TRUE);
1286 g_object_set_data (G_OBJECT (window), "menu_snaptogrid", item);
1289 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Textures"));
1290 if (g_PrefsDlg.m_bDetachableMenus)
1291 menu_tearoff (menu);
1293 item = create_check_menu_item_with_mnemonic (menu, _("Show In _Use"),
1294 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWINUSE, FALSE);
1295 g_object_set_data (G_OBJECT (window), "menu_textures_showinuse", item);
1296 item = create_check_menu_item_with_mnemonic (menu, _("Show _All"),
1297 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWALL, FALSE);
1298 g_object_set_data (G_OBJECT (window), "menu_textures_showall", item);
1299 menu_separator (menu);
1300 item = create_check_menu_item_with_mnemonic (menu, _("Show shaders"),
1301 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERS_SHOW, FALSE);
1302 g_object_set_data (G_OBJECT (window), "menu_textures_shaders_show", item);
1303 item = create_menu_item_with_mnemonic (menu, _("Flush & Reload Shaders"),
1304 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_RELOADSHADERS);
1305 g_object_set_data (G_OBJECT (window), "menu_textures_reloadshaders", item);
1306 item = create_menu_item_with_mnemonic (menu, _("Load directory..."),
1307 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOAD);
1308 g_object_set_data (G_OBJECT (window), "menu_textures_load", item);
1309 item = create_menu_item_with_mnemonic (menu, _("Directory list..."),
1310 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOADLIST);
1311 menu_separator (menu);
1313 item = create_menu_item_with_mnemonic (menu, _("_Surface Inspector"),
1314 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_INSPECTOR);
1315 menu_separator (menu);
1316 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Render Quality"));
1317 g_object_set_data (G_OBJECT (window), "render_quality_menu", menu_in_menu);
1318 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("_Wireframe"),
1319 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_WIREFRAME, FALSE);
1320 g_object_set_data (G_OBJECT (window), "menu_textures_wireframe", item);
1321 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Flat shade"),
1322 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_FLATSHADE, FALSE);
1323 g_object_set_data (G_OBJECT (window), "menu_textures_flatshade", item);
1324 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Nearest"),
1325 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEAREST, FALSE);
1326 g_object_set_data (G_OBJECT (window), "menu_view_nearest", item);
1327 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Nearest _Mipmap"),
1328 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEARESTMIPMAP, FALSE);
1329 g_object_set_data (G_OBJECT (window), "menu_view_nearestmipmap", item);
1330 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Linear"),
1331 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_LINEAR, FALSE);
1332 g_object_set_data (G_OBJECT (window), "menu_view_linear", item);
1333 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Bilinear"),
1334 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEAR, FALSE);
1335 g_object_set_data (G_OBJECT (window), "menu_view_bilinear", item);
1336 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("B_ilinear Mipmap"),
1337 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEARMIPMAP, FALSE);
1338 g_object_set_data (G_OBJECT (window), "menu_view_bilinearmipmap", item);
1339 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("T_rilinear"),
1340 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TRILINEAR, FALSE);
1341 g_object_set_data (G_OBJECT (window), "menu_view_trilinear", item);
1342 create_menu_item_with_mnemonic (menu, _("Find / Replace..."),
1343 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURE_REPLACEALL);
1345 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Lock"));
1346 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Moves"),
1347 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_LOCK, TRUE);
1348 g_object_set_data (G_OBJECT (window), "menu_toggle_lock", item);
1349 item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Rotations"),
1350 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_ROTATELOCK, TRUE);
1351 g_object_set_data (G_OBJECT (window), "menu_toggle_rotatelock", item);
1352 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Window Scale"));
1353 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("200%"),
1354 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE);
1355 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_200", item);
1356 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("100%"),
1357 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE);
1358 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_100", item);
1359 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("50%"),
1360 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE);
1361 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_50", item);
1362 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("25%"),
1363 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE);
1364 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_25", item);
1365 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("10%"),
1366 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE);
1367 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_10", item);
1368 item = menu_separator (menu);
1369 item = create_check_menu_item_with_mnemonic (menu, _("shaderlist.txt only"),
1370 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERLISTONLY, FALSE);
1371 g_object_set_data (G_OBJECT (window), "menu_textures_shaderlistonly", item);
1372 item = menu_separator (menu);
1373 g_object_set_data (G_OBJECT (window), "menu_textures_separator", item);
1374 g_object_set_data (G_OBJECT (window), "menu_textures", menu);
1377 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Misc"));
1378 if (g_PrefsDlg.m_bDetachableMenus)
1379 menu_tearoff (menu);
1381 create_menu_item_with_mnemonic (menu, _("_Benchmark"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_BENCHMARK);
1382 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Colors"));
1383 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Themes"));
1384 create_menu_item_with_mnemonic (menu_3, _("QE4 Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETORIGINAL);
1385 create_menu_item_with_mnemonic (menu_3, _("Q3Radiant Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETQER);
1386 create_menu_item_with_mnemonic (menu_3, _("Black and Green"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETBLACK);
1387 create_menu_item_with_mnemonic (menu_3, _("Maya/Max/Lightwave Emulation"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETYDNAR);
1389 menu_separator (menu_in_menu);
1390 create_menu_item_with_mnemonic (menu_in_menu, _("_Texture Background..."),
1391 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREBK);
1392 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Background..."),
1393 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_XYBK);
1394 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major..."),
1395 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR);
1396 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor..."),
1397 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR);
1398 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major Small..."),
1399 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR_ALT);
1400 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor Small..."),
1401 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR_ALT);
1402 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Text..."),
1403 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDTEXT);
1404 create_menu_item_with_mnemonic (menu_in_menu, _("Grid Block..."),
1405 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDBLOCK);
1406 create_menu_item_with_mnemonic (menu_in_menu, _("Default Brush..."),
1407 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_BRUSH);
1408 create_menu_item_with_mnemonic (menu_in_menu, _("Camera Background..."),
1409 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CAMERABACK);
1410 create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush..."),
1411 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH);
1412 create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush (Camera)..."),
1413 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH3D);
1414 create_menu_item_with_mnemonic (menu_in_menu, _("Clipper..."),
1415 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CLIPPER);
1416 create_menu_item_with_mnemonic (menu_in_menu, _("Active View name..."),
1417 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_VIEWNAME);
1419 create_menu_item_with_mnemonic (menu, _("_Gamma..."),
1420 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_GAMMA);
1421 create_menu_item_with_mnemonic (menu, _("Find brush..."),
1422 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_FINDBRUSH);
1423 item = create_menu_item_with_mnemonic (menu, _("Next leak spot"),
1424 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_NEXTLEAKSPOT);
1425 item = create_menu_item_with_mnemonic (menu, _("Previous leak spot"),
1426 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PREVIOUSLEAKSPOT);
1427 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
1428 // create_menu_item_with_mnemonic (menu, _("_Print XY View"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PRINTXY);
1429 item = create_menu_item_with_mnemonic (menu, _("_Select Entity Color..."),
1430 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_SELECTENTITYCOLOR);
1431 g_object_set_data (G_OBJECT (window), "menu_misc_selectentitycolor", item);
1434 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Region"));
1435 if (g_PrefsDlg.m_bDetachableMenus)
1436 menu_tearoff (menu);
1438 create_menu_item_with_mnemonic (menu, _("_Off"),
1439 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_OFF);
1440 create_menu_item_with_mnemonic (menu, _("_Set XY"),
1441 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETXY);
1442 create_menu_item_with_mnemonic (menu, _("Set _Tall Brush"),
1443 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETTALLBRUSH);
1444 create_menu_item_with_mnemonic (menu, _("Set _Brush"),
1445 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETBRUSH);
1446 create_menu_item_with_mnemonic (menu, _("Set Se_lected Brushes"),
1447 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETSELECTION);
1450 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Brush"));
1451 if (g_PrefsDlg.m_bDetachableMenus)
1452 menu_tearoff (menu);
1454 item = create_menu_item_with_mnemonic (menu, _("3 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_3SIDED);
1455 item = create_menu_item_with_mnemonic (menu, _("4 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_4SIDED);
1456 item = create_menu_item_with_mnemonic (menu, _("5 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_5SIDED);
1457 item = create_menu_item_with_mnemonic (menu, _("6 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_6SIDED);
1458 item = create_menu_item_with_mnemonic (menu, _("7 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_7SIDED);
1459 item = create_menu_item_with_mnemonic (menu, _("8 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_8SIDED);
1460 item = create_menu_item_with_mnemonic (menu, _("9 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_9SIDED);
1461 menu_separator (menu);
1462 create_menu_item_with_mnemonic (menu, _("Arbitrary sided..."),
1463 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ARBITRARYSIDED);
1464 menu_separator (menu);
1465 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Primitives"));
1466 create_menu_item_with_mnemonic (menu_in_menu, _("Cone..."),
1467 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_MAKECONE);
1468 create_menu_item_with_mnemonic (menu_in_menu, _("Sphere..."),
1469 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_PRIMITIVES_SPHERE);
1472 if (!g_pGameDescription->mNoPatch)
1474 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Curve"));
1475 if (g_PrefsDlg.m_bDetachableMenus)
1476 menu_tearoff (menu);
1478 create_menu_item_with_mnemonic (menu, _("Cylinder"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHTUBE);
1479 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More Cylinders"));
1480 create_menu_item_with_mnemonic (menu_in_menu, _("Dense Cylinder"),
1481 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHDENSETUBE);
1482 create_menu_item_with_mnemonic (menu_in_menu, _("Very Dense Cylinder"),
1483 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHVERYDENSETUBE);
1484 create_menu_item_with_mnemonic (menu_in_menu, _("Square Cylinder"),
1485 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHSQUARE);
1486 menu_separator (menu);
1487 create_menu_item_with_mnemonic (menu, _("End cap"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHENDCAP);
1488 create_menu_item_with_mnemonic (menu, _("Bevel"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHBEVEL);
1489 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More End caps, Bevels"));
1490 create_menu_item_with_mnemonic (menu_in_menu, _("Square Endcap"),
1491 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL);
1492 create_menu_item_with_mnemonic (menu_in_menu, _("Square Bevel"),
1493 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP);
1494 menu_separator (menu);
1495 create_menu_item_with_mnemonic (menu, _("Cone"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHCONE);
1496 item = create_menu_item_with_mnemonic (menu, _("Sphere"),
1497 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PRIMITIVES_SPHERE);
1498 gtk_widget_set_sensitive (item, FALSE);
1499 menu_separator (menu);
1500 item = create_menu_item_with_mnemonic (menu, _("Simple Patch Mesh..."),
1501 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_SIMPLEPATCHMESH);
1502 g_object_set_data (G_OBJECT (window), "menu_simplepatchmesh", item);
1503 menu_separator (menu);
1504 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Insert"));
1505 create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Columns"),
1506 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTCOLUMN);
1507 create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Columns"),
1508 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDCOLUMN);
1509 menu_separator (menu_in_menu);
1510 create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Rows"),
1511 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTROW);
1512 create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Rows"),
1513 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDROW);
1514 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Delete"));
1515 create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Columns"),
1516 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTCOLUMN);
1517 create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Columns"),
1518 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTCOLUMN);
1519 menu_separator (menu_in_menu);
1520 create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Rows"),
1521 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTROW);
1522 create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Rows"),
1523 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTROW);
1524 menu_separator (menu);
1525 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Matrix"));
1526 create_menu_item_with_mnemonic (menu_in_menu, _("Invert"),
1527 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVE);
1528 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Re-disperse"));
1529 create_menu_item_with_mnemonic (menu_3, _("Rows"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_ROWS);
1530 create_menu_item_with_mnemonic (menu_3, _("Cols (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS);
1531 create_menu_item_with_mnemonic (menu_3, _("Rows (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS);
1532 create_menu_item_with_mnemonic (menu_in_menu, _("Transpose"),
1533 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MATRIX_TRANSPOSE);
1534 menu_separator (menu);
1535 create_menu_item_with_mnemonic (menu, _("Cap Selection"),
1536 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CAP);
1537 create_menu_item_with_mnemonic (menu, _("Cycle Cap Texture"),
1538 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CYCLECAP);
1539 menu_separator (menu);
1540 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Overlay"));
1541 create_menu_item_with_mnemonic (menu_in_menu, _("Set"),
1542 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_SET);
1543 create_menu_item_with_mnemonic (menu_in_menu, _("Clear"),
1544 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_CLEAR);
1545 menu_separator (menu);
1546 create_menu_item_with_mnemonic (menu, _("Thicken..."), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_THICKEN);
1549 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Plugins"));
1550 if (g_PrefsDlg.m_bDetachableMenus)
1551 menu_tearoff (menu);
1554 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1556 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1557 item = menu_separator (menu);
1558 g_object_set_data (G_OBJECT (window), "menu_plugin_separator", item);
1559 g_object_set_data (G_OBJECT (window), "menu_plugin", menu);
1562 menu = create_sub_menu_with_mnemonic (menu_bar, _("_Help"));
1563 if (g_PrefsDlg.m_bDetachableMenus)
1564 menu_tearoff (menu);
1566 item = create_menu_item_with_mnemonic (menu, _("Manual"),
1567 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP);
1568 gtk_widget_add_accelerator (item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1570 // this creates all the per-game drop downs for the game pack helps
1571 // it will take care of hooking the Sys_OpenURL calls etc.
1572 create_game_help_menu(menu, accel);
1574 // TTimo: this is in global.xlink now
1575 //create_menu_item_with_mnemonic (menu, "Links",
1576 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1577 create_menu_item_with_mnemonic (menu, _("Bug report"),
1578 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_BUGREPORT);
1579 create_menu_item_with_mnemonic (menu, _("Shortcuts list"),
1580 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_COMMANDLIST);
1581 create_menu_item_with_mnemonic (menu, _("_About"),
1582 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_ABOUT);
1585 // leo: Hidden menu to make the accelerators work,
1586 // this is a hack that needs to be changed later if someone has a better idea.
1588 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1589 menu = create_sub_menu_with_mnemonic (menu_bar, "Hidden");
1590 if (g_PrefsDlg.m_bDetachableMenus)
1591 menu_tearoff (menu);
1593 gtk_widget_hide (gtk_menu_get_attach_widget (GTK_MENU (menu)));
1595 create_menu_item_with_mnemonic (menu, "BendMode", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_BEND);
1596 create_menu_item_with_mnemonic (menu, "FitTexture", GTK_SIGNAL_FUNC (HandleCommand), IDC_BTN_FACEFIT);
1597 create_menu_item_with_mnemonic (menu, "ViewTextures", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TEXTURE);
1598 create_menu_item_with_mnemonic (menu, "PatchInspector", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_INSPECTOR);
1599 create_menu_item_with_mnemonic (menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREY);
1600 create_menu_item_with_mnemonic (menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREX);
1601 create_menu_item_with_mnemonic (menu, "IncPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTCOLUMN);
1602 create_menu_item_with_mnemonic (menu, "IncPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTROW);
1603 create_menu_item_with_mnemonic (menu, "DecPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETECOLUMN);
1604 create_menu_item_with_mnemonic (menu, "DecPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETEROW);
1605 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1606 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1607 create_menu_item_with_mnemonic (menu, "SelectNudgeDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1608 create_menu_item_with_mnemonic (menu, "CameraForward", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_FORWARD);
1609 create_menu_item_with_mnemonic (menu, "CameraBack", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_BACK);
1610 create_menu_item_with_mnemonic (menu, "CameraLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_LEFT);
1611 create_menu_item_with_mnemonic (menu, "CameraRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_RIGHT);
1612 create_menu_item_with_mnemonic (menu, "CameraUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_UP);
1613 create_menu_item_with_mnemonic (menu, "CameraDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_DOWN);
1614 create_menu_item_with_mnemonic (menu, "CameraAngleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEUP);
1615 create_menu_item_with_mnemonic (menu, "CameraAngleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEDOWN);
1616 create_menu_item_with_mnemonic (menu, "CameraStrafeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFERIGHT);
1617 create_menu_item_with_mnemonic (menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFELEFT);
1618 create_menu_item_with_mnemonic (menu, "ToggleGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_TOGGLE);
1619 create_menu_item_with_mnemonic (menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CROSSHAIR);
1620 create_menu_item_with_mnemonic (menu, "ToggleRealtime", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CAMERAUPDATE);
1621 create_menu_item_with_mnemonic (menu, "MouseRotate", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_MOUSEROTATE);
1622 create_menu_item_with_mnemonic (menu, "TexRotateClock", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECLOCK);
1623 create_menu_item_with_mnemonic (menu, "TexRotateCounter", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECOUNTER);
1624 create_menu_item_with_mnemonic (menu, "TexScaleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEUP);
1625 create_menu_item_with_mnemonic (menu, "TexScaleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEDOWN);
1626 create_menu_item_with_mnemonic (menu, "TexShiftLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTLEFT);
1627 create_menu_item_with_mnemonic (menu, "TexShiftRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTRIGHT);
1628 create_menu_item_with_mnemonic (menu, "TexShiftUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTUP);
1629 create_menu_item_with_mnemonic (menu, "TexShiftDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTDOWN);
1630 create_menu_item_with_mnemonic (menu, "GridDown", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_PREV);
1631 create_menu_item_with_mnemonic (menu, "GridUp", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_NEXT);
1632 create_menu_item_with_mnemonic (menu, "TexScaleLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALELEFT);
1633 create_menu_item_with_mnemonic (menu, "TexScaleRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALERIGHT);
1634 create_menu_item_with_mnemonic (menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEDOWN);
1635 create_menu_item_with_mnemonic (menu, "MoveSelectionUP", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEUP);
1636 create_menu_item_with_mnemonic (menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_PRINT);
1637 create_menu_item_with_mnemonic (menu, "ToggleSizePaint", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TOGGLESIZEPAINT);
1638 create_menu_item_with_mnemonic (menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1639 create_menu_item_with_mnemonic (menu, "SelectNudgeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1640 create_menu_item_with_mnemonic (menu, "SelectNudgeUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1641 create_menu_item_with_mnemonic (menu, "NaturalizePatch", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_NATURALIZE);
1642 create_menu_item_with_mnemonic (menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SNAPTOGRID);
1643 create_menu_item_with_mnemonic (menu, "SelectAllOfType", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_ALL);
1644 create_menu_item_with_mnemonic (menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_OUTLINESTYLE);
1645 create_menu_item_with_mnemonic (menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEUP);
1646 create_menu_item_with_mnemonic (menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEDOWN);
1648 g_bIgnoreCommands--;
1651 void MainFrame::create_main_toolbar (GtkWidget *window, GtkWidget *vbox)
1653 GtkWidget *handle_box, *toolbar, *w;
1655 handle_box = gtk_handle_box_new ();
1656 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1657 gtk_widget_show (handle_box);
1658 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1660 toolbar = gtk_toolbar_new ();
1661 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1662 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1663 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1664 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1666 gtk_widget_show (toolbar);
1668 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Open"), _("Open an existing map"), "",
1669 new_pixmap (window, "file_open.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1670 GINT_TO_POINTER (ID_FILE_OPEN));
1671 g_object_set_data (G_OBJECT (window), "tb_file_open", w);
1672 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Save"), _("Save the active map"), "",
1673 new_pixmap (window, "file_save.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1674 GINT_TO_POINTER (ID_FILE_SAVE));
1675 g_object_set_data (G_OBJECT (window), "tb_file_save", w);
1676 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1677 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Flip"), "",
1678 new_pixmap (window, "brush_flipx.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1679 GINT_TO_POINTER (ID_BRUSH_FLIPX));
1680 g_object_set_data (G_OBJECT (window), "tb_brush_flipx", w);
1681 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Rotate"), "",
1682 new_pixmap (window, "brush_rotatex.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1683 GINT_TO_POINTER (ID_BRUSH_ROTATEX));
1684 g_object_set_data (G_OBJECT (window), "tb_brush_rotatex", w);
1685 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Flip"), "",
1686 new_pixmap (window, "brush_flipy.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1687 GINT_TO_POINTER (ID_BRUSH_FLIPY));
1688 g_object_set_data (G_OBJECT (window), "tb_brush_flipy", w);
1689 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Rotate"), "",
1690 new_pixmap (window, "brush_rotatey.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1691 GINT_TO_POINTER (ID_BRUSH_ROTATEY));
1692 g_object_set_data (G_OBJECT (window), "tb_brush_rotatey", w);
1693 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Flip"), "",
1694 new_pixmap (window, "brush_flipz.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1695 GINT_TO_POINTER (ID_BRUSH_FLIPZ));
1696 g_object_set_data (G_OBJECT (window), "tb_brush_flipz", w);
1697 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Rotate"), "",
1698 new_pixmap (window, "brush_rotatez.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1699 GINT_TO_POINTER (ID_BRUSH_ROTATEZ));
1700 g_object_set_data (G_OBJECT (window), "tb_brush_rotatez", w);
1701 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1703 if (g_PrefsDlg.m_bWideToolbar)
1705 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Complete Tall"), "",
1706 new_pixmap (window, "selection_selectcompletetall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1707 GINT_TO_POINTER (ID_SELECTION_SELECTCOMPLETETALL));
1708 g_object_set_data (G_OBJECT (window), "tb_selection_selectcompletetall", w);
1709 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Touching"), "",
1710 new_pixmap (window, "selection_selecttouching.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1711 GINT_TO_POINTER (ID_SELECTION_SELECTTOUCHING));
1712 g_object_set_data (G_OBJECT (window), "tb_selection_selecttouching", w);
1713 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Partial Tall"), "",
1714 new_pixmap (window, "selection_selectpartialtall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1715 GINT_TO_POINTER (ID_SELECTION_SELECTPARTIALTALL));
1716 g_object_set_data (G_OBJECT (window), "tb_selection_selectpartialtall", w);
1717 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Inside"), "",
1718 new_pixmap (window, "selection_selectinside.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1719 GINT_TO_POINTER (ID_SELECTION_SELECTINSIDE));
1720 g_object_set_data (G_OBJECT (window), "tb_selection_selectinside", w);
1723 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Selection"), "",
1724 new_pixmap (window, "popup_selection.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1725 GINT_TO_POINTER (ID_POPUP_SELECTION));
1726 g_object_set_data (G_OBJECT (window), "tb_popup_selection", w);
1728 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1730 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Subtract"), "",
1731 new_pixmap (window, "selection_csgsubtract.bmp"),
1732 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGSUBTRACT));
1733 g_object_set_data (G_OBJECT (window), "tb_selection_csgsubtract", w);
1735 if (g_PrefsDlg.m_bWideToolbar)
1737 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Merge"), "",
1738 new_pixmap (window, "selection_csgmerge.bmp"),
1739 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGMERGE));
1740 g_object_set_data (G_OBJECT (window), "tb_selection_csgmerge", w);
1743 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Hollow"), "",
1744 new_pixmap (window, "selection_makehollow.bmp"),
1745 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_MAKEHOLLOW));
1746 g_object_set_data (G_OBJECT (window), "tb_selection_makehollow", w);
1748 if (g_PrefsDlg.m_bWideToolbar)
1750 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1751 "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1752 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1753 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1756 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1758 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Change views"), "",
1759 new_pixmap (window, "view_change.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1760 GINT_TO_POINTER (ID_VIEW_CHANGE));
1761 g_object_set_data (G_OBJECT (window), "tb_view_change", w);
1763 if (!g_PrefsDlg.m_bWideToolbar)
1765 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1768 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Texture view mode"), "",
1769 new_pixmap (window, "textures_popup.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1770 GINT_TO_POINTER (ID_TEXTURES_POPUP));
1771 g_object_set_data (G_OBJECT (window), "tb_textures_popup", w);
1773 if (g_PrefsDlg.m_bWideToolbar)
1775 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1776 "", _("Cubic clip the camera view"), "",
1777 new_pixmap (window, "view_cubicclipping.bmp"),
1778 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1779 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1782 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1784 if (!g_PrefsDlg.m_bWideToolbar)
1786 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1787 "", _("Camera preview"), "", new_pixmap (window, "view_cameratoggle.bmp"),
1788 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CAMERATOGGLE));
1789 g_object_set_data (G_OBJECT (window), "tb_view_cameratoggle", w);
1790 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Update Camera", "",
1791 new_pixmap (window, "view_cameraupdate.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1792 GINT_TO_POINTER (ID_VIEW_CAMERAUPDATE));
1793 g_object_set_data (G_OBJECT (window), "tb_view_cameraupdate", w);
1794 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1795 "", _("Cubic clip the camera view"), "",
1796 new_pixmap (window, "view_cubicclipping.bmp"),
1797 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1798 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1799 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1800 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1801 "", _("Entity inspector"), "", new_pixmap (window, "view_entity.bmp"),
1802 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_ENTITY));
1803 g_object_set_data (G_OBJECT (window), "tb_view_entity", w);
1804 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1805 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1806 "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1807 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1808 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1809 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1812 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1813 "", _("Free Rotation"), "", new_pixmap (window, "select_mouserotate.bmp"),
1814 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSEROTATE));
1815 g_object_set_data (G_OBJECT (window), "tb_select_mouserotate", w);
1816 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1817 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1818 "", _("Free Scaling"), "", new_pixmap (window, "select_mousescale.bmp"),
1819 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSESCALE));
1820 g_object_set_data (G_OBJECT (window), "tb_select_mousescale", w);
1821 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1822 "", _("Scale X"), "", new_pixmap (window, "scalelockx.bmp"),
1823 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKX));
1824 g_object_set_data (G_OBJECT (window), "tb_scalelockx", w);
1825 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1826 "", _("Scale Y"), "", new_pixmap (window, "scalelocky.bmp"),
1827 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKY));
1828 g_object_set_data (G_OBJECT (window), "tb_scalelocky", w);
1829 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1830 "", _("Scale Z"), "", new_pixmap (window, "scalelockz.bmp"),
1831 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKZ));
1832 g_object_set_data (G_OBJECT (window), "tb_scalelockz", w);
1834 if (g_PrefsDlg.m_bWideToolbar)
1836 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1837 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1838 "", _("Don't select model brushes"), "",
1839 new_pixmap (window, "dontselectmodel.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1840 GINT_TO_POINTER (ID_DONTSELECTMODEL));
1841 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1842 g_object_set_data (G_OBJECT (window), "tb_dontselectmodel", w);
1844 if (!g_pGameDescription->mNoPatch)
1846 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1847 "", _("Don't select curved brushes"), "",
1848 new_pixmap (window, "dontselectcurve.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1849 GINT_TO_POINTER (ID_DONTSELECTCURVE));
1850 g_object_set_data (G_OBJECT (window), "tb_dontselectcurve", w);
1854 // bug #292, patch toolbar option
1855 if (g_PrefsDlg.m_bPatchToolbar)
1857 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1858 "", _("Show patch bounding box"), "",
1859 new_pixmap (window, "patch_showboundingbox.bmp"),
1860 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_SHOWBOUNDINGBOX));
1861 g_object_set_data (G_OBJECT (window), "tb_patch_showboundingbox", w);
1862 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1863 "", _("Show patches as wireframes"), "",
1864 new_pixmap (window, "patch_wireframe.bmp"),
1865 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_WIREFRAME));
1866 g_object_set_data (G_OBJECT (window), "tb_patch_wireframe", w);
1867 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1868 "", _("Patch Bend mode"), "",
1869 new_pixmap (window, "patch_bend.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1870 GINT_TO_POINTER (ID_PATCH_BEND));
1871 g_object_set_data (G_OBJECT (window), "tb_patch_bend", w);
1872 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Put caps on the current patch"), "",
1873 new_pixmap (window, "curve_cap.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1874 GINT_TO_POINTER (ID_CURVE_CAP));
1875 g_object_set_data (G_OBJECT (window), "tb_curve_cap", w);
1876 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1877 "", _("Welds equal patch points during moves"), "",
1878 new_pixmap (window, "patch_weld.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1879 GINT_TO_POINTER (ID_PATCH_WELD));
1880 g_object_set_data (G_OBJECT (window), "tb_patch_weld", w);
1881 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1882 "", _("Selects drill down rows and columns"), "",
1883 new_pixmap (window, "patch_drilldown.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1884 GINT_TO_POINTER (ID_PATCH_DRILLDOWN));
1885 g_object_set_data (G_OBJECT (window), "tb_patch_drilldown", w);
1888 if (g_PrefsDlg.m_bWideToolbar)
1890 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1891 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Show Entities as"), "",
1892 new_pixmap (window, "show_entities.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1893 GINT_TO_POINTER (ID_SHOW_ENTITIES));
1894 g_object_set_data (G_OBJECT (window), "tb_show_entities", w);
1900 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1901 gtk_widget_hide (w);
1902 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1903 gtk_widget_hide (w);
1904 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1905 gtk_widget_hide (w);
1906 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1907 gtk_widget_hide (w);
1911 m_bCamPreview = true;
1912 g_nScaleHow = (SCALE_X | SCALE_Y | SCALE_Z);
1915 void MainFrame::create_plugin_toolbar (GtkWidget *window, GtkWidget *vbox)
1917 GtkWidget *handle_box, *toolbar;
1919 handle_box = gtk_handle_box_new ();
1920 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1921 if (g_PrefsDlg.m_bPluginToolbar)
1922 gtk_widget_show (handle_box);
1923 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1925 toolbar = gtk_toolbar_new();
1926 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1927 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1928 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1929 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1930 g_object_set_data (G_OBJECT (window), "toolbar_plugin", toolbar);
1931 gtk_widget_show (toolbar);
1934 void MainFrame::create_main_statusbar (GtkWidget *window, GtkWidget *vbox)
1936 GtkWidget *hbox, *hbox1;
1940 hbox = gtk_hbox_new (FALSE, 0);
1941 gtk_widget_show (hbox);
1942 gtk_widget_set_usize (hbox, -1, 24);
1943 gtk_container_border_width (GTK_CONTAINER (hbox), 1);
1944 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
1946 frame = gtk_frame_new ((char*)NULL);
1947 gtk_widget_show (frame);
1948 gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
1949 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1951 hbox1 = gtk_hbox_new (FALSE, 0);
1952 gtk_container_add (GTK_CONTAINER (frame), hbox1);
1953 gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
1954 gtk_widget_show (hbox1);
1956 label = gtk_label_new (_(" Label "));
1957 gtk_widget_show (label);
1958 gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, TRUE, 0);
1959 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1960 gtk_misc_set_padding (GTK_MISC (label), 3, 0);
1961 m_pStatusLabel[0] = label;
1963 for (int i = 1; i < 6; i++)
1965 frame = gtk_frame_new ((char*)NULL);
1966 gtk_widget_show (frame);
1967 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1968 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1970 label = gtk_label_new (_(" Label "));
1971 gtk_widget_show (label);
1972 gtk_container_add (GTK_CONTAINER (frame), label);
1973 m_pStatusLabel[i] = label;
1978 static gint mainframe_idle (gpointer user_data)
1980 g_pParentWnd->RoutineProcessing ();
1984 static void Sys_Iconify (GtkWidget *w);
1985 static void Sys_Restore (GtkWidget *w);
1987 inline void CHECK_RESTORE(GtkWidget* w)
1989 if (g_object_get_data (G_OBJECT (w), "was_mapped") != NULL)
1990 gtk_widget_show (w);
1994 // this is called when the window is restored from the iconified state
1995 static void mainframe_map (GtkWidget *widget)
1997 if (g_pParentWnd->IsSleeping ())
1998 g_pParentWnd->OnSleep ();
2000 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2002 // restore previously visible windows
2003 CHECK_RESTORE (g_pParentWnd->GetCamWnd ()->m_pParent);
2004 if (g_PrefsDlg.m_bFloatingZ)
2005 CHECK_RESTORE (g_pParentWnd->GetZWnd ()->m_pParent);
2006 CHECK_RESTORE (g_pParentWnd->GetXYWnd ()->m_pParent);
2007 CHECK_RESTORE (g_pParentWnd->GetXZWnd ()->m_pParent);
2008 CHECK_RESTORE (g_pParentWnd->GetYZWnd ()->m_pParent);
2009 CHECK_RESTORE (g_pGroupDlg->m_pWidget);
2013 inline void CHECK_MINIMIZE(GtkWidget* w)
2015 g_object_set_data (G_OBJECT (w), "was_mapped", (void*)(GTK_WIDGET_VISIBLE (w) != 0));
2016 gtk_widget_hide (w);
2019 static void mainframe_unmap (GtkWidget *widget)
2022 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2024 // minimize all other windows when the main window is minimized
2025 CHECK_MINIMIZE (g_pParentWnd->GetCamWnd ()->m_pParent);
2026 if (g_PrefsDlg.m_bFloatingZ)
2027 CHECK_MINIMIZE (g_pParentWnd->GetZWnd ()->m_pParent);
2028 CHECK_MINIMIZE (g_pParentWnd->GetXYWnd ()->m_pParent);
2029 CHECK_MINIMIZE (g_pParentWnd->GetXZWnd ()->m_pParent);
2030 CHECK_MINIMIZE (g_pParentWnd->GetYZWnd ()->m_pParent);
2031 CHECK_MINIMIZE (g_pGroupDlg->m_pWidget);
2035 static GtkWidget* create_floating (MainFrame* mainframe)
2037 GtkWidget *wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2038 //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2039 gtk_window_set_transient_for (GTK_WINDOW (wnd), GTK_WINDOW (mainframe->m_pWidget));
2040 gtk_widget_set_events (wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2041 gtk_signal_connect (GTK_OBJECT (wnd), "delete_event", GTK_SIGNAL_FUNC (widget_delete_hide), NULL);
2042 gtk_signal_connect (GTK_OBJECT (wnd), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2043 gtk_signal_connect (GTK_OBJECT (wnd), "key_press_event",
2044 GTK_SIGNAL_FUNC (mainframe_keypress), mainframe);
2045 gtk_signal_connect (GTK_OBJECT (wnd), "key_release_event",
2046 GTK_SIGNAL_FUNC (mainframe_keyrelease), mainframe);
2047 gtk_signal_connect (GTK_OBJECT (wnd), "map_event",
2048 GTK_SIGNAL_FUNC (mainframe_map), mainframe);
2050 gtk_window_set_default_size (GTK_WINDOW (wnd), 100, 100);
2052 #ifdef DBG_WINDOWPOS
2053 Sys_Printf("create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd);
2059 void console_populate_popup(GtkTextView* textview, GtkMenu* menu, gpointer user_data)
2061 menu_separator(GTK_WIDGET(menu));
2063 GtkWidget* item = gtk_menu_item_new_with_label (_("Clear"));
2064 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (Sys_ClearPrintf), NULL);
2065 gtk_widget_show (item);
2066 gtk_menu_append (GTK_MENU (menu), item);
2069 void console_construct(GtkWidget* textview)
2071 g_signal_connect(G_OBJECT(textview), "populate-popup", G_CALLBACK(console_populate_popup), NULL);
2074 extern MemStream g_Clipboard;
2076 void Clipboard_CopyMap()
2078 g_Clipboard.SetLength(0);
2079 Map_Export (&g_Clipboard, "xmap", false, true);
2082 void Clipboard_PasteMap()
2084 if (g_Clipboard.GetLength() > 0)
2086 g_Clipboard.Seek(0, SEEK_SET);
2087 Map_Import(&g_Clipboard, "xmap", true);
2092 Platform-independent GTK clipboard support.
2093 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2095 #if defined (__linux__) || defined (__APPLE__)
2099 RADIANT_CLIPPINGS = 23,
2102 static const GtkTargetEntry clipboard_targets[] = {
2103 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2106 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner)
2110 GdkAtom type = GDK_NONE;
2112 len = g_Clipboard.GetLength();
2119 buffer = g_Clipboard.GetBuffer ();
2122 if(info == clipboard_targets[0].info)
2124 type = gdk_atom_intern(clipboard_targets[0].target, FALSE);
2127 gtk_selection_data_set (selection_data, type, 8, buffer, len);
2130 static void clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner)
2134 static void clipboard_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data)
2136 g_Clipboard.SetLength (0);
2138 if (data->length < 0)
2139 Sys_FPrintf(SYS_ERR, "Error retrieving selection\n");
2140 else if(strcmp(gdk_atom_name(data->type), clipboard_targets[0].target) == 0)
2141 g_Clipboard.Write (data->data, data->length);
2143 Clipboard_PasteMap();
2146 void clipboard_copy()
2148 Clipboard_CopyMap();
2150 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2152 gtk_clipboard_set_with_data (clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL);
2155 void clipboard_paste()
2157 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2159 gtk_clipboard_request_contents (clipboard, gdk_atom_intern(clipboard_targets[0].target, FALSE), clipboard_received, NULL);
2163 #elif defined(WIN32)
2165 void clipboard_copy()
2167 Clipboard_CopyMap();
2169 bool bClipped = false;
2170 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2173 if (::OpenClipboard(NULL))
2176 long lSize = g_Clipboard.GetLength();
2177 HANDLE h = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof(long));
2180 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2181 memcpy(cp, &lSize, sizeof(long));
2183 g_Clipboard.Seek(0, SEEK_SET);
2184 g_Clipboard.Read(cp, lSize);
2186 ::SetClipboardData(nClipboard, h);
2195 Sys_Printf("Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n");
2199 void clipboard_paste()
2201 bool bPasted = false;
2202 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2203 if (nClipboard > 0 && ::OpenClipboard(NULL))
2205 if(IsClipboardFormatAvailable(nClipboard))
2207 HANDLE h = ::GetClipboardData(nClipboard);
2210 g_Clipboard.SetLength(0);
2211 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2213 memcpy(&lSize, cp, sizeof(long));
2215 g_Clipboard.Write(cp, lSize);
2222 Clipboard_PasteMap();
2227 void MainFrame::Copy()
2232 void MainFrame::Paste()
2235 UpdateSurfaceDialog();
2239 #ifdef DBG_WINDOWPOS
2240 GtkWidget *watchit = NULL;
2242 void CheckWatchit(char *msg)
2244 static int width = 0;
2245 if ((watchit!=NULL) && (watchit->allocation.width != width))
2247 Sys_Printf("CheckWatchit %s: %d\n", msg, watchit->allocation.width);
2248 width = watchit->allocation.width;
2254 BOOL CALLBACK m_pCountMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2256 int *n = (int *) dwData;
2263 struct monitorInfo_s {
2264 GdkRectangle *win_monitors;
2268 BOOL CALLBACK m_pEnumMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2270 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2271 GdkRectangle *monitor;
2274 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2276 memset(&lpmi, 0, sizeof(MONITORINFOEX));
2277 lpmi.cbSize = sizeof(MONITORINFOEX);
2279 GetMonitorInfo( hMonitor, &lpmi );
2281 if( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2284 SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
2285 monitor->x = rect.left;
2286 monitor->y = rect.top;
2287 monitor->width = rect.right - rect.left;
2288 monitor->height = rect.bottom - rect.top;
2290 if (monitorInfo->i_win_mon != 0)
2292 GdkRectangle temp = *monitor;
2293 *monitor = monitorInfo->win_monitors[0];
2294 monitorInfo->win_monitors[0] = temp;
2297 monitor->x = lpmi.rcMonitor.left;
2298 monitor->y = lpmi.rcMonitor.top;
2299 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2300 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2303 monitorInfo->i_win_mon++;
2308 void PositionWindowOnPrimaryScreen(window_position_t& position)
2310 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2312 if( position.x <= primaryMonitorRect.x + 6 )
2313 position.x = primaryMonitorRect.x + 6;
2314 else if( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 )
2315 position.x = primaryMonitorRect.x + 6;
2317 if( position.y <= primaryMonitorRect.y + 6 )
2318 position.y = primaryMonitorRect.y + 6;
2319 else if( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 )
2320 position.y = primaryMonitorRect.y + 6;
2322 if( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 )
2323 position.w = primaryMonitorRect.width - 18;
2324 if( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 )
2325 position.h = primaryMonitorRect.height - 18;
2329 GtkWidget* create_framed_widget(GtkWidget* widget)
2331 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2332 gtk_widget_show (frame);
2333 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2334 gtk_container_add (GTK_CONTAINER (frame), widget);
2335 gtk_widget_show(widget);
2339 gboolean entry_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2341 gtk_window_remove_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2345 gboolean entry_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2347 gtk_window_add_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2351 GtkWidget* create_framed_texwnd(TexWnd* texwnd)
2353 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2354 gtk_widget_show (frame);
2355 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2357 GtkWidget* hbox = gtk_hbox_new (FALSE, 0);
2358 gtk_widget_show (hbox);
2359 gtk_container_add (GTK_CONTAINER (frame), hbox);
2361 GtkWidget* w = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,1,1,1)));
2362 gtk_widget_show (w);
2363 gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, TRUE, 0);
2364 g_qeglobals_gui.d_texture_scroll = w;
2366 GtkWidget* texbox = gtk_vbox_new (FALSE, 0);
2367 gtk_widget_show (texbox);
2368 gtk_box_pack_start (GTK_BOX (hbox), texbox, TRUE, TRUE, 0);
2370 w = gtk_entry_new ();
2371 gtk_box_pack_start (GTK_BOX (texbox), w, FALSE, FALSE, 0);
2372 texwnd->m_pFilter = w;
2373 g_signal_connect(G_OBJECT(w), "focus_in_event", G_CALLBACK(entry_focus_in), NULL);
2374 g_signal_connect(G_OBJECT(w), "focus_out_event", G_CALLBACK(entry_focus_out), NULL);
2376 w = texwnd->GetWidget ();
2377 gtk_box_pack_start (GTK_BOX (texbox), w, TRUE, TRUE, 0);
2378 gtk_widget_show (w);
2383 static ZWnd *create_floating_zwnd(MainFrame *mainframe)
2385 ZWnd *pZWnd = new ZWnd ();
2386 GtkWidget* wnd = create_floating (mainframe);
2388 gtk_window_set_title (GTK_WINDOW (wnd), "Z");
2390 pZWnd->m_pParent = wnd;
2393 GtkWidget* frame = create_framed_widget(pZWnd->GetWidget());
2394 gtk_container_add (GTK_CONTAINER (wnd), frame);
2397 gtk_widget_realize (wnd);
2399 // turn OFF minimize and maximize boxes.
2400 // Must be *after* realize, or wnd->window is NULL
2401 // should do the right thing on *nix, need to verify.
2402 gdk_window_set_decorations ( wnd->window,
2403 GdkWMDecoration(GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2404 //TODO 50 by observation, will vary depending on decoration sizes
2406 GdkGeometry geometry;
2407 geometry.min_width = 50;
2408 //we only care about width, but have to set this too, or get nasty bugs
2409 geometry.min_height = 10;
2410 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE);
2414 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2415 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2418 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posZWnd);
2420 if (g_PrefsDlg.m_bZVis)
2421 gtk_widget_show (wnd);
2426 static const int gutter = 12;
2428 void MainFrame::Create ()
2430 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2432 gtk_widget_set_events (window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2433 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2434 GTK_SIGNAL_FUNC (mainframe_delete), this);
2435 gtk_signal_connect (GTK_OBJECT (window), "destroy",
2436 GTK_SIGNAL_FUNC (mainframe_destroy), this);
2437 gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2438 GTK_SIGNAL_FUNC (mainframe_keypress), this);
2439 gtk_signal_connect (GTK_OBJECT (window), "key_release_event",
2440 GTK_SIGNAL_FUNC (mainframe_keyrelease), this);
2441 gtk_signal_connect (GTK_OBJECT (window), "map_event",
2442 GTK_SIGNAL_FUNC (mainframe_map), this);
2443 gtk_signal_connect (GTK_OBJECT (window), "unmap_event",
2444 GTK_SIGNAL_FUNC (mainframe_unmap), this);
2446 g_qeglobals_gui.d_main_window = window;
2449 // calculate gdk offset
2450 int n_win_monitors = 0;
2452 monitorInfo_s monitorInfo;
2454 // detect multiple monitors
2455 EnumDisplayMonitors (NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>(&n_win_monitors));
2457 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2458 monitorInfo.i_win_mon = 0;
2459 EnumDisplayMonitors (NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>(&monitorInfo));
2461 gdk_offset_x = G_MININT;
2462 gdk_offset_y = G_MININT;
2465 for( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2466 gdk_offset_x = MAX (gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x);
2467 gdk_offset_y = MAX (gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y);
2470 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 );
2472 if( g_PrefsDlg.m_bStartOnPrimMon )
2475 GdkDisplay *display;
2477 gint n_gdk_monitors = 0;
2481 // detect multiple monitors
2482 display = gdk_display_get_default ();
2483 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name (display), gdk_display_get_n_screens (display) );
2485 screen = gdk_display_get_screen( display, 1 );
2486 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2488 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2490 for( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2491 memset( &rect, 0, sizeof(rect) );
2492 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2493 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2496 memcpy( &primaryMonitorRect, &rect, sizeof(primaryMonitorRect) );
2500 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2503 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2504 primaryMonitorRect.width = gdk_screen_width ();
2505 primaryMonitorRect.height = gdk_screen_height ();
2510 load_window_pos(window, g_PrefsDlg.mWindowInfo.position);
2512 GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
2513 gtk_container_add (GTK_CONTAINER (window), vbox);
2514 gtk_widget_show (vbox);
2516 create_main_menu (window, vbox);
2518 create_main_toolbar (window, vbox);
2519 create_plugin_toolbar (window,vbox);
2521 m_nCurrentStyle = g_PrefsDlg.m_nView;
2523 g_pGroupDlg->Create ();
2528 gtk_widget_show (window);
2530 // not needed on win32, it's in the .rc
2535 load_pixmap ("icon.bmp", window, &pixmap, &mask);
2536 gdk_window_set_icon (window->window, NULL, pixmap, mask);
2540 if (CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft)
2543 GtkWidget* vsplit = gtk_vpaned_new ();
2544 m_pSplits[0] = vsplit;
2545 gtk_box_pack_start (GTK_BOX (vbox), vsplit, TRUE, TRUE, 0);
2546 gtk_widget_show (vsplit);
2549 GtkWidget* hsplit = gtk_hpaned_new ();
2550 m_pSplits[2] = hsplit;
2551 gtk_paned_add1 (GTK_PANED (vsplit), hsplit);
2552 gtk_widget_show (hsplit);
2555 GtkWidget* hsplit2 = gtk_hpaned_new ();
2556 m_pSplits[3] = hsplit2;
2557 gtk_paned_add2 (GTK_PANED (hsplit), hsplit2);
2558 gtk_widget_show (hsplit2);
2561 GtkWidget* vsplit2 = gtk_vpaned_new ();
2562 m_pSplits[1] = vsplit2;
2563 if (CurrentStyle() == eRegular)
2564 gtk_paned_add2 (GTK_PANED (hsplit2), vsplit2);
2566 gtk_paned_add1 (GTK_PANED (hsplit), vsplit2);
2567 gtk_widget_show (vsplit2);
2570 m_pCamWnd = new CamWnd ();
2572 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2573 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2577 m_pXYWnd = new XYWnd ();
2578 m_pXYWnd->SetViewType(XY);
2580 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget ());
2581 gtk_paned_add1 (GTK_PANED (hsplit2), frame);
2585 m_pZWnd = new ZWnd ();
2587 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget ());
2588 if (CurrentStyle() == eRegular)
2589 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2591 gtk_paned_add2 (GTK_PANED (hsplit2), frame);
2595 m_pTexWnd = new TexWnd ();
2597 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2598 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2603 GtkWidget* scr = gtk_scrolled_window_new (NULL, NULL);
2604 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2605 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
2606 gtk_widget_show (scr);
2607 gtk_paned_pack2 (GTK_PANED (vsplit), scr, FALSE, TRUE);
2610 GtkWidget* text = gtk_text_view_new ();
2611 gtk_widget_set_size_request(text, 0, -1); // allow shrinking
2612 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
2613 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), FALSE);
2614 gtk_container_add (GTK_CONTAINER (scr), text);
2615 gtk_widget_show (text);
2616 g_qeglobals_gui.d_edit = text;
2624 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nXYHeight+28);
2626 if (CurrentStyle() == eRegular)
2628 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nZWidth);
2629 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2633 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nCamWidth);
2634 while (gtk_events_pending ()) gtk_main_iteration ();
2635 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2638 while (gtk_events_pending ()) gtk_main_iteration ();
2640 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), g_PrefsDlg.mWindowInfo.nCamHeight);
2642 else if (CurrentStyle() == eFloating)
2645 GtkWidget* wnd = create_floating (this);
2646 gtk_window_set_title (GTK_WINDOW (wnd), "Camera");
2649 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2650 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2653 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posCamWnd);
2655 gtk_widget_show (wnd);
2657 m_pCamWnd = new CamWnd ();
2660 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget ());
2661 gtk_container_add (GTK_CONTAINER (wnd), frame);
2664 m_pCamWnd->m_pParent = wnd;
2667 if (g_PrefsDlg.m_bFloatingZ)
2669 m_pZWnd = create_floating_zwnd(this);
2672 GtkWidget* wnd = create_floating (this);
2673 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2676 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2677 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2680 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2682 m_pXYWnd = new XYWnd ();
2683 m_pXYWnd->SetViewType(XY);
2686 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2687 gtk_container_add (GTK_CONTAINER (wnd), frame);
2690 m_pXYWnd->m_pParent = wnd;
2692 gtk_widget_show (wnd);
2697 GtkWidget* wnd = create_floating (this);
2698 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2701 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2702 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2705 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2707 m_pZWnd = new ZWnd ();
2708 m_pZWnd->m_pParent = wnd;
2710 m_pXYWnd = new XYWnd ();
2711 m_pXYWnd->SetViewType(XY);
2712 m_pXYWnd->m_pParent = wnd;
2716 GtkWidget* hsplit = gtk_hpaned_new ();
2717 m_pSplits[0] = hsplit;
2718 gtk_container_add (GTK_CONTAINER (wnd), hsplit);
2719 gtk_widget_show (hsplit);
2722 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget());
2723 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2726 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2727 gtk_paned_add2 (GTK_PANED (hsplit), frame);
2731 gtk_widget_show (wnd);
2733 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nZFloatWidth);
2737 GtkWidget* wnd = create_floating (this);
2738 gtk_window_set_title (GTK_WINDOW (wnd), _("XZ View"));
2741 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2742 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2745 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXZWnd);
2747 m_pXZWnd = new XYWnd ();
2748 m_pXZWnd->m_pParent = wnd;
2749 m_pXZWnd->SetViewType(XZ);
2752 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2753 gtk_container_add (GTK_CONTAINER (wnd), frame);
2756 if (g_PrefsDlg.m_bXZVis)
2757 gtk_widget_show (wnd);
2761 GtkWidget* wnd = create_floating (this);
2762 gtk_window_set_title (GTK_WINDOW (wnd), _("YZ View"));
2765 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2766 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2769 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posYZWnd);
2771 m_pYZWnd = new XYWnd ();
2772 m_pYZWnd->m_pParent = wnd;
2773 m_pYZWnd->SetViewType(YZ);
2776 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2777 gtk_container_add (GTK_CONTAINER (wnd), frame);
2780 if (g_PrefsDlg.m_bYZVis)
2781 gtk_widget_show (wnd);
2784 m_pTexWnd = new TexWnd ();
2786 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2787 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2790 GtkWidget* w = gtk_label_new (_("Textures"));
2791 gtk_widget_show (w);
2792 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2796 g_pGroupDlg->Show ();
2801 GtkWidget* hsplit = gtk_hpaned_new ();
2802 m_pSplits[0] = hsplit;
2803 gtk_box_pack_start (GTK_BOX (vbox), hsplit, TRUE, TRUE, 0);
2804 gtk_widget_show (hsplit);
2807 GtkWidget* vsplit1 = gtk_vpaned_new ();
2808 m_pSplits[1] = vsplit1;
2809 gtk_paned_add1 (GTK_PANED (hsplit), vsplit1);
2810 gtk_widget_show (vsplit1);
2813 GtkWidget* vsplit2 = gtk_vpaned_new ();
2814 m_pSplits[2] = vsplit2;
2815 gtk_paned_add2 (GTK_PANED (hsplit), vsplit2);
2816 gtk_widget_show (vsplit2);
2818 m_pCamWnd = new CamWnd ();
2820 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2821 gtk_paned_add1 (GTK_PANED (vsplit1), frame);
2824 m_pXYWnd = new XYWnd ();
2825 m_pXYWnd->SetViewType(XY);
2827 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2828 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2831 m_pYZWnd = new XYWnd ();
2832 m_pYZWnd->SetViewType(YZ);
2834 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2835 gtk_paned_add2 (GTK_PANED (vsplit1), frame);
2838 m_pXZWnd = new XYWnd ();
2839 m_pXZWnd->SetViewType(XZ);
2841 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2842 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2848 // g_qeglobals_gui.d_edit = NULL;
2851 m_pTexWnd = new TexWnd ();
2852 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2855 GtkWidget* w = gtk_label_new (_("Textures"));
2856 gtk_widget_show (w);
2857 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2861 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2862 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2863 m_pZWnd = create_floating_zwnd(this);
2865 while (gtk_events_pending ())
2866 gtk_main_iteration ();
2869 int x = GTK_PANED (m_pSplits[0])->max_position/2 - gutter;
2870 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), x);
2874 int y = GTK_PANED (m_pSplits[1])->max_position/2 - gutter;
2875 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), y);
2876 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), y);
2880 if(g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED)
2881 gtk_window_maximize(GTK_WINDOW(window));
2883 gtk_widget_show (window);
2887 if (m_pXYWnd) // this is always true?
2889 m_pXYWnd->SetActive(true);
2891 m_bSplittersOK = true;
2892 Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
2894 g_pParentWnd->OnEntitiesSetViewAs(0);
2896 // m_wndTextureBar.Create (vbox);
2897 create_main_statusbar (window, vbox);
2900 ShowMenuItemKeyBindings(window);
2902 if (g_qeglobals_gui.d_edit != NULL)
2903 console_construct(g_qeglobals_gui.d_edit);
2905 // bool load_last = FALSE;
2908 SetButtonMenuStates();
2910 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2912 g_bIgnoreCommands++;
2913 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
2914 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
2915 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaderlistonly"));
2916 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
2917 g_bIgnoreCommands--;
2919 // if (g_PrefsDlg.m_bTextureBar)
2920 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2922 SetActiveXY(m_pXYWnd);
2924 s_idle_id = gtk_timeout_add (25, mainframe_idle, this);
2926 QGL_InitExtensions ();
2928 if (g_PrefsDlg.mLocalPrefs.mbEmpty)
2930 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2931 g_PrefsDlg.SavePrefs();
2934 // remove the pid file
2935 remove (g_pidGameFile.GetBuffer ());
2937 Sys_Printf ("Entering message loop\n");
2941 m_nTimer = gtk_timeout_add (1000, timer, this);
2944 // =============================================================================
2947 MainFrame::MainFrame()
2950 m_bSplittersOK = false;
2951 g_pParentWnd = this;
2952 m_pXYWnd = (XYWnd*)NULL;
2954 m_pTexWnd = (TexWnd*)NULL;
2955 m_pZWnd = (ZWnd*)NULL;
2956 m_pYZWnd = (XYWnd*)NULL;
2957 m_pXZWnd = (XYWnd*)NULL;
2958 m_pActiveXY = (XYWnd*)NULL;
2959 m_bCamPreview = true;
2961 for (int n = 0; n < 6; n++)
2962 m_pStatusLabel[n] = NULL;
2963 m_bNeedStatusUpdate = false;
2965 m_bSleeping = false;
2969 MainFrame::~MainFrame()
2971 while (g_BSPFrontendCommands)
2973 free (g_BSPFrontendCommands->data);
2974 g_BSPFrontendCommands = g_slist_remove (g_BSPFrontendCommands, g_BSPFrontendCommands->data);
2978 void MainFrame::ReleaseContexts ()
2981 m_pXYWnd->DestroyContext ();
2983 m_pYZWnd->DestroyContext ();
2985 m_pXZWnd->DestroyContext ();
2987 m_pCamWnd->DestroyContext ();
2989 m_pTexWnd->DestroyContext ();
2991 m_pZWnd->DestroyContext ();
2994 void MainFrame::CreateContexts ()
2997 m_pCamWnd->CreateContext ();
2999 m_pXYWnd->CreateContext ();
3001 m_pYZWnd->CreateContext ();
3003 m_pXZWnd->CreateContext ();
3005 m_pTexWnd->CreateContext ();
3007 m_pZWnd->CreateContext ();
3010 static void Sys_Iconify (GtkWidget *w)
3012 // we might not have been realized yet
3013 if (w->window == NULL)
3016 if (!GTK_WIDGET_MAPPED (w))
3019 #if defined (__linux__) || defined (__APPLE__)
3020 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Iconify\n");
3022 XWindowAttributes xattr;
3023 GdkWindowPrivate *Private;
3025 Private = (GdkWindowPrivate*)w->window;
3026 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (0));
3028 if (!Private->destroyed)
3030 xattr.map_state = IsUnmapped;
3031 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3033 if (xattr.map_state != IsUnmapped)
3034 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (1));
3036 XIconifyWindow (Private->xdisplay, Private->xwindow, 0);
3042 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_MINIMIZE);
3046 static void Sys_Restore (GtkWidget *w)
3048 // we might not have been realized yet
3049 if (w->window == NULL)
3052 if (!GTK_WIDGET_VISIBLE (w))
3055 #if defined (__linux__) || defined (__APPLE__)
3056 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Restore\n");
3058 XWindowAttributes xattr;
3059 GdkWindowPrivate *Private;
3061 Private = (GdkWindowPrivate*)w->window;
3063 xattr.map_state = IsUnmapped;
3064 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3066 if (xattr.map_state == IsUnmapped)
3067 XMapRaised (Private->xdisplay, Private->xwindow);
3072 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_RESTORE);
3080 void RefreshModelSkin (GSList **pModels, entitymodel_t *model)
3082 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3083 // so we avoid the fucked up ones, assuming they are at the end
3084 if (!model->strSkin)
3087 Sys_Printf("Dropping model %p with empty skin in RefreshModelSkin\n", model);
3090 // and also keeping it so we have an actual count of empty models
3091 g_slist_append (*pModels, model);
3094 // do we have this model already?
3095 if (g_slist_find (*pModels, model))
3099 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3100 Sys_Printf("Already processed model: %p %s\n", model, ((GString *)model->strSkin)->str);
3104 model->nTextureBind = Texture_LoadSkin(((GString *)model->strSkin)->str, &model->nSkinWidth, &model->nSkinHeight );
3105 if (model->nTextureBind != -1)
3106 Sys_Printf("LOADED SKIN: %s\n", ((GString *)model->strSkin)->str );
3108 Sys_Printf("Load skin failed: %s\n", ((GString *)model->strSkin)->str );
3109 *pModels = g_slist_append (*pModels, model);
3111 Sys_Printf("Processed model %p %s\n", model, ((GString *)model->strSkin)->str);
3115 void MainFrame::OnSleep()
3120 // useful when trying to debug crashes in the sleep code
3121 Sys_Printf("Going into sleep mode..\n");
3123 Sys_Printf("Dispatching sleep msg...");
3124 DispatchRadiantMsg (RADIANT_SLEEP);
3125 Sys_Printf("Done.\n");
3127 if (CurrentStyle() == eSplit)
3128 Sys_Iconify (m_pZWnd->m_pParent);
3130 Sys_Iconify (m_pWidget);
3132 QERApp_FreeShaders ();
3133 g_bScreenUpdates = false;
3136 Sys_Printf("Releasing contexts...");
3138 Sys_Printf("Done.\n");
3140 // free all the skins in the caches
3141 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3142 g_lstSkinCache.RemoveAll();
3145 Sys_Printf("Waking up\n");
3146 if (CurrentStyle() == eSplit)
3147 Sys_Restore (m_pZWnd->m_pParent);
3149 Sys_Restore (m_pWidget);
3152 Sys_Printf("Creating contexts...");
3154 Sys_Printf("Done.\n");
3156 Sys_Printf("Making current on camera...");
3157 m_pCamWnd->MakeCurrent ();
3158 Sys_Printf("Done.\n");
3160 Sys_Printf("Reloading shaders...");
3161 // reload the shader scripts and textures
3162 QERApp_ReloadShaders ();
3164 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3165 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
3166 Sys_Printf("Done.\n");
3168 // rebuild the patches by setting the bDirty flag on them
3169 for (brush_t* b=active_brushes.next ; b != &active_brushes ; b=b->next)
3172 b->pPatch->bDirty = true;
3175 Sys_Printf("Reloading skins...");
3176 // we have purged all the skins before going to sleep
3177 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3178 // namely, all entitymodel_t
3179 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3180 // (a single eclass_t can reference several entitymodel_t)
3181 // FIXME: and what's up with md3Class then? what is it used for?
3185 GSList *Models = NULL;
3186 for (ent = entities.next; ent != &entities; ent = ent->next)
3188 // if it's a model with skin then the fixedsize flag must be on
3189 // only if there IS a model .. we are not trying to load
3190 if (ent->eclass->fixedsize)
3192 if (ent->eclass->model)
3196 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3198 entitymodel_t *model;
3199 for (model = ent->eclass->model; model; model=model->pNext)
3200 RefreshModelSkin (&Models, model);
3201 } else if (ent->md3Class)
3203 entitymodel_t *model;
3204 for (model = ent->md3Class->model; model; model=model->pNext)
3205 RefreshModelSkin (&Models, model);
3209 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3214 for (e = g_md3Cache; e ; e = e->next)
3216 entitymodel_t *model;
3217 for (model = e->model; model; model=model->pNext)
3218 if (!g_slist_find (Models, model))
3220 Sys_Printf("model %p ", model);
3222 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3224 Sys_Printf("not found in main loop (no skin)\n");
3228 // clean the model list
3229 g_slist_free (Models);
3231 Sys_Printf("Done.\n");
3233 // bring back the GL font
3234 gtk_glwidget_create_font (m_pCamWnd->GetWidget ());
3236 g_bScreenUpdates = true;
3238 Sys_Printf("Dispatching wake msg...");
3239 DispatchRadiantMsg (RADIANT_WAKEUP);
3240 Sys_Printf("Done\n");
3244 void WINAPI QERApp_Sleep()
3246 g_pParentWnd->OnSleep();
3251 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3252 and not in OnDestroy because the info may be lost already?
3253 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3255 void MainFrame::OnDelete ()
3257 save_window_pos(m_pWidget, g_PrefsDlg.mWindowInfo.position);
3259 // surface inspector and patch inspector
3260 save_window_pos (g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd);
3261 save_window_pos (g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd);
3263 // entity inspector / group dialog
3264 // NOTE TTimo do we have to save a different window depending on the view mode?
3265 save_window_pos (g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd);
3267 if (g_PrefsDlg.m_bFloatingZ)
3268 save_window_pos (m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd);
3270 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED (m_pSplits[0])->child1_size;
3272 if (CurrentStyle() == eFloating)
3274 save_window_pos (m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd);
3275 save_window_pos (m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd);
3276 save_window_pos (m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd);
3277 save_window_pos (m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd);
3280 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state(g_pParentWnd->m_pWidget->window);
3283 void MainFrame::OnDestroy ()
3285 // shut down console output first
3286 // (we'll still get the info if we are running a log file anyway)
3287 g_qeglobals_gui.d_edit = NULL;
3290 Sys_Printf("MainFrame::OnDestroy\n");
3293 gtk_timeout_remove (s_idle_id);
3295 gtk_timeout_remove (m_nTimer);
3297 if (!g_qeglobals.disable_ini)
3299 Sys_Printf("Start writing prefs\n");
3300 Sys_Printf("MRU_Save... ");
3306 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split1");
3307 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED (w)->child1_size;
3308 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split2");
3309 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED (w)->child1_size;
3311 if (!FloatingGroupDialog())
3313 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3315 vsplit = m_pSplits[0];
3316 vsplit2 = m_pSplits[1];
3317 hsplit = m_pSplits[2];
3318 hsplit2 = m_pSplits[3];
3320 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED (vsplit)->child1_size;
3321 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED (hsplit2)->child1_size;
3323 if(CurrentStyle() == eRegular)
3324 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED (hsplit)->child1_size;
3326 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED (hsplit)->child1_size;
3328 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED (vsplit2)->child1_size;
3331 if (g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit)
3333 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
3334 g_PrefsDlg.m_bZVis = TRUE;
3336 g_PrefsDlg.m_bZVis = FALSE;
3339 g_PrefsDlg.SavePrefs();
3340 Sys_Printf("Done prefs\n");
3343 // spog - this may be better in another place..
3344 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3345 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
3347 delete m_pXYWnd; m_pXYWnd = NULL;
3348 delete m_pYZWnd; m_pYZWnd = NULL;
3349 delete m_pXZWnd; m_pXZWnd = NULL;
3350 delete m_pZWnd; m_pZWnd = NULL;
3351 delete m_pTexWnd; m_pTexWnd = NULL;
3352 delete m_pCamWnd; m_pCamWnd = NULL;
3354 if (g_pGroupDlg->m_pWidget)
3356 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3357 gtk_widget_destroy (g_pGroupDlg->m_pWidget);
3358 g_pGroupDlg->m_pWidget = NULL;
3361 if (strcmpi(currentmap, "unnamed.map") != 0)
3363 g_PrefsDlg.m_strLastMap = currentmap;
3364 g_PrefsDlg.SavePrefs ();
3366 Sys_Printf("CleanUpEntities...");
3368 Sys_Printf("Done.\n");
3370 Sys_Printf("Releasing brushes...");
3371 while (active_brushes.next != &active_brushes)
3372 Brush_Free (active_brushes.next, false);
3373 while (selected_brushes.next != &selected_brushes)
3374 Brush_Free (selected_brushes.next, false);
3375 while (filtered_brushes.next != &filtered_brushes)
3376 Brush_Free (filtered_brushes.next, false);
3377 Sys_Printf("Done.\n");
3379 Sys_Printf("Releasing entities...");
3380 while (entities.next != &entities)
3381 Entity_Free (entities.next);
3382 Sys_Printf("Done.\n");
3384 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3387 epair_t* pNextEPair = pEPair->next;
3389 free (pEPair->value);
3391 pEPair = pNextEPair;
3394 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3395 while (pEntity != NULL && pEntity != g_qeglobals.d_project_entity)
3397 entity_t* pNextEntity = pEntity->next;
3398 Entity_Free(pEntity);
3399 pEntity = pNextEntity;
3402 Sys_Printf("Freeing world entity...");
3404 Entity_Free(world_entity);
3405 Sys_Printf("Done.\n");
3407 Sys_Printf("Shutdown VFS...");
3409 Sys_Printf("Done.\n");
3411 Sys_Printf("FreeShaders...");
3412 QERApp_FreeShaders();
3413 Sys_Printf("Done.\n");
3416 // TTimo: now using profile.cpp code
3417 void MainFrame::LoadCommandMap()
3421 bool bUserCmdList = false;
3423 // verbose a little: count of user commands we recognized
3425 int iOverrideCount = 0;
3429 #if defined (__linux__) || defined (__APPLE__)
3430 strINI = g_PrefsDlg.m_rc_path->str;
3431 #elif defined(WIN32)
3432 strINI = g_strGameToolsPath;
3434 #error "WTF are you compiling this on"
3437 strINI += "shortcuts.ini";
3439 f = fopen (strINI.GetBuffer(), "r");
3443 // loop through all the commands
3444 for (int i = 0; i < g_nCommandCount; i++)
3447 if (read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ))
3451 Sys_Printf("Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3452 bUserCmdList = true;
3457 strBuff.TrimRight();
3458 strBuff.MakeLower();
3459 int nSpecial = strBuff.Find("+alt");
3460 g_Commands[i].m_nModifiers = 0;
3463 g_Commands[i].m_nModifiers |= RAD_ALT;
3464 FindReplace(strBuff, "+alt", "");
3466 nSpecial = strBuff.Find("+ctrl");
3469 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3470 FindReplace(strBuff, "+ctrl", "");
3472 nSpecial = strBuff.Find("+shift");
3475 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3476 FindReplace(strBuff, "+shift", "");
3479 strBuff.TrimRight();
3480 strBuff.MakeUpper();
3481 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3483 nLen = strBuff.GetLength();
3484 if (nLen == 1) // most often case.. deal with first
3486 g_Commands[i].m_nKey = __toascii(strBuff.GetAt(0));
3488 } else // special key
3490 for (j = 0; j < g_nKeyCount; j++)
3492 if (strBuff.CompareNoCase(g_Keys[j].m_strName) == 0)
3494 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3499 if (j == g_nKeyCount)
3501 Sys_Printf("WARNING: failed to parse user command %s\n", value);
3505 // maybe this new shortcut is overriding another one
3506 // then we need to disable the other binded key
3507 for (j = 0; j < g_nCommandCount; j++)
3511 if (g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers)
3514 g_Commands[j].m_nKey = 0;
3517 // it's the only one
3524 Sys_Printf("User's command list overrides %d default commands\n", iOverrideCount);
3525 Sys_Printf("Parsed %d custom shortcuts\n", iCount );
3528 Sys_Printf("Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer());
3531 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3532 // we also output the count of commands that are not binded .. dunno if it's much use ..
3533 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3534 void MainFrame::ShowMenuItemKeyBindings(GtkWidget* window)
3536 //!\todo Find a better way to get the global accelerator group..
3537 GtkAccelGroup *accel = GTK_ACCEL_GROUP(gtk_accel_groups_from_object(G_OBJECT(window))->data);
3543 for (i = 0; i < g_nCommandCount; i++)
3545 if (g_Commands[i].m_nKey == 0)
3551 item = g_object_get_data (G_OBJECT (m_pWidget), g_Commands[i].m_strMenu);
3554 Sys_FPrintf (SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3555 g_Commands[i].m_strCommand);
3560 if (g_Commands[i].m_nModifiers) // are there modifiers present?
3562 if (g_Commands[i].m_nModifiers & RAD_SHIFT)
3563 mods |= GDK_SHIFT_MASK;
3564 if (g_Commands[i].m_nModifiers & RAD_ALT)
3565 mods |= GDK_MOD1_MASK;
3566 if (g_Commands[i].m_nModifiers & RAD_CONTROL)
3567 mods |= GDK_CONTROL_MASK;
3570 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3571 if (gtk_accelerator_valid (g_Commands[i].m_nKey, (GdkModifierType)mods))
3574 // NOTE TTimo this is the important place where all the shortcuts are binded
3575 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);
3577 gtk_widget_add_accelerator (GTK_WIDGET (item), "activate", accel, g_Commands[i].m_nKey,
3578 (GdkModifierType)mods, GTK_ACCEL_VISIBLE);
3581 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (GTK_BIN (item)->child);
3585 g_free (accel_label->accel_string);
3586 accel_label->accel_string = NULL;
3588 gstring = g_string_new (accel_label->accel_string);
3589 g_string_append (gstring, " ");
3592 if (mods & GDK_SHIFT_MASK)
3594 g_string_append (gstring, "Shft");
3597 if (mods & GDK_CONTROL_MASK)
3600 g_string_append (gstring, "+");
3601 g_string_append (gstring, "Ctl");
3604 if (mods & GDK_MOD1_MASK)
3607 g_string_append (gstring, "+");
3608 g_string_append (gstring, "Alt");
3613 g_string_append (gstring, "+");
3614 if (g_Commands[i].m_nKey < 0x80 || (g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff))
3616 switch (g_Commands[i].m_nKey)
3619 g_string_append (gstring, "Space");
3622 g_string_append (gstring, "Backslash");
3625 g_string_append_c (gstring, toupper (g_Commands[i].m_nKey));
3632 tmp = gtk_accelerator_name (g_Commands[i].m_nKey, (GdkModifierType)0);
3633 if (tmp[0] != 0 && tmp[1] == 0)
3634 tmp[0] = toupper (tmp[0]);
3635 g_string_append (gstring, tmp);
3639 g_free (accel_label->accel_string);
3640 accel_label->accel_string = gstring->str;
3641 g_string_free (gstring, FALSE);
3643 if (!accel_label->accel_string)
3644 accel_label->accel_string = g_strdup ("");
3646 gtk_widget_queue_resize (GTK_WIDGET (accel_label));
3651 Sys_Printf("%d commands not bound to a key\n", iCount);
3654 void MainFrame::CreateQEChildren()
3656 // load the project file
3659 Sys_Printf("loading project file from the command line: %s\n", g_argv[1]);
3660 if (!QE_LoadProject(g_argv[1]))
3661 Error("Unable to load project file %s\n", g_argv[1]);
3665 const char* filename = NULL;
3668 bool bTriedTemplate = false;
3670 if (g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION) {
3671 // we need to regenerate from template
3672 Sys_Printf("last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION);
3673 g_PrefsDlg.m_strLastProject = "";
3676 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3678 while(r == NULL || *r == '\0' || access(r, R_OK) != 0 || !QE_LoadProject(r))
3682 // try default project location
3683 bTriedTemplate = true;
3684 // for all OSes, we look for the template in the base installation (no homepath here)
3685 strcpy(buf, g_pGameDescription->mEnginePath.GetBuffer());
3686 strcat(buf, g_pGameDescription->mBaseGame.GetBuffer());
3687 strcat(buf, "/scripts/");
3688 strcat(buf, PROJECT_TEMPLATE_NAME);
3693 gtk_MessageBox (NULL, _("Failed to load project file.\nPlease enter a valid project file."), _("Load Project"));
3695 filename = file_dialog (m_pWidget, TRUE, _("Choose Project File"), buf, "project");
3696 if (filename != NULL)
3699 Error("Cannot continue without loading a project...");
3707 void MainFrame::OnTimer()
3709 GdkModifierType mask;
3711 gdk_window_get_pointer (NULL, NULL, NULL, &mask);
3713 if ((mask & (GDK_BUTTON1_MASK|GDK_BUTTON2_MASK|GDK_BUTTON3_MASK)) == 0)
3715 QE_CountBrushesAndUpdateStatusBar();
3719 // see MainFrame::UpdateStatusText below
3720 if (m_bNeedStatusUpdate)
3722 for (int n = 0; n < 6; n++)
3724 if (m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL)
3725 gtk_label_set_text (GTK_LABEL (m_pStatusLabel[n]), m_strStatus[n]);
3727 m_bNeedStatusUpdate = false;
3731 void MainFrame::UpdateStatusText()
3733 m_bNeedStatusUpdate = true;
3736 void MainFrame::SetStatusText(int nPane, const char* pText)
3738 if (pText && nPane <= 5 && nPane >= 0)
3740 m_strStatus[nPane] = pText;
3744 void MainFrame::SetButtonMenuStates()
3747 g_bIgnoreCommands++;
3749 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
3750 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_angles);
3751 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
3752 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_names);
3753 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
3754 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_coordinates);
3755 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
3756 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_outline);
3757 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
3758 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
3759 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
3760 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_axis);
3761 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3762 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3763 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) ? FALSE : TRUE);
3764 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3765 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3766 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3767 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3768 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3769 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3770 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
3771 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3772 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD) != 0);
3773 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
3774 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3775 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT) != 0);
3776 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
3777 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3778 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS) != 0);
3779 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
3780 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3781 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT) != 0);
3782 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
3783 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3784 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS) != 0);
3785 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
3786 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3787 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK) != 0);
3788 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
3789 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3790 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP) != 0);
3791 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
3792 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3793 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP) != 0);
3794 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
3795 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3796 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL) != 0);
3797 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
3798 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3799 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) != 0);
3800 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3801 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3802 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3803 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3804 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3805 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3806 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
3807 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3808 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS) != 0);
3809 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
3810 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3811 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES) != 0);
3812 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
3813 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3814 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS) != 0);
3815 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
3816 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3817 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS) != 0);
3818 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
3819 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3820 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS) != 0);
3821 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
3822 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3823 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS) != 0);
3824 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
3825 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bTextureLock) ? TRUE : FALSE);
3826 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
3827 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bRotateLock) ? TRUE : FALSE);
3828 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
3829 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3830 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
3831 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bGLLighting) ? TRUE : FALSE);
3832 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
3833 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (!g_PrefsDlg.m_bNoClamp) ? TRUE : FALSE);
3835 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
3836 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3837 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
3838 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
3840 if (!g_pGameDescription->mNoPatch)
3842 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
3843 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
3845 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
3846 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
3847 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
3848 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
3849 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
3850 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
3853 int id, n = g_PrefsDlg.m_nTextureScale;
3856 case 10 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3857 case 25 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3858 case 50 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3859 case 200 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3860 default : id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3862 SetTextureScale (id);
3864 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3866 if (g_qeglobals.d_project_entity)
3868 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3872 g_bIgnoreCommands--;
3875 void MainFrame::UpdateWindows(int nBits)
3877 if (!g_bScreenUpdates)
3879 #ifdef DBG_WINDOWPOS
3880 static int bean_count = 0;
3882 sprintf(bean_buf,"UpdateWindows %d",bean_count);
3883 CheckWatchit(bean_buf);
3887 if (nBits & (W_XY | W_XY_OVERLAY))
3890 m_pXYWnd->RedrawWindow ();
3892 m_pXZWnd->RedrawWindow ();
3894 m_pYZWnd->RedrawWindow ();
3897 if (nBits & W_CAMERA || ((nBits & W_CAMERA_IFON) && m_bCamPreview))
3900 m_pCamWnd->RedrawWindow ();
3903 if (nBits & (W_Z | W_Z_OVERLAY))
3906 m_pZWnd->RedrawWindow ();
3909 if (nBits & W_TEXTURE)
3912 m_pTexWnd->RedrawWindow ();
3914 #ifdef DBG_WINDOWPOS
3915 sprintf(bean_buf,"%d (end UpdateWidows)",bean_count);
3916 CheckWatchit(bean_buf);
3920 void MainFrame::RoutineProcessing()
3922 #ifdef DBG_WINDOWPOS
3923 static int bean_count = 0;
3925 sprintf(bean_buf,"RoutineProcessing %d",bean_count);
3926 CheckWatchit(bean_buf);
3933 double oldtime = 0.0;
3936 /* // checking KeyState works right
3938 a2 = GetKeyState(VK_MENU);
3941 Sys_Printf("VK_MENU: %d\n",a2);
3945 b2 = GetKeyState(VK_UP);
3948 Sys_Printf("VK_UP: %d\n",b2);
3952 time = Sys_DoubleTime ();
3953 delta = time - oldtime;
3958 // update the BSP process watcher
3960 m_pWatchBSP->RoutineProcessing();
3962 // run time dependant behavior
3964 m_pCamWnd->Cam_MouseControl(delta);
3968 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3969 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3970 UpdateWindows(nBits); // happens in rare cases but causes a stack overflow
3973 // Enable/disable the menu items
3976 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3977 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3978 if (!g_PrefsDlg.m_bWideToolbar)
3980 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3981 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3983 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3984 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3985 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3986 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3987 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3988 gtk_widget_set_sensitive (item, region_active);
3989 g_bIgnoreCommands++;
3990 // update the toolbar before displaying the menu:
3991 // show in use check box
3992 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3993 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3994 // show all check box
3995 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3996 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3997 g_bIgnoreCommands--;
4000 #ifdef DBG_WINDOWPOS
4001 sprintf(bean_buf,"%d (end RoutineProcessing)",bean_count);
4002 CheckWatchit(bean_buf);
4006 void MainFrame::DoWatchBSP()
4008 // network monitoring of the BSP process
4010 m_pWatchBSP = new CWatchBSP();
4013 void MainFrame::CleanPlugInMenu()
4015 GtkWidget *menu, *sep;
4018 // delete everything after the separator
4019 menu = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin"));
4020 sep = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin_separator"));
4021 m_nNextPlugInID = ID_PLUGIN_START;
4023 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4026 gtk_container_remove (GTK_CONTAINER (menu), GTK_WIDGET (lst->next->data));
4027 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4031 void MainFrame::AddPlugInMenuItem(IPlugIn* pPlugIn)
4033 GtkWidget *menu, *item, *parent;
4034 const char *menuText;
4036 parent = gtk_menu_item_new_with_label (pPlugIn->getMenuName());
4037 gtk_widget_show (parent);
4038 gtk_container_add (GTK_CONTAINER (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin")), parent);
4040 int nCount = pPlugIn->getCommandCount();
4043 menu = gtk_menu_new ();
4046 menuText = pPlugIn->getCommand(--nCount);
4047 if (menuText != NULL && strlen(menuText) > 0)
4049 if (!strcmp(menuText, "-"))
4051 item = gtk_menu_item_new ();
4052 gtk_widget_set_sensitive (item, FALSE);
4055 item = gtk_menu_item_new_with_label (menuText);
4056 gtk_signal_connect (GTK_OBJECT (item), "activate",
4057 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (m_nNextPlugInID));
4059 gtk_widget_show (item);
4060 gtk_container_add (GTK_CONTAINER (menu), item);
4061 pPlugIn->addMenuID(m_nNextPlugInID++);
4064 gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), menu);
4068 void MainFrame::OnPlugIn(unsigned int nID, char* str)
4070 m_PlugInMgr.Dispatch(nID, str);
4073 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype(IToolbarButton::EType type)
4077 case IToolbarButton::eSpace:
4078 return GTK_TOOLBAR_CHILD_SPACE;
4079 case IToolbarButton::eButton:
4080 return GTK_TOOLBAR_CHILD_BUTTON;
4081 case IToolbarButton::eToggleButton:
4082 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4083 case IToolbarButton::eRadioButton:
4084 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4086 Error("invalid toolbar button type");
4087 return (GtkToolbarChildType)0;
4090 void toolbar_insert(GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data)
4092 GtkWidget *w, *pixmap;
4093 GdkPixmap *gdkpixmap;
4096 load_plugin_bitmap(image, (void **)&gdkpixmap, (void **)&mask);
4097 pixmap = gtk_pixmap_new (gdkpixmap, mask);
4098 gdk_pixmap_unref (gdkpixmap);
4099 gdk_pixmap_unref (mask);
4100 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), gtktoolbarchildtype_for_toolbarbuttontype(type), NULL, text, tooltip, "", GTK_WIDGET (pixmap), handler, data);
4103 void SignalToolbarButton(GtkWidget *widget, gpointer data)
4105 const_cast<const IToolbarButton*>(reinterpret_cast<IToolbarButton*>(data))->activate();
4108 void MainFrame::AddPlugInToolbarButton(const IToolbarButton* button)
4110 GtkWidget*const toolbar = GTK_WIDGET(g_object_get_data (G_OBJECT (m_pWidget), "toolbar_plugin"));
4111 toolbar_insert(toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC(SignalToolbarButton), reinterpret_cast<gpointer>(const_cast<IToolbarButton*>(button)));
4114 void MainFrame::OnSelectionSelectNudgedown()
4116 NudgeSelection(3, g_qeglobals.d_gridsize);
4119 void MainFrame::OnSelectionSelectNudgeleft()
4121 NudgeSelection(0, g_qeglobals.d_gridsize);
4124 void MainFrame::OnSelectionSelectNudgeright()
4126 NudgeSelection(2, g_qeglobals.d_gridsize);
4129 void MainFrame::OnSelectionSelectNudgeup()
4131 NudgeSelection(1, g_qeglobals.d_gridsize);
4134 void MainFrame::NudgeSelection(int nDirection, float fAmount)
4136 if (ActiveXY()->RotateMode())
4139 if (ActiveXY()->GetViewType() == XY)
4143 if (g_pParentWnd->ActiveXY()->GetViewType() == XZ)
4149 if (nDirection == 2 || nDirection == 3)
4154 float fDeg = -fAmount;
4155 float fAdj = fAmount;
4157 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4159 strStatus.Format("Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4160 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2]);
4161 g_pParentWnd->SetStatusText(2, strStatus);
4162 Select_RotateAxis(nAxis, fDeg, false, true);
4163 Sys_UpdateWindows (W_ALL);
4165 if (ActiveXY()->ScaleMode())
4167 if (nDirection == 0 || nDirection == 3)
4172 v[0] = v[1] = v[2] = 1.0;
4185 Select_Scale((g_nScaleHow & SCALE_X) ? v[0] : 1.0,
4186 (g_nScaleHow & SCALE_Y) ? v[1] : 1.0,
4187 (g_nScaleHow & SCALE_Z) ? v[2] : 1.0);
4188 Sys_UpdateWindows (W_ALL);
4191 // 0 - left, 1 - up, 2 - right, 3 - down
4193 if (nDirection == 0)
4195 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4197 } else if (nDirection == 1)
4199 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4200 } else if (nDirection == 2)
4202 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4205 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4208 Nudge(nDim, fAmount);
4212 void MainFrame::Nudge(int nDim, float fNudge)
4215 vMove[0] = vMove[1] = vMove[2] = 0;
4216 vMove[nDim] = fNudge;
4218 if((g_qeglobals.d_select_mode == sel_vertex ||
4219 g_qeglobals.d_select_mode == sel_curvepoint)
4220 && g_qeglobals.d_num_move_points)
4221 Select_NudgePoint(vMove, true);
4223 Select_Move(vMove, true);
4224 Sys_UpdateWindows (W_ALL);
4227 void MainFrame::SetGridStatus()
4232 c1 = (g_PrefsDlg.m_bTextureLock) ? 'M' : ' ';
4233 c2 = (g_PrefsDlg.m_bRotateLock) ? 'R' : ' ';
4234 strStatus.Format("G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4235 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2);
4236 SetStatusText(4, strStatus);
4239 void MainFrame::UpdatePatchToolbarButtons()
4242 g_bIgnoreCommands++;
4243 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
4244 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
4245 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4246 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4247 g_bIgnoreCommands--;
4250 // =============================================================================
4253 void MainFrame::OnFileNew()
4255 if (ConfirmModified())
4259 void MainFrame::OnFileOpen()
4261 if (!ConfirmModified())
4267 if (!g_pGameDescription->noMapsInHome) {
4268 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4269 strcat(buf, "maps/");
4274 str = file_dialog (m_pWidget, TRUE, _("Open Map"), buf, MAP_MAJOR, "maps/");
4278 strcpy(currentmap,str);
4284 void MainFrame::OnFileImportmap()
4289 if (!g_pGameDescription->noMapsInHome) {
4290 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4291 strcat(buf, "maps/");
4296 str = file_dialog (m_pWidget, TRUE, _("Import Map"), buf, MAP_MAJOR, "maps/");
4300 Map_ImportFile(str);
4304 void MainFrame::OnFileSave()
4306 if (!strcmp(currentmap, "unnamed.map"))
4309 Map_SaveFile (currentmap, false);
4312 void MainFrame::OnFileSaveas()
4317 if (!g_pGameDescription->noMapsInHome) {
4318 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4319 strcat(buf, "maps/");
4324 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, _("Save Map"), buf, MAP_MAJOR, "maps/");
4328 strcpy (currentmap, str);
4330 Map_SaveFile (str, false); // ignore region
4334 void MainFrame::OnFileExportmap()
4339 if (!g_pGameDescription->noMapsInHome) {
4340 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4341 strcat(buf, "maps/");
4346 str = file_dialog (m_pWidget, FALSE, _("Export Selection"), buf, MAP_MAJOR, "maps/");
4350 Map_SaveSelected (str);
4354 void MainFrame::OnFileSaveregion()
4359 if (!g_pGameDescription->noMapsInHome) {
4360 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4361 strcat(buf, "maps/");
4366 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, _("Export Region"), buf, MAP_MAJOR, "maps/");
4370 Map_SaveFile (str, true); // ignore region
4374 void MainFrame::OnFileNewproject()
4376 char* name = DoNewProjectDlg ();
4378 // create a new project:
4379 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4380 // on linux we create under ~/.q3a, on win32 under strEnginePath
4381 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4382 if ((name != NULL) && (strlen (name) > 0))
4384 CString strNewBasePath;
4386 // NOTE TTimo this would probably not work right on *nix
4387 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4388 strNewBasePath += name;
4389 strNewBasePath += "/";
4391 CString strProjToLoad;
4392 CString strMapToLoad;
4394 // if the dir exists, ask the user if they want to continue anyway
4395 if (Q_mkdir (strNewBasePath.GetBuffer(), 0755) != 0)
4398 strMsg.Format("The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer ());
4400 if (gtk_MessageBox(m_pWidget, _(strMsg), _("Error"), MB_YESNO) != IDYES)
4402 Sys_Printf("New Project cancelled, directory already exists for project\n");
4409 strDir = strNewBasePath;
4411 Q_mkdir (strDir.GetBuffer(), 0755);
4413 strDir = strNewBasePath;
4414 strDir += "textures/";
4415 Q_mkdir (strDir.GetBuffer(), 0755);
4417 strDir = strNewBasePath;
4418 strDir += "scripts/";
4419 Q_mkdir (strDir.GetBuffer(), 0755);
4421 // print a warning for total conversions, since setting the basepath when required files are
4422 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4423 Sys_FPrintf(SYS_WRN, "*** Note: basepath unchanged\n");
4425 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name);
4427 strDir = strNewBasePath;
4428 strDir += "maps/autosave.map";
4429 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4431 // state that this is a user project file, no templating
4432 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4433 // create the project file
4434 strProjToLoad = strNewBasePath;
4435 strProjToLoad += "scripts/";
4436 strProjToLoad += name;
4437 strProjToLoad += ".";
4438 strProjToLoad += PROJECT_FILETYPE;
4439 QE_SaveProject(strProjToLoad.GetBuffer());
4444 void MainFrame::OnFileLoadproject()
4446 if (ConfirmModified())
4450 void MainFrame::OnFileProjectsettings()
4452 DoProjectSettings();
4455 void MainFrame::OnFilePointfile()
4457 if (g_qeglobals.d_pointfile_display_list)
4463 void MainFrame::OnMru(unsigned int nID)
4465 if (ConfirmModified())
4466 MRU_Activate (nID - ID_FILE_RECENT1);
4469 void MainFrame::OnFileExit()
4471 if (ConfirmModified())
4473 // stop printing during shutdown
4474 // NOTE: we should cleanly release GL contexts and stuff when exiting
4478 g_qeglobals_gui.d_edit = NULL;
4479 gtk_widget_destroy (m_pWidget);
4483 void MainFrame::OnFileCheckUpdate()
4488 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4490 URL += "&OS_dlup=1";
4492 URL += "&OS_dlup=2";
4494 URL += "&Version_dlup=" RADIANT_VERSION;
4495 g_PrefsDlg.mGamesDialog.AddPacksURL(URL);
4496 OpenURL(URL.GetBuffer());
4499 void MainFrame::OnEditUndo()
4504 void MainFrame::OnEditRedo()
4509 void MainFrame::OnEditCopybrush()
4514 void MainFrame::OnEditPastebrush()
4518 Undo_Start("paste");
4522 Undo_EndBrushList(&selected_brushes);
4526 void MainFrame::OnEditPastebrushToCamera()
4531 vec3_t mid, camorigin, delta;
4533 ActiveXY()->Paste();
4535 // Work out the delta
4536 Select_GetMid( mid );
4538 // Snap camera origin to grid
4539 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4540 camorigin[0] = floor(camorigin[0] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4541 camorigin[1] = floor(camorigin[1] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4542 camorigin[2] = floor(camorigin[2] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4544 VectorSubtract( camorigin, mid, delta );
4547 Select_Move( delta, false );
4549 Undo_Start("paste to camera");
4550 Undo_EndBrushList(&selected_brushes);
4555 void MainFrame::OnSelectionDelete()
4559 // ActiveXY()->UndoCopy();
4560 Undo_Start("delete");
4561 Undo_AddBrushList(&selected_brushes);
4562 //add all deleted entities to the undo
4563 for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next)
4565 Undo_AddEntity(brush->owner);
4567 // NOTE: Select_Delete does NOT delete entities
4569 Undo_EndBrushList(&selected_brushes);
4573 void MainFrame::OnEditMapinfo()
4578 void MainFrame::OnEditEntityinfo()
4583 void MainFrame::OnBrushScripts()
4588 void MainFrame::OnEditLoadprefab()
4590 const char *filename;
4593 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4595 CurPath = g_PrefsDlg.m_strPrefabPath;
4599 filename = file_dialog (m_pWidget, TRUE, _("Import Prefab"), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/");
4601 if (filename != NULL)
4603 Map_ImportFile(filename);
4607 void MainFrame::OnEditSaveprefab()
4609 const char *filename;
4612 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4614 CurPath = g_PrefsDlg.m_strPrefabPath;
4618 getcwd (tmp, PATH_MAX);
4623 filename = file_dialog (m_pWidget, FALSE, _("Export Prefab"), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/");
4624 if (filename != NULL)
4626 Map_SaveSelected(filename);
4630 void MainFrame::OnPrefs()
4632 int nView = g_PrefsDlg.m_nView;
4633 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4634 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4635 int nShader = g_PrefsDlg.m_nShader;
4636 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4637 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4638 g_PrefsDlg.LoadPrefs();
4640 if (g_PrefsDlg.DoModal() == IDOK)
4642 if ((g_PrefsDlg.m_nLatchedView != nView) ||
4643 (g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus) ||
4644 (g_PrefsDlg.m_bLatchedWideToolbar != bToolbar) ||
4645 (g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar) ||
4646 (g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar) ||
4647 (g_PrefsDlg.m_nLatchedShader != nShader) ||
4648 (g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality)
4649 || (g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ)
4651 gtk_MessageBox(m_pWidget, _("You must restart Radiant for the changes to take effect."));
4653 // if the view mode was switched to floating, set the Z window on by default
4654 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4655 // (and we simply hope there will be a SavePrefs before we die)
4656 if ((g_PrefsDlg.m_nView != nView) && ((EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating))
4658 g_PrefsDlg.m_bZVis = true;
4662 m_pTexWnd->UpdatePrefs();
4664 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
4665 g_bIgnoreCommands++;
4666 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
4667 (!g_PrefsDlg.m_bNoClamp) ? TRUE : FALSE);
4668 g_bIgnoreCommands--;
4672 void MainFrame::OnTogglecamera()
4674 if (CurrentStyle() == eFloating) // floating views
4676 if (m_pCamWnd && m_pCamWnd->m_pParent)
4678 if (GTK_WIDGET_VISIBLE (m_pCamWnd->m_pParent))
4679 widget_delete_hide (m_pCamWnd->m_pParent);
4681 gtk_widget_show (m_pCamWnd->m_pParent);
4685 if (GTK_WIDGET_VISIBLE (m_pCamWnd->GetWidget ()))
4686 gtk_widget_hide (m_pCamWnd->GetWidget ());
4688 gtk_widget_show (m_pCamWnd->GetWidget ());
4692 void MainFrame::OnToggleconsole()
4694 if (FloatingGroupDialog()) // QE4 style
4696 if (inspector_mode == W_CONSOLE)
4698 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4699 widget_delete_hide (g_qeglobals_gui.d_entity);
4701 gtk_widget_show (g_qeglobals_gui.d_entity);
4704 gtk_widget_show (g_qeglobals_gui.d_entity);
4705 SetInspectorMode(W_CONSOLE);
4710 // trigger the entity inspector on/off
4711 void MainFrame::OnViewEntity()
4713 // make sure we're working with the current selection (bugzilla #436)
4714 if( ! GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4717 if (!FloatingGroupDialog())
4719 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_ENTITY)
4720 widget_delete_hide (g_qeglobals_gui.d_entity);
4723 gtk_widget_show (g_qeglobals_gui.d_entity);
4724 SetInspectorMode(W_ENTITY);
4728 if (inspector_mode == W_ENTITY)
4730 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4731 widget_delete_hide (g_qeglobals_gui.d_entity);
4733 gtk_widget_show (g_qeglobals_gui.d_entity);
4736 gtk_widget_show (g_qeglobals_gui.d_entity);
4737 SetInspectorMode(W_ENTITY);
4742 void MainFrame::OnViewGroups()
4744 if (!FloatingGroupDialog())
4746 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_GROUP)
4747 widget_delete_hide (g_qeglobals_gui.d_entity);
4750 gtk_widget_show (g_qeglobals_gui.d_entity);
4751 SetInspectorMode(W_GROUP);
4755 if (inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating)
4757 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4758 widget_delete_hide (g_qeglobals_gui.d_entity);
4760 gtk_widget_show (g_qeglobals_gui.d_entity);
4763 gtk_widget_show (g_qeglobals_gui.d_entity);
4764 SetInspectorMode(W_GROUP);
4769 void MainFrame::OnToggleview()
4771 if (CurrentStyle() == eFloating) // QE4 style
4773 if (m_pXYWnd && m_pXYWnd->m_pParent)
4775 if (GTK_WIDGET_VISIBLE (m_pXYWnd->m_pParent))
4776 widget_delete_hide (m_pXYWnd->m_pParent);
4778 gtk_widget_show (m_pXYWnd->m_pParent);
4783 void MainFrame::OnToggleviewXz()
4785 if (CurrentStyle() == eFloating) // QE4 style
4787 if (m_pXZWnd && m_pXZWnd->m_pParent)
4789 // get windowplacement doesn't actually save this so we will here
4790 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE (m_pXZWnd->m_pParent);
4791 if (g_PrefsDlg.m_bXZVis)
4792 widget_delete_hide (m_pXZWnd->m_pParent);
4794 gtk_widget_show (m_pXZWnd->m_pParent);
4795 g_PrefsDlg.m_bXZVis ^= 1;
4796 g_PrefsDlg.SavePrefs ();
4801 void MainFrame::OnToggleviewYz()
4803 if (CurrentStyle() == eFloating) // QE4 style
4805 if (m_pYZWnd && m_pYZWnd->m_pParent)
4807 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE (m_pYZWnd->m_pParent);
4808 if (g_PrefsDlg.m_bYZVis)
4809 widget_delete_hide (m_pYZWnd->m_pParent);
4811 gtk_widget_show (m_pYZWnd->m_pParent);
4812 g_PrefsDlg.m_bYZVis ^= 1;
4813 g_PrefsDlg.SavePrefs ();
4818 void MainFrame::OnTogglez()
4820 if ( g_pParentWnd->FloatingGroupDialog() ) // QE4 style
4822 if (m_pZWnd && m_pZWnd->m_pParent)
4824 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
4825 widget_delete_hide (m_pZWnd->m_pParent);
4827 gtk_widget_show (m_pZWnd->m_pParent);
4828 g_PrefsDlg.m_bZVis ^= 1;
4829 g_PrefsDlg.SavePrefs ();
4832 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4836 void MainFrame::OnViewCenter()
4838 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4839 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor((m_pCamWnd->Camera()->angles[YAW]+11)/22.5);
4840 Sys_UpdateWindows (W_CAMERA | W_XY_OVERLAY);
4843 void MainFrame::OnViewUpfloor()
4845 m_pCamWnd->Cam_ChangeFloor (true);
4848 void MainFrame::OnViewDownfloor()
4850 m_pCamWnd->Cam_ChangeFloor (false);
4853 void MainFrame::OnViewCenterview()
4855 if(CurrentStyle() == eSplit)
4857 GetXYWnd()->PositionView();
4858 GetXZWnd()->PositionView();
4859 GetYZWnd()->PositionView();
4860 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4863 m_pXYWnd->PositionView();
4864 Sys_UpdateWindows (W_XY);
4868 void MainFrame::OnViewNextview()
4870 if (CurrentStyle() == eSplit)
4872 GetXYWnd()->PositionView();
4873 GetXZWnd()->PositionView();
4874 GetYZWnd()->PositionView();
4875 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4878 if (m_pXYWnd->GetViewType() == XY)
4879 m_pXYWnd->SetViewType(XZ);
4881 if (m_pXYWnd->GetViewType() == XZ)
4882 m_pXYWnd->SetViewType(YZ);
4884 m_pXYWnd->SetViewType(XY);
4885 m_pXYWnd->PositionView();
4886 Sys_UpdateWindows (W_XY);
4890 void MainFrame::OnViewXy()
4892 if(!FloatingGroupDialog())
4894 m_pXYWnd->SetViewType(XY);
4895 m_pXYWnd->PositionView();
4897 Sys_UpdateWindows (W_XY);
4900 void MainFrame::OnViewSide()
4902 if (!FloatingGroupDialog())
4904 m_pXYWnd->SetViewType(XZ);
4905 m_pXYWnd->PositionView();
4907 Sys_UpdateWindows (W_XY);
4910 void MainFrame::OnViewFront()
4912 if (!FloatingGroupDialog())
4914 m_pXYWnd->SetViewType(YZ);
4915 m_pXYWnd->PositionView();
4917 Sys_UpdateWindows (W_XY);
4920 void MainFrame::OnView100()
4923 m_pXYWnd->SetScale(1);
4925 m_pXZWnd->SetScale(1);
4927 m_pYZWnd->SetScale(1);
4928 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4931 void MainFrame::OnViewZoomin()
4933 if (m_pXYWnd && m_pXYWnd->Active())
4935 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 5.0 / 4);
4936 if (m_pXYWnd->Scale() > 30)
4937 m_pXYWnd->SetScale(30);
4940 if (m_pXZWnd && m_pXZWnd->Active())
4942 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 5.0 / 4);
4943 if (m_pXZWnd->Scale() > 30)
4944 m_pXZWnd->SetScale(30);
4947 if (m_pYZWnd && m_pYZWnd->Active())
4949 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 5.0 / 4);
4950 if (m_pYZWnd->Scale() > 30)
4951 m_pYZWnd->SetScale(30);
4954 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4957 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4958 // we don't go below a zoom factor corresponding to 10% of the max world size
4959 // (this has to be computed against the window size)
4960 void MainFrame::OnViewZoomout()
4963 if (m_pXYWnd && m_pXYWnd->Active())
4965 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 4.0 / 5);
4966 min_scale = MIN(m_pXYWnd->Width(),m_pXYWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4967 if (m_pXYWnd->Scale() < min_scale) m_pXYWnd->SetScale (min_scale);
4970 if (m_pXZWnd && m_pXZWnd->Active())
4972 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 4.0 / 5);
4973 min_scale = MIN(m_pXZWnd->Width(),m_pXZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4974 if (m_pXZWnd->Scale() < min_scale) m_pXZWnd->SetScale (min_scale);
4977 if (m_pYZWnd && m_pYZWnd->Active())
4979 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 4.0 / 5);
4980 min_scale = MIN(m_pYZWnd->Width(),m_pYZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4981 if (m_pYZWnd->Scale() < min_scale) m_pYZWnd->SetScale (min_scale);
4983 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4986 void MainFrame::OnViewZ100()
4989 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4992 void MainFrame::OnViewZzoomin()
4997 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
5000 void MainFrame::OnViewZzoomout()
5003 if (z.scale < 0.125)
5005 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
5008 void MainFrame::OnViewCubein()
5010 g_PrefsDlg.m_nCubicScale--;
5011 if (g_PrefsDlg.m_nCubicScale < 1)
5012 g_PrefsDlg.m_nCubicScale = 1;
5013 g_PrefsDlg.SavePrefs ();
5014 Sys_UpdateWindows(W_CAMERA);
5018 void MainFrame::OnViewCubeout()
5020 g_PrefsDlg.m_nCubicScale++;
5021 if (g_PrefsDlg.m_nCubicScale > 22)
5022 g_PrefsDlg.m_nCubicScale = 22;
5023 g_PrefsDlg.SavePrefs ();
5024 Sys_UpdateWindows(W_CAMERA);
5028 void MainFrame::OnViewShownames()
5030 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
5031 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
5032 g_bIgnoreCommands++;
5033 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5034 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE);
5035 g_bIgnoreCommands--;
5036 Sys_UpdateWindows (W_XY);
5039 void MainFrame::OnViewShowAngles()
5041 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
5042 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
5043 g_bIgnoreCommands++;
5044 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5045 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE);
5046 g_bIgnoreCommands--;
5047 Sys_UpdateWindows (W_XY);
5050 void MainFrame::OnViewShowblocks()
5052 g_qeglobals.show_blocks ^= 1;
5053 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showblocks"));
5054 g_bIgnoreCommands++;
5055 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.show_blocks ? TRUE : FALSE);
5056 g_bIgnoreCommands--;
5057 Sys_UpdateWindows (W_XY);
5060 void MainFrame::OnViewShowcoordinates()
5062 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
5063 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
5064 g_bIgnoreCommands++;
5065 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5066 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE);
5067 g_bIgnoreCommands--;
5068 Sys_UpdateWindows (W_XY|W_Z);
5071 void MainFrame::OnViewShowOutline()
5073 g_qeglobals.d_savedinfo.show_outline ^= 1;
5074 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
5075 g_bIgnoreCommands++;
5076 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5077 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE);
5078 g_bIgnoreCommands--;
5079 Sys_UpdateWindows (W_XY);
5082 void MainFrame::OnViewShowAxes()
5084 g_qeglobals.d_savedinfo.show_axis ^= 1;
5085 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
5086 g_bIgnoreCommands++;
5087 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5088 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE);
5089 g_bIgnoreCommands--;
5090 Sys_UpdateWindows (W_XY);
5093 void MainFrame::OnViewShowWorkzone()
5095 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showworkzone"));
5096 g_bIgnoreCommands++;
5097 if (g_qeglobals.d_show_work)
5099 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
5100 g_qeglobals.d_show_work = false;
5103 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5104 g_qeglobals.d_show_work = true;
5106 g_bIgnoreCommands--;
5107 Sys_UpdateWindows (W_XY);
5110 void MainFrame::OnViewHideshowHideselected()
5116 void MainFrame::OnViewHideshowShowhidden()
5118 Select_ShowAllHidden();
5122 sets the view mode for the entities
5123 called upon LoadPrefs too
5124 NOTE TTimo previous implementation had a SavePrefs call
5125 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5126 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5127 (otherwise we are always called following user action on the widget)
5129 void MainFrame::OnEntitiesSetViewAs(int mode)
5131 gpointer item = NULL;
5134 switch (g_PrefsDlg.m_nEntityShowState)
5137 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5140 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5142 case ENTITY_SELECTED:
5143 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5145 case ENTITY_SELECTED_SKIN:
5146 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5148 case ENTITY_SKINNED:
5149 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5151 case ENTITY_SKINNED_BOXED:
5152 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5155 g_bIgnoreCommands++;
5156 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5157 g_bIgnoreCommands--;
5163 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5164 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5165 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5167 case ID_VIEW_ENTITIESAS_WIREFRAME:
5168 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5169 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5171 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5172 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5173 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5175 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5176 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5177 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5179 case ID_VIEW_ENTITIESAS_SKINNED:
5180 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5181 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5183 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5184 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5185 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5188 Sys_FPrintf(SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n");
5194 Sys_FPrintf(SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n");
5198 g_bIgnoreCommands++;
5199 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5200 g_bIgnoreCommands--;
5202 Sys_UpdateWindows(W_ALL);
5205 void MainFrame::OnViewCubicclipping()
5209 g_PrefsDlg.m_bCubicClipping ^= 1;
5210 g_bIgnoreCommands++;
5211 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
5212 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5213 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
5214 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5215 g_bIgnoreCommands--;
5216 g_PrefsDlg.SavePrefs ();
5217 //Map_BuildBrushData ();
5218 Sys_UpdateWindows(W_CAMERA);
5221 void MainFrame::OnViewOpengllighting()
5223 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
5224 g_PrefsDlg.m_bGLLighting ^= 1;
5225 g_PrefsDlg.SavePrefs ();
5226 g_bIgnoreCommands++;
5227 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE);
5228 Sys_UpdateWindows (W_XY|W_CAMERA);
5229 g_bIgnoreCommands--;
5232 void MainFrame::OnSelectionDragedges()
5234 if (g_qeglobals.d_select_mode == sel_edge)
5236 g_qeglobals.d_select_mode = sel_brush;
5237 Sys_UpdateWindows (W_ALL);
5240 SetupVertexSelection ();
5241 if (g_qeglobals.d_numpoints)
5242 g_qeglobals.d_select_mode = sel_edge;
5243 Sys_UpdateWindows (W_ALL);
5247 void MainFrame::OnSelectionDragvertecies()
5249 if (g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint)
5251 g_qeglobals.d_select_mode = sel_brush;
5252 Sys_UpdateWindows (W_ALL);
5255 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5256 if (OnlyPatchesSelected())
5259 } else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5261 SetupVertexSelection ();
5262 if (g_qeglobals.d_numpoints)
5263 g_qeglobals.d_select_mode = sel_vertex;
5265 Sys_UpdateWindows (W_ALL);
5269 void MainFrame::OnSelectionClone()
5274 // called when the escape key is used (either on the main window or on an inspector)
5275 void MainFrame::OnSelectionDeselect()
5281 OnSelectMouserotate();
5284 OnSelectMousescale();
5289 ActiveXY()->KillPathMode();
5292 if (g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0)
5294 g_qeglobals.d_num_move_points = 0;
5295 Sys_UpdateWindows(W_ALL);
5299 SetStatusText(2, " ");
5304 void MainFrame::OnBrushFlipx()
5306 Undo_Start("flip X");
5307 Undo_AddBrushList(&selected_brushes);
5309 Select_FlipAxis (0);
5310 // spog - this does not work - it's a rotate not a flip
5312 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5314 if(b->owner->eclass->fixedsize)
5317 float a = FloatForKey(b->owner, "angle");
5318 a = div ((int)(180 - a), 180).rem;
5319 sprintf (buf, "%d", (int)a);
5320 SetKeyValue(b->owner, "angle", buf);
5321 Brush_Build(b,true,true,false,false); // don't filter
5325 Undo_EndBrushList(&selected_brushes);
5329 void MainFrame::OnBrushFlipy()
5331 Undo_Start("flip Y");
5332 Undo_AddBrushList(&selected_brushes);
5334 Select_FlipAxis (1);
5335 // spog - this does not work - it's a rotate not a flip
5337 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5339 if(b->owner->eclass->fixedsize)
5341 float a = FloatForKey(b->owner, "angle");
5342 if (a == 0 || a == 180 || a == 360)
5344 if ( a == 90 || a == 270)
5358 sprintf (buf, "%d", (int)a);
5359 SetKeyValue(b->owner, "angle", buf);
5360 Brush_Build(b,true,true,false,false); // don't filter
5365 Undo_EndBrushList(&selected_brushes);
5369 void MainFrame::OnBrushFlipz()
5371 Undo_Start("flip Z");
5372 Undo_AddBrushList(&selected_brushes);
5373 Select_FlipAxis (2);
5374 Undo_EndBrushList(&selected_brushes);
5378 void MainFrame::OnBrushRotatex()
5380 Undo_Start("rotate X");
5381 Undo_AddBrushList(&selected_brushes);
5382 Select_RotateAxis (0, 90);
5383 Undo_EndBrushList(&selected_brushes);
5387 void MainFrame::OnBrushRotatey()
5389 Undo_Start("rotate Y");
5390 Undo_AddBrushList(&selected_brushes);
5391 Select_RotateAxis (1, 90);
5392 Undo_EndBrushList(&selected_brushes);
5396 void MainFrame::OnBrushRotatez()
5398 Undo_Start("rotate Z");
5399 Undo_AddBrushList(&selected_brushes);
5400 Select_RotateAxis (2, 90);
5401 Undo_EndBrushList(&selected_brushes);
5405 void MainFrame::OnSelectionArbitraryrotation()
5407 Undo_Start("arbitrary rotation");
5408 Undo_AddBrushList(&selected_brushes);
5412 Undo_EndBrushList(&selected_brushes);
5416 void MainFrame::OnSelectScale()
5418 Undo_Start("scale");
5419 Undo_AddBrushList(&selected_brushes);
5421 Undo_EndBrushList(&selected_brushes);
5425 void MainFrame::OnSelectionMakehollow()
5428 // ActiveXY()->UndoCopy();
5429 Undo_Start("hollow");
5430 Undo_AddBrushList(&selected_brushes);
5432 Undo_EndBrushList(&selected_brushes);
5436 void MainFrame::OnSelectionCsgsubtract()
5438 Undo_Start("CSG subtract");
5443 void MainFrame::OnSelectionCsgmerge()
5445 Undo_Start("CSG merge");
5446 Undo_AddBrushList(&selected_brushes);
5448 Undo_EndBrushList(&selected_brushes);
5452 void MainFrame::OnSelectionNoOutline()
5454 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5455 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) ^ OUTLINE_ZBUF;
5456 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5457 g_bIgnoreCommands++;
5458 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5459 g_bIgnoreCommands--;
5460 Sys_UpdateWindows (W_CAMERA);
5463 void MainFrame::OnSelectionOutlineStyle()
5465 if ((g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) && (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL))
5466 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5467 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL)
5468 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5469 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF)
5470 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5472 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5473 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5474 g_bIgnoreCommands++;
5475 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5476 g_bIgnoreCommands--;
5477 Sys_UpdateWindows (W_CAMERA);
5480 void MainFrame::OnSelectionSelectcompletetall()
5483 ActiveXY()->UndoCopy();
5484 Select_CompleteTall ();
5487 void MainFrame::OnSelectionSelecttouching()
5492 void MainFrame::OnSelectionSelectpartialtall()
5494 Select_PartialTall();
5497 void MainFrame::OnSelectionSelectinside()
5502 void MainFrame::OnViewClipper()
5504 GtkWidget *w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_clipper"));
5505 g_bIgnoreCommands++;
5509 if (ActiveXY()->ClipMode())
5511 ActiveXY()->SetClipMode(false);
5512 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), FALSE);
5515 if (ActiveXY()->RotateMode())
5516 OnSelectMouserotate();
5517 ActiveXY()->SetClipMode(true);
5518 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
5521 g_bIgnoreCommands--;
5524 void MainFrame::OnClipSelected()
5526 if (m_pActiveXY && m_pActiveXY->ClipMode())
5528 Undo_Start("clip selected");
5529 Undo_AddBrushList(&selected_brushes);
5530 m_pActiveXY->Clip();
5531 Undo_EndBrushList(&selected_brushes);
5535 if (g_bPatchBendMode)
5536 Patch_BendHandleENTER();
5537 // else if (g_bPatchBendMode)
5538 // Patch_InsDelHandleENTER();
5542 void MainFrame::OnSplitSelected()
5546 Undo_Start("split selected");
5547 Undo_AddBrushList(&selected_brushes);
5548 m_pActiveXY->SplitClip();
5549 Undo_EndBrushList(&selected_brushes);
5554 void MainFrame::OnFlipClip()
5557 m_pActiveXY->FlipClip();
5560 void MainFrame::OnSelectionConnect()
5562 Undo_Start("connect selected entities");
5563 Undo_AddBrushList(&selected_brushes);
5565 Undo_EndBrushList(&selected_brushes);
5569 void MainFrame::OnSelectionUngroupentity()
5571 Undo_Start("ungroup selected entities");
5572 Undo_AddBrushList(&selected_brushes);
5574 Undo_EndBrushList(&selected_brushes);
5578 void MainFrame::OnSelectionMergeentity()
5580 Undo_Start("merge entity");
5581 Undo_AddBrushList(&selected_brushes);
5582 Select_MergeEntity();
5583 Undo_EndBrushList(&selected_brushes);
5587 void MainFrame::OnSelectionGroupworld()
5589 Undo_Start("group world");
5590 Undo_AddBrushList(&selected_brushes);
5591 Select_GroupEntity(world_entity);
5592 Undo_EndBrushList(&selected_brushes);
5596 void MainFrame::OnSelectionMakeDetail()
5598 Undo_Start("make detail");
5599 Undo_AddBrushList(&selected_brushes);
5600 Select_MakeDetail ();
5601 Undo_EndBrushList(&selected_brushes);
5605 void MainFrame::OnSelectionMakeStructural()
5607 Undo_Start("make structural");
5608 Undo_AddBrushList(&selected_brushes);
5609 Select_MakeStructural ();
5610 Undo_EndBrushList(&selected_brushes);
5614 void MainFrame::OnBspCommand (unsigned int nID)
5616 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503
5617 // make sure we don't attempt to region compile a map with the camera outside the region
5622 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5623 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5624 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2]);
5627 for (i=0 ; i<3 ; i++)
5629 if (vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i])
5631 Sys_FPrintf(SYS_ERR, "The camera must be in the region to start a region compile.\n");
5637 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5638 if (stricmp( currentmap, "unnamed.map") == 0)
5643 if (g_PrefsDlg.m_bSnapShots && (stricmp (currentmap, "unnamed.map") != 0))
5646 if (g_qeglobals.bBSPFrontendPlugin)
5648 char *cmd = (char*)g_slist_nth_data (g_BSPFrontendCommands, nID-CMD_BSPCOMMAND);
5649 g_BSPFrontendTable.m_pfnDispatchBSPCommand (cmd);
5652 RunBsp (bsp_commands[nID-CMD_BSPCOMMAND]);
5656 void MainFrame::OnGrid (unsigned int nID)
5658 if (nID == ID_GRID_025)
5660 g_qeglobals.d_gridsize = 0.25f;
5661 g_qeglobals.d_bSmallGrid = true;
5662 } else if (nID == ID_GRID_05)
5664 g_qeglobals.d_gridsize = 0.5f;
5665 g_qeglobals.d_bSmallGrid = true;
5670 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5671 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5672 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5673 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5674 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5675 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5676 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5677 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5678 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5680 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5681 g_qeglobals.d_bSmallGrid = false;
5686 // SnapTToGrid option: need to check everywhere the grid size is changed
5687 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5688 if (g_PrefsDlg.m_bSnapTToGrid)
5691 Sys_UpdateWindows (W_XY|W_Z);
5694 void MainFrame::OnSnaptogrid()
5696 g_PrefsDlg.m_bNoClamp ^= 1;
5697 g_PrefsDlg.SavePrefs ();
5699 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
5700 g_bIgnoreCommands++;
5701 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bNoClamp ? FALSE : TRUE);
5702 g_bIgnoreCommands--;
5705 void MainFrame::OnTexturesShowinuse()
5708 Texture_ShowInuse ();
5710 if (!g_bShowAllShaders)
5711 Sys_Printf("Already showing only in-use textures.\n");
5713 Sys_UpdateWindows( W_TEXTURE );
5717 void MainFrame::OnTexturesShowall()
5722 // do some triggering on/off, if the inspector is already up then hide it
5723 void MainFrame::OnTexturesInspector()
5728 void MainFrame::OnViewNearest(unsigned int nID)
5730 Texture_SetMode(nID);
5733 void MainFrame::OnTextureReplaceall()
5735 FindTextureDialog::show();
5738 void MainFrame::OnToggleLock()
5740 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5742 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
5743 g_bIgnoreCommands++;
5744 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE);
5745 g_bIgnoreCommands--;
5746 g_PrefsDlg.SavePrefs ();
5750 void MainFrame::OnToggleRotatelock()
5752 g_PrefsDlg.m_bRotateLock ^= 1;
5754 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
5755 g_bIgnoreCommands++;
5756 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE);
5757 g_bIgnoreCommands--;
5758 g_PrefsDlg.SavePrefs ();
5762 // use a dialog for direct selection of a texture menu
5763 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5764 void MainFrame::OnTexturesLoad()
5766 char def_path[NAME_MAX];
5769 // check if that works with fs_game (I suspect some more design is needed)
5770 // see how this is done in 1.2?
5771 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=507
5772 strcpy (def_path, g_pGameDescription->mEnginePath.GetBuffer());
5773 strcat (def_path, g_pGameDescription->mBaseGame.GetBuffer());
5774 strcat (def_path, "/");
5776 char *dir = dir_dialog (m_pWidget, _("Load textures from path"), def_path);
5780 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5781 Sys_Printf("user select: '%s'\n", dir);
5782 // remove a potential trailing slash?
5783 if (dir[strlen(dir)-1]=='/' || dir[strlen(dir)-1]=='\\')
5784 dir[strlen(dir)-1] = '\0';
5785 char *pouic = MAX(strrchr(dir, '/'),strrchr(dir, '\\'));
5788 strcpy(texture_directory, pouic+1);
5789 Sys_Printf("Loading '%s'\n", texture_directory);
5790 Texture_ShowDirectory();
5793 Sys_FPrintf(SYS_WRN, "Failed to extract the directory\n");
5797 Sys_FPrintf(SYS_WRN, "texture load dialog cancelled\n");
5800 void MainFrame::OnTexturesReloadshaders()
5803 QERApp_ReloadShaders();
5805 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5806 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
5807 Sys_UpdateWindows (W_ALL);
5811 void MainFrame::OnTexturesShadersShow()
5813 g_PrefsDlg.m_bShowShaders ^= 1;
5814 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
5815 g_bIgnoreCommands++;
5816 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
5817 g_bIgnoreCommands--;
5818 Sys_UpdateWindows(W_TEXTURE);
5821 void MainFrame::SetTextureScale(int id)
5827 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5828 g_PrefsDlg.m_nTextureScale = 10;
5829 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_10"));
5831 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5832 g_PrefsDlg.m_nTextureScale = 25;
5833 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_25"));
5835 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5836 g_PrefsDlg.m_nTextureScale = 50;
5837 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_50"));
5839 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5840 g_PrefsDlg.m_nTextureScale = 200;
5841 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_200"));
5844 g_PrefsDlg.m_nTextureScale = 100;
5845 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_100"));
5849 g_bIgnoreCommands++;
5850 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5851 g_bIgnoreCommands--;
5853 Texture_ResetPosition();
5856 void MainFrame::OnTexturewindowScaleup()
5858 switch(g_PrefsDlg.m_nTextureScale) {
5859 // 200, all the way in, don't do anything
5861 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_200);
5864 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5867 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5870 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5875 void MainFrame::OnTexturewindowScaledown()
5877 switch(g_PrefsDlg.m_nTextureScale) {
5879 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5882 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5885 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5888 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_10);
5890 // 10, all the way out, don't do anything
5894 void MainFrame::OnTexturesLoadlist()
5896 DoTextureListDlg ();
5899 void MainFrame::OnTexturesShaderlistonly()
5901 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5902 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget),"menu_textures_shaderlistonly"));
5903 g_bIgnoreCommands++;
5904 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
5905 g_bIgnoreCommands--;
5909 void MainFrame::OnTextureWad(unsigned int nID)
5912 Texture_ShowDirectory (nID);
5913 Sys_UpdateWindows (W_ALL);
5917 void MainFrame::OnMiscBenchmark()
5919 m_pCamWnd->BenchMark();
5922 void MainFrame::OnColorSetoriginal()
5924 for (int i=0 ; i<3 ; i++)
5926 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5927 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5928 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5929 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5930 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5935 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5936 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5938 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5939 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5943 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5945 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5947 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5948 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5949 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5951 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5952 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5953 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5955 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5957 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5960 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5961 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5963 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5964 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5965 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5967 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5968 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5969 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5971 Sys_UpdateWindows (W_ALL);
5974 void MainFrame::OnColorSetqer()
5976 for (int i=0 ; i<3 ; i++)
5978 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5979 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5980 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5981 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5982 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5985 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5986 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5987 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5989 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5990 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5991 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5993 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5994 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5995 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5997 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5998 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5999 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6001 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6002 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6003 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6005 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6006 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6007 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6009 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6010 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6011 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6013 Sys_UpdateWindows (W_ALL);
6016 void MainFrame::OnColorSetblack()
6018 for (int i=0 ; i<3 ; i++)
6020 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6021 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
6022 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
6023 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6026 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
6027 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
6028 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
6030 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
6031 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
6032 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6034 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
6035 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
6036 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
6038 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6039 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6040 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6042 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6043 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6044 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6046 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
6047 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
6048 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
6050 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
6051 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
6052 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
6054 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6055 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6056 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6058 Sys_UpdateWindows (W_ALL);
6061 /* ydnar: to emulate maya/max/lightwave color schemes */
6062 void MainFrame::OnColorSetydnar()
6064 for (int i=0 ; i<3 ; i++)
6066 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6067 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
6068 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
6069 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
6070 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6073 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
6074 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
6075 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6077 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
6078 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
6079 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
6081 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6082 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6083 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6085 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6086 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6087 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6089 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6090 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6091 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6093 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6094 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6095 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6097 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6098 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6099 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6101 Sys_UpdateWindows (W_ALL);
6104 void MainFrame::OnTexturebk()
6106 DoColor(COLOR_TEXTUREBACK);
6107 Sys_UpdateWindows (W_ALL);
6110 void MainFrame::OnColorsXybk()
6112 DoColor(COLOR_GRIDBACK);
6113 Sys_UpdateWindows (W_ALL);
6116 void MainFrame::OnColorsMajor()
6118 DoColor(COLOR_GRIDMAJOR);
6119 Sys_UpdateWindows (W_ALL);
6122 void MainFrame::OnColorsMinor()
6124 DoColor(COLOR_GRIDMINOR);
6125 Sys_UpdateWindows (W_ALL);
6128 void MainFrame::OnColorsMajor_Alt()
6130 DoColor(COLOR_GRIDMAJOR_ALT);
6131 Sys_UpdateWindows (W_ALL);
6134 void MainFrame::OnColorsMinor_Alt()
6136 DoColor(COLOR_GRIDMINOR_ALT);
6137 Sys_UpdateWindows (W_ALL);
6140 void MainFrame::OnColorsGridtext()
6142 DoColor(COLOR_GRIDTEXT);
6143 Sys_UpdateWindows (W_ALL);
6146 void MainFrame::OnColorsGridblock()
6148 DoColor(COLOR_GRIDBLOCK);
6149 Sys_UpdateWindows (W_ALL);
6152 void MainFrame::OnColorsCameraBack()
6154 DoColor(COLOR_CAMERABACK);
6155 Sys_UpdateWindows (W_ALL);
6158 void MainFrame::OnColorsBrush()
6160 DoColor(COLOR_BRUSHES);
6161 Sys_UpdateWindows (W_ALL);
6164 void MainFrame::OnColorsSelectedbrush()
6166 DoColor(COLOR_SELBRUSHES);
6167 Sys_UpdateWindows (W_ALL);
6170 void MainFrame::OnColorsSelectedbrush3D()
6172 DoColor(COLOR_SELBRUSHES3D);
6173 Sys_UpdateWindows (W_ALL);
6176 void MainFrame::OnColorsClipper()
6178 DoColor(COLOR_CLIPPER);
6179 Sys_UpdateWindows (W_ALL);
6182 void MainFrame::OnColorsViewname()
6184 DoColor(COLOR_VIEWNAME);
6185 Sys_UpdateWindows (W_ALL);
6188 void MainFrame::OnMiscGamma()
6190 float fSave = g_qeglobals.d_savedinfo.fGamma;
6192 if (fSave != g_qeglobals.d_savedinfo.fGamma)
6194 gtk_MessageBox(m_pWidget, _("You must restart Radiant for Gamma settings to take effect."));
6197 void MainFrame::OnMiscFindbrush()
6202 void MainFrame::OnMiscNextleakspot()
6207 void MainFrame::OnMiscPreviousleakspot()
6212 void MainFrame::OnMiscPrintxy()
6217 void MainFrame::OnMiscSelectentitycolor()
6221 CString strColor = ValueForKey(edit_entity, "_color");
6222 if (strColor.GetLength() > 0)
6225 int n = sscanf(strColor,"%f %f %f", &fR, &fG, &fB);
6228 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6229 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6230 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6234 if (inspector_mode == W_ENTITY && (DoColor(COLOR_ENTITY)))
6237 sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6238 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6239 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
6241 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntValueField]), buffer);
6242 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntKeyField]), "_color");
6244 //DK - SOF change to get color to entity quickly
6245 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6246 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6249 Sys_UpdateWindows( W_ALL );
6253 void MainFrame::OnConvertcurves()
6257 for (brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
6261 for (face_t* f = pb->brush_faces ; f ; f=f->next)
6263 if (f->texdef.contents & CONTENTS_LADDER)
6265 f->texdef.contents &= ~CONTENTS_LADDER;
6266 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6271 Map_BuildBrushData();
6275 void MainFrame::OnRegionOff()
6280 void MainFrame::OnRegionSetxy()
6285 void MainFrame::OnRegionSettallbrush()
6287 Map_RegionTallBrush ();
6290 void MainFrame::OnRegionSetbrush()
6295 void MainFrame::OnRegionSetselection()
6297 Map_RegionSelectedBrushes ();
6300 void MainFrame::OnBrush3sided()
6302 Undo_Start("3 sided");
6303 Undo_AddBrushList(&selected_brushes);
6305 Undo_EndBrushList(&selected_brushes);
6309 void MainFrame::OnBrush4sided()
6311 Undo_Start("4 sided");
6312 Undo_AddBrushList(&selected_brushes);
6314 Undo_EndBrushList(&selected_brushes);
6318 void MainFrame::OnBrush5sided()
6320 Undo_Start("5 sided");
6321 Undo_AddBrushList(&selected_brushes);
6323 Undo_EndBrushList(&selected_brushes);
6327 void MainFrame::OnBrush6sided()
6329 Undo_Start("6 sided");
6330 Undo_AddBrushList(&selected_brushes);
6332 Undo_EndBrushList(&selected_brushes);
6336 void MainFrame::OnBrush7sided()
6338 Undo_Start("7 sided");
6339 Undo_AddBrushList(&selected_brushes);
6341 Undo_EndBrushList(&selected_brushes);
6345 void MainFrame::OnBrush8sided()
6347 Undo_Start("8 sided");
6348 Undo_AddBrushList(&selected_brushes);
6350 Undo_EndBrushList(&selected_brushes);
6354 void MainFrame::OnBrush9sided()
6356 Undo_Start("9 sided");
6357 Undo_AddBrushList(&selected_brushes);
6359 Undo_EndBrushList(&selected_brushes);
6363 void MainFrame::OnBrushArbitrarysided()
6365 Undo_Start("arbitrary sided");
6366 Undo_AddBrushList(&selected_brushes);
6368 Undo_EndBrushList(&selected_brushes);
6372 void MainFrame::OnBrushMakecone()
6374 Undo_Start("make cone");
6375 Undo_AddBrushList(&selected_brushes);
6377 Undo_EndBrushList(&selected_brushes);
6381 void MainFrame::OnBrushPrimitivesSphere()
6383 Undo_Start("make sphere");
6384 Undo_AddBrushList(&selected_brushes);
6386 DoSides(false, true);
6388 Undo_EndBrushList(&selected_brushes);
6392 void MainFrame::OnCurvePatchtube()
6394 Undo_Start("make curve cylinder");
6395 Undo_AddBrushList(&selected_brushes);
6396 Patch_BrushToMesh(false);
6397 Sys_UpdateWindows (W_ALL);
6398 Undo_EndBrushList(&selected_brushes);
6402 void MainFrame::OnCurvePatchdensetube()
6404 Undo_Start("dense cylinder");
6405 Undo_AddBrushList(&selected_brushes);
6407 Patch_BrushToMesh(false);
6408 OnCurveInsertAddrow();
6409 Sys_UpdateWindows (W_ALL);
6411 Undo_EndBrushList(&selected_brushes);
6415 void MainFrame::OnCurvePatchverydensetube()
6417 Undo_Start("very dense cylinder");
6418 Undo_AddBrushList(&selected_brushes);
6420 Patch_BrushToMesh(false);
6421 OnCurveInsertAddrow();
6422 OnCurveInsertInsertrow();
6423 OnCurveInsertAddrow();
6424 Sys_UpdateWindows (W_ALL);
6426 Undo_EndBrushList(&selected_brushes);
6430 void MainFrame::OnCurvePatchsquare()
6432 Undo_Start("square cylinder");
6433 Undo_AddBrushList(&selected_brushes);
6435 Patch_BrushToMesh(false, false, false, true);
6436 Sys_UpdateWindows (W_ALL);
6438 Undo_EndBrushList(&selected_brushes);
6442 void MainFrame::OnCurvePatchendcap()
6444 Undo_Start("make end cap");
6445 Undo_AddBrushList(&selected_brushes);
6446 Patch_BrushToMesh(false, false, true);
6447 Sys_UpdateWindows (W_ALL);
6448 Undo_EndBrushList(&selected_brushes);
6452 void MainFrame::OnCurvePatchbevel()
6454 Undo_Start("make bevel");
6455 Undo_AddBrushList(&selected_brushes);
6456 Patch_BrushToMesh(false, true, false);
6457 Sys_UpdateWindows (W_ALL);
6458 Undo_EndBrushList(&selected_brushes);
6462 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel()
6464 Undo_Start("square bevel");
6465 Undo_AddBrushList(&selected_brushes);
6467 Patch_BrushToMesh(false, true, false, true);
6468 Sys_UpdateWindows (W_ALL);
6470 Undo_EndBrushList(&selected_brushes);
6474 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap()
6476 Undo_Start("square endcap");
6477 Undo_AddBrushList(&selected_brushes);
6479 Patch_BrushToMesh(false, false, true, true);
6480 Sys_UpdateWindows (W_ALL);
6482 Undo_EndBrushList(&selected_brushes);
6486 void MainFrame::OnCurvePatchcone()
6488 Undo_Start("make curve cone");
6489 Undo_AddBrushList(&selected_brushes);
6490 Patch_BrushToMesh(true);
6491 Sys_UpdateWindows (W_ALL);
6492 Undo_EndBrushList(&selected_brushes);
6496 void MainFrame::OnCurveSimplepatchmesh()
6498 Undo_Start("make simpe patch mesh");
6499 Undo_AddBrushList(&selected_brushes);
6501 Undo_EndBrushList(&selected_brushes);
6505 void MainFrame::OnCurveInsertInsertcolumn()
6507 Undo_Start("insert (2) columns");
6508 Undo_AddBrushList(&selected_brushes);
6509 Patch_AdjustSelected(true, true, false);
6510 Sys_UpdateWindows(W_ALL);
6511 Undo_EndBrushList(&selected_brushes);
6515 void MainFrame::OnCurveInsertAddcolumn()
6517 Undo_Start("add (2) columns");
6518 Undo_AddBrushList(&selected_brushes);
6519 Patch_AdjustSelected(true, true, true);
6520 Sys_UpdateWindows(W_ALL);
6521 Undo_EndBrushList(&selected_brushes);
6525 void MainFrame::OnCurveInsertInsertrow()
6527 Undo_Start("insert (2) rows");
6528 Undo_AddBrushList(&selected_brushes);
6529 Patch_AdjustSelected(true, false, false);
6530 Sys_UpdateWindows(W_ALL);
6531 Undo_EndBrushList(&selected_brushes);
6535 void MainFrame::OnCurveInsertAddrow()
6537 Undo_Start("add (2) rows");
6538 Undo_AddBrushList(&selected_brushes);
6539 Patch_AdjustSelected(true, false, true);
6540 Sys_UpdateWindows(W_ALL);
6541 Undo_EndBrushList(&selected_brushes);
6545 void MainFrame::OnCurveDeleteFirstcolumn()
6547 Undo_Start("delete first (2) columns");
6548 Undo_AddBrushList(&selected_brushes);
6549 Patch_AdjustSelected(false, true, true);
6550 Sys_UpdateWindows(W_ALL);
6551 Undo_EndBrushList(&selected_brushes);
6555 void MainFrame::OnCurveDeleteLastcolumn()
6557 Undo_Start("delete last (2) columns");
6558 Undo_AddBrushList(&selected_brushes);
6559 Patch_AdjustSelected(false, true, false);
6560 Sys_UpdateWindows(W_ALL);
6561 Undo_EndBrushList(&selected_brushes);
6565 void MainFrame::OnCurveDeleteFirstrow()
6567 Undo_Start("delete first (2) rows");
6568 Undo_AddBrushList(&selected_brushes);
6569 Patch_AdjustSelected(false, false, true);
6570 Sys_UpdateWindows(W_ALL);
6571 Undo_EndBrushList(&selected_brushes);
6575 void MainFrame::OnCurveDeleteLastrow()
6577 Undo_Start("delete last (2) rows");
6578 Undo_AddBrushList(&selected_brushes);
6579 Patch_AdjustSelected(false, false, false);
6580 Sys_UpdateWindows(W_ALL);
6581 Undo_EndBrushList(&selected_brushes);
6585 void MainFrame::OnCurveNegative()
6587 Patch_ToggleInverted();
6588 //Sys_UpdateWindows(W_ALL);
6591 void MainFrame::OnCurveRedisperseRows()
6593 Undo_Start("redisperse rows");
6594 Undo_AddBrushList(&selected_brushes);
6595 Patch_DisperseRows();
6596 Sys_UpdateWindows (W_ALL);
6597 Undo_EndBrushList(&selected_brushes);
6601 void MainFrame::OnCurveRedisperseIntermediateCols()
6603 Undo_Start("redisperse im cols");
6604 Undo_AddBrushList(&selected_brushes);
6605 Patch_DisperseIntermediateColumns();
6606 Sys_UpdateWindows (W_ALL);
6607 Undo_EndBrushList(&selected_brushes);
6611 void MainFrame::OnCurveRedisperseIntermediateRows()
6613 Undo_Start("redisperse im rows");
6614 Undo_AddBrushList(&selected_brushes);
6615 Patch_DisperseIntermediateRows();
6616 Sys_UpdateWindows (W_ALL);
6617 Undo_EndBrushList(&selected_brushes);
6621 void MainFrame::OnCurveMatrixTranspose()
6624 Sys_UpdateWindows (W_ALL);
6627 void MainFrame::OnCurveCap()
6630 Sys_UpdateWindows (W_ALL);
6633 void MainFrame::OnCurveCyclecap()
6635 Patch_CycleCapSelected();
6636 Sys_UpdateWindows (W_ALL);
6639 void MainFrame::OnCurveOverlaySet()
6641 Patch_SetOverlays();
6642 Sys_UpdateWindows(W_ALL);
6645 void MainFrame::OnCurveOverlayClear()
6647 Patch_ClearOverlays();
6648 Sys_UpdateWindows(W_ALL);
6651 void MainFrame::OnCurveThicken()
6653 Undo_Start("curve thicken");
6654 Undo_AddBrushList(&selected_brushes);
6656 Undo_EndBrushList(&selected_brushes);
6661 this can no longer be trigger manually from the menu
6662 happens only once at startup
6664 void MainFrame::OnPluginsRefresh()
6670 // open the Q3Rad manual
6671 void MainFrame::OnHelp()
6673 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6675 help = g_strAppPath;
6676 help += "Q3Rad_Manual/index.htm";
6677 OpenURL(help.GetBuffer());
6680 // FIXME: we'll go towards a unified help thing soon
6681 void MainFrame::OnHelpLinks()
6684 link = g_strAppPath;
6685 link += "links.htm";
6686 OpenURL(link.GetBuffer());
6689 void MainFrame::OnHelpBugreport()
6691 OpenURL("http://www.qeradiant.com/faq/fom-serve/cache/138.html");
6694 void MainFrame::OnHelpCommandlist()
6696 DoCommandListDlg ();
6699 void MainFrame::OnHelpAbout()
6704 void MainFrame::OnPopupSelection()
6706 GtkWidget *menu, *item;
6707 const gchar *labels[] = { _("Select Complete Tall"), _("Select Touching"), _("Select Partial Tall"), _("Select Inside")};
6708 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6709 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6711 menu = gtk_menu_new ();
6713 for (int i = 0; i < 4; i++)
6715 item = gtk_menu_item_new_with_label (labels[i]);
6716 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (HandleCommand),
6717 GINT_TO_POINTER (ids[i]));
6718 gtk_widget_show (item);
6719 gtk_menu_append (GTK_MENU (menu), item);
6722 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6725 void MainFrame::OnViewChange()
6728 //HandlePopup(this, IDR_POPUP_VIEW);
6731 void MainFrame::OnTexturesPopup()
6733 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "render_quality_menu");
6734 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6737 void MainFrame::ToggleCamera()
6740 m_bCamPreview = false;
6742 m_bCamPreview = true;
6745 void MainFrame::OnViewCameraupdate()
6747 Sys_UpdateWindows(W_CAMERA);
6750 void MainFrame::OnSelectMouserotate()
6752 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mouserotate"));
6753 g_bIgnoreCommands++;
6757 if (ActiveXY()->ClipMode())
6759 if (ActiveXY()->RotateMode())
6761 // SetRotateMode(false) always works
6762 ActiveXY()->SetRotateMode(false);
6763 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6766 // may not work if no brush selected, see return value
6767 if (ActiveXY()->SetRotateMode(true))
6768 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6770 // if MFC called, we need to set back to FALSE ourselves
6771 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6774 g_bIgnoreCommands--;
6777 void MainFrame::OnSelectMousescale()
6779 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mousescale"));
6780 g_bIgnoreCommands++;
6784 if (ActiveXY()->ClipMode())
6786 if (ActiveXY()->RotateMode())
6788 // SetRotateMode(false) always works
6789 ActiveXY()->SetRotateMode(false);
6790 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6792 if (ActiveXY()->ScaleMode())
6794 ActiveXY()->SetScaleMode(false);
6795 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6798 ActiveXY()->SetScaleMode(true);
6799 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6802 g_bIgnoreCommands--;
6805 void MainFrame::OnScalelockx()
6807 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockx"));
6808 g_bIgnoreCommands++;
6810 if (g_nScaleHow & SCALE_X)
6812 g_nScaleHow ^= SCALE_X;
6813 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6816 g_nScaleHow |= SCALE_X;
6817 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6819 g_bIgnoreCommands--;
6822 void MainFrame::OnScalelocky()
6824 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelocky"));
6825 g_bIgnoreCommands++;
6827 if (g_nScaleHow & SCALE_Y)
6829 g_nScaleHow ^= SCALE_Y;
6830 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6833 g_nScaleHow |= SCALE_Y;
6834 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6836 g_bIgnoreCommands--;
6839 void MainFrame::OnScalelockz()
6841 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockz"));
6842 g_bIgnoreCommands++;
6844 if (g_nScaleHow & SCALE_Z)
6846 g_nScaleHow ^= SCALE_Z;
6847 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6850 g_nScaleHow |= SCALE_Z;
6851 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6853 g_bIgnoreCommands--;
6856 void MainFrame::OnDontselectcurve()
6858 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
6859 g_bIgnoreCommands++;
6860 g_PrefsDlg.m_bSelectCurves ^= 1;
6861 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
6862 g_bIgnoreCommands--;
6865 void MainFrame::OnPatchToggleBox()
6867 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
6868 g_bIgnoreCommands++;
6869 g_bPatchShowBounds ^= 1;
6870 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
6871 g_bIgnoreCommands--;
6872 Sys_UpdateWindows(W_ALL);
6875 void MainFrame::OnPatchWireframe()
6877 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_wireframe"));
6878 g_bIgnoreCommands++;
6879 g_bPatchWireFrame ^= 1;
6880 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWireFrame) ? TRUE : FALSE);
6881 g_bIgnoreCommands--;
6882 Sys_UpdateWindows(W_ALL);
6885 void MainFrame::OnPatchBend()
6887 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
6888 g_bIgnoreCommands++;
6890 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
6891 g_bIgnoreCommands--;
6892 Sys_UpdateWindows(W_ALL);
6895 void MainFrame::OnPatchWeld()
6897 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
6898 g_bIgnoreCommands++;
6900 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
6901 g_bIgnoreCommands--;
6902 Sys_UpdateWindows(W_ALL);
6905 void MainFrame::OnPatchDrilldown()
6907 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
6908 g_bIgnoreCommands++;
6909 g_bPatchDrillDown ^= 1;
6910 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
6911 g_bIgnoreCommands--;
6912 Sys_UpdateWindows(W_ALL);
6915 void MainFrame::OnShowEntities()
6917 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "view_entitiesas_menu"); // use pointer to existing menu object
6918 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6921 void MainFrame::OnDropGroupName()
6924 char* name = DoNameDlg ("Name Selection");
6929 Sys_UpdateWindows (W_ALL);
6935 void MainFrame::OnDropGroupNewgroup()
6940 void MainFrame::OnDropGroupRemove()
6943 Select_AddToGroup("World");
6944 Sys_UpdateWindows (W_ALL);
6948 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6949 void MainFrame::OnFaceFit()
6954 void MainFrame::OnDontselectmodel()
6956 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
6957 g_bIgnoreCommands++;
6958 g_PrefsDlg.m_bSelectModels ^= 1;
6959 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
6960 g_bIgnoreCommands--;
6963 void MainFrame::OnViewTexture()
6965 if (FloatingGroupDialog()) // QE4 style
6967 if (inspector_mode == W_TEXTURE)
6969 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
6970 widget_delete_hide (g_qeglobals_gui.d_entity);
6972 gtk_widget_show (g_qeglobals_gui.d_entity);
6975 gtk_widget_show (g_qeglobals_gui.d_entity);
6976 SetInspectorMode (W_TEXTURE);
6981 void MainFrame::OnPatchInspector()
6983 TogglePatchInspector();
6986 void MainFrame::OnCurveNegativeTextureX()
6988 Patch_InvertTexture(false);
6989 //Sys_UpdateWindows(W_ALL);
6992 void MainFrame::OnCurveNegativeTextureY()
6994 Patch_InvertTexture(true);
6995 //Sys_UpdateWindows(W_ALL);
6998 void MainFrame::OnCurveInsertcolumn()
7000 if (&selected_brushes == selected_brushes.next)
7002 Undo_Start("insert colum");
7003 Undo_AddBrushList(&selected_brushes);
7004 //Patch_AdjustSelectedRowCols(0, 2);
7005 Patch_AdjustSelected(true, true, true);
7006 Sys_UpdateWindows(W_ALL);
7007 Undo_EndBrushList(&selected_brushes);
7011 void MainFrame::OnCurveInsertrow()
7013 if (&selected_brushes == selected_brushes.next)
7015 Undo_Start("insert row");
7016 Undo_AddBrushList(&selected_brushes);
7017 //Patch_AdjustSelectedRowCols(2, 0);
7018 Patch_AdjustSelected(true, false, true);
7019 Sys_UpdateWindows(W_ALL);
7020 Undo_EndBrushList(&selected_brushes);
7024 void MainFrame::OnCurveDeletecolumn()
7026 if (&selected_brushes == selected_brushes.next)
7028 Undo_Start("delete column");
7029 Undo_AddBrushList(&selected_brushes);
7030 Patch_AdjustSelected(false, true, true);
7031 Sys_UpdateWindows(W_ALL);
7032 Undo_EndBrushList(&selected_brushes);
7036 void MainFrame::OnCurveDeleterow()
7038 if (&selected_brushes == selected_brushes.next)
7040 Undo_Start("delete row");
7041 Undo_AddBrushList(&selected_brushes);
7042 Patch_AdjustSelected(false, false, true);
7043 Sys_UpdateWindows(W_ALL);
7044 Undo_EndBrushList(&selected_brushes);
7048 void MainFrame::OnPatchTab()
7050 if (g_bPatchBendMode)
7051 Patch_BendHandleTAB();
7052 // else if (g_bPatchInsertMode)
7053 // Patch_InsDelHandleTAB();
7056 // check to see if the selected brush is part of a func group
7057 // if it is, deselect everything and reselect the next brush
7059 brush_t *b2, *b = selected_brushes.next;
7061 if (b != &selected_brushes)
7063 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7067 for (b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext)
7075 if (b2 == &e->brushes)
7078 Select_Brush(b2, false);
7079 Sys_UpdateWindows(W_ALL);
7085 void MainFrame::OnCameraForward(bool keydown)
7087 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7091 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7092 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7093 Sys_UpdateWindows (nUpdate);
7098 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7100 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7104 void MainFrame::OnCameraBack(bool keydown)
7106 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7110 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7111 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7112 Sys_UpdateWindows (nUpdate);
7117 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7119 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7123 void MainFrame::OnCameraLeft(bool keydown)
7127 if (m_pCamWnd->m_bFreeMove)
7129 OnCameraStrafeleft(keydown);
7134 if (g_PrefsDlg.m_bCamDiscrete)
7138 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7139 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7140 Sys_UpdateWindows (nUpdate);
7145 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7147 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7151 void MainFrame::OnCameraRight(bool keydown)
7155 if (m_pCamWnd->m_bFreeMove)
7157 OnCameraStraferight(keydown);
7162 if (g_PrefsDlg.m_bCamDiscrete)
7166 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7167 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7168 Sys_UpdateWindows (nUpdate);
7173 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7175 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7179 void MainFrame::OnCameraUp()
7181 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7182 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7183 Sys_UpdateWindows (nUpdate);
7186 void MainFrame::OnCameraDown()
7188 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7189 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7190 Sys_UpdateWindows (nUpdate);
7193 void MainFrame::OnCameraAngleup()
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::OnCameraAngledown()
7203 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7204 if (m_pCamWnd->Camera()->angles[0] < -85)
7205 m_pCamWnd->Camera()->angles[0] = -85;
7206 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7209 void MainFrame::OnCameraStrafeleft(bool keydown)
7211 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7214 if (!m_pCamWnd->m_bFreeMove)
7218 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7219 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7220 Sys_UpdateWindows (nUpdate);
7227 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7229 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7232 void MainFrame::OnCameraStraferight(bool keydown)
7234 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7237 if (!m_pCamWnd->m_bFreeMove)
7241 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7242 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7243 Sys_UpdateWindows (nUpdate);
7250 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7252 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7255 void MainFrame::OnGridToggle()
7257 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7258 Sys_UpdateWindows (W_XY|W_Z);
7261 void MainFrame::OnViewCrosshair()
7264 Sys_UpdateWindows (W_XY);
7267 void MainFrame::OnSelectionTextureRotateclock()
7269 Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7272 void MainFrame::OnSelectionTextureRotatecounter()
7274 Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7277 void MainFrame::OnSelectionTextureScaleup()
7279 Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7282 void MainFrame::OnSelectionTextureScaledown()
7284 Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7287 void MainFrame::OnSelectionTextureScaleLeft()
7289 Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7292 void MainFrame::OnSelectionTextureScaleRight()
7294 Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7297 void MainFrame::OnSelectionTextureShiftleft()
7299 Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7302 void MainFrame::OnSelectionTextureShiftright()
7304 Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7307 void MainFrame::OnSelectionTextureShiftup()
7309 Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7312 void MainFrame::OnSelectionTextureShiftdown()
7314 Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7317 void MainFrame::OnGridPrev()
7320 if (g_qeglobals.d_gridsize == 1)
7322 g_qeglobals.d_gridsize = 0.5;
7323 g_qeglobals.d_bSmallGrid = true;
7324 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7325 } else if (g_qeglobals.d_gridsize == 0.5)
7327 g_qeglobals.d_gridsize = 0.25;
7328 g_qeglobals.d_bSmallGrid = true;
7329 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7330 } else if (g_qeglobals.d_gridsize > 1)
7332 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7333 g_qeglobals.d_bSmallGrid = false;
7335 switch ((int)g_qeglobals.d_gridsize)
7337 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7338 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7339 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7340 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7341 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7342 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7343 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7344 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7345 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7351 // SnapTToGrid option: need to check everywhere the grid size is changed
7352 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7353 if (g_PrefsDlg.m_bSnapTToGrid)
7357 g_bIgnoreCommands++;
7358 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7359 g_bIgnoreCommands--;
7361 Sys_UpdateWindows(W_XY | W_Z);
7364 void MainFrame::OnGridNext()
7367 if (g_qeglobals.d_gridsize == 0.25)
7369 g_qeglobals.d_gridsize = 0.5;
7370 g_qeglobals.d_bSmallGrid = true;
7371 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7372 } else if (g_qeglobals.d_gridsize == 0.5)
7374 g_qeglobals.d_gridsize = 1;
7375 g_qeglobals.d_bSmallGrid = false;
7376 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7377 } else if (g_qeglobals.d_gridsize < 256)
7379 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7380 g_qeglobals.d_bSmallGrid = false;
7382 switch ((int)g_qeglobals.d_gridsize)
7384 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7385 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7386 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7387 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7388 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7389 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7390 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7391 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7392 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7393 default: item = NULL;
7399 // SnapTToGrid option: need to check everywhere the grid size is changed
7400 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7401 if (g_PrefsDlg.m_bSnapTToGrid)
7405 g_bIgnoreCommands++;
7406 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7407 g_bIgnoreCommands--;
7409 Sys_UpdateWindows(W_XY | W_Z);
7412 void MainFrame::OnSelectionMovedown()
7414 if (&selected_brushes == selected_brushes.next)
7416 Undo_Start("move down");
7417 Undo_AddBrushList(&selected_brushes);
7420 vAmt[0] = vAmt[1] = 0.0;
7421 vAmt[2] = -g_qeglobals.d_gridsize;
7423 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7425 Undo_EndBrushList(&selected_brushes);
7429 void MainFrame::OnSelectionMoveup()
7431 if (&selected_brushes == selected_brushes.next)
7433 Undo_Start("move up");
7434 Undo_AddBrushList(&selected_brushes);
7437 vAmt[0] = vAmt[1] = 0.0;
7438 vAmt[2] = g_qeglobals.d_gridsize;
7440 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7442 Undo_EndBrushList(&selected_brushes);
7446 void MainFrame::OnSelectionPrint()
7448 for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7452 void MainFrame::OnSelectionTogglesizepaint()
7454 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7455 Sys_UpdateWindows(W_XY);
7458 void MainFrame::OnPatchNaturalize()
7460 Patch_NaturalizeSelected();
7461 Sys_UpdateWindows (W_ALL);
7464 void MainFrame::OnSnapToGrid()
7466 if (&selected_brushes == selected_brushes.next)
7468 Undo_Start("snap selection to grid");
7469 Undo_AddBrushList(&selected_brushes);
7470 //Select_SnapToGrid();
7471 for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7474 Patch_SnapToGrid(pb->pPatch);
7476 Brush_SnapToGrid(pb);
7478 Sys_UpdateWindows (W_ALL);
7479 Undo_EndBrushList(&selected_brushes);
7483 void MainFrame::OnSelectAll()
7488 void MainFrame::OnSelectionInvert()
7491 Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7495 void PerformFiltering ()
7499 // mattn - this should be removed - otherwise the filters from the
7500 // plugins are wiped away with each update
7502 // spog - deletes old filters list and creates new one when
7503 // g_qeglobals.d_savedinfo.exclude is updated
7504 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
7505 g_qeglobals.d_savedinfo.filters = FilterUpdate(g_qeglobals.d_savedinfo.filters);
7508 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7509 brush->bFiltered = FilterBrush( brush );
7511 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7512 brush->bFiltered = FilterBrush( brush );
7515 void MainFrame::OnFilterAreaportals()
7517 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7518 g_bIgnoreCommands++;
7519 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7520 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7522 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7523 g_bIgnoreCommands--;
7525 Sys_UpdateWindows (W_XY|W_CAMERA);
7528 void MainFrame::OnFilterCaulk()
7530 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7531 g_bIgnoreCommands++;
7532 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7533 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7535 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7536 g_bIgnoreCommands--;
7538 Sys_UpdateWindows (W_XY|W_CAMERA);
7541 void MainFrame::OnFilterClips()
7543 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7544 g_bIgnoreCommands++;
7545 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7546 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7548 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7549 g_bIgnoreCommands--;
7551 Sys_UpdateWindows (W_XY|W_CAMERA);
7554 void MainFrame::OnFilterBotClips()
7556 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7557 g_bIgnoreCommands++;
7558 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7559 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7561 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7562 g_bIgnoreCommands--;
7564 Sys_UpdateWindows (W_XY|W_CAMERA);
7567 void MainFrame::OnFilterStructural()
7569 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7570 g_bIgnoreCommands++;
7571 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7572 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7574 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7575 g_bIgnoreCommands--;
7577 Sys_UpdateWindows (W_XY|W_CAMERA);
7580 void MainFrame::OnFilterDetails()
7582 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7583 g_bIgnoreCommands++;
7584 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7585 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7587 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7588 g_bIgnoreCommands--;
7590 Sys_UpdateWindows (W_XY|W_CAMERA);
7593 void MainFrame::OnFilterEntities()
7595 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7596 g_bIgnoreCommands++;
7597 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7598 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7600 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7601 g_bIgnoreCommands--;
7603 Sys_UpdateWindows (W_XY|W_CAMERA);
7606 void MainFrame::OnFilterHintsskips()
7608 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7609 g_bIgnoreCommands++;
7610 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7611 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7613 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7614 g_bIgnoreCommands--;
7616 Sys_UpdateWindows (W_XY|W_CAMERA);
7619 void MainFrame::OnFilterLights()
7621 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7622 g_bIgnoreCommands++;
7623 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7624 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7626 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7627 g_bIgnoreCommands--;
7629 Sys_UpdateWindows (W_XY|W_CAMERA);
7632 void MainFrame::OnFilterLiquids()
7634 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7635 g_bIgnoreCommands++;
7636 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7637 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7639 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7640 g_bIgnoreCommands--;
7642 Sys_UpdateWindows (W_XY|W_CAMERA);
7645 void MainFrame::OnFilterModels()
7647 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7648 g_bIgnoreCommands++;
7649 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7650 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7652 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7653 g_bIgnoreCommands--;
7655 Sys_UpdateWindows (W_XY|W_CAMERA);
7658 void MainFrame::OnFilterPatches()
7660 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7661 g_bIgnoreCommands++;
7662 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7663 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7665 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7666 g_bIgnoreCommands--;
7668 Sys_UpdateWindows (W_XY|W_CAMERA);
7671 void MainFrame::OnFilterPaths()
7673 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7674 g_bIgnoreCommands++;
7675 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7676 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7678 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7679 g_bIgnoreCommands--;
7681 Sys_UpdateWindows (W_XY|W_CAMERA);
7684 void MainFrame::OnFilterClusterportals()
7686 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7687 g_bIgnoreCommands++;
7688 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7689 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7691 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7692 g_bIgnoreCommands--;
7694 Sys_UpdateWindows (W_XY|W_CAMERA);
7697 void MainFrame::OnFilterLightgrid()
7699 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7700 g_bIgnoreCommands++;
7701 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7702 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7704 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7705 g_bIgnoreCommands--;
7707 Sys_UpdateWindows (W_XY|W_CAMERA);
7710 void MainFrame::OnFilterTranslucent()
7712 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7713 g_bIgnoreCommands++;
7714 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7715 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7717 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7718 g_bIgnoreCommands--;
7720 Sys_UpdateWindows (W_XY|W_CAMERA);
7723 void MainFrame::OnFilterTriggers()
7725 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7726 g_bIgnoreCommands++;
7727 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7728 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7730 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7731 g_bIgnoreCommands--;
7733 Sys_UpdateWindows (W_XY|W_CAMERA);
7736 void MainFrame::OnFilterWorld()
7738 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7739 g_bIgnoreCommands++;
7740 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7741 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7743 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7744 g_bIgnoreCommands--;
7746 Sys_UpdateWindows (W_XY|W_CAMERA);
7756 // =============================================================================
7757 // leo: Unused functions, not called anywhere from the code (need to check)
7759 void MainFrame::OnViewConsole()
7761 if (FloatingGroupDialog()) // QE4 style
7763 if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7765 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7766 widget_delete_hide (g_qeglobals_gui.d_entity);
7768 gtk_widget_show (g_qeglobals_gui.d_entity);
7771 gtk_widget_show (g_qeglobals_gui.d_entity);
7772 SetInspectorMode(W_CONSOLE);
7777 void MainFrame::OnCurveFreeze()
7782 void MainFrame::OnCurveUnFreeze()
7784 Patch_UnFreeze(false);
7787 void MainFrame::OnCurveUnFreezeAll()
7789 Patch_UnFreeze(true);
7792 void MainFrame::OnSelectReselect()
7797 void MainFrame::OnSelectionTextureFit()
7799 // TODO: Add your command handler code here
7802 void MainFrame::OnPatchEnter()
7807 void MainFrame::OnDropGroupAddtoWorld()
7810 Select_AddToGroup("World");
7811 Sys_UpdateWindows (W_ALL);