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 <gdk/gdkkeysyms.h>
38 #include <gdk/gdkprivate.h>
40 #if defined (__linux__) || defined (__APPLE__)
44 #include "groupdialog.h"
45 #include "patchdialog.h"
48 // use this to verbose what happens with the beyboard
54 CString g_strAppPath; ///< holds the full path of the executable
55 CString g_strDTDPath; ///< path to the DTD files
57 see http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 for the two below
59 CString g_pidFile; ///< the global .pid file (only for global part of the startup)
60 CString g_pidGameFile; ///< the game-specific .pid file
61 CString g_strBitmapsPath; // directory where the bitmaps are stored
64 points to the game tools directory, for instance
65 C:\Program Files\Quake III Arena\GtkRadiant
67 this is one of the main variables that are configured by the game selection on startup
68 <g_strGameToolsPath>/plugins
69 <g_strGameToolsPath>/modules
72 CString g_strGameToolsPath; ///< this is set by g_PrefsDlg.mGamesDialog
73 CGameDescription *g_pGameDescription; ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
74 CString g_strPluginsDir; ///< name of plugins directory, always sub-directory of toolspath
75 CString g_strModulesDir; ///< name of modules directory, always sub-directory of toolspath
78 directory for temp files
79 NOTE: on *nix this is were we check for .pid
81 CString g_strTempPath;
82 MainFrame* g_pParentWnd = NULL; // used to precast to CMainFrame
83 PrefsDlg g_Preferences; // global prefs instance
84 PrefsDlg& g_PrefsDlg = g_Preferences; // reference used throughout
85 int g_nUpdateBits = 0; // window update flags
86 bool g_bScreenUpdates = true; // whether window painting is active, used in a few places
87 // to disable updates for speed reasons
88 // both of the above should be made members of CMainFrame
89 int g_bIgnoreCommands; // Used to ignore commands when checking menus/toolbars
90 GSList *g_BSPFrontendCommands; // List of commands in the BSP menu
92 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
93 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
95 extern bool g_bCrossHairs;
98 extern PatchDialog g_PatchDialog;
100 GtkAccelGroup* global_accel;
102 void Select_Ungroup ();
104 // command mapping stuff
106 // m_strCommand is the command string
107 // m_nKey is the GDK_??? equivelant
108 // m_nModifiers are key states as follows
115 #define SPEED_MOVE 32
116 #define SPEED_TURN 22.5
118 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
119 // - if you add a command here and you don't want a menu item, use the "hidden" menu
120 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
121 SCommandInfo g_Commands[] =
123 {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
124 {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
125 {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
126 // {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
127 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
128 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
129 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
130 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
131 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
132 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
133 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
134 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
135 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
136 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
137 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
138 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
139 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
140 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
141 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
142 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
143 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
144 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
145 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
146 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
147 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
148 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
149 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
150 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
151 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
152 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
153 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
154 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
155 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
156 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
157 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
158 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
159 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
160 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
161 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
162 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
163 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
164 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
165 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
166 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
167 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
168 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
169 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
170 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
171 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
172 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
173 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
174 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
175 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
176 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
177 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
178 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
179 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
180 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
181 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
182 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
183 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
184 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
185 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
186 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
187 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
188 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
189 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
190 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
191 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
192 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
193 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
194 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
195 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
196 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
197 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
198 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
199 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
200 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
201 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
202 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
203 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
204 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
205 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
206 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
207 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
208 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
209 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
210 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
211 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
212 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
213 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
214 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
215 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
216 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
217 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
218 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
219 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
220 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
221 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
222 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
223 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
224 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
225 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
226 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
227 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
228 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
229 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
230 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
231 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
232 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
233 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
234 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
235 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
236 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
237 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
238 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
239 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
240 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
241 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
242 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
243 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
244 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
245 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
246 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
247 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
248 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
249 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
250 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
251 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
252 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
253 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
254 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
255 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
256 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
257 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
258 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
259 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
260 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
261 {"FilterCaulk", '6', RAD_ALT , ID_FILTER_CAULK, "menu_filter_caulk"},
262 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
263 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
264 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
265 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
266 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
267 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
268 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
269 {"FilterStructural", 'D', RAD_CONTROL|RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
270 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
271 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
272 {"FilterTriggers", 'T', RAD_CONTROL|RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
273 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
274 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
275 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
278 int g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
282 {"Space", GDK_space},
283 {"Backspace", GDK_BackSpace},
284 {"Escape", GDK_Escape},
286 {"Insert", GDK_Insert},
287 {"Delete", GDK_Delete},
288 {"PageUp", GDK_Prior},
289 {"PageDown", GDK_Next},
293 {"Right", GDK_Right},
307 {"Return", GDK_Return},
308 {"Comma", GDK_comma},
309 {"Period", GDK_period},
310 {"Plus", GDK_KP_Add},
311 {"Multiply", GDK_multiply},
312 {"Subtract", GDK_KP_Subtract},
313 {"NumPad0", GDK_KP_0},
314 {"NumPad1", GDK_KP_1},
315 {"NumPad2", GDK_KP_2},
316 {"NumPad3", GDK_KP_3},
317 {"NumPad4", GDK_KP_4},
318 {"NumPad5", GDK_KP_5},
319 {"NumPad6", GDK_KP_6},
320 {"NumPad7", GDK_KP_7},
321 {"NumPad8", GDK_KP_8},
322 {"NumPad9", GDK_KP_9},
329 int g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
331 // =============================================================================
334 void WINAPI Sys_UpdateWindows (int nBits)
336 g_nUpdateBits |= nBits;
339 // =============================================================================
342 // Gef: Separate handling for keyup events
343 void HandleKeyUp (GtkWidget *widget, gpointer data)
345 int id = GPOINTER_TO_INT (data);
347 Sys_Printf("HandleKeyUp: %d\n", id);
350 if(g_bIgnoreCommands)
355 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (FALSE); break;
356 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (FALSE); break;
357 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (FALSE); break;
358 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (FALSE); break;
359 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (FALSE); break;
360 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (FALSE); break;
364 gint HandleCommand (GtkWidget *widget, gpointer data)
366 int id = GPOINTER_TO_INT (data);
368 Sys_Printf("HandleCommand %d\n", id);
371 if ( g_bIgnoreCommands ) {
373 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
378 if (id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END) g_pParentWnd->OnTextureWad (id);
379 else if (id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END) g_pParentWnd->OnBspCommand (id);
380 else if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4) g_pParentWnd->OnMru (id);
381 else if (id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE)
383 if (GTK_CHECK_MENU_ITEM (widget)->active)
384 g_pParentWnd->OnViewNearest (id);
385 } else if (id >= ID_GRID_025 && id <= ID_GRID_256) g_pParentWnd->OnGrid (id);
386 else if (id >= ID_PLUGIN_START && id <= ID_PLUGIN_END)
389 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
390 g_pParentWnd->OnPlugIn (id, str);
391 } else if (id >= ID_ENTITY_START && id <= ID_ENTITY_END)
394 gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
395 g_pParentWnd->ActiveXY()->OnEntityCreate (str);
399 case ID_FILE_NEW: g_pParentWnd->OnFileNew (); break;
400 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
401 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen (); break;
402 case ID_FILE_SAVE: g_pParentWnd->OnFileSave (); break;
403 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas (); break;
404 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap (); break;
405 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion (); break;
406 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject (); break;
407 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject (); break;
408 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings (); break;
409 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile (); break;
410 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate (); break;
411 case ID_FILE_EXIT: g_pParentWnd->OnFileExit (); break;
412 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap (); break;
413 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo (); break;
414 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo (); break;
415 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush (); break;
416 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush (); break;
417 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera (); break;
418 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete (); break;
419 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo (); break;
420 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo (); break;
421 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts (); break;
422 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab (); break;
423 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab (); break;
424 case ID_PREFS: g_pParentWnd->OnPrefs (); break;
425 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera (); break;
426 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole (); break;
427 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity (); break;
428 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups (); break;
429 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview (); break;
430 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz (); break;
431 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz (); break;
432 case ID_TOGGLEZ: g_pParentWnd->OnTogglez (); break;
433 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter (); break;
434 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor (); break;
435 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor (); break;
436 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview (); break;
437 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview (); break;
438 case ID_VIEW_XY: g_pParentWnd->OnViewXy (); break;
439 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide (); break;
440 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront (); break;
441 case ID_VIEW_100: g_pParentWnd->OnView100 (); break;
442 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin (); break;
443 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout (); break;
444 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100 (); break;
445 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin (); break;
446 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout (); break;
447 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein (); break;
448 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout (); break;
449 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames (); break;
450 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks (); break;
451 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates (); break;
452 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline (); break;
453 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes (); break;
454 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone (); break;
455 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles (); break;
456 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected (); break;
457 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden (); break;
458 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
459 case ID_VIEW_ENTITIESAS_WIREFRAME:
460 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
461 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
462 case ID_VIEW_ENTITIESAS_SKINNED:
463 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
464 g_pParentWnd->OnEntitiesSetViewAs(id);
466 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping (); break;
467 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting (); break;
468 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges (); break;
469 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies (); break;
470 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone (); break;
471 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect (); break;
472 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx (); break;
473 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy (); break;
474 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz (); break;
475 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex (); break;
476 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey (); break;
477 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez (); break;
478 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation (); break;
479 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale (); break;
480 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow (); break;
481 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract (); break;
482 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge (); break;
483 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline (); break;
484 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle (); break;
485 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall (); break;
486 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching (); break;
487 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall (); break;
488 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside (); break;
489 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft (); break;
490 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright (); break;
491 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup (); break;
492 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown (); break;
493 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper (); break;
494 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected (); break;
495 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected (); break;
496 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip (); break;
497 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect (); break;
498 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity (); break;
499 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
500 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
501 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail (); break;
502 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural (); break;
503 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid (); break;
504 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse (); break;
505 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall (); break;
506 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector (); break;
507 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall (); break;
508 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock (); break;
509 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock (); break;
510 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad (); break;
511 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders (); break;
512 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow (); break;
513 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
514 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
515 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
516 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
517 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
518 g_pParentWnd->SetTextureScale (id);
520 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist (); break;
521 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly (); break;
522 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup (); break;
523 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown (); break;
524 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark (); break;
525 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal (); break;
526 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer (); break;
527 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack (); break;
528 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar (); break; /* ydnar */
529 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk (); break;
530 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk (); break;
531 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor (); break;
532 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor (); break;
533 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext (); break;
534 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock (); break;
535 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack (); break;
536 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush (); break;
537 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush (); break;
538 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D (); break;
539 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper (); break;
540 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname (); break;
541 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma (); break;
542 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush (); break;
543 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot (); break;
544 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot (); break;
545 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy (); break;
546 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor (); break;
547 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves (); break;
548 case ID_REGION_OFF: g_pParentWnd->OnRegionOff (); break;
549 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy (); break;
550 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush (); break;
551 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush (); break;
552 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection (); break;
553 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided (); break;
554 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided (); break;
555 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided (); break;
556 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided (); break;
557 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided (); break;
558 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided (); break;
559 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided (); break;
560 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided (); break;
561 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone (); break;
562 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere (); break;
563 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube (); break;
564 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube (); break;
565 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube (); break;
566 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare (); break;
567 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap (); break;
568 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel (); break;
569 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel (); break;
570 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap();break;
571 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone (); break;
572 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh (); break;
573 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn (); break;
574 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn (); break;
575 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow (); break;
576 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow (); break;
577 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn (); break;
578 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn (); break;
579 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow (); break;
580 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow (); break;
581 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative (); break;
582 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows (); break;
583 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols (); break;
584 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows (); break;
585 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose (); break;
586 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap (); break;
587 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap (); break;
588 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet (); break;
589 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear (); break;
590 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken (); break;
591 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh (); break;
592 case ID_HELP: g_pParentWnd->OnHelp (); break;
593 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
594 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
595 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist (); break;
596 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout (); break;
597 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel (); break;
598 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals (); break;
599 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk (); break;
600 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural (); break;
601 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips (); break;
602 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips (); break;
603 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails (); break;
604 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities (); break;
605 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips (); break;
606 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights (); break;
607 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids (); break;
608 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels (); break;
609 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches (); break;
610 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent (); break;
611 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers (); break;
612 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld (); break;
613 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths (); break;
614 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals (); break;
615 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid (); break;
617 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection (); break;
618 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange (); break;
619 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup (); break;
620 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera (); break;
621 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate (); break;
622 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate (); break;
623 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale (); break;
624 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx (); break;
625 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky (); break;
626 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz (); break;
627 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve (); break;
628 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox (); break;
629 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe (); break;
630 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend (); break;
631 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld (); break;
632 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown (); break;
633 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName (); break;
634 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup (); break;
635 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove (); break;
636 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities (); break;
638 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit (); break;
639 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture (); break;
640 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector (); break;
641 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX (); break;
642 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY (); break;
643 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn (); break;
644 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow (); break;
645 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn (); break;
646 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow (); break;
647 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab (); break;
648 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (TRUE); break;
649 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (TRUE); break;
650 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (TRUE); break;
651 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (TRUE); break;
652 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp (); break;
653 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown (); break;
654 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup (); break;
655 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown (); break;
656 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (TRUE); break;
657 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (TRUE); break;
658 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle (); break;
659 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole (); break;
660 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair (); break;
661 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit (); break;
662 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock (); break;
663 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter (); break;
664 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup (); break;
665 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown (); break;
666 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft (); break;
667 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright (); break;
668 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup (); break;
669 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown (); break;
670 case ID_GRID_PREV: g_pParentWnd->OnGridPrev (); break;
671 case ID_GRID_NEXT: g_pParentWnd->OnGridNext (); break;
672 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft (); break;
673 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight (); break;
674 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown (); break;
675 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup (); break;
676 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint (); break;
677 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint (); break;
678 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize (); break;
679 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid (); break;
680 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll (); break;
681 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert (); break;
687 static gint timer (gpointer data)
689 MainFrame *wnd = (MainFrame*)data;
694 static gint mainframe_delete (GtkWidget *widget, GdkEvent *event, gpointer data)
696 MainFrame *wnd = (MainFrame*)data;
700 if (ConfirmModified())
703 g_qeglobals_gui.d_edit = NULL;
708 static void mainframe_destroy (GtkWidget *widget, gpointer data)
710 MainFrame *wnd = (MainFrame*)data;
712 // avoid saving prefs when the app is minimized
713 if (g_pParentWnd->IsSleeping())
715 Sys_Printf("Shutdown while sleeping, not saving prefs\n");
716 g_qeglobals.disable_ini = true;
719 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
720 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
721 g_PrefsDlg.SavePrefs ();
726 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
727 // and modules / plugins decide to save some stuff
728 g_pParentWnd->GetPlugInMgr().Shutdown();
733 g_PrefsDlg.Destroy ();
734 g_dlgSurface.Destroy ();
735 g_dlgFind.Destroy ();
736 g_PatchDialog.Destroy ();
741 static gint mainframe_keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
743 unsigned int code = gdk_keyval_to_upper(event->keyval);
745 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=924
746 if(code == GDK_ISO_Left_Tab) {
751 Sys_Printf("key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK);
754 // BUG: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=865
755 // return only if Texture Viewport is in main window, otherwise if Tex viewport is in it's own window
756 // the Filter GtkEntry won't release focus
757 if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus(GTK_WINDOW(widget)) )
758 if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) )
762 Sys_Printf("mainframe_keypress processing into a command\n");
764 for (int i = 0; i < g_nCommandCount; i++)
766 if (g_Commands[i].m_nKey == code) // find a match?
769 unsigned int nState = 0;
772 if ((event->state & GDK_CONTROL_MASK) != 0)
773 nState |= RAD_CONTROL;
774 if ((event->state & GDK_SHIFT_MASK) != 0)
776 if ((g_Commands[i].m_nModifiers & 0x7) == nState)
778 HandleCommand (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
779 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
788 static gint mainframe_keyrelease (GtkWidget* widget, GdkEventKey* event, gpointer data)
790 unsigned int code = gdk_keyval_to_upper(event->keyval);
792 if (gtk_accelerator_valid (event->keyval, (GdkModifierType)0))
795 for (int i = 0; i < g_nCommandCount; i++)
797 if (g_Commands[i].m_nKey == code) // find a match?
799 if(!g_Commands[i].m_nModifiers)
801 // Gef: Only call the handler if it's a key that needs keyup events
802 switch (g_Commands[i].m_nCommand)
804 case ID_CAMERA_FORWARD:
807 case ID_CAMERA_RIGHT:
808 case ID_CAMERA_STRAFELEFT:
809 case ID_CAMERA_STRAFERIGHT:
811 HandleKeyUp (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
812 gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_release_event");
825 // =============================================================================
826 // Window creation functions
828 void AddMenuItem (GtkWidget* item, unsigned int id)
830 for (int i = 0; i < g_nCommandCount; i++)
831 if (g_Commands[i].m_nCommand == id)
833 g_object_set_data (G_OBJECT (g_pParentWnd->m_pWidget), g_Commands[i].m_strMenu, item);
838 void MainFrame::handle_help_command(int id)
840 OpenURL(mHelpURLs[id]->GetBuffer());
844 needed for hooking in Gtk+
846 void HandleHelpCommand (GtkWidget *widget, gpointer data)
848 int id = GPOINTER_TO_INT (data);
849 g_pParentWnd->handle_help_command(id);
852 void MainFrame::process_xlink (Str &FileName, char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel)
855 pDoc = xmlParseFile(FileName.GetBuffer());
858 Sys_Printf("Processing .xlink file '%s'\n", FileName.GetBuffer());
860 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic(menu, menu_name);
861 // start walking the nodes, find the 'links' one
862 xmlNodePtr pNode = pDoc->children;
863 while (pNode && strcmp((const char*)pNode->name, "links"))
867 pNode = pNode->children;
870 if (!strcmp((const char*)pNode->name, "item"))
874 if (strstr((char *)xmlGetProp(pNode, (xmlChar *)"url"), "http://"))
878 *url = (char *)xmlGetProp(pNode, (xmlChar *)"url");
885 *url += (char *)xmlGetProp(pNode, (xmlChar *)"url");
887 mHelpURLs.push_back(url);
888 create_menu_item_with_mnemonic (menu_in_menu, (char *)xmlGetProp(pNode, (xmlChar *)"name"), GTK_SIGNAL_FUNC(HandleHelpCommand), mHelpURLs.size()-1);
897 Sys_Printf("'%s' not found / parse failed\n", FileName.GetBuffer());
901 void MainFrame::create_game_help_menu (GtkWidget *menu, GtkAccelGroup *accel)
904 list<CGameDescription *>::iterator iGame;
906 // start in the global dir
907 FileName = g_strAppPath;
908 FileName += "global.xlink";
909 process_xlink(FileName, "General", g_strAppPath.GetBuffer(), menu, accel);
911 for (iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++)
913 FileName = (*iGame)->mGameToolsPath;
914 FileName += "game.xlink";
915 process_xlink(FileName, (*iGame)->mGameName, (*iGame)->mGameToolsPath.GetBuffer(), menu, accel);
919 void MainFrame::create_main_menu (GtkWidget *window, GtkWidget *vbox)
921 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
922 GtkAccelGroup *accel;
925 accel = gtk_accel_group_new ();
926 global_accel = accel;
927 gtk_window_add_accel_group (GTK_WINDOW (window), accel);
929 handle_box = gtk_handle_box_new ();
930 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
931 gtk_widget_show (handle_box);
933 menu_bar = gtk_menu_bar_new ();
934 gtk_container_add (GTK_CONTAINER (handle_box), menu_bar);
935 gtk_widget_show (menu_bar);
938 menu = create_sub_menu_with_mnemonic (menu_bar, "_File");
939 if (g_PrefsDlg.m_bDetachableMenus)
942 create_menu_item_with_mnemonic (menu, "_New Map",
943 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEW);
944 menu_separator (menu);
946 //++timo temporary experimental stuff for sleep mode..
947 item = create_menu_item_with_mnemonic (menu, "_Sleep",
948 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SLEEP);
949 g_object_set_data (G_OBJECT (window), "menu_file_sleep", item );
950 menu_separator (menu);
953 item = create_menu_item_with_mnemonic (menu, "_Open...",
954 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_OPEN);
955 g_object_set_data (G_OBJECT (window), "menu_file_open", item);
956 create_menu_item_with_mnemonic (menu, "_Import...", // Hydra: give it it's proper name
957 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_IMPORTMAP);
958 item = create_menu_item_with_mnemonic (menu, "_Save",
959 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVE);
960 g_object_set_data (G_OBJECT (window), "menu_file_save", item);
961 create_menu_item_with_mnemonic (menu, "Save _as...",
962 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEAS);
963 create_menu_item_with_mnemonic (menu, "Save s_elected...",
964 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXPORTMAP);
965 menu_separator (menu);
966 item = create_menu_item_with_mnemonic (menu, "Save re_gion...",
967 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEREGION);
968 g_object_set_data (G_OBJECT (window), "menu_file_saveregion", item);
969 menu_separator (menu);
970 create_menu_item_with_mnemonic (menu, "New p_roject...",
971 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEWPROJECT);
972 create_menu_item_with_mnemonic (menu, "Load _project...",
973 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_LOADPROJECT);
974 create_menu_item_with_mnemonic (menu, "Pro_ject settings...",
975 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_PROJECTSETTINGS);
976 menu_separator (menu);
977 create_menu_item_with_mnemonic (menu, "_Pointfile...",
978 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_POINTFILE);
979 menu_separator (menu);
980 item = create_menu_item_with_mnemonic (menu, "Recent Files",
981 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT1);
982 g_object_set_data (G_OBJECT (item), "accel", accel);
983 gtk_widget_set_sensitive (item, FALSE);
984 MRU_AddWidget (item, 0);
985 item = create_menu_item_with_mnemonic (menu, "2",
986 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT2);
987 gtk_widget_hide (item);
988 MRU_AddWidget (item, 1);
989 item = create_menu_item_with_mnemonic (menu, "3",
990 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT3);
991 gtk_widget_hide (item);
992 MRU_AddWidget (item, 2);
993 item = create_menu_item_with_mnemonic (menu, "4",
994 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT4);
995 gtk_widget_hide (item);
996 MRU_AddWidget (item, 3);
997 menu_separator (menu);
998 create_menu_item_with_mnemonic (menu, "Check for GtkRadiant update (web)",
999 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_CHECKUPDATE);
1001 create_menu_item_with_mnemonic (menu, "E_xit",
1002 GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXIT);
1005 menu = create_sub_menu_with_mnemonic (menu_bar, "_Edit");
1006 if (g_PrefsDlg.m_bDetachableMenus)
1007 menu_tearoff (menu);
1008 item = create_menu_item_with_mnemonic (menu, "_Undo",
1009 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_UNDO);
1010 g_object_set_data (G_OBJECT (window), "menu_edit_undo", item);
1011 item = create_menu_item_with_mnemonic (menu, "_Redo",
1012 GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_REDO);
1013 g_object_set_data (G_OBJECT (window), "menu_edit_redo", item);
1014 menu_separator (menu);
1015 item = create_menu_item_with_mnemonic (menu, "_Copy", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_COPYBRUSH);
1016 item = create_menu_item_with_mnemonic (menu, "_Paste", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSH);
1017 item = create_menu_item_with_mnemonic (menu, "P_aste To Camera", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSHTOCAMERA);
1018 item = create_menu_item_with_mnemonic (menu, "_Delete", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1019 g_object_set_data (G_OBJECT (window), "menu_selection_delete", item);
1020 menu_separator (menu);
1021 create_menu_item_with_mnemonic (menu, "Map Info...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_MAPINFO);
1022 create_menu_item_with_mnemonic (menu, "Entity Info...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_ENTITYINFO);
1023 menu_separator (menu);
1024 create_menu_item_with_mnemonic (menu, "Brush Scripts...", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_SCRIPTS);
1025 menu_separator (menu);
1026 create_menu_item_with_mnemonic (menu, "Load Pre_fab...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_LOADPREFAB);
1027 create_menu_item_with_mnemonic (menu, "Save Selection as Prefab...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_SAVEPREFAB);
1028 menu_separator (menu);
1029 create_menu_item_with_mnemonic (menu, "Preferences...", GTK_SIGNAL_FUNC (HandleCommand), ID_PREFS);
1032 menu = create_sub_menu_with_mnemonic (menu_bar, "_View");
1033 if (g_PrefsDlg.m_bDetachableMenus)
1034 menu_tearoff (menu);
1036 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Toggle");
1037 create_menu_item_with_mnemonic (menu_in_menu, "Camera View", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECAMERA);
1038 create_menu_item_with_mnemonic (menu_in_menu, "Console View", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECONSOLE);
1039 item = create_menu_item_with_mnemonic (menu_in_menu, "Entity View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITY);
1040 g_object_set_data (G_OBJECT (window), "menu_view_entity", item);
1041 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1042 create_menu_item_with_mnemonic (menu_in_menu, "XY (Top)", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW);
1043 create_menu_item_with_mnemonic (menu_in_menu, "YZ (Side)", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_YZ);
1044 create_menu_item_with_mnemonic (menu_in_menu, "XZ (Front)", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_XZ);
1045 create_menu_item_with_mnemonic (menu_in_menu, "Z View", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEZ);
1046 menu_separator (menu);
1047 item = create_menu_item_with_mnemonic (menu, "_Center", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTER);
1048 item = create_menu_item_with_mnemonic (menu, "_Center 2d", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTERVIEW);
1049 item = create_menu_item_with_mnemonic (menu, "_Up Floor", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_UPFLOOR);
1050 item = create_menu_item_with_mnemonic (menu, "_Down Floor", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_DOWNFLOOR);
1051 menu_separator (menu);
1052 item = create_menu_item_with_mnemonic (menu, "_Next (XY, YZ, XY)", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEXTVIEW);
1053 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Layout");
1054 create_menu_item_with_mnemonic (menu_in_menu, "XY (Top)", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_XY);
1055 create_menu_item_with_mnemonic (menu_in_menu, "YZ", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SIDE);
1056 create_menu_item_with_mnemonic (menu_in_menu, "XZ", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_FRONT);
1057 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Zoom");
1058 create_menu_item_with_mnemonic (menu_in_menu, "_XY 100%", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_100);
1059 item = create_menu_item_with_mnemonic (menu_in_menu, "XY Zoom _In", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMIN);
1060 item = create_menu_item_with_mnemonic (menu_in_menu, "XY Zoom _Out", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMOUT);
1061 menu_separator (menu_in_menu);
1062 create_menu_item_with_mnemonic (menu_in_menu, "_Z 100%", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_Z100);
1063 item = create_menu_item_with_mnemonic (menu_in_menu, "Z Zoo_m In", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMIN);
1064 g_object_set_data (G_OBJECT (window), "menu_view_zzoomin", item);
1065 item = create_menu_item_with_mnemonic (menu_in_menu, "Z Zoom O_ut", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMOUT);
1066 g_object_set_data (G_OBJECT (window), "menu_view_zzoomout", item);
1067 menu_separator (menu_in_menu);
1068 item = create_menu_item_with_mnemonic (menu_in_menu, "Cubic Clip Zoom In", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEIN);
1069 item = create_menu_item_with_mnemonic (menu_in_menu, "Cubic Clip Zoom Out", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEOUT);
1070 menu_separator (menu);
1072 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Show");
1073 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show _Angles", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWANGLES, FALSE);
1074 g_object_set_data (G_OBJECT (window), "menu_view_showangles", item);
1075 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show _Names", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWNAMES, TRUE);
1076 g_object_set_data (G_OBJECT (window), "menu_view_shownames", item);
1077 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Blocks", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWBLOCKS, FALSE);
1078 g_object_set_data (G_OBJECT (window), "menu_view_showblocks", item);
1079 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show C_oordinates", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWCOORDINATES, TRUE);
1080 g_object_set_data (G_OBJECT (window), "menu_view_showcoordinates", item);
1081 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Window Outline", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWOUTLINE, TRUE);
1082 g_object_set_data (G_OBJECT (window), "menu_view_showoutline", item);
1083 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show ZBuffered Outline", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_NOOUTLINE, TRUE);
1084 g_object_set_data (G_OBJECT (window), "menu_selection_nooutline", item);
1085 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Axes", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWAXES, TRUE);
1086 g_object_set_data (G_OBJECT (window), "menu_view_showaxes", item);
1087 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Workzone", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWWORKZONE, FALSE);
1088 g_object_set_data (G_OBJECT (window), "menu_view_showworkzone", item);
1090 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Filter");
1091 create_check_menu_item_with_mnemonic (menu_in_menu, "World", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_WORLD, FALSE);
1092 create_check_menu_item_with_mnemonic (menu_in_menu, "Entities", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_ENTITIES, FALSE);
1093 create_check_menu_item_with_mnemonic (menu_in_menu, "Areaportals", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_AREAPORTALS, FALSE);
1094 create_check_menu_item_with_mnemonic (menu_in_menu, "Translucent", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRANSLUCENT, FALSE);
1095 create_check_menu_item_with_mnemonic (menu_in_menu, "Liquids", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIQUIDS, FALSE);
1096 create_check_menu_item_with_mnemonic (menu_in_menu, "Caulk", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CAULK, FALSE);
1097 create_check_menu_item_with_mnemonic (menu_in_menu, "Clips", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLIPS, FALSE);
1098 create_check_menu_item_with_mnemonic (menu_in_menu, "Paths", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATHS, FALSE);
1099 create_check_menu_item_with_mnemonic (menu_in_menu, "Clusterportals", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLUSTERPORTALS, FALSE);
1100 create_check_menu_item_with_mnemonic (menu_in_menu, "Lights", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTS, FALSE);
1101 create_check_menu_item_with_mnemonic (menu_in_menu, "Structural", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_STRUCTURAL, FALSE);
1102 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Lightgrid", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTGRID, FALSE);
1103 g_object_set_data (G_OBJECT (window), "menu_filter_lightgrid", item);
1104 create_check_menu_item_with_mnemonic (menu_in_menu, "Patches", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATCHES, FALSE);
1105 create_check_menu_item_with_mnemonic (menu_in_menu, "Details", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_DETAILS, FALSE);
1106 create_check_menu_item_with_mnemonic (menu_in_menu, "Hints", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_HINTSSKIPS, FALSE);
1107 create_check_menu_item_with_mnemonic (menu_in_menu, "Models", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_MODELS, FALSE);
1108 create_check_menu_item_with_mnemonic (menu_in_menu, "Triggers", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRIGGERS, FALSE);
1109 create_check_menu_item_with_mnemonic (menu_in_menu, "Botclips", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_BOTCLIPS, FALSE);
1111 menu_separator (menu);
1112 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Hide/Show");
1113 create_menu_item_with_mnemonic (menu_in_menu, "Hide Selected",
1114 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_HIDESELECTED);
1115 create_menu_item_with_mnemonic (menu_in_menu, "Show Hidden",
1116 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_SHOWHIDDEN);
1117 menu_separator (menu);
1118 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Entities as");
1119 g_object_set_data (G_OBJECT (window), "view_entitiesas_menu", menu_in_menu);
1120 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, "Bounding box",
1121 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE);
1122 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_boundingbox", item);
1123 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Wireframe",
1124 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE);
1125 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_wireframe", item);
1126 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Selected Wireframe",
1127 GTK_SIGNAL_FUNC (HandleCommand),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE);
1128 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedwireframe", item);
1129 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Selected Skinned",
1130 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE);
1131 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedskinned", item);
1132 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Skinned",
1133 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNED,FALSE);
1134 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinned", item);
1135 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Skinned and Boxed",
1136 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE);
1137 g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinnedandboxed", item);
1138 menu_separator (menu);
1139 item = create_check_menu_item_with_mnemonic (menu, "Cubic Clipping",
1140 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBICCLIPPING, TRUE);
1141 g_object_set_data (G_OBJECT (window), "menu_view_cubicclipping", item);
1142 menu_separator (menu);
1143 item = create_check_menu_item_with_mnemonic (menu, "OpenGL Lighting",
1144 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_OPENGLLIGHTING, FALSE);
1145 g_object_set_data (G_OBJECT (window), "menu_view_opengllighting", item);
1148 menu = create_sub_menu_with_mnemonic (menu_bar, "_Selection");
1149 if (g_PrefsDlg.m_bDetachableMenus)
1150 menu_tearoff (menu);
1152 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Drag");
1153 create_menu_item_with_mnemonic (menu_in_menu, "Drag _Edges",
1154 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGEDGES);
1155 create_menu_item_with_mnemonic (menu_in_menu, "Drag _Vertices",
1156 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGVERTECIES);
1157 menu_separator (menu);
1158 create_menu_item_with_mnemonic (menu, "_Clone",
1159 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CLONE);
1160 item = create_menu_item_with_mnemonic (menu, "Deselect",
1161 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DESELECT);
1162 item = create_menu_item_with_mnemonic (menu, "Invert",
1163 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_INVERT);
1165 create_menu_item_with_mnemonic (menu, "_Delete",
1166 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1168 menu_separator (menu);
1169 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Flip");
1170 create_menu_item_with_mnemonic (menu_in_menu, "Flip _X",
1171 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPX);
1172 create_menu_item_with_mnemonic (menu_in_menu, "Flip _Y",
1173 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPY);
1174 create_menu_item_with_mnemonic (menu_in_menu, "Flip _Z",
1175 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPZ);
1176 menu_separator (menu);
1177 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Rotate");
1178 create_menu_item_with_mnemonic (menu_in_menu, "Rotate X",
1179 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEX);
1180 create_menu_item_with_mnemonic (menu_in_menu, "Rotate Y",
1181 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEY);
1182 create_menu_item_with_mnemonic (menu_in_menu, "Rotate Z",
1183 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEZ);
1184 create_menu_item_with_mnemonic (menu_in_menu, "Arbitrary rotation...",
1185 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_ARBITRARYROTATION);
1186 menu_separator (menu);
1187 create_menu_item_with_mnemonic (menu, "Scale...", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SCALE);
1188 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "CSG");
1189 create_menu_item_with_mnemonic (menu_in_menu, "Make _Hollow",
1190 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKEHOLLOW);
1191 create_menu_item_with_mnemonic (menu_in_menu, "CSG _Subtract",
1192 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGSUBTRACT);
1193 create_menu_item_with_mnemonic (menu_in_menu, "CSG _Merge",
1194 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGMERGE);
1195 menu_separator (menu);
1196 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Select");
1197 create_menu_item_with_mnemonic (menu_in_menu, "Select Complete _Tall",
1198 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTCOMPLETETALL);
1199 create_menu_item_with_mnemonic (menu_in_menu, "Select T_ouching",
1200 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTTOUCHING);
1201 create_menu_item_with_mnemonic (menu_in_menu, "Select _Partial Tall",
1202 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTPARTIALTALL);
1203 create_menu_item_with_mnemonic (menu_in_menu, "Select _Inside",
1204 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTINSIDE);
1206 create_menu_item_with_mnemonic (menu_in_menu, "Nudge Left",
1207 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1208 create_menu_item_with_mnemonic (menu_in_menu, "Nudge Right",
1209 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1210 create_menu_item_with_mnemonic (menu_in_menu, "Nudge Up",
1211 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1212 create_menu_item_with_mnemonic (menu_in_menu, "Nudge Down",
1213 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1215 menu_separator (menu);
1216 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Clipper");
1217 create_menu_item_with_mnemonic (menu_in_menu, "Toggle Clipper",
1218 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CLIPPER);
1219 menu_separator (menu_in_menu);
1220 create_menu_item_with_mnemonic (menu_in_menu, "Clip selection",
1221 GTK_SIGNAL_FUNC (HandleCommand), ID_CLIP_SELECTED);
1222 create_menu_item_with_mnemonic (menu_in_menu, "Split selection",
1223 GTK_SIGNAL_FUNC (HandleCommand), ID_SPLIT_SELECTED);
1224 create_menu_item_with_mnemonic (menu_in_menu, "Flip Clip orientation",
1225 GTK_SIGNAL_FUNC (HandleCommand), ID_FLIP_CLIP);
1226 menu_separator (menu);
1227 create_menu_item_with_mnemonic (menu, "Connect entities",
1228 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CONNECT);
1229 create_menu_item_with_mnemonic (menu, "Ungroup entity",
1230 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_UNGROUPENTITY);
1231 create_menu_item_with_mnemonic (menu, "Make detail",
1232 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_DETAIL);
1233 create_menu_item_with_mnemonic (menu, "Make structural",
1234 GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_STRUCTURAL);
1237 menu = create_sub_menu_with_mnemonic (menu_bar, "_Bsp");
1239 menu_separator (menu);
1240 g_object_set_data (G_OBJECT (window), "menu_bsp", menu);
1243 menu = create_sub_menu_with_mnemonic (menu_bar, "_Grid");
1244 if (g_PrefsDlg.m_bDetachableMenus)
1245 menu_tearoff (menu);
1247 item = create_radio_menu_item_with_mnemonic (menu, NULL, "Grid0.25",
1248 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_025, FALSE);
1249 g_object_set_data (G_OBJECT (window), "menu_grid_025", item);
1250 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid0.5",
1251 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_05, FALSE);
1252 g_object_set_data (G_OBJECT (window), "menu_grid_05", item);
1253 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid1",
1254 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_1, FALSE);
1255 g_object_set_data (G_OBJECT (window), "menu_grid_1", item);
1256 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid2",
1257 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_2, FALSE);
1258 g_object_set_data (G_OBJECT (window), "menu_grid_2", item);
1259 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid4",
1260 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_4, FALSE);
1261 g_object_set_data (G_OBJECT (window), "menu_grid_4", item);
1262 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid8",
1263 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_8, TRUE);
1264 g_object_set_data (G_OBJECT (window), "menu_grid_8", item);
1265 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid16",
1266 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_16, FALSE);
1267 g_object_set_data (G_OBJECT (window), "menu_grid_16", item);
1268 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid32",
1269 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_32, FALSE);
1270 g_object_set_data (G_OBJECT (window), "menu_grid_32", item);
1271 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid64",
1272 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_64, FALSE);
1273 g_object_set_data (G_OBJECT (window), "menu_grid_64", item);
1274 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid128",
1275 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_128, FALSE);
1276 g_object_set_data (G_OBJECT (window), "menu_grid_128", item);
1277 item = create_radio_menu_item_with_mnemonic (menu, item, "Grid256",
1278 GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_256, FALSE);
1279 g_object_set_data (G_OBJECT (window), "menu_grid_256", item);
1280 menu_separator (menu);
1281 item = create_check_menu_item_with_mnemonic (menu, "Snap to grid",
1282 GTK_SIGNAL_FUNC (HandleCommand), ID_SNAPTOGRID, TRUE);
1283 g_object_set_data (G_OBJECT (window), "menu_snaptogrid", item);
1286 menu = create_sub_menu_with_mnemonic (menu_bar, "_Textures");
1287 if (g_PrefsDlg.m_bDetachableMenus)
1288 menu_tearoff (menu);
1290 item = create_check_menu_item_with_mnemonic (menu, "Show In _Use",
1291 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWINUSE, FALSE);
1292 g_object_set_data (G_OBJECT (window), "menu_textures_showinuse", item);
1293 item = create_check_menu_item_with_mnemonic (menu, "Show _All",
1294 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWALL, FALSE);
1295 g_object_set_data (G_OBJECT (window), "menu_textures_showall", item);
1296 menu_separator (menu);
1297 item = create_check_menu_item_with_mnemonic (menu, "Show shaders",
1298 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERS_SHOW, FALSE);
1299 g_object_set_data (G_OBJECT (window), "menu_textures_shaders_show", item);
1300 item = create_menu_item_with_mnemonic (menu, "Flush & Reload Shaders",
1301 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_RELOADSHADERS);
1302 g_object_set_data (G_OBJECT (window), "menu_textures_reloadshaders", item);
1303 item = create_menu_item_with_mnemonic (menu, "Load directory...",
1304 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOAD);
1305 g_object_set_data (G_OBJECT (window), "menu_textures_load", item);
1306 item = create_menu_item_with_mnemonic (menu, "Directory list...",
1307 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOADLIST);
1308 menu_separator (menu);
1310 item = create_menu_item_with_mnemonic (menu, "_Surface Inspector",
1311 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_INSPECTOR);
1312 menu_separator (menu);
1313 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Render Quality");
1314 g_object_set_data (G_OBJECT (window), "render_quality_menu", menu_in_menu);
1315 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, "_Wireframe",
1316 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_WIREFRAME, FALSE);
1317 g_object_set_data (G_OBJECT (window), "menu_textures_wireframe", item);
1318 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Flat shade",
1319 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_FLATSHADE, FALSE);
1320 g_object_set_data (G_OBJECT (window), "menu_textures_flatshade", item);
1321 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Nearest",
1322 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEAREST, FALSE);
1323 g_object_set_data (G_OBJECT (window), "menu_view_nearest", item);
1324 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Nearest _Mipmap",
1325 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEARESTMIPMAP, FALSE);
1326 g_object_set_data (G_OBJECT (window), "menu_view_nearestmipmap", item);
1327 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Linear",
1328 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_LINEAR, FALSE);
1329 g_object_set_data (G_OBJECT (window), "menu_view_linear", item);
1330 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Bilinear",
1331 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEAR, FALSE);
1332 g_object_set_data (G_OBJECT (window), "menu_view_bilinear", item);
1333 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "B_ilinear Mipmap",
1334 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEARMIPMAP, FALSE);
1335 g_object_set_data (G_OBJECT (window), "menu_view_bilinearmipmap", item);
1336 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "T_rilinear",
1337 GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TRILINEAR, FALSE);
1338 g_object_set_data (G_OBJECT (window), "menu_view_trilinear", item);
1339 create_menu_item_with_mnemonic (menu, "Find / Replace...",
1340 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURE_REPLACEALL);
1342 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Texture Lock");
1343 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Moves",
1344 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_LOCK, TRUE);
1345 g_object_set_data (G_OBJECT (window), "menu_toggle_lock", item);
1346 item = create_check_menu_item_with_mnemonic (menu_in_menu, "Rotations",
1347 GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_ROTATELOCK, TRUE);
1348 g_object_set_data (G_OBJECT (window), "menu_toggle_rotatelock", item);
1349 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Texture Window Scale");
1350 item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, "200%",
1351 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE);
1352 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_200", item);
1353 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "100%",
1354 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE);
1355 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_100", item);
1356 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "50%",
1357 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE);
1358 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_50", item);
1359 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "25%",
1360 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE);
1361 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_25", item);
1362 item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "10%",
1363 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE);
1364 g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_10", item);
1365 item = menu_separator (menu);
1366 item = create_check_menu_item_with_mnemonic (menu, "shaderlist.txt only",
1367 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERLISTONLY, FALSE);
1368 g_object_set_data (G_OBJECT (window), "menu_textures_shaderlistonly", item);
1369 item = menu_separator (menu);
1370 g_object_set_data (G_OBJECT (window), "menu_textures_separator", item);
1371 g_object_set_data (G_OBJECT (window), "menu_textures", menu);
1374 menu = create_sub_menu_with_mnemonic (menu_bar, "_Misc");
1375 if (g_PrefsDlg.m_bDetachableMenus)
1376 menu_tearoff (menu);
1378 create_menu_item_with_mnemonic (menu, "_Benchmark", GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_BENCHMARK);
1379 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Colors");
1380 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, "Themes");
1381 create_menu_item_with_mnemonic (menu_3, "QE4 Original", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETORIGINAL);
1382 create_menu_item_with_mnemonic (menu_3, "Q3Radiant Original", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETQER);
1383 create_menu_item_with_mnemonic (menu_3, "Black and Green", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETBLACK);
1384 create_menu_item_with_mnemonic (menu_3, "Maya/Max/Lightwave Emulation", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETYDNAR);
1386 menu_separator (menu_in_menu);
1387 create_menu_item_with_mnemonic (menu_in_menu, "_Texture Background...",
1388 GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREBK);
1389 create_menu_item_with_mnemonic (menu_in_menu, "Grid Background...",
1390 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_XYBK);
1391 create_menu_item_with_mnemonic (menu_in_menu, "Grid Major...",
1392 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR);
1393 create_menu_item_with_mnemonic (menu_in_menu, "Grid Minor...",
1394 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR);
1395 create_menu_item_with_mnemonic (menu_in_menu, "Grid Major Small...",
1396 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR_ALT);
1397 create_menu_item_with_mnemonic (menu_in_menu, "Grid Minor Small...",
1398 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR_ALT);
1399 create_menu_item_with_mnemonic (menu_in_menu, "Grid Text...",
1400 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDTEXT);
1401 create_menu_item_with_mnemonic (menu_in_menu, "Grid Block...",
1402 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDBLOCK);
1403 create_menu_item_with_mnemonic (menu_in_menu, "Default Brush...",
1404 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_BRUSH);
1405 create_menu_item_with_mnemonic (menu_in_menu, "Camera Background...",
1406 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CAMERABACK);
1407 create_menu_item_with_mnemonic (menu_in_menu, "Selected Brush...",
1408 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH);
1409 create_menu_item_with_mnemonic (menu_in_menu, "Selected Brush (Camera)...",
1410 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH3D);
1411 create_menu_item_with_mnemonic (menu_in_menu, "Clipper...",
1412 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CLIPPER);
1413 create_menu_item_with_mnemonic (menu_in_menu, "Active View name...",
1414 GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_VIEWNAME);
1416 create_menu_item_with_mnemonic (menu, "_Gamma...",
1417 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_GAMMA);
1418 create_menu_item_with_mnemonic (menu, "Find brush...",
1419 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_FINDBRUSH);
1420 item = create_menu_item_with_mnemonic (menu, "Next leak spot",
1421 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_NEXTLEAKSPOT);
1422 item = create_menu_item_with_mnemonic (menu, "Previous leak spot",
1423 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PREVIOUSLEAKSPOT);
1424 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
1425 // create_menu_item_with_mnemonic (menu, "_Print XY View", GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PRINTXY);
1426 item = create_menu_item_with_mnemonic (menu, "_Select Entity Color...",
1427 GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_SELECTENTITYCOLOR);
1428 g_object_set_data (G_OBJECT (window), "menu_misc_selectentitycolor", item);
1431 menu = create_sub_menu_with_mnemonic (menu_bar, "_Region");
1432 if (g_PrefsDlg.m_bDetachableMenus)
1433 menu_tearoff (menu);
1435 create_menu_item_with_mnemonic (menu, "_Off",
1436 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_OFF);
1437 create_menu_item_with_mnemonic (menu, "_Set XY",
1438 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETXY);
1439 create_menu_item_with_mnemonic (menu, "Set _Tall Brush",
1440 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETTALLBRUSH);
1441 create_menu_item_with_mnemonic (menu, "Set _Brush",
1442 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETBRUSH);
1443 create_menu_item_with_mnemonic (menu, "Set Se_lected Brushes",
1444 GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETSELECTION);
1447 menu = create_sub_menu_with_mnemonic (menu_bar, "_Brush");
1448 if (g_PrefsDlg.m_bDetachableMenus)
1449 menu_tearoff (menu);
1451 item = create_menu_item_with_mnemonic (menu, "3 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_3SIDED);
1452 item = create_menu_item_with_mnemonic (menu, "4 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_4SIDED);
1453 item = create_menu_item_with_mnemonic (menu, "5 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_5SIDED);
1454 item = create_menu_item_with_mnemonic (menu, "6 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_6SIDED);
1455 item = create_menu_item_with_mnemonic (menu, "7 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_7SIDED);
1456 item = create_menu_item_with_mnemonic (menu, "8 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_8SIDED);
1457 item = create_menu_item_with_mnemonic (menu, "9 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_9SIDED);
1458 menu_separator (menu);
1459 create_menu_item_with_mnemonic (menu, "Arbitrary sided...",
1460 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ARBITRARYSIDED);
1461 menu_separator (menu);
1462 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Primitives");
1463 create_menu_item_with_mnemonic (menu_in_menu, "Cone...",
1464 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_MAKECONE);
1465 create_menu_item_with_mnemonic (menu_in_menu, "Sphere...",
1466 GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_PRIMITIVES_SPHERE);
1469 if (!g_pGameDescription->mNoPatch)
1471 menu = create_sub_menu_with_mnemonic (menu_bar, "_Curve");
1472 if (g_PrefsDlg.m_bDetachableMenus)
1473 menu_tearoff (menu);
1475 create_menu_item_with_mnemonic (menu, "Cylinder", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHTUBE);
1476 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "More Cylinders");
1477 create_menu_item_with_mnemonic (menu_in_menu, "Dense Cylinder",
1478 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHDENSETUBE);
1479 create_menu_item_with_mnemonic (menu_in_menu, "Very Dense Cylinder",
1480 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHVERYDENSETUBE);
1481 create_menu_item_with_mnemonic (menu_in_menu, "Square Cylinder",
1482 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHSQUARE);
1483 menu_separator (menu);
1484 create_menu_item_with_mnemonic (menu, "End cap", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHENDCAP);
1485 create_menu_item_with_mnemonic (menu, "Bevel", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHBEVEL);
1486 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "More End caps, Bevels");
1487 create_menu_item_with_mnemonic (menu_in_menu, "Square Endcap",
1488 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL);
1489 create_menu_item_with_mnemonic (menu_in_menu, "Square Bevel",
1490 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP);
1491 menu_separator (menu);
1492 create_menu_item_with_mnemonic (menu, "Cone", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHCONE);
1493 item = create_menu_item_with_mnemonic (menu, "Sphere",
1494 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PRIMITIVES_SPHERE);
1495 gtk_widget_set_sensitive (item, FALSE);
1496 menu_separator (menu);
1497 item = create_menu_item_with_mnemonic (menu, "Simple Patch Mesh...",
1498 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_SIMPLEPATCHMESH);
1499 g_object_set_data (G_OBJECT (window), "menu_simplepatchmesh", item);
1500 menu_separator (menu);
1501 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Insert");
1502 create_menu_item_with_mnemonic (menu_in_menu, "Insert (2) Columns",
1503 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTCOLUMN);
1504 create_menu_item_with_mnemonic (menu_in_menu, "Add (2) Columns",
1505 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDCOLUMN);
1506 menu_separator (menu_in_menu);
1507 create_menu_item_with_mnemonic (menu_in_menu, "Insert (2) Rows",
1508 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTROW);
1509 create_menu_item_with_mnemonic (menu_in_menu, "Add (2) Rows",
1510 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDROW);
1511 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Delete");
1512 create_menu_item_with_mnemonic (menu_in_menu, "First (2) Columns",
1513 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTCOLUMN);
1514 create_menu_item_with_mnemonic (menu_in_menu, "Last (2) Columns",
1515 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTCOLUMN);
1516 menu_separator (menu_in_menu);
1517 create_menu_item_with_mnemonic (menu_in_menu, "First (2) Rows",
1518 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTROW);
1519 create_menu_item_with_mnemonic (menu_in_menu, "Last (2) Rows",
1520 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTROW);
1521 menu_separator (menu);
1522 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Matrix");
1523 create_menu_item_with_mnemonic (menu_in_menu, "Invert",
1524 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVE);
1525 menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, "Re-disperse");
1526 create_menu_item_with_mnemonic (menu_3, "Rows", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_ROWS);
1527 create_menu_item_with_mnemonic (menu_3, "Cols (Intermediate)", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS);
1528 create_menu_item_with_mnemonic (menu_3, "Rows (Intermediate)", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS);
1529 create_menu_item_with_mnemonic (menu_in_menu, "Transpose",
1530 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MATRIX_TRANSPOSE);
1531 menu_separator (menu);
1532 create_menu_item_with_mnemonic (menu, "Cap Selection",
1533 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CAP);
1534 create_menu_item_with_mnemonic (menu, "Cycle Cap Texture",
1535 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CYCLECAP);
1536 menu_separator (menu);
1537 menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Overlay");
1538 create_menu_item_with_mnemonic (menu_in_menu, "Set",
1539 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_SET);
1540 create_menu_item_with_mnemonic (menu_in_menu, "Clear",
1541 GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_CLEAR);
1542 menu_separator (menu);
1543 create_menu_item_with_mnemonic (menu, "Thicken...", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_THICKEN);
1546 menu = create_sub_menu_with_mnemonic (menu_bar, "_Plugins");
1547 if (g_PrefsDlg.m_bDetachableMenus)
1548 menu_tearoff (menu);
1551 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1553 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1554 item = menu_separator (menu);
1555 g_object_set_data (G_OBJECT (window), "menu_plugin_separator", item);
1556 g_object_set_data (G_OBJECT (window), "menu_plugin", menu);
1559 menu = create_sub_menu_with_mnemonic (menu_bar, "_Help");
1560 if (g_PrefsDlg.m_bDetachableMenus)
1561 menu_tearoff (menu);
1563 item = create_menu_item_with_mnemonic (menu, "Manual",
1564 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP);
1565 gtk_widget_add_accelerator (item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1567 // this creates all the per-game drop downs for the game pack helps
1568 // it will take care of hooking the Sys_OpenURL calls etc.
1569 create_game_help_menu(menu, accel);
1571 // TTimo: this is in global.xlink now
1572 //create_menu_item_with_mnemonic (menu, "Links",
1573 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1574 create_menu_item_with_mnemonic (menu, "Bug report",
1575 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_BUGREPORT);
1576 create_menu_item_with_mnemonic (menu, "Shortcuts list",
1577 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_COMMANDLIST);
1578 create_menu_item_with_mnemonic (menu, "_About",
1579 GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_ABOUT);
1582 // leo: Hidden menu to make the accelerators work,
1583 // this is a hack that needs to be changed later if someone has a better idea.
1585 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1586 menu = create_sub_menu_with_mnemonic (menu_bar, "Hidden");
1587 if (g_PrefsDlg.m_bDetachableMenus)
1588 menu_tearoff (menu);
1590 gtk_widget_hide (gtk_menu_get_attach_widget (GTK_MENU (menu)));
1592 create_menu_item_with_mnemonic (menu, "BendMode", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_BEND);
1593 create_menu_item_with_mnemonic (menu, "FitTexture", GTK_SIGNAL_FUNC (HandleCommand), IDC_BTN_FACEFIT);
1594 create_menu_item_with_mnemonic (menu, "ViewTextures", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TEXTURE);
1595 create_menu_item_with_mnemonic (menu, "PatchInspector", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_INSPECTOR);
1596 create_menu_item_with_mnemonic (menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREY);
1597 create_menu_item_with_mnemonic (menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREX);
1598 create_menu_item_with_mnemonic (menu, "IncPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTCOLUMN);
1599 create_menu_item_with_mnemonic (menu, "IncPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTROW);
1600 create_menu_item_with_mnemonic (menu, "DecPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETECOLUMN);
1601 create_menu_item_with_mnemonic (menu, "DecPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETEROW);
1602 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1603 create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1604 create_menu_item_with_mnemonic (menu, "SelectNudgeDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1605 create_menu_item_with_mnemonic (menu, "CameraForward", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_FORWARD);
1606 create_menu_item_with_mnemonic (menu, "CameraBack", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_BACK);
1607 create_menu_item_with_mnemonic (menu, "CameraLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_LEFT);
1608 create_menu_item_with_mnemonic (menu, "CameraRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_RIGHT);
1609 create_menu_item_with_mnemonic (menu, "CameraUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_UP);
1610 create_menu_item_with_mnemonic (menu, "CameraDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_DOWN);
1611 create_menu_item_with_mnemonic (menu, "CameraAngleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEUP);
1612 create_menu_item_with_mnemonic (menu, "CameraAngleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEDOWN);
1613 create_menu_item_with_mnemonic (menu, "CameraStrafeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFERIGHT);
1614 create_menu_item_with_mnemonic (menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFELEFT);
1615 create_menu_item_with_mnemonic (menu, "ToggleGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_TOGGLE);
1616 create_menu_item_with_mnemonic (menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CROSSHAIR);
1617 create_menu_item_with_mnemonic (menu, "ToggleRealtime", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CAMERAUPDATE);
1618 create_menu_item_with_mnemonic (menu, "MouseRotate", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_MOUSEROTATE);
1619 create_menu_item_with_mnemonic (menu, "TexRotateClock", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECLOCK);
1620 create_menu_item_with_mnemonic (menu, "TexRotateCounter", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECOUNTER);
1621 create_menu_item_with_mnemonic (menu, "TexScaleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEUP);
1622 create_menu_item_with_mnemonic (menu, "TexScaleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEDOWN);
1623 create_menu_item_with_mnemonic (menu, "TexShiftLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTLEFT);
1624 create_menu_item_with_mnemonic (menu, "TexShiftRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTRIGHT);
1625 create_menu_item_with_mnemonic (menu, "TexShiftUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTUP);
1626 create_menu_item_with_mnemonic (menu, "TexShiftDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTDOWN);
1627 create_menu_item_with_mnemonic (menu, "GridDown", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_PREV);
1628 create_menu_item_with_mnemonic (menu, "GridUp", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_NEXT);
1629 create_menu_item_with_mnemonic (menu, "TexScaleLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALELEFT);
1630 create_menu_item_with_mnemonic (menu, "TexScaleRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALERIGHT);
1631 create_menu_item_with_mnemonic (menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEDOWN);
1632 create_menu_item_with_mnemonic (menu, "MoveSelectionUP", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEUP);
1633 create_menu_item_with_mnemonic (menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_PRINT);
1634 create_menu_item_with_mnemonic (menu, "ToggleSizePaint", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TOGGLESIZEPAINT);
1635 create_menu_item_with_mnemonic (menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1636 create_menu_item_with_mnemonic (menu, "SelectNudgeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1637 create_menu_item_with_mnemonic (menu, "SelectNudgeUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1638 create_menu_item_with_mnemonic (menu, "NaturalizePatch", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_NATURALIZE);
1639 create_menu_item_with_mnemonic (menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SNAPTOGRID);
1640 create_menu_item_with_mnemonic (menu, "SelectAllOfType", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_ALL);
1641 create_menu_item_with_mnemonic (menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_OUTLINESTYLE);
1642 create_menu_item_with_mnemonic (menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEUP);
1643 create_menu_item_with_mnemonic (menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEDOWN);
1645 g_bIgnoreCommands--;
1648 void MainFrame::create_main_toolbar (GtkWidget *window, GtkWidget *vbox)
1650 GtkWidget *handle_box, *toolbar, *w;
1652 handle_box = gtk_handle_box_new ();
1653 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1654 gtk_widget_show (handle_box);
1655 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1657 toolbar = gtk_toolbar_new ();
1658 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1659 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1660 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1661 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1663 gtk_widget_show (toolbar);
1665 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "Open", "Open an existing map", "",
1666 new_pixmap (window, "file_open.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1667 GINT_TO_POINTER (ID_FILE_OPEN));
1668 g_object_set_data (G_OBJECT (window), "tb_file_open", w);
1669 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "Save", "Save the active map", "",
1670 new_pixmap (window, "file_save.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1671 GINT_TO_POINTER (ID_FILE_SAVE));
1672 g_object_set_data (G_OBJECT (window), "tb_file_save", w);
1673 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1674 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "x-axis Flip", "",
1675 new_pixmap (window, "brush_flipx.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1676 GINT_TO_POINTER (ID_BRUSH_FLIPX));
1677 g_object_set_data (G_OBJECT (window), "tb_brush_flipx", w);
1678 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "x-axis Rotate", "",
1679 new_pixmap (window, "brush_rotatex.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1680 GINT_TO_POINTER (ID_BRUSH_ROTATEX));
1681 g_object_set_data (G_OBJECT (window), "tb_brush_rotatex", w);
1682 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "y-axis Flip", "",
1683 new_pixmap (window, "brush_flipy.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1684 GINT_TO_POINTER (ID_BRUSH_FLIPY));
1685 g_object_set_data (G_OBJECT (window), "tb_brush_flipy", w);
1686 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "y-axis Rotate", "",
1687 new_pixmap (window, "brush_rotatey.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1688 GINT_TO_POINTER (ID_BRUSH_ROTATEY));
1689 g_object_set_data (G_OBJECT (window), "tb_brush_rotatey", w);
1690 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "z-axis Flip", "",
1691 new_pixmap (window, "brush_flipz.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1692 GINT_TO_POINTER (ID_BRUSH_FLIPZ));
1693 g_object_set_data (G_OBJECT (window), "tb_brush_flipz", w);
1694 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "z-axis Rotate", "",
1695 new_pixmap (window, "brush_rotatez.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1696 GINT_TO_POINTER (ID_BRUSH_ROTATEZ));
1697 g_object_set_data (G_OBJECT (window), "tb_brush_rotatez", w);
1698 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1700 if (g_PrefsDlg.m_bWideToolbar)
1702 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Complete Tall", "",
1703 new_pixmap (window, "selection_selectcompletetall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1704 GINT_TO_POINTER (ID_SELECTION_SELECTCOMPLETETALL));
1705 g_object_set_data (G_OBJECT (window), "tb_selection_selectcompletetall", w);
1706 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Select Touching", "",
1707 new_pixmap (window, "selection_selecttouching.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1708 GINT_TO_POINTER (ID_SELECTION_SELECTTOUCHING));
1709 g_object_set_data (G_OBJECT (window), "tb_selection_selecttouching", w);
1710 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Select Partial Tall", "",
1711 new_pixmap (window, "selection_selectpartialtall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1712 GINT_TO_POINTER (ID_SELECTION_SELECTPARTIALTALL));
1713 g_object_set_data (G_OBJECT (window), "tb_selection_selectpartialtall", w);
1714 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Select Inside", "",
1715 new_pixmap (window, "selection_selectinside.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1716 GINT_TO_POINTER (ID_SELECTION_SELECTINSIDE));
1717 g_object_set_data (G_OBJECT (window), "tb_selection_selectinside", w);
1720 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Selection", "",
1721 new_pixmap (window, "popup_selection.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1722 GINT_TO_POINTER (ID_POPUP_SELECTION));
1723 g_object_set_data (G_OBJECT (window), "tb_popup_selection", w);
1725 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1727 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "CSG Subtract", "",
1728 new_pixmap (window, "selection_csgsubtract.bmp"),
1729 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGSUBTRACT));
1730 g_object_set_data (G_OBJECT (window), "tb_selection_csgsubtract", w);
1732 if (g_PrefsDlg.m_bWideToolbar)
1734 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "CSG Merge", "",
1735 new_pixmap (window, "selection_csgmerge.bmp"),
1736 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGMERGE));
1737 g_object_set_data (G_OBJECT (window), "tb_selection_csgmerge", w);
1740 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Hollow", "",
1741 new_pixmap (window, "selection_makehollow.bmp"),
1742 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_MAKEHOLLOW));
1743 g_object_set_data (G_OBJECT (window), "tb_selection_makehollow", w);
1745 if (g_PrefsDlg.m_bWideToolbar)
1747 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1748 "", "Clipper", "", new_pixmap (window, "view_clipper.bmp"),
1749 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1750 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1753 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1755 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Change views", "",
1756 new_pixmap (window, "view_change.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1757 GINT_TO_POINTER (ID_VIEW_CHANGE));
1758 g_object_set_data (G_OBJECT (window), "tb_view_change", w);
1760 if (!g_PrefsDlg.m_bWideToolbar)
1762 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1765 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Texture view mode", "",
1766 new_pixmap (window, "textures_popup.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1767 GINT_TO_POINTER (ID_TEXTURES_POPUP));
1768 g_object_set_data (G_OBJECT (window), "tb_textures_popup", w);
1770 if (g_PrefsDlg.m_bWideToolbar)
1772 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1773 "", "Cubic clip the camera view", "",
1774 new_pixmap (window, "view_cubicclipping.bmp"),
1775 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1776 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1779 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1781 if (!g_PrefsDlg.m_bWideToolbar)
1783 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1784 "", "Camera preview", "", new_pixmap (window, "view_cameratoggle.bmp"),
1785 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CAMERATOGGLE));
1786 g_object_set_data (G_OBJECT (window), "tb_view_cameratoggle", w);
1787 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Update Camera", "",
1788 new_pixmap (window, "view_cameraupdate.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1789 GINT_TO_POINTER (ID_VIEW_CAMERAUPDATE));
1790 g_object_set_data (G_OBJECT (window), "tb_view_cameraupdate", w);
1791 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1792 "", "Cubic clip the camera view", "",
1793 new_pixmap (window, "view_cubicclipping.bmp"),
1794 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1795 g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1796 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1797 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1798 "", "Entity inspector", "", new_pixmap (window, "view_entity.bmp"),
1799 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_ENTITY));
1800 g_object_set_data (G_OBJECT (window), "tb_view_entity", w);
1801 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1802 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1803 "", "Clipper", "", new_pixmap (window, "view_clipper.bmp"),
1804 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1805 g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1806 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1809 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1810 "", "Free Rotation", "", new_pixmap (window, "select_mouserotate.bmp"),
1811 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSEROTATE));
1812 g_object_set_data (G_OBJECT (window), "tb_select_mouserotate", w);
1813 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1814 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1815 "", "Free Scaling", "", new_pixmap (window, "select_mousescale.bmp"),
1816 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSESCALE));
1817 g_object_set_data (G_OBJECT (window), "tb_select_mousescale", w);
1818 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1819 "", "Scale X", "", new_pixmap (window, "scalelockx.bmp"),
1820 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKX));
1821 g_object_set_data (G_OBJECT (window), "tb_scalelockx", w);
1822 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1823 "", "Scale Y", "", new_pixmap (window, "scalelocky.bmp"),
1824 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKY));
1825 g_object_set_data (G_OBJECT (window), "tb_scalelocky", w);
1826 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1827 "", "Scale Z", "", new_pixmap (window, "scalelockz.bmp"),
1828 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKZ));
1829 g_object_set_data (G_OBJECT (window), "tb_scalelockz", w);
1831 if (g_PrefsDlg.m_bWideToolbar)
1833 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1834 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1835 "", "Don't select model brushes", "",
1836 new_pixmap (window, "dontselectmodel.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1837 GINT_TO_POINTER (ID_DONTSELECTMODEL));
1838 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1839 g_object_set_data (G_OBJECT (window), "tb_dontselectmodel", w);
1841 if (!g_pGameDescription->mNoPatch)
1843 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1844 "", "Don't select curved brushes", "",
1845 new_pixmap (window, "dontselectcurve.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1846 GINT_TO_POINTER (ID_DONTSELECTCURVE));
1847 g_object_set_data (G_OBJECT (window), "tb_dontselectcurve", w);
1851 // bug #292, patch toolbar option
1852 if (g_PrefsDlg.m_bPatchToolbar)
1854 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855 "", "Show patch bounding box", "",
1856 new_pixmap (window, "patch_showboundingbox.bmp"),
1857 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_SHOWBOUNDINGBOX));
1858 g_object_set_data (G_OBJECT (window), "tb_patch_showboundingbox", w);
1859 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860 "", "Show patches as wireframes", "",
1861 new_pixmap (window, "patch_wireframe.bmp"),
1862 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_WIREFRAME));
1863 g_object_set_data (G_OBJECT (window), "tb_patch_wireframe", w);
1864 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1865 "", "Patch Bend mode", "",
1866 new_pixmap (window, "patch_bend.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1867 GINT_TO_POINTER (ID_PATCH_BEND));
1868 g_object_set_data (G_OBJECT (window), "tb_patch_bend", w);
1869 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Put caps on the current patch", "",
1870 new_pixmap (window, "curve_cap.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1871 GINT_TO_POINTER (ID_CURVE_CAP));
1872 g_object_set_data (G_OBJECT (window), "tb_curve_cap", w);
1873 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874 "", "Welds equal patch points during moves", "",
1875 new_pixmap (window, "patch_weld.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1876 GINT_TO_POINTER (ID_PATCH_WELD));
1877 g_object_set_data (G_OBJECT (window), "tb_patch_weld", w);
1878 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1879 "", "Selects drill down rows and columns", "",
1880 new_pixmap (window, "patch_drilldown.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1881 GINT_TO_POINTER (ID_PATCH_DRILLDOWN));
1882 g_object_set_data (G_OBJECT (window), "tb_patch_drilldown", w);
1885 if (g_PrefsDlg.m_bWideToolbar)
1887 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1888 w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Show Entities as", "",
1889 new_pixmap (window, "show_entities.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1890 GINT_TO_POINTER (ID_SHOW_ENTITIES));
1891 g_object_set_data (G_OBJECT (window), "tb_show_entities", w);
1897 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1898 gtk_widget_hide (w);
1899 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1900 gtk_widget_hide (w);
1901 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1902 gtk_widget_hide (w);
1903 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1904 gtk_widget_hide (w);
1908 m_bCamPreview = true;
1909 g_nScaleHow = (SCALE_X | SCALE_Y | SCALE_Z);
1912 void MainFrame::create_plugin_toolbar (GtkWidget *window, GtkWidget *vbox)
1914 GtkWidget *handle_box, *toolbar;
1916 handle_box = gtk_handle_box_new ();
1917 gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1918 if (g_PrefsDlg.m_bPluginToolbar)
1919 gtk_widget_show (handle_box);
1920 g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1922 toolbar = gtk_toolbar_new();
1923 gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1924 gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1925 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1926 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1927 g_object_set_data (G_OBJECT (window), "toolbar_plugin", toolbar);
1928 gtk_widget_show (toolbar);
1931 void MainFrame::create_main_statusbar (GtkWidget *window, GtkWidget *vbox)
1933 GtkWidget *hbox, *hbox1;
1937 hbox = gtk_hbox_new (FALSE, 0);
1938 gtk_widget_show (hbox);
1939 gtk_widget_set_usize (hbox, -1, 24);
1940 gtk_container_border_width (GTK_CONTAINER (hbox), 1);
1941 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
1943 frame = gtk_frame_new ((char*)NULL);
1944 gtk_widget_show (frame);
1945 gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
1946 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1948 hbox1 = gtk_hbox_new (FALSE, 0);
1949 gtk_container_add (GTK_CONTAINER (frame), hbox1);
1950 gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
1951 gtk_widget_show (hbox1);
1953 label = gtk_label_new (" Label ");
1954 gtk_widget_show (label);
1955 gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, TRUE, 0);
1956 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1957 gtk_misc_set_padding (GTK_MISC (label), 3, 0);
1958 m_pStatusLabel[0] = label;
1960 for (int i = 1; i < 6; i++)
1962 frame = gtk_frame_new ((char*)NULL);
1963 gtk_widget_show (frame);
1964 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1965 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1967 label = gtk_label_new (" Label ");
1968 gtk_widget_show (label);
1969 gtk_container_add (GTK_CONTAINER (frame), label);
1970 m_pStatusLabel[i] = label;
1975 static gint mainframe_idle (gpointer user_data)
1977 g_pParentWnd->RoutineProcessing ();
1981 static void Sys_Iconify (GtkWidget *w);
1982 static void Sys_Restore (GtkWidget *w);
1984 inline void CHECK_RESTORE(GtkWidget* w)
1986 if (g_object_get_data (G_OBJECT (w), "was_mapped") != NULL)
1987 gtk_widget_show (w);
1991 // this is called when the window is restored from the iconified state
1992 static void mainframe_map (GtkWidget *widget)
1994 if (g_pParentWnd->IsSleeping ())
1995 g_pParentWnd->OnSleep ();
1997 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
1999 // restore previously visible windows
2000 CHECK_RESTORE (g_pParentWnd->GetCamWnd ()->m_pParent);
2001 if (g_PrefsDlg.m_bFloatingZ)
2002 CHECK_RESTORE (g_pParentWnd->GetZWnd ()->m_pParent);
2003 CHECK_RESTORE (g_pParentWnd->GetXYWnd ()->m_pParent);
2004 CHECK_RESTORE (g_pParentWnd->GetXZWnd ()->m_pParent);
2005 CHECK_RESTORE (g_pParentWnd->GetYZWnd ()->m_pParent);
2006 CHECK_RESTORE (g_pGroupDlg->m_pWidget);
2010 inline void CHECK_MINIMIZE(GtkWidget* w)
2012 g_object_set_data (G_OBJECT (w), "was_mapped", (void*)(GTK_WIDGET_VISIBLE (w) != 0));
2013 gtk_widget_hide (w);
2016 static void mainframe_unmap (GtkWidget *widget)
2019 if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2021 // minimize all other windows when the main window is minimized
2022 CHECK_MINIMIZE (g_pParentWnd->GetCamWnd ()->m_pParent);
2023 if (g_PrefsDlg.m_bFloatingZ)
2024 CHECK_MINIMIZE (g_pParentWnd->GetZWnd ()->m_pParent);
2025 CHECK_MINIMIZE (g_pParentWnd->GetXYWnd ()->m_pParent);
2026 CHECK_MINIMIZE (g_pParentWnd->GetXZWnd ()->m_pParent);
2027 CHECK_MINIMIZE (g_pParentWnd->GetYZWnd ()->m_pParent);
2028 CHECK_MINIMIZE (g_pGroupDlg->m_pWidget);
2032 static GtkWidget* create_floating (MainFrame* mainframe)
2034 GtkWidget *wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2035 //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2036 gtk_window_set_transient_for (GTK_WINDOW (wnd), GTK_WINDOW (mainframe->m_pWidget));
2037 gtk_widget_set_events (wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2038 gtk_signal_connect (GTK_OBJECT (wnd), "delete_event", GTK_SIGNAL_FUNC (widget_delete_hide), NULL);
2039 gtk_signal_connect (GTK_OBJECT (wnd), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2040 gtk_signal_connect (GTK_OBJECT (wnd), "key_press_event",
2041 GTK_SIGNAL_FUNC (mainframe_keypress), mainframe);
2042 gtk_signal_connect (GTK_OBJECT (wnd), "key_release_event",
2043 GTK_SIGNAL_FUNC (mainframe_keyrelease), mainframe);
2044 gtk_signal_connect (GTK_OBJECT (wnd), "map_event",
2045 GTK_SIGNAL_FUNC (mainframe_map), mainframe);
2047 gtk_window_set_default_size (GTK_WINDOW (wnd), 100, 100);
2049 #ifdef DBG_WINDOWPOS
2050 Sys_Printf("create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd);
2056 void console_populate_popup(GtkTextView* textview, GtkMenu* menu, gpointer user_data)
2058 menu_separator(GTK_WIDGET(menu));
2060 GtkWidget* item = gtk_menu_item_new_with_label ("Clear");
2061 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (Sys_ClearPrintf), NULL);
2062 gtk_widget_show (item);
2063 gtk_menu_append (GTK_MENU (menu), item);
2066 void console_construct(GtkWidget* textview)
2068 g_signal_connect(G_OBJECT(textview), "populate-popup", G_CALLBACK(console_populate_popup), NULL);
2071 extern MemStream g_Clipboard;
2073 void Clipboard_CopyMap()
2075 g_Clipboard.SetLength(0);
2076 Map_Export (&g_Clipboard, "xmap", false, true);
2079 void Clipboard_PasteMap()
2081 if (g_Clipboard.GetLength() > 0)
2083 g_Clipboard.Seek(0, SEEK_SET);
2084 Map_Import(&g_Clipboard, "xmap", true);
2089 Platform-independent GTK clipboard support.
2090 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2092 #if defined (__linux__) || defined (__APPLE__)
2096 RADIANT_CLIPPINGS = 23,
2099 static const GtkTargetEntry clipboard_targets[] = {
2100 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2103 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner)
2107 GdkAtom type = GDK_NONE;
2109 len = g_Clipboard.GetLength();
2116 buffer = g_Clipboard.GetBuffer ();
2119 if(info == clipboard_targets[0].info)
2121 type = gdk_atom_intern(clipboard_targets[0].target, FALSE);
2124 gtk_selection_data_set (selection_data, type, 8, buffer, len);
2127 static void clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner)
2131 static void clipboard_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data)
2133 g_Clipboard.SetLength (0);
2135 if (data->length < 0)
2136 Sys_FPrintf(SYS_ERR, "Error retrieving selection\n");
2137 else if(strcmp(gdk_atom_name(data->type), clipboard_targets[0].target) == 0)
2138 g_Clipboard.Write (data->data, data->length);
2140 Clipboard_PasteMap();
2143 void clipboard_copy()
2145 Clipboard_CopyMap();
2147 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2149 gtk_clipboard_set_with_data (clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL);
2152 void clipboard_paste()
2154 GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2156 gtk_clipboard_request_contents (clipboard, gdk_atom_intern(clipboard_targets[0].target, FALSE), clipboard_received, NULL);
2160 #elif defined(WIN32)
2162 void clipboard_copy()
2164 Clipboard_CopyMap();
2166 bool bClipped = false;
2167 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2170 if (::OpenClipboard(NULL))
2173 long lSize = g_Clipboard.GetLength();
2174 HANDLE h = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof(long));
2177 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2178 memcpy(cp, &lSize, sizeof(long));
2180 g_Clipboard.Seek(0, SEEK_SET);
2181 g_Clipboard.Read(cp, lSize);
2183 ::SetClipboardData(nClipboard, h);
2192 Sys_Printf("Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n");
2196 void clipboard_paste()
2198 bool bPasted = false;
2199 UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2200 if (nClipboard > 0 && ::OpenClipboard(NULL))
2202 if(IsClipboardFormatAvailable(nClipboard))
2204 HANDLE h = ::GetClipboardData(nClipboard);
2207 g_Clipboard.SetLength(0);
2208 unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2210 memcpy(&lSize, cp, sizeof(long));
2212 g_Clipboard.Write(cp, lSize);
2219 Clipboard_PasteMap();
2224 void MainFrame::Copy()
2229 void MainFrame::Paste()
2232 UpdateSurfaceDialog();
2236 #ifdef DBG_WINDOWPOS
2237 GtkWidget *watchit = NULL;
2239 void CheckWatchit(char *msg)
2241 static int width = 0;
2242 if ((watchit!=NULL) && (watchit->allocation.width != width))
2244 Sys_Printf("CheckWatchit %s: %d\n", msg, watchit->allocation.width);
2245 width = watchit->allocation.width;
2251 BOOL CALLBACK m_pCountMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2253 int *n = (int *) dwData;
2260 struct monitorInfo_s {
2261 GdkRectangle *win_monitors;
2265 BOOL CALLBACK m_pEnumMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2267 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2268 GdkRectangle *monitor;
2271 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2273 memset(&lpmi, 0, sizeof(MONITORINFOEX));
2274 lpmi.cbSize = sizeof(MONITORINFOEX);
2276 GetMonitorInfo( hMonitor, &lpmi );
2278 if( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2281 SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
2282 monitor->x = rect.left;
2283 monitor->y = rect.top;
2284 monitor->width = rect.right - rect.left;
2285 monitor->height = rect.bottom - rect.top;
2287 if (monitorInfo->i_win_mon != 0)
2289 GdkRectangle temp = *monitor;
2290 *monitor = monitorInfo->win_monitors[0];
2291 monitorInfo->win_monitors[0] = temp;
2294 monitor->x = lpmi.rcMonitor.left;
2295 monitor->y = lpmi.rcMonitor.top;
2296 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2297 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2300 monitorInfo->i_win_mon++;
2305 void PositionWindowOnPrimaryScreen(window_position_t& position)
2307 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2309 if( position.x <= primaryMonitorRect.x + 6 )
2310 position.x = primaryMonitorRect.x + 6;
2311 else if( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 )
2312 position.x = primaryMonitorRect.x + 6;
2314 if( position.y <= primaryMonitorRect.y + 6 )
2315 position.y = primaryMonitorRect.y + 6;
2316 else if( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 )
2317 position.y = primaryMonitorRect.y + 6;
2319 if( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 )
2320 position.w = primaryMonitorRect.width - 18;
2321 if( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 )
2322 position.h = primaryMonitorRect.height - 18;
2326 GtkWidget* create_framed_widget(GtkWidget* widget)
2328 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2329 gtk_widget_show (frame);
2330 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2331 gtk_container_add (GTK_CONTAINER (frame), widget);
2332 gtk_widget_show(widget);
2336 gboolean entry_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2338 gtk_window_remove_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2342 gboolean entry_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2344 gtk_window_add_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2348 GtkWidget* create_framed_texwnd(TexWnd* texwnd)
2350 GtkWidget* frame = gtk_frame_new ((char*)NULL);
2351 gtk_widget_show (frame);
2352 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2354 GtkWidget* hbox = gtk_hbox_new (FALSE, 0);
2355 gtk_widget_show (hbox);
2356 gtk_container_add (GTK_CONTAINER (frame), hbox);
2358 GtkWidget* w = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,1,1,1)));
2359 gtk_widget_show (w);
2360 gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, TRUE, 0);
2361 g_qeglobals_gui.d_texture_scroll = w;
2363 GtkWidget* texbox = gtk_vbox_new (FALSE, 0);
2364 gtk_widget_show (texbox);
2365 gtk_box_pack_start (GTK_BOX (hbox), texbox, TRUE, TRUE, 0);
2367 w = gtk_entry_new ();
2368 gtk_box_pack_start (GTK_BOX (texbox), w, FALSE, FALSE, 0);
2369 texwnd->m_pFilter = w;
2370 g_signal_connect(G_OBJECT(w), "focus_in_event", G_CALLBACK(entry_focus_in), NULL);
2371 g_signal_connect(G_OBJECT(w), "focus_out_event", G_CALLBACK(entry_focus_out), NULL);
2373 w = texwnd->GetWidget ();
2374 gtk_box_pack_start (GTK_BOX (texbox), w, TRUE, TRUE, 0);
2375 gtk_widget_show (w);
2380 static ZWnd *create_floating_zwnd(MainFrame *mainframe)
2382 ZWnd *pZWnd = new ZWnd ();
2383 GtkWidget* wnd = create_floating (mainframe);
2385 gtk_window_set_title (GTK_WINDOW (wnd), "Z");
2387 pZWnd->m_pParent = wnd;
2390 GtkWidget* frame = create_framed_widget(pZWnd->GetWidget());
2391 gtk_container_add (GTK_CONTAINER (wnd), frame);
2394 gtk_widget_realize (wnd);
2396 // turn OFF minimize and maximize boxes.
2397 // Must be *after* realize, or wnd->window is NULL
2398 // should do the right thing on *nix, need to verify.
2399 gdk_window_set_decorations ( wnd->window,
2400 GdkWMDecoration(GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2401 //TODO 50 by observation, will vary depending on decoration sizes
2403 GdkGeometry geometry;
2404 geometry.min_width = 50;
2405 //we only care about width, but have to set this too, or get nasty bugs
2406 geometry.min_height = 10;
2407 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE);
2411 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2412 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2415 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posZWnd);
2417 if (g_PrefsDlg.m_bZVis)
2418 gtk_widget_show (wnd);
2423 static const int gutter = 12;
2425 void MainFrame::Create ()
2427 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2429 gtk_widget_set_events (window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2430 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2431 GTK_SIGNAL_FUNC (mainframe_delete), this);
2432 gtk_signal_connect (GTK_OBJECT (window), "destroy",
2433 GTK_SIGNAL_FUNC (mainframe_destroy), this);
2434 gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2435 GTK_SIGNAL_FUNC (mainframe_keypress), this);
2436 gtk_signal_connect (GTK_OBJECT (window), "key_release_event",
2437 GTK_SIGNAL_FUNC (mainframe_keyrelease), this);
2438 gtk_signal_connect (GTK_OBJECT (window), "map_event",
2439 GTK_SIGNAL_FUNC (mainframe_map), this);
2440 gtk_signal_connect (GTK_OBJECT (window), "unmap_event",
2441 GTK_SIGNAL_FUNC (mainframe_unmap), this);
2443 g_qeglobals_gui.d_main_window = window;
2446 // calculate gdk offset
2447 int n_win_monitors = 0;
2449 monitorInfo_s monitorInfo;
2451 // detect multiple monitors
2452 EnumDisplayMonitors (NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>(&n_win_monitors));
2454 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2455 monitorInfo.i_win_mon = 0;
2456 EnumDisplayMonitors (NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>(&monitorInfo));
2458 gdk_offset_x = G_MININT;
2459 gdk_offset_y = G_MININT;
2462 for( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2463 gdk_offset_x = MAX (gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x);
2464 gdk_offset_y = MAX (gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y);
2467 Sys_Printf( "GDK's coordinate system is offset by %d over the x-axis and %d over the y-axis from Windows' coordinate system.\n", gdk_offset_x, gdk_offset_y );
2469 if( g_PrefsDlg.m_bStartOnPrimMon )
2472 GdkDisplay *display;
2474 gint n_gdk_monitors = 0;
2478 // detect multiple monitors
2479 display = gdk_display_get_default ();
2480 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name (display), gdk_display_get_n_screens (display) );
2482 screen = gdk_display_get_screen( display, 1 );
2483 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2485 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2487 for( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2488 memset( &rect, 0, sizeof(rect) );
2489 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2490 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2493 memcpy( &primaryMonitorRect, &rect, sizeof(primaryMonitorRect) );
2497 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2500 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2501 primaryMonitorRect.width = gdk_screen_width ();
2502 primaryMonitorRect.height = gdk_screen_height ();
2507 load_window_pos(window, g_PrefsDlg.mWindowInfo.position);
2509 GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
2510 gtk_container_add (GTK_CONTAINER (window), vbox);
2511 gtk_widget_show (vbox);
2513 create_main_menu (window, vbox);
2515 create_main_toolbar (window, vbox);
2516 create_plugin_toolbar (window,vbox);
2518 m_nCurrentStyle = g_PrefsDlg.m_nView;
2520 g_pGroupDlg->Create ();
2525 gtk_widget_show (window);
2527 // not needed on win32, it's in the .rc
2532 load_pixmap ("icon.bmp", window, &pixmap, &mask);
2533 gdk_window_set_icon (window->window, NULL, pixmap, mask);
2537 if (CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft)
2540 GtkWidget* vsplit = gtk_vpaned_new ();
2541 m_pSplits[0] = vsplit;
2542 gtk_box_pack_start (GTK_BOX (vbox), vsplit, TRUE, TRUE, 0);
2543 gtk_widget_show (vsplit);
2546 GtkWidget* hsplit = gtk_hpaned_new ();
2547 m_pSplits[2] = hsplit;
2548 gtk_paned_add1 (GTK_PANED (vsplit), hsplit);
2549 gtk_widget_show (hsplit);
2552 GtkWidget* hsplit2 = gtk_hpaned_new ();
2553 m_pSplits[3] = hsplit2;
2554 gtk_paned_add2 (GTK_PANED (hsplit), hsplit2);
2555 gtk_widget_show (hsplit2);
2558 GtkWidget* vsplit2 = gtk_vpaned_new ();
2559 m_pSplits[1] = vsplit2;
2560 if (CurrentStyle() == eRegular)
2561 gtk_paned_add2 (GTK_PANED (hsplit2), vsplit2);
2563 gtk_paned_add1 (GTK_PANED (hsplit), vsplit2);
2564 gtk_widget_show (vsplit2);
2567 m_pCamWnd = new CamWnd ();
2569 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2570 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2574 m_pXYWnd = new XYWnd ();
2575 m_pXYWnd->SetViewType(XY);
2577 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget ());
2578 gtk_paned_add1 (GTK_PANED (hsplit2), frame);
2582 m_pZWnd = new ZWnd ();
2584 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget ());
2585 if (CurrentStyle() == eRegular)
2586 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2588 gtk_paned_add2 (GTK_PANED (hsplit2), frame);
2592 m_pTexWnd = new TexWnd ();
2594 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2595 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2600 GtkWidget* scr = gtk_scrolled_window_new (NULL, NULL);
2601 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2602 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
2603 gtk_widget_show (scr);
2604 gtk_paned_pack2 (GTK_PANED (vsplit), scr, FALSE, TRUE);
2607 GtkWidget* text = gtk_text_view_new ();
2608 gtk_widget_set_size_request(text, 0, -1); // allow shrinking
2609 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
2610 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), FALSE);
2611 gtk_container_add (GTK_CONTAINER (scr), text);
2612 gtk_widget_show (text);
2613 g_qeglobals_gui.d_edit = text;
2621 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nXYHeight+28);
2623 if (CurrentStyle() == eRegular)
2625 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nZWidth);
2626 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2630 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nCamWidth);
2631 while (gtk_events_pending ()) gtk_main_iteration ();
2632 gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2635 while (gtk_events_pending ()) gtk_main_iteration ();
2637 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), g_PrefsDlg.mWindowInfo.nCamHeight);
2639 else if (CurrentStyle() == eFloating)
2642 GtkWidget* wnd = create_floating (this);
2643 gtk_window_set_title (GTK_WINDOW (wnd), "Camera");
2646 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2647 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2650 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posCamWnd);
2652 gtk_widget_show (wnd);
2654 m_pCamWnd = new CamWnd ();
2657 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget ());
2658 gtk_container_add (GTK_CONTAINER (wnd), frame);
2661 m_pCamWnd->m_pParent = wnd;
2664 if (g_PrefsDlg.m_bFloatingZ)
2666 m_pZWnd = create_floating_zwnd(this);
2669 GtkWidget* wnd = create_floating (this);
2670 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2673 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2674 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2677 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2679 m_pXYWnd = new XYWnd ();
2680 m_pXYWnd->SetViewType(XY);
2683 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2684 gtk_container_add (GTK_CONTAINER (wnd), frame);
2687 m_pXYWnd->m_pParent = wnd;
2689 gtk_widget_show (wnd);
2694 GtkWidget* wnd = create_floating (this);
2695 gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2698 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2699 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2702 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2704 m_pZWnd = new ZWnd ();
2705 m_pZWnd->m_pParent = wnd;
2707 m_pXYWnd = new XYWnd ();
2708 m_pXYWnd->SetViewType(XY);
2709 m_pXYWnd->m_pParent = wnd;
2713 GtkWidget* hsplit = gtk_hpaned_new ();
2714 m_pSplits[0] = hsplit;
2715 gtk_container_add (GTK_CONTAINER (wnd), hsplit);
2716 gtk_widget_show (hsplit);
2719 GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget());
2720 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2723 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2724 gtk_paned_add2 (GTK_PANED (hsplit), frame);
2728 gtk_widget_show (wnd);
2730 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nZFloatWidth);
2734 GtkWidget* wnd = create_floating (this);
2735 gtk_window_set_title (GTK_WINDOW (wnd), "XZ View");
2738 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2739 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2742 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXZWnd);
2744 m_pXZWnd = new XYWnd ();
2745 m_pXZWnd->m_pParent = wnd;
2746 m_pXZWnd->SetViewType(XZ);
2749 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2750 gtk_container_add (GTK_CONTAINER (wnd), frame);
2753 if (g_PrefsDlg.m_bXZVis)
2754 gtk_widget_show (wnd);
2758 GtkWidget* wnd = create_floating (this);
2759 gtk_window_set_title (GTK_WINDOW (wnd), "YZ View");
2762 if( g_PrefsDlg.m_bStartOnPrimMon ) {
2763 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2766 load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posYZWnd);
2768 m_pYZWnd = new XYWnd ();
2769 m_pYZWnd->m_pParent = wnd;
2770 m_pYZWnd->SetViewType(YZ);
2773 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2774 gtk_container_add (GTK_CONTAINER (wnd), frame);
2777 if (g_PrefsDlg.m_bYZVis)
2778 gtk_widget_show (wnd);
2781 m_pTexWnd = new TexWnd ();
2783 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2784 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2787 GtkWidget* w = gtk_label_new ("Textures");
2788 gtk_widget_show (w);
2789 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2793 g_pGroupDlg->Show ();
2798 GtkWidget* hsplit = gtk_hpaned_new ();
2799 m_pSplits[0] = hsplit;
2800 gtk_box_pack_start (GTK_BOX (vbox), hsplit, TRUE, TRUE, 0);
2801 gtk_widget_show (hsplit);
2804 GtkWidget* vsplit1 = gtk_vpaned_new ();
2805 m_pSplits[1] = vsplit1;
2806 gtk_paned_add1 (GTK_PANED (hsplit), vsplit1);
2807 gtk_widget_show (vsplit1);
2810 GtkWidget* vsplit2 = gtk_vpaned_new ();
2811 m_pSplits[2] = vsplit2;
2812 gtk_paned_add2 (GTK_PANED (hsplit), vsplit2);
2813 gtk_widget_show (vsplit2);
2815 m_pCamWnd = new CamWnd ();
2817 GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2818 gtk_paned_add1 (GTK_PANED (vsplit1), frame);
2821 m_pXYWnd = new XYWnd ();
2822 m_pXYWnd->SetViewType(XY);
2824 GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2825 gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2828 m_pYZWnd = new XYWnd ();
2829 m_pYZWnd->SetViewType(YZ);
2831 GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2832 gtk_paned_add2 (GTK_PANED (vsplit1), frame);
2835 m_pXZWnd = new XYWnd ();
2836 m_pXZWnd->SetViewType(XZ);
2838 GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2839 gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2845 // g_qeglobals_gui.d_edit = NULL;
2848 m_pTexWnd = new TexWnd ();
2849 GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2852 GtkWidget* w = gtk_label_new ("Textures");
2853 gtk_widget_show (w);
2854 gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2858 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2859 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2860 m_pZWnd = create_floating_zwnd(this);
2862 while (gtk_events_pending ())
2863 gtk_main_iteration ();
2866 int x = GTK_PANED (m_pSplits[0])->max_position/2 - gutter;
2867 gtk_paned_set_position (GTK_PANED (m_pSplits[0]), x);
2871 int y = GTK_PANED (m_pSplits[1])->max_position/2 - gutter;
2872 gtk_paned_set_position (GTK_PANED (m_pSplits[1]), y);
2873 gtk_paned_set_position (GTK_PANED (m_pSplits[2]), y);
2877 if(g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED)
2878 gtk_window_maximize(GTK_WINDOW(window));
2880 gtk_widget_show (window);
2884 if (m_pXYWnd) // this is always true?
2886 m_pXYWnd->SetActive(true);
2888 m_bSplittersOK = true;
2889 Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
2891 g_pParentWnd->OnEntitiesSetViewAs(0);
2893 // m_wndTextureBar.Create (vbox);
2894 create_main_statusbar (window, vbox);
2897 ShowMenuItemKeyBindings(window);
2899 if (g_qeglobals_gui.d_edit != NULL)
2900 console_construct(g_qeglobals_gui.d_edit);
2902 // bool load_last = FALSE;
2905 SetButtonMenuStates();
2907 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2909 g_bIgnoreCommands++;
2910 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
2911 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
2912 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaderlistonly"));
2913 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
2914 g_bIgnoreCommands--;
2916 // if (g_PrefsDlg.m_bTextureBar)
2917 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2919 SetActiveXY(m_pXYWnd);
2921 s_idle_id = gtk_timeout_add (25, mainframe_idle, this);
2923 QGL_InitExtensions ();
2925 if (g_PrefsDlg.mLocalPrefs.mbEmpty)
2927 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2928 g_PrefsDlg.SavePrefs();
2931 // remove the pid file
2932 remove (g_pidGameFile.GetBuffer ());
2934 Sys_Printf ("Entering message loop\n");
2938 m_nTimer = gtk_timeout_add (1000, timer, this);
2941 // =============================================================================
2944 MainFrame::MainFrame()
2947 m_bSplittersOK = false;
2948 g_pParentWnd = this;
2949 m_pXYWnd = (XYWnd*)NULL;
2951 m_pTexWnd = (TexWnd*)NULL;
2952 m_pZWnd = (ZWnd*)NULL;
2953 m_pYZWnd = (XYWnd*)NULL;
2954 m_pXZWnd = (XYWnd*)NULL;
2955 m_pActiveXY = (XYWnd*)NULL;
2956 m_bCamPreview = true;
2958 for (int n = 0; n < 6; n++)
2959 m_pStatusLabel[n] = NULL;
2960 m_bNeedStatusUpdate = false;
2962 m_bSleeping = false;
2966 MainFrame::~MainFrame()
2968 while (g_BSPFrontendCommands)
2970 free (g_BSPFrontendCommands->data);
2971 g_BSPFrontendCommands = g_slist_remove (g_BSPFrontendCommands, g_BSPFrontendCommands->data);
2975 void MainFrame::ReleaseContexts ()
2978 m_pXYWnd->DestroyContext ();
2980 m_pYZWnd->DestroyContext ();
2982 m_pXZWnd->DestroyContext ();
2984 m_pCamWnd->DestroyContext ();
2986 m_pTexWnd->DestroyContext ();
2988 m_pZWnd->DestroyContext ();
2991 void MainFrame::CreateContexts ()
2994 m_pCamWnd->CreateContext ();
2996 m_pXYWnd->CreateContext ();
2998 m_pYZWnd->CreateContext ();
3000 m_pXZWnd->CreateContext ();
3002 m_pTexWnd->CreateContext ();
3004 m_pZWnd->CreateContext ();
3007 static void Sys_Iconify (GtkWidget *w)
3009 // we might not have been realized yet
3010 if (w->window == NULL)
3013 if (!GTK_WIDGET_MAPPED (w))
3016 #if defined (__linux__) || defined (__APPLE__)
3017 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Iconify\n");
3019 XWindowAttributes xattr;
3020 GdkWindowPrivate *Private;
3022 Private = (GdkWindowPrivate*)w->window;
3023 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (0));
3025 if (!Private->destroyed)
3027 xattr.map_state = IsUnmapped;
3028 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3030 if (xattr.map_state != IsUnmapped)
3031 g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (1));
3033 XIconifyWindow (Private->xdisplay, Private->xwindow, 0);
3039 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_MINIMIZE);
3043 static void Sys_Restore (GtkWidget *w)
3045 // we might not have been realized yet
3046 if (w->window == NULL)
3049 if (!GTK_WIDGET_VISIBLE (w))
3052 #if defined (__linux__) || defined (__APPLE__)
3053 Sys_FPrintf(SYS_WRN, "FIXME: Sys_Restore\n");
3055 XWindowAttributes xattr;
3056 GdkWindowPrivate *Private;
3058 Private = (GdkWindowPrivate*)w->window;
3060 xattr.map_state = IsUnmapped;
3061 XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3063 if (xattr.map_state == IsUnmapped)
3064 XMapRaised (Private->xdisplay, Private->xwindow);
3069 ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_RESTORE);
3077 void RefreshModelSkin (GSList **pModels, entitymodel_t *model)
3079 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3080 // so we avoid the fucked up ones, assuming they are at the end
3081 if (!model->strSkin)
3084 Sys_Printf("Dropping model %p with empty skin in RefreshModelSkin\n", model);
3087 // and also keeping it so we have an actual count of empty models
3088 g_slist_append (*pModels, model);
3091 // do we have this model already?
3092 if (g_slist_find (*pModels, model))
3096 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3097 Sys_Printf("Already processed model: %p %s\n", model, ((GString *)model->strSkin)->str);
3101 model->nTextureBind = Texture_LoadSkin(((GString *)model->strSkin)->str, &model->nSkinWidth, &model->nSkinHeight );
3102 if (model->nTextureBind != -1)
3103 Sys_Printf("LOADED SKIN: %s\n", ((GString *)model->strSkin)->str );
3105 Sys_Printf("Load skin failed: %s\n", ((GString *)model->strSkin)->str );
3106 *pModels = g_slist_append (*pModels, model);
3108 Sys_Printf("Processed model %p %s\n", model, ((GString *)model->strSkin)->str);
3112 void MainFrame::OnSleep()
3117 // useful when trying to debug crashes in the sleep code
3118 Sys_Printf("Going into sleep mode..\n");
3120 Sys_Printf("Dispatching sleep msg...");
3121 DispatchRadiantMsg (RADIANT_SLEEP);
3122 Sys_Printf("Done.\n");
3124 if (CurrentStyle() == eSplit)
3125 Sys_Iconify (m_pZWnd->m_pParent);
3127 Sys_Iconify (m_pWidget);
3129 QERApp_FreeShaders ();
3130 g_bScreenUpdates = false;
3133 Sys_Printf("Releasing contexts...");
3135 Sys_Printf("Done.\n");
3137 // free all the skins in the caches
3138 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3139 g_lstSkinCache.RemoveAll();
3142 Sys_Printf("Waking up\n");
3143 if (CurrentStyle() == eSplit)
3144 Sys_Restore (m_pZWnd->m_pParent);
3146 Sys_Restore (m_pWidget);
3149 Sys_Printf("Creating contexts...");
3151 Sys_Printf("Done.\n");
3153 Sys_Printf("Making current on camera...");
3154 m_pCamWnd->MakeCurrent ();
3155 Sys_Printf("Done.\n");
3157 Sys_Printf("Reloading shaders...");
3158 // reload the shader scripts and textures
3159 QERApp_ReloadShaders ();
3161 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3162 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
3163 Sys_Printf("Done.\n");
3165 // rebuild the patches by setting the bDirty flag on them
3166 for (brush_t* b=active_brushes.next ; b != &active_brushes ; b=b->next)
3169 b->pPatch->bDirty = true;
3172 Sys_Printf("Reloading skins...");
3173 // we have purged all the skins before going to sleep
3174 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3175 // namely, all entitymodel_t
3176 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3177 // (a single eclass_t can reference several entitymodel_t)
3178 // FIXME: and what's up with md3Class then? what is it used for?
3182 GSList *Models = NULL;
3183 for (ent = entities.next; ent != &entities; ent = ent->next)
3185 // if it's a model with skin then the fixedsize flag must be on
3186 // only if there IS a model .. we are not trying to load
3187 if (ent->eclass->fixedsize)
3189 if (ent->eclass->model)
3193 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3195 entitymodel_t *model;
3196 for (model = ent->eclass->model; model; model=model->pNext)
3197 RefreshModelSkin (&Models, model);
3198 } else if (ent->md3Class)
3200 entitymodel_t *model;
3201 for (model = ent->md3Class->model; model; model=model->pNext)
3202 RefreshModelSkin (&Models, model);
3206 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3211 for (e = g_md3Cache; e ; e = e->next)
3213 entitymodel_t *model;
3214 for (model = e->model; model; model=model->pNext)
3215 if (!g_slist_find (Models, model))
3217 Sys_Printf("model %p ", model);
3219 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3221 Sys_Printf("not found in main loop (no skin)\n");
3225 // clean the model list
3226 g_slist_free (Models);
3228 Sys_Printf("Done.\n");
3230 // bring back the GL font
3231 gtk_glwidget_create_font (m_pCamWnd->GetWidget ());
3233 g_bScreenUpdates = true;
3235 Sys_Printf("Dispatching wake msg...");
3236 DispatchRadiantMsg (RADIANT_WAKEUP);
3237 Sys_Printf("Done\n");
3241 void WINAPI QERApp_Sleep()
3243 g_pParentWnd->OnSleep();
3248 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3249 and not in OnDestroy because the info may be lost already?
3250 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3252 void MainFrame::OnDelete ()
3254 save_window_pos(m_pWidget, g_PrefsDlg.mWindowInfo.position);
3256 // surface inspector and patch inspector
3257 save_window_pos (g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd);
3258 save_window_pos (g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd);
3260 // entity inspector / group dialog
3261 // NOTE TTimo do we have to save a different window depending on the view mode?
3262 save_window_pos (g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd);
3264 if (g_PrefsDlg.m_bFloatingZ)
3265 save_window_pos (m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd);
3267 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED (m_pSplits[0])->child1_size;
3269 if (CurrentStyle() == eFloating)
3271 save_window_pos (m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd);
3272 save_window_pos (m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd);
3273 save_window_pos (m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd);
3274 save_window_pos (m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd);
3277 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state(g_pParentWnd->m_pWidget->window);
3280 void MainFrame::OnDestroy ()
3282 // shut down console output first
3283 // (we'll still get the info if we are running a log file anyway)
3284 g_qeglobals_gui.d_edit = NULL;
3287 Sys_Printf("MainFrame::OnDestroy\n");
3290 gtk_timeout_remove (s_idle_id);
3292 gtk_timeout_remove (m_nTimer);
3294 if (!g_qeglobals.disable_ini)
3296 Sys_Printf("Start writing prefs\n");
3297 Sys_Printf("MRU_Save... ");
3303 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split1");
3304 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED (w)->child1_size;
3305 w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split2");
3306 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED (w)->child1_size;
3308 if (!FloatingGroupDialog())
3310 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3312 vsplit = m_pSplits[0];
3313 vsplit2 = m_pSplits[1];
3314 hsplit = m_pSplits[2];
3315 hsplit2 = m_pSplits[3];
3317 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED (vsplit)->child1_size;
3318 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED (hsplit2)->child1_size;
3320 if(CurrentStyle() == eRegular)
3321 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED (hsplit)->child1_size;
3323 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED (hsplit)->child1_size;
3325 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED (vsplit2)->child1_size;
3328 if (g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit)
3330 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
3331 g_PrefsDlg.m_bZVis = TRUE;
3333 g_PrefsDlg.m_bZVis = FALSE;
3336 g_PrefsDlg.SavePrefs();
3337 Sys_Printf("Done prefs\n");
3340 // spog - this may be better in another place..
3341 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3342 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
3344 delete m_pXYWnd; m_pXYWnd = NULL;
3345 delete m_pYZWnd; m_pYZWnd = NULL;
3346 delete m_pXZWnd; m_pXZWnd = NULL;
3347 delete m_pZWnd; m_pZWnd = NULL;
3348 delete m_pTexWnd; m_pTexWnd = NULL;
3349 delete m_pCamWnd; m_pCamWnd = NULL;
3351 if (g_pGroupDlg->m_pWidget)
3353 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3354 gtk_widget_destroy (g_pGroupDlg->m_pWidget);
3355 g_pGroupDlg->m_pWidget = NULL;
3358 if (strcmpi(currentmap, "unnamed.map") != 0)
3360 g_PrefsDlg.m_strLastMap = currentmap;
3361 g_PrefsDlg.SavePrefs ();
3363 Sys_Printf("CleanUpEntities...");
3365 Sys_Printf("Done.\n");
3367 Sys_Printf("Releasing brushes...");
3368 while (active_brushes.next != &active_brushes)
3369 Brush_Free (active_brushes.next, false);
3370 while (selected_brushes.next != &selected_brushes)
3371 Brush_Free (selected_brushes.next, false);
3372 while (filtered_brushes.next != &filtered_brushes)
3373 Brush_Free (filtered_brushes.next, false);
3374 Sys_Printf("Done.\n");
3376 Sys_Printf("Releasing entities...");
3377 while (entities.next != &entities)
3378 Entity_Free (entities.next);
3379 Sys_Printf("Done.\n");
3381 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3384 epair_t* pNextEPair = pEPair->next;
3386 free (pEPair->value);
3388 pEPair = pNextEPair;
3391 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3392 while (pEntity != NULL && pEntity != g_qeglobals.d_project_entity)
3394 entity_t* pNextEntity = pEntity->next;
3395 Entity_Free(pEntity);
3396 pEntity = pNextEntity;
3399 Sys_Printf("Freeing world entity...");
3401 Entity_Free(world_entity);
3402 Sys_Printf("Done.\n");
3404 Sys_Printf("Shutdown VFS...");
3406 Sys_Printf("Done.\n");
3408 Sys_Printf("FreeShaders...");
3409 QERApp_FreeShaders();
3410 Sys_Printf("Done.\n");
3413 // TTimo: now using profile.cpp code
3414 void MainFrame::LoadCommandMap()
3418 bool bUserCmdList = false;
3420 // verbose a little: count of user commands we recognized
3422 int iOverrideCount = 0;
3426 #if defined (__linux__) || defined (__APPLE__)
3427 strINI = g_PrefsDlg.m_rc_path->str;
3428 #elif defined(WIN32)
3429 strINI = g_strGameToolsPath;
3431 #error "WTF are you compiling this on"
3434 strINI += "shortcuts.ini";
3436 f = fopen (strINI.GetBuffer(), "r");
3440 // loop through all the commands
3441 for (int i = 0; i < g_nCommandCount; i++)
3444 if (read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ))
3448 Sys_Printf("Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3449 bUserCmdList = true;
3454 strBuff.TrimRight();
3455 strBuff.MakeLower();
3456 int nSpecial = strBuff.Find("+alt");
3457 g_Commands[i].m_nModifiers = 0;
3460 g_Commands[i].m_nModifiers |= RAD_ALT;
3461 FindReplace(strBuff, "+alt", "");
3463 nSpecial = strBuff.Find("+ctrl");
3466 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3467 FindReplace(strBuff, "+ctrl", "");
3469 nSpecial = strBuff.Find("+shift");
3472 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3473 FindReplace(strBuff, "+shift", "");
3476 strBuff.TrimRight();
3477 strBuff.MakeUpper();
3478 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3480 nLen = strBuff.GetLength();
3481 if (nLen == 1) // most often case.. deal with first
3483 g_Commands[i].m_nKey = __toascii(strBuff.GetAt(0));
3485 } else // special key
3487 for (j = 0; j < g_nKeyCount; j++)
3489 if (strBuff.CompareNoCase(g_Keys[j].m_strName) == 0)
3491 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3496 if (j == g_nKeyCount)
3498 Sys_Printf("WARNING: failed to parse user command %s\n", value);
3502 // maybe this new shortcut is overriding another one
3503 // then we need to disable the other binded key
3504 for (j = 0; j < g_nCommandCount; j++)
3508 if (g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers)
3511 g_Commands[j].m_nKey = 0;
3514 // it's the only one
3521 Sys_Printf("User's command list overrides %d default commands\n", iOverrideCount);
3522 Sys_Printf("Parsed %d custom shortcuts\n", iCount );
3525 Sys_Printf("Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer());
3528 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3529 // we also output the count of commands that are not binded .. dunno if it's much use ..
3530 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3531 void MainFrame::ShowMenuItemKeyBindings(GtkWidget* window)
3533 //!\todo Find a better way to get the global accelerator group..
3534 GtkAccelGroup *accel = GTK_ACCEL_GROUP(gtk_accel_groups_from_object(G_OBJECT(window))->data);
3540 for (i = 0; i < g_nCommandCount; i++)
3542 if (g_Commands[i].m_nKey == 0)
3548 item = g_object_get_data (G_OBJECT (m_pWidget), g_Commands[i].m_strMenu);
3551 Sys_FPrintf (SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3552 g_Commands[i].m_strCommand);
3557 if (g_Commands[i].m_nModifiers) // are there modifiers present?
3559 if (g_Commands[i].m_nModifiers & RAD_SHIFT)
3560 mods |= GDK_SHIFT_MASK;
3561 if (g_Commands[i].m_nModifiers & RAD_ALT)
3562 mods |= GDK_MOD1_MASK;
3563 if (g_Commands[i].m_nModifiers & RAD_CONTROL)
3564 mods |= GDK_CONTROL_MASK;
3567 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3568 if (gtk_accelerator_valid (g_Commands[i].m_nKey, (GdkModifierType)mods))
3571 // NOTE TTimo this is the important place where all the shortcuts are binded
3572 Sys_Printf("Calling gtk_widget_add_accelerator on command: %s menu: %s key: %d mods: %d\n", g_Commands[i].m_strCommand, g_Commands[i].m_strMenu, g_Commands[i].m_nKey, mods);
3574 gtk_widget_add_accelerator (GTK_WIDGET (item), "activate", accel, g_Commands[i].m_nKey,
3575 (GdkModifierType)mods, GTK_ACCEL_VISIBLE);
3578 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (GTK_BIN (item)->child);
3582 g_free (accel_label->accel_string);
3583 accel_label->accel_string = NULL;
3585 gstring = g_string_new (accel_label->accel_string);
3586 g_string_append (gstring, " ");
3589 if (mods & GDK_SHIFT_MASK)
3591 g_string_append (gstring, "Shft");
3594 if (mods & GDK_CONTROL_MASK)
3597 g_string_append (gstring, "+");
3598 g_string_append (gstring, "Ctl");
3601 if (mods & GDK_MOD1_MASK)
3604 g_string_append (gstring, "+");
3605 g_string_append (gstring, "Alt");
3610 g_string_append (gstring, "+");
3611 if (g_Commands[i].m_nKey < 0x80 || (g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff))
3613 switch (g_Commands[i].m_nKey)
3616 g_string_append (gstring, "Space");
3619 g_string_append (gstring, "Backslash");
3622 g_string_append_c (gstring, toupper (g_Commands[i].m_nKey));
3629 tmp = gtk_accelerator_name (g_Commands[i].m_nKey, (GdkModifierType)0);
3630 if (tmp[0] != 0 && tmp[1] == 0)
3631 tmp[0] = toupper (tmp[0]);
3632 g_string_append (gstring, tmp);
3636 g_free (accel_label->accel_string);
3637 accel_label->accel_string = gstring->str;
3638 g_string_free (gstring, FALSE);
3640 if (!accel_label->accel_string)
3641 accel_label->accel_string = g_strdup ("");
3643 gtk_widget_queue_resize (GTK_WIDGET (accel_label));
3648 Sys_Printf("%d commands not bound to a key\n", iCount);
3651 void MainFrame::CreateQEChildren()
3653 // load the project file
3656 Sys_Printf("loading project file from the command line: %s\n", g_argv[1]);
3657 if (!QE_LoadProject(g_argv[1]))
3658 Error("Unable to load project file %s\n", g_argv[1]);
3662 const char* filename = NULL;
3665 bool bTriedTemplate = false;
3667 if (g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION) {
3668 // we need to regenerate from template
3669 Sys_Printf("last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION);
3670 g_PrefsDlg.m_strLastProject = "";
3673 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3675 while(r == NULL || *r == '\0' || access(r, R_OK) != 0 || !QE_LoadProject(r))
3679 // try default project location
3680 bTriedTemplate = true;
3681 // for all OSes, we look for the template in the base installation (no homepath here)
3682 strcpy(buf, g_pGameDescription->mEnginePath.GetBuffer());
3683 strcat(buf, g_pGameDescription->mBaseGame.GetBuffer());
3684 strcat(buf, "/scripts/");
3685 strcat(buf, PROJECT_TEMPLATE_NAME);
3690 gtk_MessageBox (NULL, "Failed to load project file.\nPlease enter a valid project file.", "Load Project");
3692 filename = file_dialog (m_pWidget, TRUE, "Choose Project File", buf, "project");
3693 if (filename != NULL)
3696 Error("Cannot continue without loading a project...");
3704 void MainFrame::OnTimer()
3706 GdkModifierType mask;
3708 gdk_window_get_pointer (NULL, NULL, NULL, &mask);
3710 if ((mask & (GDK_BUTTON1_MASK|GDK_BUTTON2_MASK|GDK_BUTTON3_MASK)) == 0)
3712 QE_CountBrushesAndUpdateStatusBar();
3716 // see MainFrame::UpdateStatusText below
3717 if (m_bNeedStatusUpdate)
3719 for (int n = 0; n < 6; n++)
3721 if (m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL)
3722 gtk_label_set_text (GTK_LABEL (m_pStatusLabel[n]), m_strStatus[n]);
3724 m_bNeedStatusUpdate = false;
3728 void MainFrame::UpdateStatusText()
3730 m_bNeedStatusUpdate = true;
3733 void MainFrame::SetStatusText(int nPane, const char* pText)
3735 if (pText && nPane <= 5 && nPane >= 0)
3737 m_strStatus[nPane] = pText;
3741 void MainFrame::SetButtonMenuStates()
3744 g_bIgnoreCommands++;
3746 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
3747 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_angles);
3748 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
3749 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_names);
3750 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
3751 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_coordinates);
3752 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
3753 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_outline);
3754 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
3755 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
3756 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
3757 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_axis);
3758 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3759 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3760 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) ? FALSE : TRUE);
3761 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3762 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3763 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3764 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3765 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3766 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3767 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
3768 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3769 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD) != 0);
3770 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
3771 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3772 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT) != 0);
3773 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
3774 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3775 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS) != 0);
3776 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
3777 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3778 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT) != 0);
3779 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
3780 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3781 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS) != 0);
3782 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
3783 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3784 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK) != 0);
3785 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
3786 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3787 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP) != 0);
3788 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
3789 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3790 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP) != 0);
3791 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
3792 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3793 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL) != 0);
3794 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
3795 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3796 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) != 0);
3797 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3798 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3799 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3800 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3801 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3802 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3803 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
3804 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3805 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS) != 0);
3806 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
3807 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3808 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES) != 0);
3809 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
3810 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3811 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS) != 0);
3812 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
3813 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3814 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS) != 0);
3815 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
3816 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3817 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS) != 0);
3818 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
3819 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3820 (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS) != 0);
3821 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
3822 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bTextureLock) ? TRUE : FALSE);
3823 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
3824 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bRotateLock) ? TRUE : FALSE);
3825 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
3826 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3827 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
3828 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bGLLighting) ? TRUE : FALSE);
3829 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
3830 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (!g_PrefsDlg.m_bNoClamp) ? TRUE : FALSE);
3832 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
3833 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3834 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
3835 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
3837 if (!g_pGameDescription->mNoPatch)
3839 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
3840 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
3842 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
3843 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
3844 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
3845 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
3846 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
3847 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
3850 int id, n = g_PrefsDlg.m_nTextureScale;
3853 case 10 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3854 case 25 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3855 case 50 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3856 case 200 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3857 default : id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3859 SetTextureScale (id);
3861 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3863 if (g_qeglobals.d_project_entity)
3865 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3869 g_bIgnoreCommands--;
3872 void MainFrame::UpdateWindows(int nBits)
3874 if (!g_bScreenUpdates)
3876 #ifdef DBG_WINDOWPOS
3877 static int bean_count = 0;
3879 sprintf(bean_buf,"UpdateWindows %d",bean_count);
3880 CheckWatchit(bean_buf);
3884 if (nBits & (W_XY | W_XY_OVERLAY))
3887 m_pXYWnd->RedrawWindow ();
3889 m_pXZWnd->RedrawWindow ();
3891 m_pYZWnd->RedrawWindow ();
3894 if (nBits & W_CAMERA || ((nBits & W_CAMERA_IFON) && m_bCamPreview))
3897 m_pCamWnd->RedrawWindow ();
3900 if (nBits & (W_Z | W_Z_OVERLAY))
3903 m_pZWnd->RedrawWindow ();
3906 if (nBits & W_TEXTURE)
3909 m_pTexWnd->RedrawWindow ();
3911 #ifdef DBG_WINDOWPOS
3912 sprintf(bean_buf,"%d (end UpdateWidows)",bean_count);
3913 CheckWatchit(bean_buf);
3917 void MainFrame::RoutineProcessing()
3919 #ifdef DBG_WINDOWPOS
3920 static int bean_count = 0;
3922 sprintf(bean_buf,"RoutineProcessing %d",bean_count);
3923 CheckWatchit(bean_buf);
3930 double oldtime = 0.0;
3933 /* // checking KeyState works right
3935 a2 = GetKeyState(VK_MENU);
3938 Sys_Printf("VK_MENU: %d\n",a2);
3942 b2 = GetKeyState(VK_UP);
3945 Sys_Printf("VK_UP: %d\n",b2);
3949 time = Sys_DoubleTime ();
3950 delta = time - oldtime;
3955 // update the BSP process watcher
3957 m_pWatchBSP->RoutineProcessing();
3959 // run time dependant behavior
3961 m_pCamWnd->Cam_MouseControl(delta);
3965 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3966 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3967 UpdateWindows(nBits); // happens in rare cases but causes a stack overflow
3970 // Enable/disable the menu items
3973 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3974 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3975 if (!g_PrefsDlg.m_bWideToolbar)
3977 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3978 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3980 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3981 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3982 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3983 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3984 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3985 gtk_widget_set_sensitive (item, region_active);
3986 g_bIgnoreCommands++;
3987 // update the toolbar before displaying the menu:
3988 // show in use check box
3989 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3990 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3991 // show all check box
3992 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3993 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3994 g_bIgnoreCommands--;
3997 #ifdef DBG_WINDOWPOS
3998 sprintf(bean_buf,"%d (end RoutineProcessing)",bean_count);
3999 CheckWatchit(bean_buf);
4003 void MainFrame::DoWatchBSP()
4005 // network monitoring of the BSP process
4007 m_pWatchBSP = new CWatchBSP();
4010 void MainFrame::CleanPlugInMenu()
4012 GtkWidget *menu, *sep;
4015 // delete everything after the separator
4016 menu = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin"));
4017 sep = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin_separator"));
4018 m_nNextPlugInID = ID_PLUGIN_START;
4020 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4023 gtk_container_remove (GTK_CONTAINER (menu), GTK_WIDGET (lst->next->data));
4024 lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4028 void MainFrame::AddPlugInMenuItem(IPlugIn* pPlugIn)
4030 GtkWidget *menu, *item, *parent;
4031 const char *menuText;
4033 parent = gtk_menu_item_new_with_label (pPlugIn->getMenuName());
4034 gtk_widget_show (parent);
4035 gtk_container_add (GTK_CONTAINER (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin")), parent);
4037 int nCount = pPlugIn->getCommandCount();
4040 menu = gtk_menu_new ();
4043 menuText = pPlugIn->getCommand(--nCount);
4044 if (menuText != NULL && strlen(menuText) > 0)
4046 if (!strcmp(menuText, "-"))
4048 item = gtk_menu_item_new ();
4049 gtk_widget_set_sensitive (item, FALSE);
4052 item = gtk_menu_item_new_with_label (menuText);
4053 gtk_signal_connect (GTK_OBJECT (item), "activate",
4054 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (m_nNextPlugInID));
4056 gtk_widget_show (item);
4057 gtk_container_add (GTK_CONTAINER (menu), item);
4058 pPlugIn->addMenuID(m_nNextPlugInID++);
4061 gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), menu);
4065 void MainFrame::OnPlugIn(unsigned int nID, char* str)
4067 m_PlugInMgr.Dispatch(nID, str);
4070 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype(IToolbarButton::EType type)
4074 case IToolbarButton::eSpace:
4075 return GTK_TOOLBAR_CHILD_SPACE;
4076 case IToolbarButton::eButton:
4077 return GTK_TOOLBAR_CHILD_BUTTON;
4078 case IToolbarButton::eToggleButton:
4079 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4080 case IToolbarButton::eRadioButton:
4081 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4083 Error("invalid toolbar button type");
4084 return (GtkToolbarChildType)0;
4087 void toolbar_insert(GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data)
4089 GtkWidget *w, *pixmap;
4090 GdkPixmap *gdkpixmap;
4093 load_plugin_bitmap(image, (void **)&gdkpixmap, (void **)&mask);
4094 pixmap = gtk_pixmap_new (gdkpixmap, mask);
4095 gdk_pixmap_unref (gdkpixmap);
4096 gdk_pixmap_unref (mask);
4097 w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), gtktoolbarchildtype_for_toolbarbuttontype(type), NULL, text, tooltip, "", GTK_WIDGET (pixmap), handler, data);
4100 void SignalToolbarButton(GtkWidget *widget, gpointer data)
4102 const_cast<const IToolbarButton*>(reinterpret_cast<IToolbarButton*>(data))->activate();
4105 void MainFrame::AddPlugInToolbarButton(const IToolbarButton* button)
4107 GtkWidget*const toolbar = GTK_WIDGET(g_object_get_data (G_OBJECT (m_pWidget), "toolbar_plugin"));
4108 toolbar_insert(toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC(SignalToolbarButton), reinterpret_cast<gpointer>(const_cast<IToolbarButton*>(button)));
4111 void MainFrame::OnSelectionSelectNudgedown()
4113 NudgeSelection(3, g_qeglobals.d_gridsize);
4116 void MainFrame::OnSelectionSelectNudgeleft()
4118 NudgeSelection(0, g_qeglobals.d_gridsize);
4121 void MainFrame::OnSelectionSelectNudgeright()
4123 NudgeSelection(2, g_qeglobals.d_gridsize);
4126 void MainFrame::OnSelectionSelectNudgeup()
4128 NudgeSelection(1, g_qeglobals.d_gridsize);
4131 void MainFrame::NudgeSelection(int nDirection, float fAmount)
4133 if (ActiveXY()->RotateMode())
4136 if (ActiveXY()->GetViewType() == XY)
4140 if (g_pParentWnd->ActiveXY()->GetViewType() == XZ)
4146 if (nDirection == 2 || nDirection == 3)
4151 float fDeg = -fAmount;
4152 float fAdj = fAmount;
4154 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4156 strStatus.Format("Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4157 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2]);
4158 g_pParentWnd->SetStatusText(2, strStatus);
4159 Select_RotateAxis(nAxis, fDeg, false, true);
4160 Sys_UpdateWindows (W_ALL);
4162 if (ActiveXY()->ScaleMode())
4164 if (nDirection == 0 || nDirection == 3)
4169 v[0] = v[1] = v[2] = 1.0;
4182 Select_Scale((g_nScaleHow & SCALE_X) ? v[0] : 1.0,
4183 (g_nScaleHow & SCALE_Y) ? v[1] : 1.0,
4184 (g_nScaleHow & SCALE_Z) ? v[2] : 1.0);
4185 Sys_UpdateWindows (W_ALL);
4188 // 0 - left, 1 - up, 2 - right, 3 - down
4190 if (nDirection == 0)
4192 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4194 } else if (nDirection == 1)
4196 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4197 } else if (nDirection == 2)
4199 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4202 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4205 Nudge(nDim, fAmount);
4209 void MainFrame::Nudge(int nDim, float fNudge)
4212 vMove[0] = vMove[1] = vMove[2] = 0;
4213 vMove[nDim] = fNudge;
4215 if((g_qeglobals.d_select_mode == sel_vertex ||
4216 g_qeglobals.d_select_mode == sel_curvepoint)
4217 && g_qeglobals.d_num_move_points)
4218 Select_NudgePoint(vMove, true);
4220 Select_Move(vMove, true);
4221 Sys_UpdateWindows (W_ALL);
4224 void MainFrame::SetGridStatus()
4229 c1 = (g_PrefsDlg.m_bTextureLock) ? 'M' : ' ';
4230 c2 = (g_PrefsDlg.m_bRotateLock) ? 'R' : ' ';
4231 strStatus.Format("G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4232 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2);
4233 SetStatusText(4, strStatus);
4236 void MainFrame::UpdatePatchToolbarButtons()
4239 g_bIgnoreCommands++;
4240 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
4241 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
4242 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4243 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4244 g_bIgnoreCommands--;
4247 // =============================================================================
4250 void MainFrame::OnFileNew()
4252 if (ConfirmModified())
4256 void MainFrame::OnFileOpen()
4258 if (!ConfirmModified())
4264 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4265 strcat(buf, "maps/");
4267 str = file_dialog (m_pWidget, TRUE, "Open Map", buf, MAP_MAJOR);
4271 strcpy(currentmap,str);
4277 void MainFrame::OnFileImportmap()
4282 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4283 strcat(buf, "maps/");
4285 str = file_dialog (m_pWidget, TRUE, "Import Map", buf, MAP_MAJOR);
4289 Map_ImportFile(str);
4293 void MainFrame::OnFileSave()
4295 if (!strcmp(currentmap, "unnamed.map"))
4298 Map_SaveFile (currentmap, false);
4301 void MainFrame::OnFileSaveas()
4306 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4307 strcat(buf, "maps/");
4309 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, "Save Map", buf, MAP_MAJOR);
4313 strcpy (currentmap, str);
4315 Map_SaveFile (str, false); // ignore region
4319 void MainFrame::OnFileExportmap()
4324 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4325 strcat(buf, "maps/");
4327 str = file_dialog (m_pWidget, FALSE, "Export Selection", buf, MAP_MAJOR);
4331 Map_SaveSelected (str);
4335 void MainFrame::OnFileSaveregion()
4340 strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4341 strcat(buf, "maps/");
4343 str = file_dialog (g_pParentWnd->m_pWidget, FALSE, "Export Region", buf, MAP_MAJOR);
4347 Map_SaveFile (str, true); // ignore region
4351 void MainFrame::OnFileNewproject()
4353 char* name = DoNewProjectDlg ();
4355 // create a new project:
4356 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4357 // on linux we create under ~/.q3a, on win32 under strEnginePath
4358 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4359 if ((name != NULL) && (strlen (name) > 0))
4361 CString strNewBasePath;
4363 // NOTE TTimo this would probably not work right on *nix
4364 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4365 strNewBasePath += name;
4366 strNewBasePath += "/";
4368 CString strProjToLoad;
4369 CString strMapToLoad;
4371 // if the dir exists, ask the user if they want to continue anyway
4372 if (Q_mkdir (strNewBasePath.GetBuffer(), 0755) != 0)
4375 strMsg.Format("The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer ());
4377 if (gtk_MessageBox(m_pWidget, strMsg, "Error", MB_YESNO) != IDYES)
4379 Sys_Printf("New Project cancelled, directory already exists for project\n");
4386 strDir = strNewBasePath;
4388 Q_mkdir (strDir.GetBuffer(), 0755);
4390 strDir = strNewBasePath;
4391 strDir += "textures/";
4392 Q_mkdir (strDir.GetBuffer(), 0755);
4394 strDir = strNewBasePath;
4395 strDir += "scripts/";
4396 Q_mkdir (strDir.GetBuffer(), 0755);
4398 // print a warning for total conversions, since setting the basepath when required files are
4399 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4400 Sys_FPrintf(SYS_WRN, "*** Note: basepath unchanged\n");
4402 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name);
4404 strDir = strNewBasePath;
4405 strDir += "maps/autosave.map";
4406 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4408 // state that this is a user project file, no templating
4409 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4410 // create the project file
4411 strProjToLoad = strNewBasePath;
4412 strProjToLoad += "scripts/";
4413 strProjToLoad += name;
4414 strProjToLoad += ".";
4415 strProjToLoad += PROJECT_FILETYPE;
4416 QE_SaveProject(strProjToLoad.GetBuffer());
4421 void MainFrame::OnFileLoadproject()
4423 if (ConfirmModified())
4427 void MainFrame::OnFileProjectsettings()
4429 DoProjectSettings();
4432 void MainFrame::OnFilePointfile()
4434 if (g_qeglobals.d_pointfile_display_list)
4440 void MainFrame::OnMru(unsigned int nID)
4442 if (ConfirmModified())
4443 MRU_Activate (nID - ID_FILE_RECENT1);
4446 void MainFrame::OnFileExit()
4448 if (ConfirmModified())
4450 // stop printing during shutdown
4451 // NOTE: we should cleanly release GL contexts and stuff when exiting
4455 g_qeglobals_gui.d_edit = NULL;
4456 gtk_widget_destroy (m_pWidget);
4460 void MainFrame::OnFileCheckUpdate()
4465 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4467 URL += "&OS_dlup=1";
4469 URL += "&OS_dlup=2";
4471 URL += "&Version_dlup=" RADIANT_VERSION;
4472 g_PrefsDlg.mGamesDialog.AddPacksURL(URL);
4473 OpenURL(URL.GetBuffer());
4476 void MainFrame::OnEditUndo()
4481 void MainFrame::OnEditRedo()
4486 void MainFrame::OnEditCopybrush()
4491 void MainFrame::OnEditPastebrush()
4495 Undo_Start("paste");
4499 Undo_EndBrushList(&selected_brushes);
4503 void MainFrame::OnEditPastebrushToCamera()
4508 vec3_t mid, camorigin, delta;
4510 ActiveXY()->Paste();
4512 // Work out the delta
4513 Select_GetMid( mid );
4515 // Snap camera origin to grid
4516 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4517 camorigin[0] = floor(camorigin[0] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4518 camorigin[1] = floor(camorigin[1] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4519 camorigin[2] = floor(camorigin[2] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4521 VectorSubtract( camorigin, mid, delta );
4524 Select_Move( delta, false );
4526 Undo_Start("paste to camera");
4527 Undo_EndBrushList(&selected_brushes);
4532 void MainFrame::OnSelectionDelete()
4536 // ActiveXY()->UndoCopy();
4537 Undo_Start("delete");
4538 Undo_AddBrushList(&selected_brushes);
4539 //add all deleted entities to the undo
4540 for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next)
4542 Undo_AddEntity(brush->owner);
4544 // NOTE: Select_Delete does NOT delete entities
4546 Undo_EndBrushList(&selected_brushes);
4550 void MainFrame::OnEditMapinfo()
4555 void MainFrame::OnEditEntityinfo()
4560 void MainFrame::OnBrushScripts()
4565 void MainFrame::OnEditLoadprefab()
4567 const char *filename;
4570 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4572 CurPath = g_PrefsDlg.m_strPrefabPath;
4576 filename = file_dialog (m_pWidget, TRUE, "Import Prefab", CurPath.GetBuffer(), MAP_MAJOR);
4578 if (filename != NULL)
4580 Map_ImportFile(filename);
4584 void MainFrame::OnEditSaveprefab()
4586 const char *filename;
4589 if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4591 CurPath = g_PrefsDlg.m_strPrefabPath;
4595 getcwd (tmp, PATH_MAX);
4600 filename = file_dialog (m_pWidget, FALSE, "Export Prefab", CurPath.GetBuffer(), MAP_MAJOR);
4601 if (filename != NULL)
4603 Map_SaveSelected(filename);
4607 void MainFrame::OnPrefs()
4609 int nView = g_PrefsDlg.m_nView;
4610 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4611 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4612 int nShader = g_PrefsDlg.m_nShader;
4613 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4614 int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4615 g_PrefsDlg.LoadPrefs();
4617 if (g_PrefsDlg.DoModal() == IDOK)
4619 if ((g_PrefsDlg.m_nLatchedView != nView) ||
4620 (g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus) ||
4621 (g_PrefsDlg.m_bLatchedWideToolbar != bToolbar) ||
4622 (g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar) ||
4623 (g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar) ||
4624 (g_PrefsDlg.m_nLatchedShader != nShader) ||
4625 (g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality)
4626 || (g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ)
4628 gtk_MessageBox(m_pWidget, "You must restart Radiant for the changes to take effect.");
4630 // if the view mode was switched to floating, set the Z window on by default
4631 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4632 // (and we simply hope there will be a SavePrefs before we die)
4633 if ((g_PrefsDlg.m_nView != nView) && ((EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating))
4635 g_PrefsDlg.m_bZVis = true;
4639 m_pTexWnd->UpdatePrefs();
4641 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
4642 g_bIgnoreCommands++;
4643 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
4644 (!g_PrefsDlg.m_bNoClamp) ? TRUE : FALSE);
4645 g_bIgnoreCommands--;
4649 void MainFrame::OnTogglecamera()
4651 if (CurrentStyle() == eFloating) // floating views
4653 if (m_pCamWnd && m_pCamWnd->m_pParent)
4655 if (GTK_WIDGET_VISIBLE (m_pCamWnd->m_pParent))
4656 widget_delete_hide (m_pCamWnd->m_pParent);
4658 gtk_widget_show (m_pCamWnd->m_pParent);
4662 if (GTK_WIDGET_VISIBLE (m_pCamWnd->GetWidget ()))
4663 gtk_widget_hide (m_pCamWnd->GetWidget ());
4665 gtk_widget_show (m_pCamWnd->GetWidget ());
4669 void MainFrame::OnToggleconsole()
4671 if (FloatingGroupDialog()) // QE4 style
4673 if (inspector_mode == W_CONSOLE)
4675 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4676 widget_delete_hide (g_qeglobals_gui.d_entity);
4678 gtk_widget_show (g_qeglobals_gui.d_entity);
4681 gtk_widget_show (g_qeglobals_gui.d_entity);
4682 SetInspectorMode(W_CONSOLE);
4687 // trigger the entity inspector on/off
4688 void MainFrame::OnViewEntity()
4690 // make sure we're working with the current selection (bugzilla #436)
4691 if( ! GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4694 if (!FloatingGroupDialog())
4696 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_ENTITY)
4697 widget_delete_hide (g_qeglobals_gui.d_entity);
4700 gtk_widget_show (g_qeglobals_gui.d_entity);
4701 SetInspectorMode(W_ENTITY);
4705 if (inspector_mode == W_ENTITY)
4707 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4708 widget_delete_hide (g_qeglobals_gui.d_entity);
4710 gtk_widget_show (g_qeglobals_gui.d_entity);
4713 gtk_widget_show (g_qeglobals_gui.d_entity);
4714 SetInspectorMode(W_ENTITY);
4719 void MainFrame::OnViewGroups()
4721 if (!FloatingGroupDialog())
4723 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_GROUP)
4724 widget_delete_hide (g_qeglobals_gui.d_entity);
4727 gtk_widget_show (g_qeglobals_gui.d_entity);
4728 SetInspectorMode(W_GROUP);
4732 if (inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating)
4734 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4735 widget_delete_hide (g_qeglobals_gui.d_entity);
4737 gtk_widget_show (g_qeglobals_gui.d_entity);
4740 gtk_widget_show (g_qeglobals_gui.d_entity);
4741 SetInspectorMode(W_GROUP);
4746 void MainFrame::OnToggleview()
4748 if (CurrentStyle() == eFloating) // QE4 style
4750 if (m_pXYWnd && m_pXYWnd->m_pParent)
4752 if (GTK_WIDGET_VISIBLE (m_pXYWnd->m_pParent))
4753 widget_delete_hide (m_pXYWnd->m_pParent);
4755 gtk_widget_show (m_pXYWnd->m_pParent);
4760 void MainFrame::OnToggleviewXz()
4762 if (CurrentStyle() == eFloating) // QE4 style
4764 if (m_pXZWnd && m_pXZWnd->m_pParent)
4766 // get windowplacement doesn't actually save this so we will here
4767 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE (m_pXZWnd->m_pParent);
4768 if (g_PrefsDlg.m_bXZVis)
4769 widget_delete_hide (m_pXZWnd->m_pParent);
4771 gtk_widget_show (m_pXZWnd->m_pParent);
4772 g_PrefsDlg.m_bXZVis ^= 1;
4773 g_PrefsDlg.SavePrefs ();
4778 void MainFrame::OnToggleviewYz()
4780 if (CurrentStyle() == eFloating) // QE4 style
4782 if (m_pYZWnd && m_pYZWnd->m_pParent)
4784 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE (m_pYZWnd->m_pParent);
4785 if (g_PrefsDlg.m_bYZVis)
4786 widget_delete_hide (m_pYZWnd->m_pParent);
4788 gtk_widget_show (m_pYZWnd->m_pParent);
4789 g_PrefsDlg.m_bYZVis ^= 1;
4790 g_PrefsDlg.SavePrefs ();
4795 void MainFrame::OnTogglez()
4797 if ( g_pParentWnd->FloatingGroupDialog() ) // QE4 style
4799 if (m_pZWnd && m_pZWnd->m_pParent)
4801 if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
4802 widget_delete_hide (m_pZWnd->m_pParent);
4804 gtk_widget_show (m_pZWnd->m_pParent);
4805 g_PrefsDlg.m_bZVis ^= 1;
4806 g_PrefsDlg.SavePrefs ();
4809 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4813 void MainFrame::OnViewCenter()
4815 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4816 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor((m_pCamWnd->Camera()->angles[YAW]+11)/22.5);
4817 Sys_UpdateWindows (W_CAMERA | W_XY_OVERLAY);
4820 void MainFrame::OnViewUpfloor()
4822 m_pCamWnd->Cam_ChangeFloor (true);
4825 void MainFrame::OnViewDownfloor()
4827 m_pCamWnd->Cam_ChangeFloor (false);
4830 void MainFrame::OnViewCenterview()
4832 if(CurrentStyle() == eSplit)
4834 GetXYWnd()->PositionView();
4835 GetXZWnd()->PositionView();
4836 GetYZWnd()->PositionView();
4837 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4840 m_pXYWnd->PositionView();
4841 Sys_UpdateWindows (W_XY);
4845 void MainFrame::OnViewNextview()
4847 if (CurrentStyle() == eSplit)
4849 GetXYWnd()->PositionView();
4850 GetXZWnd()->PositionView();
4851 GetYZWnd()->PositionView();
4852 Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4855 if (m_pXYWnd->GetViewType() == XY)
4856 m_pXYWnd->SetViewType(XZ);
4858 if (m_pXYWnd->GetViewType() == XZ)
4859 m_pXYWnd->SetViewType(YZ);
4861 m_pXYWnd->SetViewType(XY);
4862 m_pXYWnd->PositionView();
4863 Sys_UpdateWindows (W_XY);
4867 void MainFrame::OnViewXy()
4869 if(!FloatingGroupDialog())
4871 m_pXYWnd->SetViewType(XY);
4872 m_pXYWnd->PositionView();
4874 Sys_UpdateWindows (W_XY);
4877 void MainFrame::OnViewSide()
4879 if (!FloatingGroupDialog())
4881 m_pXYWnd->SetViewType(XZ);
4882 m_pXYWnd->PositionView();
4884 Sys_UpdateWindows (W_XY);
4887 void MainFrame::OnViewFront()
4889 if (!FloatingGroupDialog())
4891 m_pXYWnd->SetViewType(YZ);
4892 m_pXYWnd->PositionView();
4894 Sys_UpdateWindows (W_XY);
4897 void MainFrame::OnView100()
4900 m_pXYWnd->SetScale(1);
4902 m_pXZWnd->SetScale(1);
4904 m_pYZWnd->SetScale(1);
4905 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4908 void MainFrame::OnViewZoomin()
4910 if (m_pXYWnd && m_pXYWnd->Active())
4912 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 5.0 / 4);
4913 if (m_pXYWnd->Scale() > 30)
4914 m_pXYWnd->SetScale(30);
4917 if (m_pXZWnd && m_pXZWnd->Active())
4919 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 5.0 / 4);
4920 if (m_pXZWnd->Scale() > 30)
4921 m_pXZWnd->SetScale(30);
4924 if (m_pYZWnd && m_pYZWnd->Active())
4926 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 5.0 / 4);
4927 if (m_pYZWnd->Scale() > 30)
4928 m_pYZWnd->SetScale(30);
4931 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4934 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4935 // we don't go below a zoom factor corresponding to 10% of the max world size
4936 // (this has to be computed against the window size)
4937 void MainFrame::OnViewZoomout()
4940 if (m_pXYWnd && m_pXYWnd->Active())
4942 m_pXYWnd->SetScale(m_pXYWnd->Scale() * 4.0 / 5);
4943 min_scale = MIN(m_pXYWnd->Width(),m_pXYWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4944 if (m_pXYWnd->Scale() < min_scale) m_pXYWnd->SetScale (min_scale);
4947 if (m_pXZWnd && m_pXZWnd->Active())
4949 m_pXZWnd->SetScale(m_pXZWnd->Scale() * 4.0 / 5);
4950 min_scale = MIN(m_pXZWnd->Width(),m_pXZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4951 if (m_pXZWnd->Scale() < min_scale) m_pXZWnd->SetScale (min_scale);
4954 if (m_pYZWnd && m_pYZWnd->Active())
4956 m_pYZWnd->SetScale(m_pYZWnd->Scale() * 4.0 / 5);
4957 min_scale = MIN(m_pYZWnd->Width(),m_pYZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4958 if (m_pYZWnd->Scale() < min_scale) m_pYZWnd->SetScale (min_scale);
4960 Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4963 void MainFrame::OnViewZ100()
4966 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4969 void MainFrame::OnViewZzoomin()
4974 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4977 void MainFrame::OnViewZzoomout()
4980 if (z.scale < 0.125)
4982 Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4985 void MainFrame::OnViewCubein()
4987 g_PrefsDlg.m_nCubicScale--;
4988 if (g_PrefsDlg.m_nCubicScale < 1)
4989 g_PrefsDlg.m_nCubicScale = 1;
4990 g_PrefsDlg.SavePrefs ();
4991 Sys_UpdateWindows(W_CAMERA);
4995 void MainFrame::OnViewCubeout()
4997 g_PrefsDlg.m_nCubicScale++;
4998 if (g_PrefsDlg.m_nCubicScale > 22)
4999 g_PrefsDlg.m_nCubicScale = 22;
5000 g_PrefsDlg.SavePrefs ();
5001 Sys_UpdateWindows(W_CAMERA);
5005 void MainFrame::OnViewShownames()
5007 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
5008 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
5009 g_bIgnoreCommands++;
5010 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5011 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE);
5012 g_bIgnoreCommands--;
5013 Sys_UpdateWindows (W_XY);
5016 void MainFrame::OnViewShowAngles()
5018 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
5019 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
5020 g_bIgnoreCommands++;
5021 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5022 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE);
5023 g_bIgnoreCommands--;
5024 Sys_UpdateWindows (W_XY);
5027 void MainFrame::OnViewShowblocks()
5029 g_qeglobals.show_blocks ^= 1;
5030 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showblocks"));
5031 g_bIgnoreCommands++;
5032 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.show_blocks ? TRUE : FALSE);
5033 g_bIgnoreCommands--;
5034 Sys_UpdateWindows (W_XY);
5037 void MainFrame::OnViewShowcoordinates()
5039 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
5040 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
5041 g_bIgnoreCommands++;
5042 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5043 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE);
5044 g_bIgnoreCommands--;
5045 Sys_UpdateWindows (W_XY|W_Z);
5048 void MainFrame::OnViewShowOutline()
5050 g_qeglobals.d_savedinfo.show_outline ^= 1;
5051 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
5052 g_bIgnoreCommands++;
5053 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5054 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE);
5055 g_bIgnoreCommands--;
5056 Sys_UpdateWindows (W_XY);
5059 void MainFrame::OnViewShowAxes()
5061 g_qeglobals.d_savedinfo.show_axis ^= 1;
5062 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
5063 g_bIgnoreCommands++;
5064 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5065 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE);
5066 g_bIgnoreCommands--;
5067 Sys_UpdateWindows (W_XY);
5070 void MainFrame::OnViewShowWorkzone()
5072 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showworkzone"));
5073 g_bIgnoreCommands++;
5074 if (g_qeglobals.d_show_work)
5076 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
5077 g_qeglobals.d_show_work = false;
5080 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5081 g_qeglobals.d_show_work = true;
5083 g_bIgnoreCommands--;
5084 Sys_UpdateWindows (W_XY);
5087 void MainFrame::OnViewHideshowHideselected()
5093 void MainFrame::OnViewHideshowShowhidden()
5095 Select_ShowAllHidden();
5099 sets the view mode for the entities
5100 called upon LoadPrefs too
5101 NOTE TTimo previous implementation had a SavePrefs call
5102 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5103 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5104 (otherwise we are always called following user action on the widget)
5106 void MainFrame::OnEntitiesSetViewAs(int mode)
5108 gpointer item = NULL;
5111 switch (g_PrefsDlg.m_nEntityShowState)
5114 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5117 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5119 case ENTITY_SELECTED:
5120 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5122 case ENTITY_SELECTED_SKIN:
5123 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5125 case ENTITY_SKINNED:
5126 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5128 case ENTITY_SKINNED_BOXED:
5129 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5132 g_bIgnoreCommands++;
5133 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5134 g_bIgnoreCommands--;
5140 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5141 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5142 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5144 case ID_VIEW_ENTITIESAS_WIREFRAME:
5145 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5146 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5148 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5149 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5150 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5152 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5153 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5154 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5156 case ID_VIEW_ENTITIESAS_SKINNED:
5157 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5158 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5160 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5161 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5162 item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5165 Sys_FPrintf(SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n");
5171 Sys_FPrintf(SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n");
5175 g_bIgnoreCommands++;
5176 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5177 g_bIgnoreCommands--;
5179 Sys_UpdateWindows(W_ALL);
5182 void MainFrame::OnViewCubicclipping()
5186 g_PrefsDlg.m_bCubicClipping ^= 1;
5187 g_bIgnoreCommands++;
5188 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
5189 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5190 w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
5191 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5192 g_bIgnoreCommands--;
5193 g_PrefsDlg.SavePrefs ();
5194 //Map_BuildBrushData ();
5195 Sys_UpdateWindows(W_CAMERA);
5198 void MainFrame::OnViewOpengllighting()
5200 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
5201 g_PrefsDlg.m_bGLLighting ^= 1;
5202 g_PrefsDlg.SavePrefs ();
5203 g_bIgnoreCommands++;
5204 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE);
5205 Sys_UpdateWindows (W_XY|W_CAMERA);
5206 g_bIgnoreCommands--;
5209 void MainFrame::OnSelectionDragedges()
5211 if (g_qeglobals.d_select_mode == sel_edge)
5213 g_qeglobals.d_select_mode = sel_brush;
5214 Sys_UpdateWindows (W_ALL);
5217 SetupVertexSelection ();
5218 if (g_qeglobals.d_numpoints)
5219 g_qeglobals.d_select_mode = sel_edge;
5220 Sys_UpdateWindows (W_ALL);
5224 void MainFrame::OnSelectionDragvertecies()
5226 if (g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint)
5228 g_qeglobals.d_select_mode = sel_brush;
5229 Sys_UpdateWindows (W_ALL);
5232 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5233 if (OnlyPatchesSelected())
5236 } else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5238 SetupVertexSelection ();
5239 if (g_qeglobals.d_numpoints)
5240 g_qeglobals.d_select_mode = sel_vertex;
5242 Sys_UpdateWindows (W_ALL);
5246 void MainFrame::OnSelectionClone()
5251 // called when the escape key is used (either on the main window or on an inspector)
5252 void MainFrame::OnSelectionDeselect()
5258 OnSelectMouserotate();
5261 OnSelectMousescale();
5266 ActiveXY()->KillPathMode();
5269 if (g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0)
5271 g_qeglobals.d_num_move_points = 0;
5272 Sys_UpdateWindows(W_ALL);
5276 SetStatusText(2, " ");
5281 void MainFrame::OnBrushFlipx()
5283 Undo_Start("flip X");
5284 Undo_AddBrushList(&selected_brushes);
5286 Select_FlipAxis (0);
5287 // spog - this does not work - it's a rotate not a flip
5289 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5291 if(b->owner->eclass->fixedsize)
5294 float a = FloatForKey(b->owner, "angle");
5295 a = div ((int)(180 - a), 180).rem;
5296 sprintf (buf, "%d", (int)a);
5297 SetKeyValue(b->owner, "angle", buf);
5298 Brush_Build(b,true,true,false,false); // don't filter
5302 Undo_EndBrushList(&selected_brushes);
5306 void MainFrame::OnBrushFlipy()
5308 Undo_Start("flip Y");
5309 Undo_AddBrushList(&selected_brushes);
5311 Select_FlipAxis (1);
5312 // spog - this does not work - it's a rotate not a flip
5314 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5316 if(b->owner->eclass->fixedsize)
5318 float a = FloatForKey(b->owner, "angle");
5319 if (a == 0 || a == 180 || a == 360)
5321 if ( a == 90 || a == 270)
5335 sprintf (buf, "%d", (int)a);
5336 SetKeyValue(b->owner, "angle", buf);
5337 Brush_Build(b,true,true,false,false); // don't filter
5342 Undo_EndBrushList(&selected_brushes);
5346 void MainFrame::OnBrushFlipz()
5348 Undo_Start("flip Z");
5349 Undo_AddBrushList(&selected_brushes);
5350 Select_FlipAxis (2);
5351 Undo_EndBrushList(&selected_brushes);
5355 void MainFrame::OnBrushRotatex()
5357 Undo_Start("rotate X");
5358 Undo_AddBrushList(&selected_brushes);
5359 Select_RotateAxis (0, 90);
5360 Undo_EndBrushList(&selected_brushes);
5364 void MainFrame::OnBrushRotatey()
5366 Undo_Start("rotate Y");
5367 Undo_AddBrushList(&selected_brushes);
5368 Select_RotateAxis (1, 90);
5369 Undo_EndBrushList(&selected_brushes);
5373 void MainFrame::OnBrushRotatez()
5375 Undo_Start("rotate Z");
5376 Undo_AddBrushList(&selected_brushes);
5377 Select_RotateAxis (2, 90);
5378 Undo_EndBrushList(&selected_brushes);
5382 void MainFrame::OnSelectionArbitraryrotation()
5384 Undo_Start("arbitrary rotation");
5385 Undo_AddBrushList(&selected_brushes);
5389 Undo_EndBrushList(&selected_brushes);
5393 void MainFrame::OnSelectScale()
5395 Undo_Start("scale");
5396 Undo_AddBrushList(&selected_brushes);
5398 Undo_EndBrushList(&selected_brushes);
5402 void MainFrame::OnSelectionMakehollow()
5405 // ActiveXY()->UndoCopy();
5406 Undo_Start("hollow");
5407 Undo_AddBrushList(&selected_brushes);
5409 Undo_EndBrushList(&selected_brushes);
5413 void MainFrame::OnSelectionCsgsubtract()
5415 Undo_Start("CSG subtract");
5420 void MainFrame::OnSelectionCsgmerge()
5422 Undo_Start("CSG merge");
5423 Undo_AddBrushList(&selected_brushes);
5425 Undo_EndBrushList(&selected_brushes);
5429 void MainFrame::OnSelectionNoOutline()
5431 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5432 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) ^ OUTLINE_ZBUF;
5433 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5434 g_bIgnoreCommands++;
5435 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5436 g_bIgnoreCommands--;
5437 Sys_UpdateWindows (W_CAMERA);
5440 void MainFrame::OnSelectionOutlineStyle()
5442 if ((g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) && (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL))
5443 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5444 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL)
5445 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5446 else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF)
5447 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5449 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5450 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5451 g_bIgnoreCommands++;
5452 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5453 g_bIgnoreCommands--;
5454 Sys_UpdateWindows (W_CAMERA);
5457 void MainFrame::OnSelectionSelectcompletetall()
5460 ActiveXY()->UndoCopy();
5461 Select_CompleteTall ();
5464 void MainFrame::OnSelectionSelecttouching()
5469 void MainFrame::OnSelectionSelectpartialtall()
5471 Select_PartialTall();
5474 void MainFrame::OnSelectionSelectinside()
5479 void MainFrame::OnViewClipper()
5481 GtkWidget *w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_clipper"));
5482 g_bIgnoreCommands++;
5486 if (ActiveXY()->ClipMode())
5488 ActiveXY()->SetClipMode(false);
5489 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), FALSE);
5492 if (ActiveXY()->RotateMode())
5493 OnSelectMouserotate();
5494 ActiveXY()->SetClipMode(true);
5495 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
5498 g_bIgnoreCommands--;
5501 void MainFrame::OnClipSelected()
5503 if (m_pActiveXY && m_pActiveXY->ClipMode())
5505 Undo_Start("clip selected");
5506 Undo_AddBrushList(&selected_brushes);
5507 m_pActiveXY->Clip();
5508 Undo_EndBrushList(&selected_brushes);
5512 if (g_bPatchBendMode)
5513 Patch_BendHandleENTER();
5514 // else if (g_bPatchBendMode)
5515 // Patch_InsDelHandleENTER();
5519 void MainFrame::OnSplitSelected()
5523 Undo_Start("split selected");
5524 Undo_AddBrushList(&selected_brushes);
5525 m_pActiveXY->SplitClip();
5526 Undo_EndBrushList(&selected_brushes);
5531 void MainFrame::OnFlipClip()
5534 m_pActiveXY->FlipClip();
5537 void MainFrame::OnSelectionConnect()
5539 Undo_Start("connect selected entities");
5540 Undo_AddBrushList(&selected_brushes);
5542 Undo_EndBrushList(&selected_brushes);
5546 void MainFrame::OnSelectionUngroupentity()
5548 Undo_Start("ungroup selected entities");
5549 Undo_AddBrushList(&selected_brushes);
5551 Undo_EndBrushList(&selected_brushes);
5555 void MainFrame::OnSelectionMergeentity()
5557 Undo_Start("merge entity");
5558 Undo_AddBrushList(&selected_brushes);
5559 Select_MergeEntity();
5560 Undo_EndBrushList(&selected_brushes);
5564 void MainFrame::OnSelectionGroupworld()
5566 Undo_Start("group world");
5567 Undo_AddBrushList(&selected_brushes);
5568 Select_GroupEntity(world_entity);
5569 Undo_EndBrushList(&selected_brushes);
5573 void MainFrame::OnSelectionMakeDetail()
5575 Undo_Start("make detail");
5576 Undo_AddBrushList(&selected_brushes);
5577 Select_MakeDetail ();
5578 Undo_EndBrushList(&selected_brushes);
5582 void MainFrame::OnSelectionMakeStructural()
5584 Undo_Start("make structural");
5585 Undo_AddBrushList(&selected_brushes);
5586 Select_MakeStructural ();
5587 Undo_EndBrushList(&selected_brushes);
5591 void MainFrame::OnBspCommand (unsigned int nID)
5593 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503
5594 // make sure we don't attempt to region compile a map with the camera outside the region
5599 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5600 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5601 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2]);
5604 for (i=0 ; i<3 ; i++)
5606 if (vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i])
5608 Sys_FPrintf(SYS_ERR, "The camera must be in the region to start a region compile.\n");
5614 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5615 if (stricmp( currentmap, "unnamed.map") == 0)
5620 if (g_PrefsDlg.m_bSnapShots && (stricmp (currentmap, "unnamed.map") != 0))
5623 if (g_qeglobals.bBSPFrontendPlugin)
5625 char *cmd = (char*)g_slist_nth_data (g_BSPFrontendCommands, nID-CMD_BSPCOMMAND);
5626 g_BSPFrontendTable.m_pfnDispatchBSPCommand (cmd);
5629 RunBsp (bsp_commands[nID-CMD_BSPCOMMAND]);
5633 void MainFrame::OnGrid (unsigned int nID)
5635 if (nID == ID_GRID_025)
5637 g_qeglobals.d_gridsize = 0.25f;
5638 g_qeglobals.d_bSmallGrid = true;
5639 } else if (nID == ID_GRID_05)
5641 g_qeglobals.d_gridsize = 0.5f;
5642 g_qeglobals.d_bSmallGrid = true;
5647 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5648 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5649 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5650 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5651 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5652 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5653 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5654 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5655 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5657 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5658 g_qeglobals.d_bSmallGrid = false;
5663 // SnapTToGrid option: need to check everywhere the grid size is changed
5664 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5665 if (g_PrefsDlg.m_bSnapTToGrid)
5668 Sys_UpdateWindows (W_XY|W_Z);
5671 void MainFrame::OnSnaptogrid()
5673 g_PrefsDlg.m_bNoClamp ^= 1;
5674 g_PrefsDlg.SavePrefs ();
5676 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
5677 g_bIgnoreCommands++;
5678 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bNoClamp ? FALSE : TRUE);
5679 g_bIgnoreCommands--;
5682 void MainFrame::OnTexturesShowinuse()
5685 Texture_ShowInuse ();
5687 if (!g_bShowAllShaders)
5688 Sys_Printf("Already showing only in-use textures.\n");
5690 Sys_UpdateWindows( W_TEXTURE );
5694 void MainFrame::OnTexturesShowall()
5699 // do some triggering on/off, if the inspector is already up then hide it
5700 void MainFrame::OnTexturesInspector()
5705 void MainFrame::OnViewNearest(unsigned int nID)
5707 Texture_SetMode(nID);
5710 void MainFrame::OnTextureReplaceall()
5712 FindTextureDialog::show();
5715 void MainFrame::OnToggleLock()
5717 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5719 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
5720 g_bIgnoreCommands++;
5721 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE);
5722 g_bIgnoreCommands--;
5723 g_PrefsDlg.SavePrefs ();
5727 void MainFrame::OnToggleRotatelock()
5729 g_PrefsDlg.m_bRotateLock ^= 1;
5731 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
5732 g_bIgnoreCommands++;
5733 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE);
5734 g_bIgnoreCommands--;
5735 g_PrefsDlg.SavePrefs ();
5739 // use a dialog for direct selection of a texture menu
5740 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5741 void MainFrame::OnTexturesLoad()
5743 char def_path[NAME_MAX];
5746 // check if that works with fs_game (I suspect some more design is needed)
5747 // see how this is done in 1.2?
5748 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=507
5749 strcpy (def_path, g_pGameDescription->mEnginePath.GetBuffer());
5750 strcat (def_path, g_pGameDescription->mBaseGame.GetBuffer());
5751 strcat (def_path, "/");
5753 char *dir = dir_dialog (m_pWidget, "Load textures from path", def_path);
5757 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5758 Sys_Printf("user select: '%s'\n", dir);
5759 // remove a potential trailing slash?
5760 if (dir[strlen(dir)-1]=='/' || dir[strlen(dir)-1]=='\\')
5761 dir[strlen(dir)-1] = '\0';
5762 char *pouic = MAX(strrchr(dir, '/'),strrchr(dir, '\\'));
5765 strcpy(texture_directory, pouic+1);
5766 Sys_Printf("Loading '%s'\n", texture_directory);
5767 Texture_ShowDirectory();
5770 Sys_FPrintf(SYS_WRN, "Failed to extract the directory\n");
5774 Sys_FPrintf(SYS_WRN, "texture load dialog cancelled\n");
5777 void MainFrame::OnTexturesReloadshaders()
5780 QERApp_ReloadShaders();
5782 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5783 Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
5784 Sys_UpdateWindows (W_ALL);
5788 void MainFrame::OnTexturesShadersShow()
5790 g_PrefsDlg.m_bShowShaders ^= 1;
5791 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
5792 g_bIgnoreCommands++;
5793 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
5794 g_bIgnoreCommands--;
5795 Sys_UpdateWindows(W_TEXTURE);
5798 void MainFrame::SetTextureScale(int id)
5804 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5805 g_PrefsDlg.m_nTextureScale = 10;
5806 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_10"));
5808 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5809 g_PrefsDlg.m_nTextureScale = 25;
5810 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_25"));
5812 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5813 g_PrefsDlg.m_nTextureScale = 50;
5814 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_50"));
5816 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5817 g_PrefsDlg.m_nTextureScale = 200;
5818 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_200"));
5821 g_PrefsDlg.m_nTextureScale = 100;
5822 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_100"));
5826 g_bIgnoreCommands++;
5827 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5828 g_bIgnoreCommands--;
5830 Texture_ResetPosition();
5833 void MainFrame::OnTexturewindowScaleup()
5835 switch(g_PrefsDlg.m_nTextureScale) {
5836 // 200, all the way in, don't do anything
5838 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_200);
5841 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5844 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5847 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5852 void MainFrame::OnTexturewindowScaledown()
5854 switch(g_PrefsDlg.m_nTextureScale) {
5856 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5859 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5862 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5865 SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_10);
5867 // 10, all the way out, don't do anything
5871 void MainFrame::OnTexturesLoadlist()
5873 DoTextureListDlg ();
5876 void MainFrame::OnTexturesShaderlistonly()
5878 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5879 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget),"menu_textures_shaderlistonly"));
5880 g_bIgnoreCommands++;
5881 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
5882 g_bIgnoreCommands--;
5886 void MainFrame::OnTextureWad(unsigned int nID)
5889 Texture_ShowDirectory (nID);
5890 Sys_UpdateWindows (W_ALL);
5894 void MainFrame::OnMiscBenchmark()
5896 m_pCamWnd->BenchMark();
5899 void MainFrame::OnColorSetoriginal()
5901 for (int i=0 ; i<3 ; i++)
5903 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5904 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5905 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5906 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5907 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5911 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5912 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5913 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5915 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5916 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5917 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5920 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5921 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5922 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5924 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5925 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5926 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5928 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5929 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5930 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5932 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5933 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5936 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5937 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5938 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5941 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5942 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5945 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5946 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5948 Sys_UpdateWindows (W_ALL);
5951 void MainFrame::OnColorSetqer()
5953 for (int i=0 ; i<3 ; i++)
5955 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5957 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5958 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5962 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5963 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5964 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5966 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5967 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5968 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5970 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5971 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5972 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5974 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5975 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5976 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5978 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5979 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5980 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5982 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5983 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5984 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5986 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5987 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5988 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5990 Sys_UpdateWindows (W_ALL);
5993 void MainFrame::OnColorSetblack()
5995 for (int i=0 ; i<3 ; i++)
5997 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5998 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5999 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
6000 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6003 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
6004 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
6005 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
6007 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
6008 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
6009 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6011 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
6012 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
6013 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
6015 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6016 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6017 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6019 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6020 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6021 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6023 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
6024 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
6025 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
6027 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
6028 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
6029 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
6031 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6032 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6033 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6035 Sys_UpdateWindows (W_ALL);
6038 /* ydnar: to emulate maya/max/lightwave color schemes */
6039 void MainFrame::OnColorSetydnar()
6041 for (int i=0 ; i<3 ; i++)
6043 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6044 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
6045 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
6046 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
6047 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6050 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
6051 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
6052 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6054 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
6055 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
6056 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
6058 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6059 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6060 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6062 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6063 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6064 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6066 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6067 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6068 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6070 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6071 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6072 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6074 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6075 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6076 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6078 Sys_UpdateWindows (W_ALL);
6081 void MainFrame::OnTexturebk()
6083 DoColor(COLOR_TEXTUREBACK);
6084 Sys_UpdateWindows (W_ALL);
6087 void MainFrame::OnColorsXybk()
6089 DoColor(COLOR_GRIDBACK);
6090 Sys_UpdateWindows (W_ALL);
6093 void MainFrame::OnColorsMajor()
6095 DoColor(COLOR_GRIDMAJOR);
6096 Sys_UpdateWindows (W_ALL);
6099 void MainFrame::OnColorsMinor()
6101 DoColor(COLOR_GRIDMINOR);
6102 Sys_UpdateWindows (W_ALL);
6105 void MainFrame::OnColorsMajor_Alt()
6107 DoColor(COLOR_GRIDMAJOR_ALT);
6108 Sys_UpdateWindows (W_ALL);
6111 void MainFrame::OnColorsMinor_Alt()
6113 DoColor(COLOR_GRIDMINOR_ALT);
6114 Sys_UpdateWindows (W_ALL);
6117 void MainFrame::OnColorsGridtext()
6119 DoColor(COLOR_GRIDTEXT);
6120 Sys_UpdateWindows (W_ALL);
6123 void MainFrame::OnColorsGridblock()
6125 DoColor(COLOR_GRIDBLOCK);
6126 Sys_UpdateWindows (W_ALL);
6129 void MainFrame::OnColorsCameraBack()
6131 DoColor(COLOR_CAMERABACK);
6132 Sys_UpdateWindows (W_ALL);
6135 void MainFrame::OnColorsBrush()
6137 DoColor(COLOR_BRUSHES);
6138 Sys_UpdateWindows (W_ALL);
6141 void MainFrame::OnColorsSelectedbrush()
6143 DoColor(COLOR_SELBRUSHES);
6144 Sys_UpdateWindows (W_ALL);
6147 void MainFrame::OnColorsSelectedbrush3D()
6149 DoColor(COLOR_SELBRUSHES3D);
6150 Sys_UpdateWindows (W_ALL);
6153 void MainFrame::OnColorsClipper()
6155 DoColor(COLOR_CLIPPER);
6156 Sys_UpdateWindows (W_ALL);
6159 void MainFrame::OnColorsViewname()
6161 DoColor(COLOR_VIEWNAME);
6162 Sys_UpdateWindows (W_ALL);
6165 void MainFrame::OnMiscGamma()
6167 float fSave = g_qeglobals.d_savedinfo.fGamma;
6169 if (fSave != g_qeglobals.d_savedinfo.fGamma)
6171 gtk_MessageBox(m_pWidget, "You must restart Radiant for Gamma settings to take effect.");
6174 void MainFrame::OnMiscFindbrush()
6179 void MainFrame::OnMiscNextleakspot()
6184 void MainFrame::OnMiscPreviousleakspot()
6189 void MainFrame::OnMiscPrintxy()
6194 void MainFrame::OnMiscSelectentitycolor()
6198 CString strColor = ValueForKey(edit_entity, "_color");
6199 if (strColor.GetLength() > 0)
6202 int n = sscanf(strColor,"%f %f %f", &fR, &fG, &fB);
6205 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6206 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6207 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6211 if (inspector_mode == W_ENTITY && (DoColor(COLOR_ENTITY)))
6214 sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6215 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6216 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
6218 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntValueField]), buffer);
6219 gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntKeyField]), "_color");
6221 //DK - SOF change to get color to entity quickly
6222 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6223 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6226 Sys_UpdateWindows( W_ALL );
6230 void MainFrame::OnConvertcurves()
6234 for (brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
6238 for (face_t* f = pb->brush_faces ; f ; f=f->next)
6240 if (f->texdef.contents & CONTENTS_LADDER)
6242 f->texdef.contents &= ~CONTENTS_LADDER;
6243 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6248 Map_BuildBrushData();
6252 void MainFrame::OnRegionOff()
6257 void MainFrame::OnRegionSetxy()
6262 void MainFrame::OnRegionSettallbrush()
6264 Map_RegionTallBrush ();
6267 void MainFrame::OnRegionSetbrush()
6272 void MainFrame::OnRegionSetselection()
6274 Map_RegionSelectedBrushes ();
6277 void MainFrame::OnBrush3sided()
6279 Undo_Start("3 sided");
6280 Undo_AddBrushList(&selected_brushes);
6282 Undo_EndBrushList(&selected_brushes);
6286 void MainFrame::OnBrush4sided()
6288 Undo_Start("4 sided");
6289 Undo_AddBrushList(&selected_brushes);
6291 Undo_EndBrushList(&selected_brushes);
6295 void MainFrame::OnBrush5sided()
6297 Undo_Start("5 sided");
6298 Undo_AddBrushList(&selected_brushes);
6300 Undo_EndBrushList(&selected_brushes);
6304 void MainFrame::OnBrush6sided()
6306 Undo_Start("6 sided");
6307 Undo_AddBrushList(&selected_brushes);
6309 Undo_EndBrushList(&selected_brushes);
6313 void MainFrame::OnBrush7sided()
6315 Undo_Start("7 sided");
6316 Undo_AddBrushList(&selected_brushes);
6318 Undo_EndBrushList(&selected_brushes);
6322 void MainFrame::OnBrush8sided()
6324 Undo_Start("8 sided");
6325 Undo_AddBrushList(&selected_brushes);
6327 Undo_EndBrushList(&selected_brushes);
6331 void MainFrame::OnBrush9sided()
6333 Undo_Start("9 sided");
6334 Undo_AddBrushList(&selected_brushes);
6336 Undo_EndBrushList(&selected_brushes);
6340 void MainFrame::OnBrushArbitrarysided()
6342 Undo_Start("arbitrary sided");
6343 Undo_AddBrushList(&selected_brushes);
6345 Undo_EndBrushList(&selected_brushes);
6349 void MainFrame::OnBrushMakecone()
6351 Undo_Start("make cone");
6352 Undo_AddBrushList(&selected_brushes);
6354 Undo_EndBrushList(&selected_brushes);
6358 void MainFrame::OnBrushPrimitivesSphere()
6360 Undo_Start("make sphere");
6361 Undo_AddBrushList(&selected_brushes);
6363 DoSides(false, true);
6365 Undo_EndBrushList(&selected_brushes);
6369 void MainFrame::OnCurvePatchtube()
6371 Undo_Start("make curve cylinder");
6372 Undo_AddBrushList(&selected_brushes);
6373 Patch_BrushToMesh(false);
6374 Sys_UpdateWindows (W_ALL);
6375 Undo_EndBrushList(&selected_brushes);
6379 void MainFrame::OnCurvePatchdensetube()
6381 Undo_Start("dense cylinder");
6382 Undo_AddBrushList(&selected_brushes);
6384 Patch_BrushToMesh(false);
6385 OnCurveInsertAddrow();
6386 Sys_UpdateWindows (W_ALL);
6388 Undo_EndBrushList(&selected_brushes);
6392 void MainFrame::OnCurvePatchverydensetube()
6394 Undo_Start("very dense cylinder");
6395 Undo_AddBrushList(&selected_brushes);
6397 Patch_BrushToMesh(false);
6398 OnCurveInsertAddrow();
6399 OnCurveInsertInsertrow();
6400 OnCurveInsertAddrow();
6401 Sys_UpdateWindows (W_ALL);
6403 Undo_EndBrushList(&selected_brushes);
6407 void MainFrame::OnCurvePatchsquare()
6409 Undo_Start("square cylinder");
6410 Undo_AddBrushList(&selected_brushes);
6412 Patch_BrushToMesh(false, false, false, true);
6413 Sys_UpdateWindows (W_ALL);
6415 Undo_EndBrushList(&selected_brushes);
6419 void MainFrame::OnCurvePatchendcap()
6421 Undo_Start("make end cap");
6422 Undo_AddBrushList(&selected_brushes);
6423 Patch_BrushToMesh(false, false, true);
6424 Sys_UpdateWindows (W_ALL);
6425 Undo_EndBrushList(&selected_brushes);
6429 void MainFrame::OnCurvePatchbevel()
6431 Undo_Start("make bevel");
6432 Undo_AddBrushList(&selected_brushes);
6433 Patch_BrushToMesh(false, true, false);
6434 Sys_UpdateWindows (W_ALL);
6435 Undo_EndBrushList(&selected_brushes);
6439 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel()
6441 Undo_Start("square bevel");
6442 Undo_AddBrushList(&selected_brushes);
6444 Patch_BrushToMesh(false, true, false, true);
6445 Sys_UpdateWindows (W_ALL);
6447 Undo_EndBrushList(&selected_brushes);
6451 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap()
6453 Undo_Start("square endcap");
6454 Undo_AddBrushList(&selected_brushes);
6456 Patch_BrushToMesh(false, false, true, true);
6457 Sys_UpdateWindows (W_ALL);
6459 Undo_EndBrushList(&selected_brushes);
6463 void MainFrame::OnCurvePatchcone()
6465 Undo_Start("make curve cone");
6466 Undo_AddBrushList(&selected_brushes);
6467 Patch_BrushToMesh(true);
6468 Sys_UpdateWindows (W_ALL);
6469 Undo_EndBrushList(&selected_brushes);
6473 void MainFrame::OnCurveSimplepatchmesh()
6475 Undo_Start("make simpe patch mesh");
6476 Undo_AddBrushList(&selected_brushes);
6478 Undo_EndBrushList(&selected_brushes);
6482 void MainFrame::OnCurveInsertInsertcolumn()
6484 Undo_Start("insert (2) columns");
6485 Undo_AddBrushList(&selected_brushes);
6486 Patch_AdjustSelected(true, true, false);
6487 Sys_UpdateWindows(W_ALL);
6488 Undo_EndBrushList(&selected_brushes);
6492 void MainFrame::OnCurveInsertAddcolumn()
6494 Undo_Start("add (2) columns");
6495 Undo_AddBrushList(&selected_brushes);
6496 Patch_AdjustSelected(true, true, true);
6497 Sys_UpdateWindows(W_ALL);
6498 Undo_EndBrushList(&selected_brushes);
6502 void MainFrame::OnCurveInsertInsertrow()
6504 Undo_Start("insert (2) rows");
6505 Undo_AddBrushList(&selected_brushes);
6506 Patch_AdjustSelected(true, false, false);
6507 Sys_UpdateWindows(W_ALL);
6508 Undo_EndBrushList(&selected_brushes);
6512 void MainFrame::OnCurveInsertAddrow()
6514 Undo_Start("add (2) rows");
6515 Undo_AddBrushList(&selected_brushes);
6516 Patch_AdjustSelected(true, false, true);
6517 Sys_UpdateWindows(W_ALL);
6518 Undo_EndBrushList(&selected_brushes);
6522 void MainFrame::OnCurveDeleteFirstcolumn()
6524 Undo_Start("delete first (2) columns");
6525 Undo_AddBrushList(&selected_brushes);
6526 Patch_AdjustSelected(false, true, true);
6527 Sys_UpdateWindows(W_ALL);
6528 Undo_EndBrushList(&selected_brushes);
6532 void MainFrame::OnCurveDeleteLastcolumn()
6534 Undo_Start("delete last (2) columns");
6535 Undo_AddBrushList(&selected_brushes);
6536 Patch_AdjustSelected(false, true, false);
6537 Sys_UpdateWindows(W_ALL);
6538 Undo_EndBrushList(&selected_brushes);
6542 void MainFrame::OnCurveDeleteFirstrow()
6544 Undo_Start("delete first (2) rows");
6545 Undo_AddBrushList(&selected_brushes);
6546 Patch_AdjustSelected(false, false, true);
6547 Sys_UpdateWindows(W_ALL);
6548 Undo_EndBrushList(&selected_brushes);
6552 void MainFrame::OnCurveDeleteLastrow()
6554 Undo_Start("delete last (2) rows");
6555 Undo_AddBrushList(&selected_brushes);
6556 Patch_AdjustSelected(false, false, false);
6557 Sys_UpdateWindows(W_ALL);
6558 Undo_EndBrushList(&selected_brushes);
6562 void MainFrame::OnCurveNegative()
6564 Patch_ToggleInverted();
6565 //Sys_UpdateWindows(W_ALL);
6568 void MainFrame::OnCurveRedisperseRows()
6570 Undo_Start("redisperse rows");
6571 Undo_AddBrushList(&selected_brushes);
6572 Patch_DisperseRows();
6573 Sys_UpdateWindows (W_ALL);
6574 Undo_EndBrushList(&selected_brushes);
6578 void MainFrame::OnCurveRedisperseIntermediateCols()
6580 Undo_Start("redisperse im cols");
6581 Undo_AddBrushList(&selected_brushes);
6582 Patch_DisperseIntermediateColumns();
6583 Sys_UpdateWindows (W_ALL);
6584 Undo_EndBrushList(&selected_brushes);
6588 void MainFrame::OnCurveRedisperseIntermediateRows()
6590 Undo_Start("redisperse im rows");
6591 Undo_AddBrushList(&selected_brushes);
6592 Patch_DisperseIntermediateRows();
6593 Sys_UpdateWindows (W_ALL);
6594 Undo_EndBrushList(&selected_brushes);
6598 void MainFrame::OnCurveMatrixTranspose()
6601 Sys_UpdateWindows (W_ALL);
6604 void MainFrame::OnCurveCap()
6607 Sys_UpdateWindows (W_ALL);
6610 void MainFrame::OnCurveCyclecap()
6612 Patch_CycleCapSelected();
6613 Sys_UpdateWindows (W_ALL);
6616 void MainFrame::OnCurveOverlaySet()
6618 Patch_SetOverlays();
6619 Sys_UpdateWindows(W_ALL);
6622 void MainFrame::OnCurveOverlayClear()
6624 Patch_ClearOverlays();
6625 Sys_UpdateWindows(W_ALL);
6628 void MainFrame::OnCurveThicken()
6630 Undo_Start("curve thicken");
6631 Undo_AddBrushList(&selected_brushes);
6633 Undo_EndBrushList(&selected_brushes);
6638 this can no longer be trigger manually from the menu
6639 happens only once at startup
6641 void MainFrame::OnPluginsRefresh()
6647 // open the Q3Rad manual
6648 void MainFrame::OnHelp()
6650 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6652 help = g_strAppPath;
6653 help += "Q3Rad_Manual/index.htm";
6654 OpenURL(help.GetBuffer());
6657 // FIXME: we'll go towards a unified help thing soon
6658 void MainFrame::OnHelpLinks()
6661 link = g_strAppPath;
6662 link += "links.htm";
6663 OpenURL(link.GetBuffer());
6666 void MainFrame::OnHelpBugreport()
6668 OpenURL("http://www.qeradiant.com/faq/fom-serve/cache/138.html");
6671 void MainFrame::OnHelpCommandlist()
6673 DoCommandListDlg ();
6676 void MainFrame::OnHelpAbout()
6681 void MainFrame::OnPopupSelection()
6683 GtkWidget *menu, *item;
6684 char *labels[] = { "Select Complete Tall", "Select Touching", "Select Partial Tall", "Select Inside"};
6685 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6686 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6688 menu = gtk_menu_new ();
6690 for (int i = 0; i < 4; i++)
6692 item = gtk_menu_item_new_with_label (labels[i]);
6693 gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (HandleCommand),
6694 GINT_TO_POINTER (ids[i]));
6695 gtk_widget_show (item);
6696 gtk_menu_append (GTK_MENU (menu), item);
6699 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6702 void MainFrame::OnViewChange()
6705 //HandlePopup(this, IDR_POPUP_VIEW);
6708 void MainFrame::OnTexturesPopup()
6710 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "render_quality_menu");
6711 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6714 void MainFrame::ToggleCamera()
6717 m_bCamPreview = false;
6719 m_bCamPreview = true;
6722 void MainFrame::OnViewCameraupdate()
6724 Sys_UpdateWindows(W_CAMERA);
6727 void MainFrame::OnSelectMouserotate()
6729 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mouserotate"));
6730 g_bIgnoreCommands++;
6734 if (ActiveXY()->ClipMode())
6736 if (ActiveXY()->RotateMode())
6738 // SetRotateMode(false) always works
6739 ActiveXY()->SetRotateMode(false);
6740 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6743 // may not work if no brush selected, see return value
6744 if (ActiveXY()->SetRotateMode(true))
6745 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6747 // if MFC called, we need to set back to FALSE ourselves
6748 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6751 g_bIgnoreCommands--;
6754 void MainFrame::OnSelectMousescale()
6756 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mousescale"));
6757 g_bIgnoreCommands++;
6761 if (ActiveXY()->ClipMode())
6763 if (ActiveXY()->RotateMode())
6765 // SetRotateMode(false) always works
6766 ActiveXY()->SetRotateMode(false);
6767 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6769 if (ActiveXY()->ScaleMode())
6771 ActiveXY()->SetScaleMode(false);
6772 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6775 ActiveXY()->SetScaleMode(true);
6776 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6779 g_bIgnoreCommands--;
6782 void MainFrame::OnScalelockx()
6784 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockx"));
6785 g_bIgnoreCommands++;
6787 if (g_nScaleHow & SCALE_X)
6789 g_nScaleHow ^= SCALE_X;
6790 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6793 g_nScaleHow |= SCALE_X;
6794 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6796 g_bIgnoreCommands--;
6799 void MainFrame::OnScalelocky()
6801 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelocky"));
6802 g_bIgnoreCommands++;
6804 if (g_nScaleHow & SCALE_Y)
6806 g_nScaleHow ^= SCALE_Y;
6807 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6810 g_nScaleHow |= SCALE_Y;
6811 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6813 g_bIgnoreCommands--;
6816 void MainFrame::OnScalelockz()
6818 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockz"));
6819 g_bIgnoreCommands++;
6821 if (g_nScaleHow & SCALE_Z)
6823 g_nScaleHow ^= SCALE_Z;
6824 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6827 g_nScaleHow |= SCALE_Z;
6828 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6830 g_bIgnoreCommands--;
6833 void MainFrame::OnDontselectcurve()
6835 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
6836 g_bIgnoreCommands++;
6837 g_PrefsDlg.m_bSelectCurves ^= 1;
6838 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
6839 g_bIgnoreCommands--;
6842 void MainFrame::OnPatchToggleBox()
6844 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
6845 g_bIgnoreCommands++;
6846 g_bPatchShowBounds ^= 1;
6847 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
6848 g_bIgnoreCommands--;
6849 Sys_UpdateWindows(W_ALL);
6852 void MainFrame::OnPatchWireframe()
6854 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_wireframe"));
6855 g_bIgnoreCommands++;
6856 g_bPatchWireFrame ^= 1;
6857 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWireFrame) ? TRUE : FALSE);
6858 g_bIgnoreCommands--;
6859 Sys_UpdateWindows(W_ALL);
6862 void MainFrame::OnPatchBend()
6864 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
6865 g_bIgnoreCommands++;
6867 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
6868 g_bIgnoreCommands--;
6869 Sys_UpdateWindows(W_ALL);
6872 void MainFrame::OnPatchWeld()
6874 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
6875 g_bIgnoreCommands++;
6877 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
6878 g_bIgnoreCommands--;
6879 Sys_UpdateWindows(W_ALL);
6882 void MainFrame::OnPatchDrilldown()
6884 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
6885 g_bIgnoreCommands++;
6886 g_bPatchDrillDown ^= 1;
6887 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
6888 g_bIgnoreCommands--;
6889 Sys_UpdateWindows(W_ALL);
6892 void MainFrame::OnShowEntities()
6894 gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "view_entitiesas_menu"); // use pointer to existing menu object
6895 gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6898 void MainFrame::OnDropGroupName()
6901 char* name = DoNameDlg ("Name Selection");
6906 Sys_UpdateWindows (W_ALL);
6912 void MainFrame::OnDropGroupNewgroup()
6917 void MainFrame::OnDropGroupRemove()
6920 Select_AddToGroup("World");
6921 Sys_UpdateWindows (W_ALL);
6925 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6926 void MainFrame::OnFaceFit()
6931 void MainFrame::OnDontselectmodel()
6933 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
6934 g_bIgnoreCommands++;
6935 g_PrefsDlg.m_bSelectModels ^= 1;
6936 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
6937 g_bIgnoreCommands--;
6940 void MainFrame::OnViewTexture()
6942 if (FloatingGroupDialog()) // QE4 style
6944 if (inspector_mode == W_TEXTURE)
6946 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
6947 widget_delete_hide (g_qeglobals_gui.d_entity);
6949 gtk_widget_show (g_qeglobals_gui.d_entity);
6952 gtk_widget_show (g_qeglobals_gui.d_entity);
6953 SetInspectorMode (W_TEXTURE);
6958 void MainFrame::OnPatchInspector()
6960 TogglePatchInspector();
6963 void MainFrame::OnCurveNegativeTextureX()
6965 Patch_InvertTexture(false);
6966 //Sys_UpdateWindows(W_ALL);
6969 void MainFrame::OnCurveNegativeTextureY()
6971 Patch_InvertTexture(true);
6972 //Sys_UpdateWindows(W_ALL);
6975 void MainFrame::OnCurveInsertcolumn()
6977 if (&selected_brushes == selected_brushes.next)
6979 Undo_Start("insert colum");
6980 Undo_AddBrushList(&selected_brushes);
6981 //Patch_AdjustSelectedRowCols(0, 2);
6982 Patch_AdjustSelected(true, true, true);
6983 Sys_UpdateWindows(W_ALL);
6984 Undo_EndBrushList(&selected_brushes);
6988 void MainFrame::OnCurveInsertrow()
6990 if (&selected_brushes == selected_brushes.next)
6992 Undo_Start("insert row");
6993 Undo_AddBrushList(&selected_brushes);
6994 //Patch_AdjustSelectedRowCols(2, 0);
6995 Patch_AdjustSelected(true, false, true);
6996 Sys_UpdateWindows(W_ALL);
6997 Undo_EndBrushList(&selected_brushes);
7001 void MainFrame::OnCurveDeletecolumn()
7003 if (&selected_brushes == selected_brushes.next)
7005 Undo_Start("delete column");
7006 Undo_AddBrushList(&selected_brushes);
7007 Patch_AdjustSelected(false, true, true);
7008 Sys_UpdateWindows(W_ALL);
7009 Undo_EndBrushList(&selected_brushes);
7013 void MainFrame::OnCurveDeleterow()
7015 if (&selected_brushes == selected_brushes.next)
7017 Undo_Start("delete row");
7018 Undo_AddBrushList(&selected_brushes);
7019 Patch_AdjustSelected(false, false, true);
7020 Sys_UpdateWindows(W_ALL);
7021 Undo_EndBrushList(&selected_brushes);
7025 void MainFrame::OnPatchTab()
7027 if (g_bPatchBendMode)
7028 Patch_BendHandleTAB();
7029 // else if (g_bPatchInsertMode)
7030 // Patch_InsDelHandleTAB();
7033 // check to see if the selected brush is part of a func group
7034 // if it is, deselect everything and reselect the next brush
7036 brush_t *b2, *b = selected_brushes.next;
7038 if (b != &selected_brushes)
7040 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7044 for (b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext)
7052 if (b2 == &e->brushes)
7055 Select_Brush(b2, false);
7056 Sys_UpdateWindows(W_ALL);
7062 void MainFrame::OnCameraForward(bool keydown)
7064 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7068 VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7069 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7070 Sys_UpdateWindows (nUpdate);
7075 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7077 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7081 void MainFrame::OnCameraBack(bool keydown)
7083 if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7087 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7088 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7089 Sys_UpdateWindows (nUpdate);
7094 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7096 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7100 void MainFrame::OnCameraLeft(bool keydown)
7104 if (m_pCamWnd->m_bFreeMove)
7106 OnCameraStrafeleft(keydown);
7111 if (g_PrefsDlg.m_bCamDiscrete)
7115 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7116 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7117 Sys_UpdateWindows (nUpdate);
7122 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7124 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7128 void MainFrame::OnCameraRight(bool keydown)
7132 if (m_pCamWnd->m_bFreeMove)
7134 OnCameraStraferight(keydown);
7139 if (g_PrefsDlg.m_bCamDiscrete)
7143 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7144 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7145 Sys_UpdateWindows (nUpdate);
7150 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7152 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7156 void MainFrame::OnCameraUp()
7158 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7159 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7160 Sys_UpdateWindows (nUpdate);
7163 void MainFrame::OnCameraDown()
7165 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7166 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7167 Sys_UpdateWindows (nUpdate);
7170 void MainFrame::OnCameraAngleup()
7172 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
7173 if (m_pCamWnd->Camera()->angles[0] > 85)
7174 m_pCamWnd->Camera()->angles[0] = 85;
7175 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7178 void MainFrame::OnCameraAngledown()
7180 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7181 if (m_pCamWnd->Camera()->angles[0] < -85)
7182 m_pCamWnd->Camera()->angles[0] = -85;
7183 Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7186 void MainFrame::OnCameraStrafeleft(bool keydown)
7188 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7191 if (!m_pCamWnd->m_bFreeMove)
7195 VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7196 int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7197 Sys_UpdateWindows (nUpdate);
7204 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7206 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7209 void MainFrame::OnCameraStraferight(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_STRAFERIGHT;
7229 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7232 void MainFrame::OnGridToggle()
7234 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7235 Sys_UpdateWindows (W_XY|W_Z);
7238 void MainFrame::OnViewCrosshair()
7241 Sys_UpdateWindows (W_XY);
7244 void MainFrame::OnSelectionTextureRotateclock()
7246 Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7249 void MainFrame::OnSelectionTextureRotatecounter()
7251 Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7254 void MainFrame::OnSelectionTextureScaleup()
7256 Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7259 void MainFrame::OnSelectionTextureScaledown()
7261 Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7264 void MainFrame::OnSelectionTextureScaleLeft()
7266 Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7269 void MainFrame::OnSelectionTextureScaleRight()
7271 Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7274 void MainFrame::OnSelectionTextureShiftleft()
7276 Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7279 void MainFrame::OnSelectionTextureShiftright()
7281 Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7284 void MainFrame::OnSelectionTextureShiftup()
7286 Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7289 void MainFrame::OnSelectionTextureShiftdown()
7291 Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7294 void MainFrame::OnGridPrev()
7297 if (g_qeglobals.d_gridsize == 1)
7299 g_qeglobals.d_gridsize = 0.5;
7300 g_qeglobals.d_bSmallGrid = true;
7301 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7302 } else if (g_qeglobals.d_gridsize == 0.5)
7304 g_qeglobals.d_gridsize = 0.25;
7305 g_qeglobals.d_bSmallGrid = true;
7306 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7307 } else if (g_qeglobals.d_gridsize > 1)
7309 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7310 g_qeglobals.d_bSmallGrid = false;
7312 switch ((int)g_qeglobals.d_gridsize)
7314 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7315 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7316 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7317 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7318 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7319 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7320 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7321 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7322 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7328 // SnapTToGrid option: need to check everywhere the grid size is changed
7329 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7330 if (g_PrefsDlg.m_bSnapTToGrid)
7334 g_bIgnoreCommands++;
7335 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7336 g_bIgnoreCommands--;
7338 Sys_UpdateWindows(W_XY | W_Z);
7341 void MainFrame::OnGridNext()
7344 if (g_qeglobals.d_gridsize == 0.25)
7346 g_qeglobals.d_gridsize = 0.5;
7347 g_qeglobals.d_bSmallGrid = true;
7348 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7349 } else if (g_qeglobals.d_gridsize == 0.5)
7351 g_qeglobals.d_gridsize = 1;
7352 g_qeglobals.d_bSmallGrid = false;
7353 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7354 } else if (g_qeglobals.d_gridsize < 256)
7356 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7357 g_qeglobals.d_bSmallGrid = false;
7359 switch ((int)g_qeglobals.d_gridsize)
7361 case 1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7362 case 2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7363 case 4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7364 case 8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7365 case 16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7366 case 32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7367 case 64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7368 case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7369 case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7375 // SnapTToGrid option: need to check everywhere the grid size is changed
7376 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7377 if (g_PrefsDlg.m_bSnapTToGrid)
7381 g_bIgnoreCommands++;
7382 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7383 g_bIgnoreCommands--;
7385 Sys_UpdateWindows(W_XY | W_Z);
7388 void MainFrame::OnSelectionMovedown()
7390 if (&selected_brushes == selected_brushes.next)
7392 Undo_Start("move down");
7393 Undo_AddBrushList(&selected_brushes);
7396 vAmt[0] = vAmt[1] = 0.0;
7397 vAmt[2] = -g_qeglobals.d_gridsize;
7399 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7401 Undo_EndBrushList(&selected_brushes);
7405 void MainFrame::OnSelectionMoveup()
7407 if (&selected_brushes == selected_brushes.next)
7409 Undo_Start("move up");
7410 Undo_AddBrushList(&selected_brushes);
7413 vAmt[0] = vAmt[1] = 0.0;
7414 vAmt[2] = g_qeglobals.d_gridsize;
7416 Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7418 Undo_EndBrushList(&selected_brushes);
7422 void MainFrame::OnSelectionPrint()
7424 for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7428 void MainFrame::OnSelectionTogglesizepaint()
7430 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7431 Sys_UpdateWindows(W_XY);
7434 void MainFrame::OnPatchNaturalize()
7436 Patch_NaturalizeSelected();
7437 Sys_UpdateWindows (W_ALL);
7440 void MainFrame::OnSnapToGrid()
7442 if (&selected_brushes == selected_brushes.next)
7444 Undo_Start("snap selection to grid");
7445 Undo_AddBrushList(&selected_brushes);
7446 //Select_SnapToGrid();
7447 for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7450 Patch_SnapToGrid(pb->pPatch);
7452 Brush_SnapToGrid(pb);
7454 Sys_UpdateWindows (W_ALL);
7455 Undo_EndBrushList(&selected_brushes);
7459 void MainFrame::OnSelectAll()
7464 void MainFrame::OnSelectionInvert()
7467 Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7471 void PerformFiltering ()
7475 // spog - deletes old filters list and creates new one when
7476 // g_qeglobals.d_savedinfo.exclude is updated
7477 g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
7478 g_qeglobals.d_savedinfo.filters = FilterUpdate(g_qeglobals.d_savedinfo.filters);
7480 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7481 brush->bFiltered = FilterBrush( brush );
7483 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7484 brush->bFiltered = FilterBrush( brush );
7487 void MainFrame::OnFilterAreaportals()
7489 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7490 g_bIgnoreCommands++;
7491 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7492 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7494 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7495 g_bIgnoreCommands--;
7497 Sys_UpdateWindows (W_XY|W_CAMERA);
7500 void MainFrame::OnFilterCaulk()
7502 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7503 g_bIgnoreCommands++;
7504 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7505 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7507 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7508 g_bIgnoreCommands--;
7510 Sys_UpdateWindows (W_XY|W_CAMERA);
7513 void MainFrame::OnFilterClips()
7515 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7516 g_bIgnoreCommands++;
7517 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7518 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7520 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7521 g_bIgnoreCommands--;
7523 Sys_UpdateWindows (W_XY|W_CAMERA);
7526 void MainFrame::OnFilterBotClips()
7528 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7529 g_bIgnoreCommands++;
7530 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7531 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7533 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7534 g_bIgnoreCommands--;
7536 Sys_UpdateWindows (W_XY|W_CAMERA);
7539 void MainFrame::OnFilterStructural()
7541 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7542 g_bIgnoreCommands++;
7543 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7544 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7546 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7547 g_bIgnoreCommands--;
7549 Sys_UpdateWindows (W_XY|W_CAMERA);
7552 void MainFrame::OnFilterDetails()
7554 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7555 g_bIgnoreCommands++;
7556 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7557 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7559 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7560 g_bIgnoreCommands--;
7562 Sys_UpdateWindows (W_XY|W_CAMERA);
7565 void MainFrame::OnFilterEntities()
7567 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7568 g_bIgnoreCommands++;
7569 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7570 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7572 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7573 g_bIgnoreCommands--;
7575 Sys_UpdateWindows (W_XY|W_CAMERA);
7578 void MainFrame::OnFilterHintsskips()
7580 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7581 g_bIgnoreCommands++;
7582 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7583 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7585 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7586 g_bIgnoreCommands--;
7588 Sys_UpdateWindows (W_XY|W_CAMERA);
7591 void MainFrame::OnFilterLights()
7593 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7594 g_bIgnoreCommands++;
7595 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7596 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7598 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7599 g_bIgnoreCommands--;
7601 Sys_UpdateWindows (W_XY|W_CAMERA);
7604 void MainFrame::OnFilterLiquids()
7606 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7607 g_bIgnoreCommands++;
7608 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7609 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7611 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7612 g_bIgnoreCommands--;
7614 Sys_UpdateWindows (W_XY|W_CAMERA);
7617 void MainFrame::OnFilterModels()
7619 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7620 g_bIgnoreCommands++;
7621 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7622 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7624 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7625 g_bIgnoreCommands--;
7627 Sys_UpdateWindows (W_XY|W_CAMERA);
7630 void MainFrame::OnFilterPatches()
7632 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7633 g_bIgnoreCommands++;
7634 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7635 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7637 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7638 g_bIgnoreCommands--;
7640 Sys_UpdateWindows (W_XY|W_CAMERA);
7643 void MainFrame::OnFilterPaths()
7645 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7646 g_bIgnoreCommands++;
7647 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7648 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7650 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7651 g_bIgnoreCommands--;
7653 Sys_UpdateWindows (W_XY|W_CAMERA);
7656 void MainFrame::OnFilterClusterportals()
7658 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7659 g_bIgnoreCommands++;
7660 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7661 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7663 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7664 g_bIgnoreCommands--;
7666 Sys_UpdateWindows (W_XY|W_CAMERA);
7669 void MainFrame::OnFilterLightgrid()
7671 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7672 g_bIgnoreCommands++;
7673 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7674 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7676 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7677 g_bIgnoreCommands--;
7679 Sys_UpdateWindows (W_XY|W_CAMERA);
7682 void MainFrame::OnFilterTranslucent()
7684 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7685 g_bIgnoreCommands++;
7686 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7687 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7689 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7690 g_bIgnoreCommands--;
7692 Sys_UpdateWindows (W_XY|W_CAMERA);
7695 void MainFrame::OnFilterTriggers()
7697 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7698 g_bIgnoreCommands++;
7699 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7700 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7702 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7703 g_bIgnoreCommands--;
7705 Sys_UpdateWindows (W_XY|W_CAMERA);
7708 void MainFrame::OnFilterWorld()
7710 GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7711 g_bIgnoreCommands++;
7712 if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7713 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7715 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7716 g_bIgnoreCommands--;
7718 Sys_UpdateWindows (W_XY|W_CAMERA);
7728 // =============================================================================
7729 // leo: Unused functions, not called anywhere from the code (need to check)
7731 void MainFrame::OnViewConsole()
7733 if (FloatingGroupDialog()) // QE4 style
7735 if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7737 if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7738 widget_delete_hide (g_qeglobals_gui.d_entity);
7740 gtk_widget_show (g_qeglobals_gui.d_entity);
7743 gtk_widget_show (g_qeglobals_gui.d_entity);
7744 SetInspectorMode(W_CONSOLE);
7749 void MainFrame::OnCurveFreeze()
7754 void MainFrame::OnCurveUnFreeze()
7756 Patch_UnFreeze(false);
7759 void MainFrame::OnCurveUnFreezeAll()
7761 Patch_UnFreeze(true);
7764 void MainFrame::OnSelectReselect()
7769 void MainFrame::OnSelectionTextureFit()
7771 // TODO: Add your command handler code here
7774 void MainFrame::OnPatchEnter()
7779 void MainFrame::OnDropGroupAddtoWorld()
7782 Select_AddToGroup("World");
7783 Sys_UpdateWindows (W_ALL);