2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 // Main Window for Q3Radiant
25 // Leonardo Zide (leo@lokigames.com)
31 #include <gdk/gdkwin32.h>
32 #define COMPILE_MULTIMON_STUBS
37 #include <glib/gi18n.h>
38 #include <gdk/gdkkeysyms.h>
39 #include <gdk/gdkprivate.h>
41 #if defined ( __linux__ ) || defined ( __APPLE__ )
45 #include "groupdialog.h"
46 #include "patchdialog.h"
49 // use this to verbose what happens with the beyboard
55 CString g_strAppPath; ///< holds the full path of the executable
56 CString g_strDTDPath; ///< path to the DTD files
57 CString g_pidFile; ///< the global .pid file (only for global part of the startup)
58 CString g_pidGameFile; ///< the game-specific .pid file
59 CString g_strBitmapsPath; // directory where the bitmaps are stored
62 points to the game tools directory, for instance
63 C:\Program Files\Quake III Arena\GtkRadiant
65 this is one of the main variables that are configured by the game selection on startup
66 <g_strGameToolsPath>/plugins
67 <g_strGameToolsPath>/modules
70 CString g_strGameToolsPath; ///< this is set by g_PrefsDlg.mGamesDialog
71 CGameDescription *g_pGameDescription; ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
72 CString g_strPluginsDir; ///< name of plugins directory, always sub-directory of toolspath
73 CString g_strModulesDir; ///< name of modules directory, always sub-directory of toolspath
76 directory for temp files
77 NOTE: on *nix this is were we check for .pid
79 CString g_strTempPath;
80 MainFrame* g_pParentWnd = NULL; // used to precast to CMainFrame
81 PrefsDlg g_Preferences; // global prefs instance
82 PrefsDlg& g_PrefsDlg = g_Preferences; // reference used throughout
83 int g_nUpdateBits = 0; // window update flags
84 bool g_bScreenUpdates = true; // whether window painting is active, used in a few places
85 // to disable updates for speed reasons
86 // both of the above should be made members of CMainFrame
87 int g_bIgnoreCommands; // Used to ignore commands when checking menus/toolbars
88 GSList *g_BSPFrontendCommands; // List of commands in the BSP menu
90 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
91 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
93 extern bool g_bCrossHairs;
96 extern PatchDialog g_PatchDialog;
98 GtkAccelGroup* global_accel;
100 void Select_Ungroup();
102 // command mapping stuff
104 // m_strCommand is the command string
105 // m_nKey is the GDK_??? equivelant
106 // m_nModifiers are key states as follows
113 #define SPEED_MOVE 32
114 #define SPEED_TURN 22.5
116 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
117 // - if you add a command here and you don't want a menu item, use the "hidden" menu
118 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
119 SCommandInfo g_Commands[] =
121 {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
122 {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
123 {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
124 // {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
125 {"SelectFuncGroup", 'G', 0x00, ID_SELECT_FUNC_GROUP, "menu_select_func_group"},
126 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
127 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
128 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
129 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
130 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
131 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
132 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
133 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
134 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
135 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
136 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
137 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
138 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
139 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
140 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
141 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
142 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
143 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
144 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
145 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
146 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
147 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
148 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
149 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
150 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
151 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
152 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
153 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
154 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
155 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
156 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
157 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
158 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
159 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
160 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
161 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
162 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
163 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
164 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
165 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
166 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
167 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
168 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
169 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
170 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
171 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
172 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
173 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
174 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
175 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
176 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
177 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
178 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
179 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
180 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
181 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
182 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
183 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
184 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
185 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
186 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
187 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
188 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
189 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
190 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
191 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
192 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
193 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
194 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
195 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
196 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
197 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
198 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
199 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
200 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
201 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
202 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
203 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
204 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
205 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
206 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
207 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
208 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
209 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
210 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
211 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
212 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
213 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
214 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
215 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
216 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
217 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
218 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
219 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
220 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
221 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
222 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
223 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
224 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
225 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
226 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
227 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
228 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
229 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
230 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
231 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
232 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
233 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
234 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
235 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
236 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
237 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
238 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
239 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
240 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
241 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
242 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
243 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
244 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
245 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
246 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
247 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
248 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
249 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
250 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
251 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
252 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
253 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
254 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
255 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
256 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
257 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
258 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
259 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
260 {"FilterCaulk", '6', RAD_ALT, ID_FILTER_CAULK, "menu_filter_caulk"},
261 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
262 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
263 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
264 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
265 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
266 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
267 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
268 {"FilterStructural", 'D', RAD_CONTROL | RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
269 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
270 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
271 {"FilterTriggers", 'T', RAD_CONTROL | RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
272 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
273 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
274 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
277 int g_nCommandCount = sizeof( g_Commands ) / sizeof( SCommandInfo );
281 {"Space", GDK_space},
282 {"Backspace", GDK_BackSpace},
283 {"Escape", GDK_Escape},
285 {"Insert", GDK_Insert},
286 {"Delete", GDK_Delete},
287 {"PageUp", GDK_Prior},
288 {"PageDown", GDK_Next},
292 {"Right", GDK_Right},
306 {"Return", GDK_Return},
307 {"Comma", GDK_comma},
308 {"Period", GDK_period},
309 {"Plus", GDK_KP_Add},
310 {"Multiply", GDK_multiply},
311 {"Subtract", GDK_KP_Subtract},
312 {"NumPad0", GDK_KP_0},
313 {"NumPad1", GDK_KP_1},
314 {"NumPad2", GDK_KP_2},
315 {"NumPad3", GDK_KP_3},
316 {"NumPad4", GDK_KP_4},
317 {"NumPad5", GDK_KP_5},
318 {"NumPad6", GDK_KP_6},
319 {"NumPad7", GDK_KP_7},
320 {"NumPad8", GDK_KP_8},
321 {"NumPad9", GDK_KP_9},
328 int g_nKeyCount = sizeof( g_Keys ) / sizeof( SKeyInfo );
330 // =============================================================================
333 void WINAPI Sys_UpdateWindows( int nBits ){
334 g_nUpdateBits |= nBits;
337 // =============================================================================
340 // Gef: Separate handling for keyup events
341 void HandleKeyUp( GtkWidget *widget, gpointer data ){
342 int id = GPOINTER_TO_INT( data );
344 Sys_Printf( "HandleKeyUp: %d\n", id );
347 if ( g_bIgnoreCommands ) {
353 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward( FALSE ); break;
354 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack( FALSE ); break;
355 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft( FALSE ); break;
356 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight( FALSE ); break;
357 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft( FALSE ); break;
358 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight( FALSE ); break;
362 gint HandleCommand( GtkWidget *widget, gpointer data ){
363 int id = GPOINTER_TO_INT( data );
365 Sys_Printf( "HandleCommand %d\n", id );
368 if ( g_bIgnoreCommands ) {
370 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
375 if ( id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END ) {
376 g_pParentWnd->OnTextureWad( id );
378 else if ( id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END ) {
379 g_pParentWnd->OnBspCommand( id );
381 else if ( id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4 ) {
382 g_pParentWnd->OnMru( id );
384 else if ( id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE ) {
385 if ( GTK_CHECK_MENU_ITEM( widget )->active ) {
386 g_pParentWnd->OnViewNearest( id );
389 else if ( id >= ID_GRID_025 && id <= ID_GRID_256 ) {
390 g_pParentWnd->OnGrid( id );
392 else if ( id >= ID_PLUGIN_START && id <= ID_PLUGIN_END ) {
394 gtk_label_get( GTK_LABEL( GTK_BIN( widget )->child ), &str );
395 g_pParentWnd->OnPlugIn( id, str );
397 else if ( id >= ID_ENTITY_START && id <= ID_ENTITY_END ) {
399 gtk_label_get( GTK_LABEL( GTK_BIN( widget )->child ), &str );
400 g_pParentWnd->ActiveXY()->OnEntityCreate( str );
404 case ID_FILE_NEW: g_pParentWnd->OnFileNew(); break;
405 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
406 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen(); break;
407 case ID_FILE_SAVE: g_pParentWnd->OnFileSave(); break;
408 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas(); break;
409 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap(); break;
410 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion(); break;
411 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject(); break;
412 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject(); break;
413 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings(); break;
414 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile(); break;
415 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate(); break;
416 case ID_FILE_EXIT: g_pParentWnd->OnFileExit(); break;
417 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap(); break;
418 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo(); break;
419 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo(); break;
420 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush(); break;
421 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush(); break;
422 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera(); break;
423 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete(); break;
424 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo(); break;
425 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo(); break;
426 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts(); break;
427 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab(); break;
428 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab(); break;
429 case ID_PREFS: g_pParentWnd->OnPrefs(); break;
430 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera(); break;
431 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole(); break;
432 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity(); break;
433 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups(); break;
434 case ID_SELECT_FUNC_GROUP: g_pParentWnd->OnSelectFuncGroup(); break;
435 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview(); break;
436 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz(); break;
437 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz(); break;
438 case ID_TOGGLEZ: g_pParentWnd->OnTogglez(); break;
439 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter(); break;
440 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor(); break;
441 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor(); break;
442 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview(); break;
443 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview(); break;
444 case ID_VIEW_XY: g_pParentWnd->OnViewXy(); break;
445 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide(); break;
446 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront(); break;
447 case ID_VIEW_100: g_pParentWnd->OnView100(); break;
448 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin(); break;
449 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout(); break;
450 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100(); break;
451 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin(); break;
452 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout(); break;
453 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein(); break;
454 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout(); break;
455 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames(); break;
456 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks(); break;
457 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates(); break;
458 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline(); break;
459 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes(); break;
460 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone(); break;
461 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles(); break;
462 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected(); break;
463 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden(); break;
464 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
465 case ID_VIEW_ENTITIESAS_WIREFRAME:
466 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
467 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
468 case ID_VIEW_ENTITIESAS_SKINNED:
469 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
470 g_pParentWnd->OnEntitiesSetViewAs( id );
472 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping(); break;
473 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting(); break;
474 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges(); break;
475 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies(); break;
476 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone(); break;
477 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect(); break;
478 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx(); break;
479 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy(); break;
480 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz(); break;
481 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex(); break;
482 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey(); break;
483 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez(); break;
484 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation(); break;
485 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale(); break;
486 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow(); break;
487 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract(); break;
488 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge(); break;
489 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline(); break;
490 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle(); break;
491 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall(); break;
492 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching(); break;
493 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall(); break;
494 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside(); break;
495 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft(); break;
496 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright(); break;
497 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup(); break;
498 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown(); break;
499 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper(); break;
500 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected(); break;
501 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected(); break;
502 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip(); break;
503 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect(); break;
504 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity(); break;
505 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
506 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
507 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail(); break;
508 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural(); break;
509 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid(); break;
510 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse(); break;
511 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall(); break;
512 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector(); break;
513 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall(); break;
514 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock(); break;
515 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock(); break;
516 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad(); break;
517 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders(); break;
518 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow(); break;
519 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
520 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
521 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
522 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
523 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
524 g_pParentWnd->SetTextureScale( id );
526 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist(); break;
527 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly(); break;
528 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup(); break;
529 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown(); break;
530 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark(); break;
531 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal(); break;
532 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer(); break;
533 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack(); break;
534 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar(); break; /* ydnar */
535 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk(); break;
536 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk(); break;
537 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor(); break;
538 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor(); break;
539 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext(); break;
540 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock(); break;
541 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack(); break;
542 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush(); break;
543 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush(); break;
544 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D(); break;
545 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper(); break;
546 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname(); break;
547 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma(); break;
548 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush(); break;
549 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot(); break;
550 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot(); break;
551 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy(); break;
552 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor(); break;
553 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves(); break;
554 case ID_REGION_OFF: g_pParentWnd->OnRegionOff(); break;
555 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy(); break;
556 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush(); break;
557 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush(); break;
558 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection(); break;
559 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided(); break;
560 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided(); break;
561 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided(); break;
562 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided(); break;
563 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided(); break;
564 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided(); break;
565 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided(); break;
566 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided(); break;
567 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone(); break;
568 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere(); break;
569 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube(); break;
570 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube(); break;
571 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube(); break;
572 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare(); break;
573 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap(); break;
574 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel(); break;
575 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel(); break;
576 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap(); break;
577 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone(); break;
578 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh(); break;
579 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn(); break;
580 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn(); break;
581 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow(); break;
582 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow(); break;
583 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn(); break;
584 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn(); break;
585 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow(); break;
586 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow(); break;
587 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative(); break;
588 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows(); break;
589 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols(); break;
590 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows(); break;
591 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose(); break;
592 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap(); break;
593 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap(); break;
594 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet(); break;
595 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear(); break;
596 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken(); break;
597 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh(); break;
598 case ID_HELP: g_pParentWnd->OnHelp(); break;
599 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
600 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
601 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist(); break;
602 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout(); break;
603 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel(); break;
604 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals(); break;
605 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk(); break;
606 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural(); break;
607 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips(); break;
608 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips(); break;
609 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails(); break;
610 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities(); break;
611 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips(); break;
612 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights(); break;
613 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids(); break;
614 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels(); break;
615 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches(); break;
616 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent(); break;
617 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers(); break;
618 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld(); break;
619 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths(); break;
620 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals(); break;
621 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid(); break;
623 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection(); break;
624 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange(); break;
625 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup(); break;
626 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera(); break;
627 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate(); break;
628 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate(); break;
629 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale(); break;
630 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx(); break;
631 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky(); break;
632 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz(); break;
633 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve(); break;
634 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox(); break;
635 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe(); break;
636 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend(); break;
637 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld(); break;
638 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown(); break;
639 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName(); break;
640 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup(); break;
641 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove(); break;
642 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities(); break;
644 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit(); break;
645 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture(); break;
646 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector(); break;
647 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX(); break;
648 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY(); break;
649 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn(); break;
650 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow(); break;
651 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn(); break;
652 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow(); break;
653 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab(); break;
654 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward( TRUE ); break;
655 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack( TRUE ); break;
656 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft( TRUE ); break;
657 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight( TRUE ); break;
658 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp(); break;
659 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown(); break;
660 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup(); break;
661 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown(); break;
662 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft( TRUE ); break;
663 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight( TRUE ); break;
664 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle(); break;
665 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole(); break;
666 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair(); break;
667 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit(); break;
668 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock(); break;
669 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter(); break;
670 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup(); break;
671 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown(); break;
672 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft(); break;
673 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright(); break;
674 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup(); break;
675 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown(); break;
676 case ID_GRID_PREV: g_pParentWnd->OnGridPrev(); break;
677 case ID_GRID_NEXT: g_pParentWnd->OnGridNext(); break;
678 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft(); break;
679 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight(); break;
680 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown(); break;
681 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup(); break;
682 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint(); break;
683 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint(); break;
684 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize(); break;
685 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid(); break;
686 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll(); break;
687 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert(); break;
693 static gint timer( gpointer data ){
694 MainFrame *wnd = (MainFrame*)data;
699 static gint mainframe_delete( GtkWidget *widget, GdkEvent *event, gpointer data ){
700 MainFrame *wnd = (MainFrame*)data;
704 if ( ConfirmModified() ) {
708 g_qeglobals_gui.d_edit = NULL;
713 static void mainframe_destroy( GtkWidget *widget, gpointer data ){
714 MainFrame *wnd = (MainFrame*)data;
716 // avoid saving prefs when the app is minimized
717 if ( g_pParentWnd->IsSleeping() ) {
718 Sys_Printf( "Shutdown while sleeping, not saving prefs\n" );
719 g_qeglobals.disable_ini = true;
722 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
723 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
724 g_PrefsDlg.SavePrefs();
729 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
730 // and modules / plugins decide to save some stuff
731 g_pParentWnd->GetPlugInMgr().Shutdown();
736 g_PrefsDlg.Destroy();
737 g_dlgSurface.Destroy();
739 g_PatchDialog.Destroy();
744 static gint mainframe_keypress( GtkWidget* widget, GdkEventKey* event, gpointer data ){
745 unsigned int code = gdk_keyval_to_upper( event->keyval );
747 if ( code == GDK_ISO_Left_Tab ) {
752 Sys_Printf( "key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK );
755 // 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 ) ) {
764 Sys_Printf( "mainframe_keypress processing into a command\n" );
766 for ( int i = 0; i < g_nCommandCount; i++ )
768 if ( g_Commands[i].m_nKey == code ) { // find a match?
770 unsigned int nState = 0;
771 if ( Sys_AltDown() ) {
774 if ( ( event->state & GDK_CONTROL_MASK ) != 0 ) {
775 nState |= RAD_CONTROL;
777 if ( ( event->state & GDK_SHIFT_MASK ) != 0 ) {
780 if ( ( g_Commands[i].m_nModifiers & 0x7 ) == nState ) {
781 HandleCommand( NULL, GINT_TO_POINTER( g_Commands[i].m_nCommand ) );
782 gtk_signal_emit_stop_by_name( GTK_OBJECT( widget ), "key_press_event" );
791 static gint mainframe_keyrelease( GtkWidget* widget, GdkEventKey* event, gpointer data ){
792 unsigned int code = gdk_keyval_to_upper( event->keyval );
794 if ( gtk_accelerator_valid( event->keyval, (GdkModifierType)0 ) ) {
798 for ( int i = 0; i < g_nCommandCount; i++ )
800 if ( g_Commands[i].m_nKey == code ) { // find a match?
801 if ( !g_Commands[i].m_nModifiers ) {
802 // Gef: Only call the handler if it's a key that needs keyup events
803 switch ( g_Commands[i].m_nCommand )
805 case ID_CAMERA_FORWARD:
808 case ID_CAMERA_RIGHT:
809 case ID_CAMERA_STRAFELEFT:
810 case ID_CAMERA_STRAFERIGHT:
812 HandleKeyUp( NULL, GINT_TO_POINTER( g_Commands[i].m_nCommand ) );
813 gtk_signal_emit_stop_by_name( GTK_OBJECT( widget ), "key_release_event" );
826 // =============================================================================
827 // Window creation functions
829 void AddMenuItem( GtkWidget* item, unsigned int id ){
830 for ( int i = 0; i < g_nCommandCount; i++ )
831 if ( g_Commands[i].m_nCommand == id ) {
832 g_object_set_data( G_OBJECT( g_pParentWnd->m_pWidget ), g_Commands[i].m_strMenu, item );
837 void MainFrame::handle_help_command( int id ){
838 OpenURL( mHelpURLs[id]->GetBuffer() );
842 needed for hooking in Gtk+
844 void HandleHelpCommand( GtkWidget *widget, gpointer data ){
845 int id = GPOINTER_TO_INT( data );
846 g_pParentWnd->handle_help_command( id );
849 void MainFrame::process_xlink( Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel ){
851 pDoc = xmlParseFile( FileName.GetBuffer() );
853 Sys_Printf( "Processing .xlink file '%s'\n", FileName.GetBuffer() );
855 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic( menu, menu_name );
856 // start walking the nodes, find the 'links' one
857 xmlNodePtr pNode = pDoc->children;
858 while ( pNode && strcmp( (const char*)pNode->name, "links" ) )
861 pNode = pNode->children;
864 if ( !strcmp( (const char*)pNode->name, "item" ) ) {
867 if ( strstr( (char *)xmlGetProp( pNode, (xmlChar *)"url" ), "http://" ) ) {
870 *url = (char *)xmlGetProp( pNode, (xmlChar *)"url" );
877 *url += (char *)xmlGetProp( pNode, (xmlChar *)"url" );
879 mHelpURLs.push_back( url );
880 create_menu_item_with_mnemonic( menu_in_menu, (char *)xmlGetProp( pNode, (xmlChar *)"name" ), GTK_SIGNAL_FUNC( HandleHelpCommand ), mHelpURLs.size() - 1 );
889 Sys_Printf( "'%s' not found / parse failed\n", FileName.GetBuffer() );
893 void MainFrame::create_game_help_menu( GtkWidget *menu, GtkAccelGroup *accel ){
895 list<CGameDescription *>::iterator iGame;
897 // start in the global dir
898 FileName = g_strAppPath;
899 FileName += "global.xlink";
900 process_xlink( FileName, "General", g_strAppPath.GetBuffer(), menu, accel );
902 for ( iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++ )
904 FileName = ( *iGame )->mGameToolsPath;
905 FileName += "game.xlink";
906 process_xlink( FileName, ( *iGame )->mGameName, ( *iGame )->mGameToolsPath.GetBuffer(), menu, accel );
910 void MainFrame::create_main_menu( GtkWidget *window, GtkWidget *vbox ){
911 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
912 GtkAccelGroup *accel;
915 accel = gtk_accel_group_new();
916 global_accel = accel;
917 gtk_window_add_accel_group( GTK_WINDOW( window ), accel );
919 handle_box = gtk_handle_box_new();
920 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
921 gtk_widget_show( handle_box );
923 menu_bar = gtk_menu_bar_new();
924 gtk_container_add( GTK_CONTAINER( handle_box ), menu_bar );
925 gtk_widget_show( menu_bar );
928 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_File" ) );
929 if ( g_PrefsDlg.m_bDetachableMenus ) {
930 menu_tearoff( menu );
933 create_menu_item_with_mnemonic( menu, _( "_New Map" ),
934 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_NEW );
935 menu_separator( menu );
937 //++timo temporary experimental stuff for sleep mode..
938 item = create_menu_item_with_mnemonic( menu, _( "_Sleep" ),
939 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SLEEP );
940 g_object_set_data( G_OBJECT( window ), "menu_file_sleep", item );
941 menu_separator( menu );
944 item = create_menu_item_with_mnemonic( menu, _( "_Open..." ),
945 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_OPEN );
946 g_object_set_data( G_OBJECT( window ), "menu_file_open", item );
947 create_menu_item_with_mnemonic( menu, _( "_Import..." ), // Hydra: give it it's proper name
948 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_IMPORTMAP );
949 item = create_menu_item_with_mnemonic( menu, _( "_Save" ),
950 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVE );
951 g_object_set_data( G_OBJECT( window ), "menu_file_save", item );
952 create_menu_item_with_mnemonic( menu, _( "Save _as..." ),
953 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVEAS );
954 create_menu_item_with_mnemonic( menu, _( "Save s_elected..." ),
955 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_EXPORTMAP );
956 menu_separator( menu );
957 item = create_menu_item_with_mnemonic( menu, _( "Save re_gion..." ),
958 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVEREGION );
959 g_object_set_data( G_OBJECT( window ), "menu_file_saveregion", item );
960 menu_separator( menu );
961 create_menu_item_with_mnemonic( menu, _( "New p_roject..." ),
962 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_NEWPROJECT );
963 create_menu_item_with_mnemonic( menu, _( "Load _project..." ),
964 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_LOADPROJECT );
965 create_menu_item_with_mnemonic( menu, _( "Pro_ject settings..." ),
966 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_PROJECTSETTINGS );
967 menu_separator( menu );
968 create_menu_item_with_mnemonic( menu, _( "_Pointfile..." ),
969 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_POINTFILE );
970 menu_separator( menu );
971 item = create_menu_item_with_mnemonic( menu, _( "Recent Files" ),
972 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT1 );
973 g_object_set_data( G_OBJECT( item ), "accel", accel );
974 gtk_widget_set_sensitive( item, FALSE );
975 MRU_AddWidget( item, 0 );
976 item = create_menu_item_with_mnemonic( menu, "2",
977 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT2 );
978 gtk_widget_hide( item );
979 MRU_AddWidget( item, 1 );
980 item = create_menu_item_with_mnemonic( menu, "3",
981 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT3 );
982 gtk_widget_hide( item );
983 MRU_AddWidget( item, 2 );
984 item = create_menu_item_with_mnemonic( menu, "4",
985 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT4 );
986 gtk_widget_hide( item );
987 MRU_AddWidget( item, 3 );
988 menu_separator( menu );
989 item = create_menu_item_with_mnemonic( menu, _( "Check for GtkRadiant update (web)" ),
990 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_CHECKUPDATE );
991 // disable, the functionality is no longer available
992 gtk_widget_set_sensitive( item, FALSE );
994 create_menu_item_with_mnemonic( menu, _( "E_xit" ),
995 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_EXIT );
998 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Edit" ) );
999 if ( g_PrefsDlg.m_bDetachableMenus ) {
1000 menu_tearoff( menu );
1002 item = create_menu_item_with_mnemonic( menu, _( "_Undo" ),
1003 GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_UNDO );
1004 g_object_set_data( G_OBJECT( window ), "menu_edit_undo", item );
1005 item = create_menu_item_with_mnemonic( menu, _( "_Redo" ),
1006 GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_REDO );
1007 g_object_set_data( G_OBJECT( window ), "menu_edit_redo", item );
1008 menu_separator( menu );
1009 item = create_menu_item_with_mnemonic( menu, _( "_Copy" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_COPYBRUSH );
1010 item = create_menu_item_with_mnemonic( menu, _( "_Paste" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_PASTEBRUSH );
1011 item = create_menu_item_with_mnemonic( menu, _( "P_aste To Camera" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_PASTEBRUSHTOCAMERA );
1012 item = create_menu_item_with_mnemonic( menu, _( "_Delete" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DELETE );
1013 g_object_set_data( G_OBJECT( window ), "menu_selection_delete", item );
1014 menu_separator( menu );
1015 create_menu_item_with_mnemonic( menu, _( "Map Info..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_MAPINFO );
1016 create_menu_item_with_mnemonic( menu, _( "Entity Info..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_ENTITYINFO );
1017 menu_separator( menu );
1018 create_menu_item_with_mnemonic( menu, _( "Brush Scripts..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_SCRIPTS );
1019 menu_separator( menu );
1020 create_menu_item_with_mnemonic( menu, _( "Load Pre_fab..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_LOADPREFAB );
1021 create_menu_item_with_mnemonic( menu, _( "Save Selection as Prefab..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_SAVEPREFAB );
1022 menu_separator( menu );
1023 create_menu_item_with_mnemonic( menu, _( "Preferences..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_PREFS );
1026 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_View" ) );
1027 if ( g_PrefsDlg.m_bDetachableMenus ) {
1028 menu_tearoff( menu );
1031 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Toggle" ) );
1032 create_menu_item_with_mnemonic( menu_in_menu, _( "Camera View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLECAMERA );
1033 create_menu_item_with_mnemonic( menu_in_menu, _( "Console View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLECONSOLE );
1034 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Entity View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITY );
1035 g_object_set_data( G_OBJECT( window ), "menu_view_entity", item );
1036 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1037 create_menu_item_with_mnemonic( menu_in_menu, _( "XY (Top)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW );
1038 create_menu_item_with_mnemonic( menu_in_menu, _( "YZ (Side)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW_YZ );
1039 create_menu_item_with_mnemonic( menu_in_menu, _( "XZ (Front)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW_XZ );
1040 create_menu_item_with_mnemonic( menu_in_menu, _( "Z View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEZ );
1041 menu_separator( menu );
1042 item = create_menu_item_with_mnemonic( menu, _( "_Center" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CENTER );
1043 item = create_menu_item_with_mnemonic( menu, _( "_Center 2d" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CENTERVIEW );
1044 item = create_menu_item_with_mnemonic( menu, _( "_Up Floor" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_UPFLOOR );
1045 item = create_menu_item_with_mnemonic( menu, _( "_Down Floor" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_DOWNFLOOR );
1046 menu_separator( menu );
1047 item = create_menu_item_with_mnemonic( menu, _( "_Next (XY, YZ, XY)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEXTVIEW );
1048 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Layout" ) );
1049 create_menu_item_with_mnemonic( menu_in_menu, _( "XY (Top)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_XY );
1050 create_menu_item_with_mnemonic( menu_in_menu, _( "YZ" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SIDE );
1051 create_menu_item_with_mnemonic( menu_in_menu, _( "XZ" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_FRONT );
1052 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Zoom" ) );
1053 create_menu_item_with_mnemonic( menu_in_menu, _( "_XY 100%" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_100 );
1054 item = create_menu_item_with_mnemonic( menu_in_menu, _( "XY Zoom _In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZOOMIN );
1055 item = create_menu_item_with_mnemonic( menu_in_menu, _( "XY Zoom _Out" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZOOMOUT );
1056 menu_separator( menu_in_menu );
1057 create_menu_item_with_mnemonic( menu_in_menu, _( "_Z 100%" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_Z100 );
1058 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Z Zoo_m In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZZOOMIN );
1059 g_object_set_data( G_OBJECT( window ), "menu_view_zzoomin", item );
1060 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Z Zoom O_ut" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZZOOMOUT );
1061 g_object_set_data( G_OBJECT( window ), "menu_view_zzoomout", item );
1062 menu_separator( menu_in_menu );
1063 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Cubic Clip Zoom In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBEIN );
1064 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Cubic Clip Zoom Out" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBEOUT );
1065 menu_separator( menu );
1067 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Show" ) );
1068 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show _Angles" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWANGLES, FALSE );
1069 g_object_set_data( G_OBJECT( window ), "menu_view_showangles", item );
1070 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show _Names" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWNAMES, TRUE );
1071 g_object_set_data( G_OBJECT( window ), "menu_view_shownames", item );
1072 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Blocks" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWBLOCKS, FALSE );
1073 g_object_set_data( G_OBJECT( window ), "menu_view_showblocks", item );
1074 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show C_oordinates" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWCOORDINATES, TRUE );
1075 g_object_set_data( G_OBJECT( window ), "menu_view_showcoordinates", item );
1076 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Window Outline" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWOUTLINE, TRUE );
1077 g_object_set_data( G_OBJECT( window ), "menu_view_showoutline", item );
1078 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show ZBuffered Outline" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_NOOUTLINE, TRUE );
1079 g_object_set_data( G_OBJECT( window ), "menu_selection_nooutline", item );
1080 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Axes" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWAXES, TRUE );
1081 g_object_set_data( G_OBJECT( window ), "menu_view_showaxes", item );
1082 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Workzone" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWWORKZONE, FALSE );
1083 g_object_set_data( G_OBJECT( window ), "menu_view_showworkzone", item );
1085 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Filter" ) );
1086 create_check_menu_item_with_mnemonic( menu_in_menu, _( "World" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_WORLD, FALSE );
1087 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Entities" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_ENTITIES, FALSE );
1088 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Areaportals" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_AREAPORTALS, FALSE );
1089 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Translucent" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_TRANSLUCENT, FALSE );
1090 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Liquids" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIQUIDS, FALSE );
1091 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Caulk" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CAULK, FALSE );
1092 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Clips" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CLIPS, FALSE );
1093 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Paths" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_PATHS, FALSE );
1094 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Clusterportals" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CLUSTERPORTALS, FALSE );
1095 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Lights" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIGHTS, FALSE );
1096 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Structural" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_STRUCTURAL, FALSE );
1097 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Lightgrid" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIGHTGRID, FALSE );
1098 g_object_set_data( G_OBJECT( window ), "menu_filter_lightgrid", item );
1099 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Patches" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_PATCHES, FALSE );
1100 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Details" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_DETAILS, FALSE );
1101 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Hints" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_HINTSSKIPS, FALSE );
1102 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Models" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_MODELS, FALSE );
1103 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Triggers" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_TRIGGERS, FALSE );
1104 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Botclips" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_BOTCLIPS, FALSE );
1106 menu_separator( menu );
1107 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Hide/Show" ) );
1108 create_menu_item_with_mnemonic( menu_in_menu, _( "Hide Selected" ),
1109 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_HIDESHOW_HIDESELECTED );
1110 create_menu_item_with_mnemonic( menu_in_menu, _( "Show Hidden" ),
1111 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_HIDESHOW_SHOWHIDDEN );
1112 menu_separator( menu );
1113 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Entities as" ) );
1114 g_object_set_data( G_OBJECT( window ), "view_entitiesas_menu", menu_in_menu );
1115 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "Bounding box" ),
1116 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE );
1117 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_boundingbox", item );
1118 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Wireframe" ),
1119 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE );
1120 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_wireframe", item );
1121 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Selected Wireframe" ),
1122 GTK_SIGNAL_FUNC( HandleCommand ),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE );
1123 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_selectedwireframe", item );
1124 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Selected Skinned" ),
1125 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE );
1126 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_selectedskinned", item );
1127 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Skinned" ),
1128 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SKINNED,FALSE );
1129 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_skinned", item );
1130 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Skinned and Boxed" ),
1131 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE );
1132 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_skinnedandboxed", item );
1133 menu_separator( menu );
1134 item = create_check_menu_item_with_mnemonic( menu, _( "Cubic Clipping" ),
1135 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBICCLIPPING, TRUE );
1136 g_object_set_data( G_OBJECT( window ), "menu_view_cubicclipping", item );
1137 menu_separator( menu );
1138 item = create_check_menu_item_with_mnemonic( menu, _( "OpenGL Lighting" ),
1139 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_OPENGLLIGHTING, FALSE );
1140 g_object_set_data( G_OBJECT( window ), "menu_view_opengllighting", item );
1143 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Selection" ) );
1144 if ( g_PrefsDlg.m_bDetachableMenus ) {
1145 menu_tearoff( menu );
1148 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Drag" ) );
1149 create_menu_item_with_mnemonic( menu_in_menu, _( "Drag _Edges" ),
1150 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DRAGEDGES );
1151 create_menu_item_with_mnemonic( menu_in_menu, _( "Drag _Vertices" ),
1152 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DRAGVERTECIES );
1153 menu_separator( menu );
1154 create_menu_item_with_mnemonic( menu, _( "_Clone" ),
1155 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CLONE );
1156 item = create_menu_item_with_mnemonic( menu, _( "Deselect" ),
1157 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DESELECT );
1158 item = create_menu_item_with_mnemonic( menu, _( "Invert" ),
1159 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_INVERT );
1161 create_menu_item_with_mnemonic( menu, _( "_Delete" ),
1162 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DELETE );
1164 menu_separator( menu );
1165 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Flip" ) );
1166 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _X" ),
1167 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPX );
1168 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _Y" ),
1169 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPY );
1170 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _Z" ),
1171 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPZ );
1172 menu_separator( menu );
1173 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Rotate" ) );
1174 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate X" ),
1175 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEX );
1176 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate Y" ),
1177 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEY );
1178 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate Z" ),
1179 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEZ );
1180 create_menu_item_with_mnemonic( menu_in_menu, _( "Arbitrary rotation..." ),
1181 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_ARBITRARYROTATION );
1182 menu_separator( menu );
1183 create_menu_item_with_mnemonic( menu, _( "Scale..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_SCALE );
1184 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "CSG" ) );
1185 create_menu_item_with_mnemonic( menu_in_menu, _( "Make _Hollow" ),
1186 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKEHOLLOW );
1187 create_menu_item_with_mnemonic( menu_in_menu, _( "CSG _Subtract" ),
1188 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CSGSUBTRACT );
1189 create_menu_item_with_mnemonic( menu_in_menu, _( "CSG _Merge" ),
1190 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CSGMERGE );
1191 menu_separator( menu );
1192 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Select" ) );
1193 create_menu_item_with_mnemonic( menu_in_menu, _( "Select Complete _Tall" ),
1194 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTCOMPLETETALL );
1195 create_menu_item_with_mnemonic( menu_in_menu, _( "Select T_ouching" ),
1196 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTTOUCHING );
1197 create_menu_item_with_mnemonic( menu_in_menu, _( "Select _Partial Tall" ),
1198 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTPARTIALTALL );
1199 create_menu_item_with_mnemonic( menu_in_menu, _( "Select _Inside" ),
1200 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTINSIDE );
1201 create_menu_item_with_mnemonic( menu_in_menu, "Select Func _Group", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_FUNC_GROUP );
1203 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Left" ),
1204 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGELEFT );
1205 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Right" ),
1206 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGERIGHT );
1207 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Up" ),
1208 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEUP );
1209 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Down" ),
1210 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEDOWN );
1212 menu_separator( menu );
1213 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Clipper" ) );
1214 create_menu_item_with_mnemonic( menu_in_menu, _( "Toggle Clipper" ),
1215 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CLIPPER );
1216 menu_separator( menu_in_menu );
1217 create_menu_item_with_mnemonic( menu_in_menu, _( "Clip selection" ),
1218 GTK_SIGNAL_FUNC( HandleCommand ), ID_CLIP_SELECTED );
1219 create_menu_item_with_mnemonic( menu_in_menu, _( "Split selection" ),
1220 GTK_SIGNAL_FUNC( HandleCommand ), ID_SPLIT_SELECTED );
1221 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip Clip orientation" ),
1222 GTK_SIGNAL_FUNC( HandleCommand ), ID_FLIP_CLIP );
1223 menu_separator( menu );
1224 create_menu_item_with_mnemonic( menu, _( "Connect entities" ),
1225 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CONNECT );
1226 create_menu_item_with_mnemonic( menu, _( "Ungroup entity" ),
1227 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_UNGROUPENTITY );
1228 create_menu_item_with_mnemonic( menu, _( "Make detail" ),
1229 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKE_DETAIL );
1230 create_menu_item_with_mnemonic( menu, _( "Make structural" ),
1231 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKE_STRUCTURAL );
1234 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Bsp" ) );
1236 menu_separator( menu );
1237 g_object_set_data( G_OBJECT( window ), "menu_bsp", menu );
1240 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Grid" ) );
1241 if ( g_PrefsDlg.m_bDetachableMenus ) {
1242 menu_tearoff( menu );
1245 item = create_radio_menu_item_with_mnemonic( menu, NULL, _( "Grid0.25" ),
1246 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_025, FALSE );
1247 g_object_set_data( G_OBJECT( window ), "menu_grid_025", item );
1248 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid0.5" ),
1249 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_05, FALSE );
1250 g_object_set_data( G_OBJECT( window ), "menu_grid_05", item );
1251 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid1" ),
1252 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_1, FALSE );
1253 g_object_set_data( G_OBJECT( window ), "menu_grid_1", item );
1254 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid2" ),
1255 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_2, FALSE );
1256 g_object_set_data( G_OBJECT( window ), "menu_grid_2", item );
1257 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid4" ),
1258 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_4, FALSE );
1259 g_object_set_data( G_OBJECT( window ), "menu_grid_4", item );
1260 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid8" ),
1261 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_8, TRUE );
1262 g_object_set_data( G_OBJECT( window ), "menu_grid_8", item );
1263 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid16" ),
1264 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_16, FALSE );
1265 g_object_set_data( G_OBJECT( window ), "menu_grid_16", item );
1266 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid32" ),
1267 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_32, FALSE );
1268 g_object_set_data( G_OBJECT( window ), "menu_grid_32", item );
1269 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid64" ),
1270 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_64, FALSE );
1271 g_object_set_data( G_OBJECT( window ), "menu_grid_64", item );
1272 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid128" ),
1273 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_128, FALSE );
1274 g_object_set_data( G_OBJECT( window ), "menu_grid_128", item );
1275 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid256" ),
1276 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_256, FALSE );
1277 g_object_set_data( G_OBJECT( window ), "menu_grid_256", item );
1278 menu_separator( menu );
1279 item = create_check_menu_item_with_mnemonic( menu, _( "Snap to grid" ),
1280 GTK_SIGNAL_FUNC( HandleCommand ), ID_SNAPTOGRID, TRUE );
1281 g_object_set_data( G_OBJECT( window ), "menu_snaptogrid", item );
1284 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Textures" ) );
1285 if ( g_PrefsDlg.m_bDetachableMenus ) {
1286 menu_tearoff( menu );
1289 item = create_check_menu_item_with_mnemonic( menu, _( "Show In _Use" ),
1290 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHOWINUSE, FALSE );
1291 g_object_set_data( G_OBJECT( window ), "menu_textures_showinuse", item );
1292 item = create_check_menu_item_with_mnemonic( menu, _( "Show _All" ),
1293 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHOWALL, FALSE );
1294 g_object_set_data( G_OBJECT( window ), "menu_textures_showall", item );
1295 menu_separator( menu );
1296 item = create_check_menu_item_with_mnemonic( menu, _( "Show shaders" ),
1297 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHADERS_SHOW, FALSE );
1298 g_object_set_data( G_OBJECT( window ), "menu_textures_shaders_show", item );
1299 item = create_menu_item_with_mnemonic( menu, _( "Flush & Reload Shaders" ),
1300 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_RELOADSHADERS );
1301 g_object_set_data( G_OBJECT( window ), "menu_textures_reloadshaders", item );
1302 item = create_menu_item_with_mnemonic( menu, _( "Load directory..." ),
1303 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_LOAD );
1304 g_object_set_data( G_OBJECT( window ), "menu_textures_load", item );
1305 item = create_menu_item_with_mnemonic( menu, _( "Directory list..." ),
1306 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_LOADLIST );
1307 menu_separator( menu );
1309 item = create_menu_item_with_mnemonic( menu, _( "_Surface Inspector" ),
1310 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_INSPECTOR );
1311 menu_separator( menu );
1312 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Render Quality" ) );
1313 g_object_set_data( G_OBJECT( window ), "render_quality_menu", menu_in_menu );
1314 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "_Wireframe" ),
1315 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_WIREFRAME, FALSE );
1316 g_object_set_data( G_OBJECT( window ), "menu_textures_wireframe", item );
1317 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Flat shade" ),
1318 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_FLATSHADE, FALSE );
1319 g_object_set_data( G_OBJECT( window ), "menu_textures_flatshade", item );
1320 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Nearest" ),
1321 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEAREST, FALSE );
1322 g_object_set_data( G_OBJECT( window ), "menu_view_nearest", item );
1323 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Nearest _Mipmap" ),
1324 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEARESTMIPMAP, FALSE );
1325 g_object_set_data( G_OBJECT( window ), "menu_view_nearestmipmap", item );
1326 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Linear" ),
1327 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_LINEAR, FALSE );
1328 g_object_set_data( G_OBJECT( window ), "menu_view_linear", item );
1329 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Bilinear" ),
1330 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_BILINEAR, FALSE );
1331 g_object_set_data( G_OBJECT( window ), "menu_view_bilinear", item );
1332 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "B_ilinear Mipmap" ),
1333 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_BILINEARMIPMAP, FALSE );
1334 g_object_set_data( G_OBJECT( window ), "menu_view_bilinearmipmap", item );
1335 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "T_rilinear" ),
1336 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_TRILINEAR, FALSE );
1337 g_object_set_data( G_OBJECT( window ), "menu_view_trilinear", item );
1338 create_menu_item_with_mnemonic( menu, _( "Find / Replace..." ),
1339 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURE_REPLACEALL );
1341 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Texture Lock" ) );
1342 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Moves" ),
1343 GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLE_LOCK, TRUE );
1344 g_object_set_data( G_OBJECT( window ), "menu_toggle_lock", item );
1345 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Rotations" ),
1346 GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLE_ROTATELOCK, TRUE );
1347 g_object_set_data( G_OBJECT( window ), "menu_toggle_rotatelock", item );
1348 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Texture Window Scale" ) );
1349 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "200%" ),
1350 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE );
1351 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_200", item );
1352 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "100%" ),
1353 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE );
1354 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_100", item );
1355 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "50%" ),
1356 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE );
1357 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_50", item );
1358 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "25%" ),
1359 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE );
1360 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_25", item );
1361 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "10%" ),
1362 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE );
1363 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_10", item );
1364 item = menu_separator( menu );
1365 item = create_check_menu_item_with_mnemonic( menu, _( "shaderlist.txt only" ),
1366 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHADERLISTONLY, FALSE );
1367 g_object_set_data( G_OBJECT( window ), "menu_textures_shaderlistonly", item );
1368 item = menu_separator( menu );
1369 g_object_set_data( G_OBJECT( window ), "menu_textures_separator", item );
1370 g_object_set_data( G_OBJECT( window ), "menu_textures", menu );
1373 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Misc" ) );
1374 if ( g_PrefsDlg.m_bDetachableMenus ) {
1375 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 create_menu_item_with_mnemonic( menu, _( "_Print XY View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_PRINTXY );
1425 item = create_menu_item_with_mnemonic( menu, _( "_Select Entity Color..." ),
1426 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_SELECTENTITYCOLOR );
1427 g_object_set_data( G_OBJECT( window ), "menu_misc_selectentitycolor", item );
1430 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Region" ) );
1431 if ( g_PrefsDlg.m_bDetachableMenus ) {
1432 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 );
1452 item = create_menu_item_with_mnemonic( menu, _( "3 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_3SIDED );
1453 item = create_menu_item_with_mnemonic( menu, _( "4 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_4SIDED );
1454 item = create_menu_item_with_mnemonic( menu, _( "5 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_5SIDED );
1455 item = create_menu_item_with_mnemonic( menu, _( "6 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_6SIDED );
1456 item = create_menu_item_with_mnemonic( menu, _( "7 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_7SIDED );
1457 item = create_menu_item_with_mnemonic( menu, _( "8 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_8SIDED );
1458 item = create_menu_item_with_mnemonic( menu, _( "9 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_9SIDED );
1459 menu_separator( menu );
1460 create_menu_item_with_mnemonic( menu, _( "Arbitrary sided..." ),
1461 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ARBITRARYSIDED );
1462 menu_separator( menu );
1463 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Primitives" ) );
1464 create_menu_item_with_mnemonic( menu_in_menu, _( "Cone..." ),
1465 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_MAKECONE );
1466 create_menu_item_with_mnemonic( menu_in_menu, _( "Sphere..." ),
1467 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_PRIMITIVES_SPHERE );
1470 if ( !g_pGameDescription->mNoPatch ) {
1471 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Curve" ) );
1472 if ( g_PrefsDlg.m_bDetachableMenus ) {
1473 menu_tearoff( menu );
1476 create_menu_item_with_mnemonic( menu, _( "Cylinder" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHTUBE );
1477 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "More Cylinders" ) );
1478 create_menu_item_with_mnemonic( menu_in_menu, _( "Dense Cylinder" ),
1479 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHDENSETUBE );
1480 create_menu_item_with_mnemonic( menu_in_menu, _( "Very Dense Cylinder" ),
1481 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHVERYDENSETUBE );
1482 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Cylinder" ),
1483 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHSQUARE );
1484 menu_separator( menu );
1485 create_menu_item_with_mnemonic( menu, _( "End cap" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHENDCAP );
1486 create_menu_item_with_mnemonic( menu, _( "Bevel" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHBEVEL );
1487 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "More End caps, Bevels" ) );
1488 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Endcap" ),
1489 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL );
1490 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Bevel" ),
1491 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP );
1492 menu_separator( menu );
1493 create_menu_item_with_mnemonic( menu, _( "Cone" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHCONE );
1494 item = create_menu_item_with_mnemonic( menu, _( "Sphere" ),
1495 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PRIMITIVES_SPHERE );
1496 gtk_widget_set_sensitive( item, FALSE );
1497 menu_separator( menu );
1498 item = create_menu_item_with_mnemonic( menu, _( "Simple Patch Mesh..." ),
1499 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_SIMPLEPATCHMESH );
1500 g_object_set_data( G_OBJECT( window ), "menu_simplepatchmesh", item );
1501 menu_separator( menu );
1502 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Insert" ) );
1503 create_menu_item_with_mnemonic( menu_in_menu, _( "Insert (2) Columns" ),
1504 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_INSERTCOLUMN );
1505 create_menu_item_with_mnemonic( menu_in_menu, _( "Add (2) Columns" ),
1506 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_ADDCOLUMN );
1507 menu_separator( menu_in_menu );
1508 create_menu_item_with_mnemonic( menu_in_menu, _( "Insert (2) Rows" ),
1509 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_INSERTROW );
1510 create_menu_item_with_mnemonic( menu_in_menu, _( "Add (2) Rows" ),
1511 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_ADDROW );
1512 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Delete" ) );
1513 create_menu_item_with_mnemonic( menu_in_menu, _( "First (2) Columns" ),
1514 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_FIRSTCOLUMN );
1515 create_menu_item_with_mnemonic( menu_in_menu, _( "Last (2) Columns" ),
1516 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_LASTCOLUMN );
1517 menu_separator( menu_in_menu );
1518 create_menu_item_with_mnemonic( menu_in_menu, _( "First (2) Rows" ),
1519 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_FIRSTROW );
1520 create_menu_item_with_mnemonic( menu_in_menu, _( "Last (2) Rows" ),
1521 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_LASTROW );
1522 menu_separator( menu );
1523 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Matrix" ) );
1524 create_menu_item_with_mnemonic( menu_in_menu, _( "Invert" ),
1525 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVE );
1526 menu_3 = create_menu_in_menu_with_mnemonic( menu_in_menu, _( "Re-disperse" ) );
1527 create_menu_item_with_mnemonic( menu_3, _( "Rows" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_ROWS );
1528 create_menu_item_with_mnemonic( menu_3, _( "Cols (Intermediate)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS );
1529 create_menu_item_with_mnemonic( menu_3, _( "Rows (Intermediate)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS );
1530 create_menu_item_with_mnemonic( menu_in_menu, _( "Transpose" ),
1531 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MATRIX_TRANSPOSE );
1532 menu_separator( menu );
1533 create_menu_item_with_mnemonic( menu, _( "Cap Selection" ),
1534 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_CAP );
1535 create_menu_item_with_mnemonic( menu, _( "Cycle Cap Texture" ),
1536 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_CYCLECAP );
1537 menu_separator( menu );
1538 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Overlay" ) );
1539 create_menu_item_with_mnemonic( menu_in_menu, _( "Set" ),
1540 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_OVERLAY_SET );
1541 create_menu_item_with_mnemonic( menu_in_menu, _( "Clear" ),
1542 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_OVERLAY_CLEAR );
1543 menu_separator( menu );
1544 create_menu_item_with_mnemonic( menu, _( "Thicken..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_THICKEN );
1547 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Plugins" ) );
1548 if ( g_PrefsDlg.m_bDetachableMenus ) {
1549 menu_tearoff( menu );
1553 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1555 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1556 item = menu_separator( menu );
1557 g_object_set_data( G_OBJECT( window ), "menu_plugin_separator", item );
1558 g_object_set_data( G_OBJECT( window ), "menu_plugin", menu );
1561 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Help" ) );
1562 if ( g_PrefsDlg.m_bDetachableMenus ) {
1563 menu_tearoff( menu );
1566 item = create_menu_item_with_mnemonic( menu, _( "Manual" ),
1567 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP );
1568 gtk_widget_add_accelerator( item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
1570 // this creates all the per-game drop downs for the game pack helps
1571 // it will take care of hooking the Sys_OpenURL calls etc.
1572 create_game_help_menu( menu, accel );
1574 // TTimo: this is in global.xlink now
1575 //create_menu_item_with_mnemonic (menu, "Links",
1576 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1577 create_menu_item_with_mnemonic( menu, _( "Bug report" ),
1578 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_BUGREPORT );
1579 create_menu_item_with_mnemonic( menu, _( "Shortcuts list" ),
1580 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_COMMANDLIST );
1581 create_menu_item_with_mnemonic( menu, _( "_About" ),
1582 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_ABOUT );
1585 // leo: Hidden menu to make the accelerators work,
1586 // this is a hack that needs to be changed later if someone has a better idea.
1588 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1589 menu = create_sub_menu_with_mnemonic( menu_bar, "Hidden" );
1590 if ( g_PrefsDlg.m_bDetachableMenus ) {
1591 menu_tearoff( menu );
1594 gtk_widget_hide( gtk_menu_get_attach_widget( GTK_MENU( menu ) ) );
1596 create_menu_item_with_mnemonic( menu, "BendMode", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_BEND );
1597 create_menu_item_with_mnemonic( menu, "FitTexture", GTK_SIGNAL_FUNC( HandleCommand ), IDC_BTN_FACEFIT );
1598 create_menu_item_with_mnemonic( menu, "ViewTextures", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_TEXTURE );
1599 create_menu_item_with_mnemonic( menu, "PatchInspector", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_INSPECTOR );
1600 create_menu_item_with_mnemonic( menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVETEXTUREY );
1601 create_menu_item_with_mnemonic( menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVETEXTUREX );
1602 create_menu_item_with_mnemonic( menu, "IncPatchColumn", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERTCOLUMN );
1603 create_menu_item_with_mnemonic( menu, "IncPatchRow", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERTROW );
1604 create_menu_item_with_mnemonic( menu, "DecPatchColumn", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETECOLUMN );
1605 create_menu_item_with_mnemonic( menu, "DecPatchRow", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETEROW );
1606 create_menu_item_with_mnemonic( menu, "Patch TAB", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_TAB );
1607 create_menu_item_with_mnemonic( menu, "Patch TAB", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_TAB );
1608 create_menu_item_with_mnemonic( menu, "SelectNudgeDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEDOWN );
1609 create_menu_item_with_mnemonic( menu, "CameraForward", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_FORWARD );
1610 create_menu_item_with_mnemonic( menu, "CameraBack", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_BACK );
1611 create_menu_item_with_mnemonic( menu, "CameraLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_LEFT );
1612 create_menu_item_with_mnemonic( menu, "CameraRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_RIGHT );
1613 create_menu_item_with_mnemonic( menu, "CameraUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_UP );
1614 create_menu_item_with_mnemonic( menu, "CameraDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_DOWN );
1615 create_menu_item_with_mnemonic( menu, "CameraAngleUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_ANGLEUP );
1616 create_menu_item_with_mnemonic( menu, "CameraAngleDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_ANGLEDOWN );
1617 create_menu_item_with_mnemonic( menu, "CameraStrafeRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_STRAFERIGHT );
1618 create_menu_item_with_mnemonic( menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_STRAFELEFT );
1619 create_menu_item_with_mnemonic( menu, "ToggleGrid", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_TOGGLE );
1620 create_menu_item_with_mnemonic( menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CROSSHAIR );
1621 create_menu_item_with_mnemonic( menu, "ToggleRealtime", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CAMERAUPDATE );
1622 create_menu_item_with_mnemonic( menu, "MouseRotate", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_MOUSEROTATE );
1623 create_menu_item_with_mnemonic( menu, "TexRotateClock", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_ROTATECLOCK );
1624 create_menu_item_with_mnemonic( menu, "TexRotateCounter", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_ROTATECOUNTER );
1625 create_menu_item_with_mnemonic( menu, "TexScaleUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALEUP );
1626 create_menu_item_with_mnemonic( menu, "TexScaleDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALEDOWN );
1627 create_menu_item_with_mnemonic( menu, "TexShiftLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTLEFT );
1628 create_menu_item_with_mnemonic( menu, "TexShiftRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTRIGHT );
1629 create_menu_item_with_mnemonic( menu, "TexShiftUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTUP );
1630 create_menu_item_with_mnemonic( menu, "TexShiftDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTDOWN );
1631 create_menu_item_with_mnemonic( menu, "GridDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_PREV );
1632 create_menu_item_with_mnemonic( menu, "GridUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_NEXT );
1633 create_menu_item_with_mnemonic( menu, "TexScaleLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALELEFT );
1634 create_menu_item_with_mnemonic( menu, "TexScaleRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALERIGHT );
1635 create_menu_item_with_mnemonic( menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MOVEDOWN );
1636 create_menu_item_with_mnemonic( menu, "MoveSelectionUP", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MOVEUP );
1637 create_menu_item_with_mnemonic( menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_PRINT );
1638 create_menu_item_with_mnemonic( menu, "ToggleSizePaint", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TOGGLESIZEPAINT );
1639 create_menu_item_with_mnemonic( menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGELEFT );
1640 create_menu_item_with_mnemonic( menu, "SelectNudgeRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGERIGHT );
1641 create_menu_item_with_mnemonic( menu, "SelectNudgeUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEUP );
1642 create_menu_item_with_mnemonic( menu, "NaturalizePatch", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_NATURALIZE );
1643 create_menu_item_with_mnemonic( menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_SNAPTOGRID );
1644 create_menu_item_with_mnemonic( menu, "SelectAllOfType", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_ALL );
1645 create_menu_item_with_mnemonic( menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_OUTLINESTYLE );
1646 create_menu_item_with_mnemonic( menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREWINDOW_SCALEUP );
1647 create_menu_item_with_mnemonic( menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREWINDOW_SCALEDOWN );
1649 g_bIgnoreCommands--;
1652 void MainFrame::create_main_toolbar( GtkWidget *window, GtkWidget *vbox ){
1653 GtkWidget *handle_box, *toolbar, *w;
1655 handle_box = gtk_handle_box_new();
1656 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
1657 gtk_widget_show( handle_box );
1658 g_object_set_data( G_OBJECT( window ), "tb_handle_box", handle_box );
1660 toolbar = gtk_toolbar_new();
1661 gtk_toolbar_set_orientation( GTK_TOOLBAR( toolbar ), GTK_ORIENTATION_HORIZONTAL );
1662 gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
1663 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1664 gtk_container_add( GTK_CONTAINER( handle_box ), toolbar );
1666 gtk_widget_show( toolbar );
1668 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), _( "Open" ), _( "Open an existing map" ), "",
1669 new_pixmap( window, "file_open.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1670 GINT_TO_POINTER( ID_FILE_OPEN ) );
1671 g_object_set_data( G_OBJECT( window ), "tb_file_open", w );
1672 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), _( "Save" ), _( "Save the active map" ), "",
1673 new_pixmap( window, "file_save.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1674 GINT_TO_POINTER( ID_FILE_SAVE ) );
1675 g_object_set_data( G_OBJECT( window ), "tb_file_save", w );
1676 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1677 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "x-axis Flip" ), "",
1678 new_pixmap( window, "brush_flipx.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1679 GINT_TO_POINTER( ID_BRUSH_FLIPX ) );
1680 g_object_set_data( G_OBJECT( window ), "tb_brush_flipx", w );
1681 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "x-axis Rotate" ), "",
1682 new_pixmap( window, "brush_rotatex.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1683 GINT_TO_POINTER( ID_BRUSH_ROTATEX ) );
1684 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatex", w );
1685 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "y-axis Flip" ), "",
1686 new_pixmap( window, "brush_flipy.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1687 GINT_TO_POINTER( ID_BRUSH_FLIPY ) );
1688 g_object_set_data( G_OBJECT( window ), "tb_brush_flipy", w );
1689 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "y-axis Rotate" ), "",
1690 new_pixmap( window, "brush_rotatey.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1691 GINT_TO_POINTER( ID_BRUSH_ROTATEY ) );
1692 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatey", w );
1693 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "z-axis Flip" ), "",
1694 new_pixmap( window, "brush_flipz.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1695 GINT_TO_POINTER( ID_BRUSH_FLIPZ ) );
1696 g_object_set_data( G_OBJECT( window ), "tb_brush_flipz", w );
1697 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "z-axis Rotate" ), "",
1698 new_pixmap( window, "brush_rotatez.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1699 GINT_TO_POINTER( ID_BRUSH_ROTATEZ ) );
1700 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatez", w );
1701 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1703 if ( g_PrefsDlg.m_bWideToolbar ) {
1704 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Complete Tall" ), "",
1705 new_pixmap( window, "selection_selectcompletetall.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1706 GINT_TO_POINTER( ID_SELECTION_SELECTCOMPLETETALL ) );
1707 g_object_set_data( G_OBJECT( window ), "tb_selection_selectcompletetall", w );
1708 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Touching" ), "",
1709 new_pixmap( window, "selection_selecttouching.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1710 GINT_TO_POINTER( ID_SELECTION_SELECTTOUCHING ) );
1711 g_object_set_data( G_OBJECT( window ), "tb_selection_selecttouching", w );
1712 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Partial Tall" ), "",
1713 new_pixmap( window, "selection_selectpartialtall.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1714 GINT_TO_POINTER( ID_SELECTION_SELECTPARTIALTALL ) );
1715 g_object_set_data( G_OBJECT( window ), "tb_selection_selectpartialtall", w );
1716 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Inside" ), "",
1717 new_pixmap( window, "selection_selectinside.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1718 GINT_TO_POINTER( ID_SELECTION_SELECTINSIDE ) );
1719 g_object_set_data( G_OBJECT( window ), "tb_selection_selectinside", w );
1723 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Selection" ), "",
1724 new_pixmap( window, "popup_selection.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1725 GINT_TO_POINTER( ID_POPUP_SELECTION ) );
1726 g_object_set_data( G_OBJECT( window ), "tb_popup_selection", w );
1728 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1730 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "CSG Subtract" ), "",
1731 new_pixmap( window, "selection_csgsubtract.bmp" ),
1732 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_CSGSUBTRACT ) );
1733 g_object_set_data( G_OBJECT( window ), "tb_selection_csgsubtract", w );
1735 if ( g_PrefsDlg.m_bWideToolbar ) {
1736 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "CSG Merge" ), "",
1737 new_pixmap( window, "selection_csgmerge.bmp" ),
1738 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_CSGMERGE ) );
1739 g_object_set_data( G_OBJECT( window ), "tb_selection_csgmerge", w );
1742 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Hollow" ), "",
1743 new_pixmap( window, "selection_makehollow.bmp" ),
1744 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_MAKEHOLLOW ) );
1745 g_object_set_data( G_OBJECT( window ), "tb_selection_makehollow", w );
1747 if ( g_PrefsDlg.m_bWideToolbar ) {
1748 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1749 "", _( "Clipper" ), "", new_pixmap( window, "view_clipper.bmp" ),
1750 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CLIPPER ) );
1751 g_object_set_data( G_OBJECT( window ), "tb_view_clipper", w );
1754 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1756 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Change views" ), "",
1757 new_pixmap( window, "view_change.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1758 GINT_TO_POINTER( ID_VIEW_CHANGE ) );
1759 g_object_set_data( G_OBJECT( window ), "tb_view_change", w );
1761 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 ) {
1771 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1772 "", _( "Cubic clip the camera view" ), "",
1773 new_pixmap( window, "view_cubicclipping.bmp" ),
1774 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CUBICCLIPPING ) );
1775 g_object_set_data( G_OBJECT( window ), "tb_view_cubicclipping", w );
1778 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1780 if ( !g_PrefsDlg.m_bWideToolbar ) {
1781 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1782 "", _( "Camera preview" ), "", new_pixmap( window, "view_cameratoggle.bmp" ),
1783 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CAMERATOGGLE ) );
1784 g_object_set_data( G_OBJECT( window ), "tb_view_cameratoggle", w );
1785 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", "Update Camera", "",
1786 new_pixmap( window, "view_cameraupdate.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1787 GINT_TO_POINTER( ID_VIEW_CAMERAUPDATE ) );
1788 g_object_set_data( G_OBJECT( window ), "tb_view_cameraupdate", w );
1789 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1790 "", _( "Cubic clip the camera view" ), "",
1791 new_pixmap( window, "view_cubicclipping.bmp" ),
1792 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CUBICCLIPPING ) );
1793 g_object_set_data( G_OBJECT( window ), "tb_view_cubicclipping", w );
1794 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1795 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1796 "", _( "Entity inspector" ), "", new_pixmap( window, "view_entity.bmp" ),
1797 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_ENTITY ) );
1798 g_object_set_data( G_OBJECT( window ), "tb_view_entity", w );
1799 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1800 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1801 "", _( "Clipper" ), "", new_pixmap( window, "view_clipper.bmp" ),
1802 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CLIPPER ) );
1803 g_object_set_data( G_OBJECT( window ), "tb_view_clipper", w );
1804 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1807 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1808 "", _( "Free Rotation" ), "", new_pixmap( window, "select_mouserotate.bmp" ),
1809 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECT_MOUSEROTATE ) );
1810 g_object_set_data( G_OBJECT( window ), "tb_select_mouserotate", w );
1811 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1812 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1813 "", _( "Free Scaling" ), "", new_pixmap( window, "select_mousescale.bmp" ),
1814 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECT_MOUSESCALE ) );
1815 g_object_set_data( G_OBJECT( window ), "tb_select_mousescale", w );
1816 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1817 "", _( "Scale X" ), "", new_pixmap( window, "scalelockx.bmp" ),
1818 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKX ) );
1819 g_object_set_data( G_OBJECT( window ), "tb_scalelockx", w );
1820 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1821 "", _( "Scale Y" ), "", new_pixmap( window, "scalelocky.bmp" ),
1822 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKY ) );
1823 g_object_set_data( G_OBJECT( window ), "tb_scalelocky", w );
1824 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1825 "", _( "Scale Z" ), "", new_pixmap( window, "scalelockz.bmp" ),
1826 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKZ ) );
1827 g_object_set_data( G_OBJECT( window ), "tb_scalelockz", w );
1829 if ( g_PrefsDlg.m_bWideToolbar ) {
1830 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1831 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1832 "", _( "Don't select model brushes" ), "",
1833 new_pixmap( window, "dontselectmodel.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1834 GINT_TO_POINTER( ID_DONTSELECTMODEL ) );
1835 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1836 g_object_set_data( G_OBJECT( window ), "tb_dontselectmodel", w );
1838 if ( !g_pGameDescription->mNoPatch ) {
1839 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1840 "", _( "Don't select curved brushes" ), "",
1841 new_pixmap( window, "dontselectcurve.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1842 GINT_TO_POINTER( ID_DONTSELECTCURVE ) );
1843 g_object_set_data( G_OBJECT( window ), "tb_dontselectcurve", w );
1847 // bug #292, patch toolbar option
1848 if ( g_PrefsDlg.m_bPatchToolbar ) {
1849 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1850 "", _( "Show patch bounding box" ), "",
1851 new_pixmap( window, "patch_showboundingbox.bmp" ),
1852 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_PATCH_SHOWBOUNDINGBOX ) );
1853 g_object_set_data( G_OBJECT( window ), "tb_patch_showboundingbox", w );
1854 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855 "", _( "Show patches as wireframes" ), "",
1856 new_pixmap( window, "patch_wireframe.bmp" ),
1857 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_PATCH_WIREFRAME ) );
1858 g_object_set_data( G_OBJECT( window ), "tb_patch_wireframe", w );
1859 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860 "", _( "Patch Bend mode" ), "",
1861 new_pixmap( window, "patch_bend.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1862 GINT_TO_POINTER( ID_PATCH_BEND ) );
1863 g_object_set_data( G_OBJECT( window ), "tb_patch_bend", w );
1864 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Put caps on the current patch" ), "",
1865 new_pixmap( window, "curve_cap.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1866 GINT_TO_POINTER( ID_CURVE_CAP ) );
1867 g_object_set_data( G_OBJECT( window ), "tb_curve_cap", w );
1868 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1869 "", _( "Welds equal patch points during moves" ), "",
1870 new_pixmap( window, "patch_weld.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1871 GINT_TO_POINTER( ID_PATCH_WELD ) );
1872 g_object_set_data( G_OBJECT( window ), "tb_patch_weld", w );
1873 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874 "", _( "Selects drill down rows and columns" ), "",
1875 new_pixmap( window, "patch_drilldown.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1876 GINT_TO_POINTER( ID_PATCH_DRILLDOWN ) );
1877 g_object_set_data( G_OBJECT( window ), "tb_patch_drilldown", w );
1880 if ( g_PrefsDlg.m_bWideToolbar ) {
1881 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1882 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Show Entities as" ), "",
1883 new_pixmap( window, "show_entities.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1884 GINT_TO_POINTER( ID_SHOW_ENTITIES ) );
1885 g_object_set_data( G_OBJECT( window ), "tb_show_entities", w );
1891 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1892 gtk_widget_hide (w);
1893 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1894 gtk_widget_hide (w);
1895 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1896 gtk_widget_hide (w);
1897 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1898 gtk_widget_hide (w);
1902 m_bCamPreview = true;
1903 g_nScaleHow = ( SCALE_X | SCALE_Y | SCALE_Z );
1906 void MainFrame::create_plugin_toolbar( GtkWidget *window, GtkWidget *vbox ){
1907 GtkWidget *handle_box, *toolbar;
1909 handle_box = gtk_handle_box_new();
1910 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
1911 if ( g_PrefsDlg.m_bPluginToolbar ) {
1912 gtk_widget_show( handle_box );
1914 g_object_set_data( G_OBJECT( window ), "tb_handle_box", handle_box );
1916 toolbar = gtk_toolbar_new();
1917 gtk_toolbar_set_orientation( GTK_TOOLBAR( toolbar ), GTK_ORIENTATION_HORIZONTAL );
1918 gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
1919 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1920 gtk_container_add( GTK_CONTAINER( handle_box ), toolbar );
1921 g_object_set_data( G_OBJECT( window ), "toolbar_plugin", toolbar );
1922 gtk_widget_show( toolbar );
1925 void MainFrame::create_main_statusbar( GtkWidget *window, GtkWidget *vbox ){
1926 GtkWidget *hbox, *hbox1;
1930 hbox = gtk_hbox_new( FALSE, 0 );
1931 gtk_widget_show( hbox );
1932 gtk_widget_set_usize( hbox, -1, 24 );
1933 gtk_container_border_width( GTK_CONTAINER( hbox ), 1 );
1934 gtk_box_pack_end( GTK_BOX( vbox ), hbox, FALSE, TRUE, 2 );
1936 frame = gtk_frame_new( (char*)NULL );
1937 gtk_widget_show( frame );
1938 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
1939 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
1941 hbox1 = gtk_hbox_new( FALSE, 0 );
1942 gtk_container_add( GTK_CONTAINER( frame ), hbox1 );
1943 gtk_container_border_width( GTK_CONTAINER( hbox1 ), 0 );
1944 gtk_widget_show( hbox1 );
1946 label = gtk_label_new( _( " Label " ) );
1947 gtk_widget_show( label );
1948 gtk_box_pack_start( GTK_BOX( hbox1 ), label, FALSE, TRUE, 0 );
1949 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1950 gtk_misc_set_padding( GTK_MISC( label ), 3, 0 );
1951 m_pStatusLabel[0] = label;
1953 for ( int i = 1; i < 6; i++ )
1955 frame = gtk_frame_new( (char*)NULL );
1956 gtk_widget_show( frame );
1957 gtk_box_pack_start( GTK_BOX( hbox ), frame, FALSE, TRUE, 0 );
1958 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
1960 label = gtk_label_new( _( " Label " ) );
1961 gtk_widget_show( label );
1962 gtk_container_add( GTK_CONTAINER( frame ), label );
1963 m_pStatusLabel[i] = label;
1968 static gint mainframe_idle( gpointer user_data ){
1969 g_pParentWnd->RoutineProcessing();
1973 static void Sys_Iconify( GtkWidget *w );
1974 static void Sys_Restore( GtkWidget *w );
1976 inline void CHECK_RESTORE( GtkWidget* w ){
1977 if ( g_object_get_data( G_OBJECT( w ), "was_mapped" ) != NULL ) {
1978 gtk_widget_show( w );
1983 // this is called when the window is restored from the iconified state
1984 static void mainframe_map( GtkWidget *widget ){
1985 if ( g_pParentWnd->IsSleeping() ) {
1986 g_pParentWnd->OnSleep();
1989 if ( ( g_pParentWnd->CurrentStyle() == MainFrame::eFloating ) && ( widget == g_pParentWnd->m_pWidget ) ) {
1990 // restore previously visible windows
1991 CHECK_RESTORE( g_pParentWnd->GetCamWnd()->m_pParent );
1992 if ( g_PrefsDlg.m_bFloatingZ ) {
1993 CHECK_RESTORE( g_pParentWnd->GetZWnd()->m_pParent );
1995 CHECK_RESTORE( g_pParentWnd->GetXYWnd()->m_pParent );
1996 CHECK_RESTORE( g_pParentWnd->GetXZWnd()->m_pParent );
1997 CHECK_RESTORE( g_pParentWnd->GetYZWnd()->m_pParent );
1998 CHECK_RESTORE( g_pGroupDlg->m_pWidget );
2002 inline void CHECK_MINIMIZE( GtkWidget* w ){
2003 g_object_set_data( G_OBJECT( w ), "was_mapped", (void*)( GTK_WIDGET_VISIBLE( w ) != 0 ) );
2004 gtk_widget_hide( w );
2007 static void mainframe_unmap( GtkWidget *widget ){
2009 if ( ( g_pParentWnd->CurrentStyle() == MainFrame::eFloating ) && ( widget == g_pParentWnd->m_pWidget ) ) {
2010 // minimize all other windows when the main window is minimized
2011 CHECK_MINIMIZE( g_pParentWnd->GetCamWnd()->m_pParent );
2012 if ( g_PrefsDlg.m_bFloatingZ ) {
2013 CHECK_MINIMIZE( g_pParentWnd->GetZWnd()->m_pParent );
2015 CHECK_MINIMIZE( g_pParentWnd->GetXYWnd()->m_pParent );
2016 CHECK_MINIMIZE( g_pParentWnd->GetXZWnd()->m_pParent );
2017 CHECK_MINIMIZE( g_pParentWnd->GetYZWnd()->m_pParent );
2018 CHECK_MINIMIZE( g_pGroupDlg->m_pWidget );
2022 static GtkWidget* create_floating( MainFrame* mainframe ){
2023 GtkWidget *wnd = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2024 //workaround for a bug with set_transient_for in GTK - resulting behaviour is not perfect but better than the bug.
2025 //(see https://bugzilla.gnome.org/show_bug.cgi?id=658975 regarding the bug)
2026 if (mainframe->CurrentStyle() != MainFrame::eFloating)
2027 gtk_window_set_transient_for( GTK_WINDOW( wnd ), GTK_WINDOW( mainframe->m_pWidget ) );
2028 gtk_widget_set_events( wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2029 gtk_signal_connect( GTK_OBJECT( wnd ), "delete_event", GTK_SIGNAL_FUNC( widget_delete_hide ), NULL );
2030 gtk_signal_connect( GTK_OBJECT( wnd ), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
2031 gtk_signal_connect( GTK_OBJECT( wnd ), "key_press_event",
2032 GTK_SIGNAL_FUNC( mainframe_keypress ), mainframe );
2033 gtk_signal_connect( GTK_OBJECT( wnd ), "key_release_event",
2034 GTK_SIGNAL_FUNC( mainframe_keyrelease ), mainframe );
2035 gtk_signal_connect( GTK_OBJECT( wnd ), "map_event",
2036 GTK_SIGNAL_FUNC( mainframe_map ), mainframe );
2038 gtk_window_set_default_size( GTK_WINDOW( wnd ), 100, 100 );
2040 #ifdef DBG_WINDOWPOS
2041 Sys_Printf( "create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd );
2047 void console_populate_popup( GtkTextView* textview, GtkMenu* menu, gpointer user_data ){
2048 menu_separator( GTK_WIDGET( menu ) );
2050 GtkWidget* item = gtk_menu_item_new_with_label( _( "Clear" ) );
2051 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( Sys_ClearPrintf ), NULL );
2052 gtk_widget_show( item );
2053 gtk_menu_append( GTK_MENU( menu ), item );
2056 void console_construct( GtkWidget* textview ){
2057 g_signal_connect( G_OBJECT( textview ), "populate-popup", G_CALLBACK( console_populate_popup ), NULL );
2060 extern MemStream g_Clipboard;
2062 void Clipboard_CopyMap(){
2063 g_Clipboard.SetLength( 0 );
2064 Map_Export( &g_Clipboard, "xmap", false, true );
2067 void Clipboard_PasteMap(){
2068 if ( g_Clipboard.GetLength() > 0 ) {
2069 g_Clipboard.Seek( 0, SEEK_SET );
2070 Map_Import( &g_Clipboard, "xmap", true );
2075 Platform-independent GTK clipboard support.
2076 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2078 #if defined ( __linux__ ) || defined ( __APPLE__ )
2082 RADIANT_CLIPPINGS = 23,
2085 static const GtkTargetEntry clipboard_targets[] = {
2086 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2089 static void clipboard_get( GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner ){
2092 GdkAtom type = GDK_NONE;
2094 len = g_Clipboard.GetLength();
2101 buffer = g_Clipboard.GetBuffer();
2104 if ( info == clipboard_targets[0].info ) {
2105 type = gdk_atom_intern( clipboard_targets[0].target, FALSE );
2108 gtk_selection_data_set( selection_data, type, 8, buffer, len );
2111 static void clipboard_clear( GtkClipboard *clipboard, gpointer user_data_or_owner ){
2114 static void clipboard_received( GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data ){
2115 g_Clipboard.SetLength( 0 );
2117 if ( data->length < 0 ) {
2118 Sys_FPrintf( SYS_ERR, "Error retrieving selection\n" );
2120 else if ( strcmp( gdk_atom_name( data->type ), clipboard_targets[0].target ) == 0 ) {
2121 g_Clipboard.Write( data->data, data->length );
2124 Clipboard_PasteMap();
2127 void clipboard_copy(){
2128 Clipboard_CopyMap();
2130 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2132 gtk_clipboard_set_with_data( clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL );
2135 void clipboard_paste(){
2136 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2138 gtk_clipboard_request_contents( clipboard, gdk_atom_intern( clipboard_targets[0].target, FALSE ), clipboard_received, NULL );
2142 #elif defined( WIN32 )
2144 void clipboard_copy(){
2145 Clipboard_CopyMap();
2147 bool bClipped = false;
2148 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2149 if ( nClipboard > 0 ) {
2150 if ( ::OpenClipboard( NULL ) ) {
2152 long lSize = g_Clipboard.GetLength();
2153 HANDLE h = ::GlobalAlloc( GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof( long ) );
2155 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2156 memcpy( cp, &lSize, sizeof( long ) );
2157 cp += sizeof( long );
2158 g_Clipboard.Seek( 0, SEEK_SET );
2159 g_Clipboard.Read( cp, lSize );
2160 ::GlobalUnlock( h );
2161 ::SetClipboardData( nClipboard, h );
2169 Sys_Printf( "Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n" );
2173 void clipboard_paste(){
2174 bool bPasted = false;
2175 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2176 if ( nClipboard > 0 && ::OpenClipboard( NULL ) ) {
2177 if ( IsClipboardFormatAvailable( nClipboard ) ) {
2178 HANDLE h = ::GetClipboardData( nClipboard );
2180 g_Clipboard.SetLength( 0 );
2181 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2183 memcpy( &lSize, cp, sizeof( long ) );
2184 cp += sizeof( long );
2185 g_Clipboard.Write( cp, lSize );
2186 ::GlobalUnlock( h );
2192 Clipboard_PasteMap();
2197 void MainFrame::Copy(){
2201 void MainFrame::Paste(){
2203 UpdateSurfaceDialog();
2207 #ifdef DBG_WINDOWPOS
2208 GtkWidget *watchit = NULL;
2210 void CheckWatchit( char *msg ){
2211 static int width = 0;
2212 if ( ( watchit != NULL ) && ( watchit->allocation.width != width ) ) {
2213 Sys_Printf( "CheckWatchit %s: %d\n", msg, watchit->allocation.width );
2214 width = watchit->allocation.width;
2220 BOOL CALLBACK m_pCountMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2221 int *n = (int *) dwData;
2228 struct monitorInfo_s {
2229 GdkRectangle *win_monitors;
2233 BOOL CALLBACK m_pEnumMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2234 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2235 GdkRectangle *monitor;
2238 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2240 memset( &lpmi, 0, sizeof( MONITORINFOEX ) );
2241 lpmi.cbSize = sizeof( MONITORINFOEX );
2243 GetMonitorInfo( hMonitor, &lpmi );
2245 if ( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2248 SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0 );
2249 monitor->x = rect.left;
2250 monitor->y = rect.top;
2251 monitor->width = rect.right - rect.left;
2252 monitor->height = rect.bottom - rect.top;
2254 if ( monitorInfo->i_win_mon != 0 ) {
2255 GdkRectangle temp = *monitor;
2256 *monitor = monitorInfo->win_monitors[0];
2257 monitorInfo->win_monitors[0] = temp;
2261 monitor->x = lpmi.rcMonitor.left;
2262 monitor->y = lpmi.rcMonitor.top;
2263 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2264 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2267 monitorInfo->i_win_mon++;
2272 void PositionWindowOnPrimaryScreen( window_position_t& position ){
2273 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2275 if ( position.x <= primaryMonitorRect.x + 6 ) {
2276 position.x = primaryMonitorRect.x + 6;
2278 else if ( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 ) {
2279 position.x = primaryMonitorRect.x + 6;
2282 if ( position.y <= primaryMonitorRect.y + 6 ) {
2283 position.y = primaryMonitorRect.y + 6;
2285 else if ( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 ) {
2286 position.y = primaryMonitorRect.y + 6;
2289 if ( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 ) {
2290 position.w = primaryMonitorRect.width - 18;
2292 if ( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 ) {
2293 position.h = primaryMonitorRect.height - 18;
2298 GtkWidget* create_framed_widget( GtkWidget* widget ){
2299 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2300 gtk_widget_show( frame );
2301 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2302 gtk_container_add( GTK_CONTAINER( frame ), widget );
2303 gtk_widget_show( widget );
2307 gboolean entry_focus_in( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2308 gtk_window_remove_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2312 gboolean entry_focus_out( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2313 gtk_window_add_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2317 GtkWidget* create_framed_texwnd( TexWnd* texwnd ){
2318 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2319 gtk_widget_show( frame );
2320 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2322 GtkWidget* hbox = gtk_hbox_new( FALSE, 0 );
2323 gtk_widget_show( hbox );
2324 gtk_container_add( GTK_CONTAINER( frame ), hbox );
2326 GtkWidget* w = gtk_vscrollbar_new( GTK_ADJUSTMENT( gtk_adjustment_new( 0,0,0,1,1,1 ) ) );
2327 gtk_widget_show( w );
2328 gtk_box_pack_end( GTK_BOX( hbox ), w, FALSE, TRUE, 0 );
2329 g_qeglobals_gui.d_texture_scroll = w;
2331 GtkWidget* texbox = gtk_vbox_new( FALSE, 0 );
2332 gtk_widget_show( texbox );
2333 gtk_box_pack_start( GTK_BOX( hbox ), texbox, TRUE, TRUE, 0 );
2335 w = gtk_entry_new();
2336 gtk_box_pack_start( GTK_BOX( texbox ), w, FALSE, FALSE, 0 );
2337 texwnd->m_pFilter = w;
2338 g_signal_connect( G_OBJECT( w ), "focus_in_event", G_CALLBACK( entry_focus_in ), NULL );
2339 g_signal_connect( G_OBJECT( w ), "focus_out_event", G_CALLBACK( entry_focus_out ), NULL );
2341 w = texwnd->GetWidget();
2342 gtk_box_pack_start( GTK_BOX( texbox ), w, TRUE, TRUE, 0 );
2343 gtk_widget_show( w );
2348 static ZWnd *create_floating_zwnd( MainFrame *mainframe ){
2349 ZWnd *pZWnd = new ZWnd();
2350 GtkWidget* wnd = create_floating( mainframe );
2352 gtk_window_set_title( GTK_WINDOW( wnd ), "Z" );
2354 pZWnd->m_pParent = wnd;
2357 GtkWidget* frame = create_framed_widget( pZWnd->GetWidget() );
2358 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2361 gtk_widget_realize( wnd );
2363 // turn OFF minimize and maximize boxes.
2364 // Must be *after* realize, or wnd->window is NULL
2365 // should do the right thing on *nix, need to verify.
2366 gdk_window_set_decorations( wnd->window,
2367 GdkWMDecoration( GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2368 //TODO 50 by observation, will vary depending on decoration sizes
2370 GdkGeometry geometry;
2371 geometry.min_width = 50;
2372 //we only care about width, but have to set this too, or get nasty bugs
2373 geometry.min_height = 10;
2374 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE );
2378 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2379 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2382 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posZWnd );
2384 if ( g_PrefsDlg.m_bZVis ) {
2385 gtk_widget_show( wnd );
2391 static const int gutter = 12;
2393 void MainFrame::Create(){
2394 GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2396 gtk_widget_set_events( window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2397 gtk_signal_connect( GTK_OBJECT( window ), "delete_event",
2398 GTK_SIGNAL_FUNC( mainframe_delete ), this );
2399 gtk_signal_connect( GTK_OBJECT( window ), "destroy",
2400 GTK_SIGNAL_FUNC( mainframe_destroy ), this );
2401 gtk_signal_connect( GTK_OBJECT( window ), "key_press_event",
2402 GTK_SIGNAL_FUNC( mainframe_keypress ), this );
2403 gtk_signal_connect( GTK_OBJECT( window ), "key_release_event",
2404 GTK_SIGNAL_FUNC( mainframe_keyrelease ), this );
2405 gtk_signal_connect( GTK_OBJECT( window ), "map_event",
2406 GTK_SIGNAL_FUNC( mainframe_map ), this );
2407 gtk_signal_connect( GTK_OBJECT( window ), "unmap_event",
2408 GTK_SIGNAL_FUNC( mainframe_unmap ), this );
2410 g_qeglobals_gui.d_main_window = window;
2413 // calculate gdk offset
2414 int n_win_monitors = 0;
2416 monitorInfo_s monitorInfo;
2418 // detect multiple monitors
2419 EnumDisplayMonitors( NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>( &n_win_monitors ) );
2421 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2422 monitorInfo.i_win_mon = 0;
2423 EnumDisplayMonitors( NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>( &monitorInfo ) );
2425 gdk_offset_x = G_MININT;
2426 gdk_offset_y = G_MININT;
2429 for ( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2430 gdk_offset_x = MAX( gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x );
2431 gdk_offset_y = MAX( gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y );
2434 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 );
2436 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2438 GdkDisplay *display;
2440 gint n_gdk_monitors = 0;
2444 // detect multiple monitors
2445 display = gdk_display_get_default();
2446 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name( display ), gdk_display_get_n_screens( display ) );
2448 screen = gdk_display_get_screen( display, 1 );
2449 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2451 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2453 for ( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2454 memset( &rect, 0, sizeof( rect ) );
2455 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2456 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2459 memcpy( &primaryMonitorRect, &rect, sizeof( primaryMonitorRect ) );
2463 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2466 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2467 primaryMonitorRect.width = gdk_screen_width();
2468 primaryMonitorRect.height = gdk_screen_height();
2473 load_window_pos( window, g_PrefsDlg.mWindowInfo.position );
2475 GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
2476 gtk_container_add( GTK_CONTAINER( window ), vbox );
2477 gtk_widget_show( vbox );
2479 create_main_menu( window, vbox );
2481 create_main_toolbar( window, vbox );
2482 create_plugin_toolbar( window,vbox );
2484 m_nCurrentStyle = g_PrefsDlg.m_nView;
2486 g_pGroupDlg->Create();
2491 gtk_widget_show( window );
2493 // not needed on win32, it's in the .rc
2498 load_pixmap( "icon.bmp", window, &pixmap, &mask );
2499 gdk_window_set_icon( window->window, NULL, pixmap, mask );
2503 if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) {
2505 GtkWidget* vsplit = gtk_vpaned_new();
2506 m_pSplits[0] = vsplit;
2507 gtk_box_pack_start( GTK_BOX( vbox ), vsplit, TRUE, TRUE, 0 );
2508 gtk_widget_show( vsplit );
2511 GtkWidget* hsplit = gtk_hpaned_new();
2512 m_pSplits[2] = hsplit;
2513 gtk_paned_add1( GTK_PANED( vsplit ), hsplit );
2514 gtk_widget_show( hsplit );
2517 GtkWidget* hsplit2 = gtk_hpaned_new();
2518 m_pSplits[3] = hsplit2;
2519 gtk_paned_add2( GTK_PANED( hsplit ), hsplit2 );
2520 gtk_widget_show( hsplit2 );
2523 GtkWidget* vsplit2 = gtk_vpaned_new();
2524 m_pSplits[1] = vsplit2;
2525 if ( CurrentStyle() == eRegular ) {
2526 gtk_paned_add2( GTK_PANED( hsplit2 ), vsplit2 );
2529 gtk_paned_add1( GTK_PANED( hsplit ), vsplit2 );
2531 gtk_widget_show( vsplit2 );
2534 m_pCamWnd = new CamWnd();
2536 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2537 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2541 m_pXYWnd = new XYWnd();
2542 m_pXYWnd->SetViewType( XY );
2544 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2545 gtk_paned_add1( GTK_PANED( hsplit2 ), frame );
2549 m_pZWnd = new ZWnd();
2551 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2552 if ( CurrentStyle() == eRegular ) {
2553 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2556 gtk_paned_add2( GTK_PANED( hsplit2 ), frame );
2561 m_pTexWnd = new TexWnd();
2563 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2564 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2569 GtkWidget* scr = gtk_scrolled_window_new( NULL, NULL );
2570 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
2571 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
2572 gtk_widget_show( scr );
2573 gtk_paned_pack2( GTK_PANED( vsplit ), scr, FALSE, TRUE );
2576 GtkWidget* text = gtk_text_view_new();
2577 gtk_widget_set_size_request( text, 0, -1 ); // allow shrinking
2578 gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( text ), GTK_WRAP_WORD );
2579 gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
2580 gtk_container_add( GTK_CONTAINER( scr ), text );
2581 gtk_widget_show( text );
2582 g_qeglobals_gui.d_edit = text;
2590 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nXYHeight + 28 );
2592 if ( CurrentStyle() == eRegular ) {
2593 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nZWidth );
2594 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2598 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nCamWidth );
2599 while ( gtk_events_pending() ) gtk_main_iteration();
2600 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2603 while ( gtk_events_pending() ) gtk_main_iteration();
2605 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), g_PrefsDlg.mWindowInfo.nCamHeight );
2607 else if ( CurrentStyle() == eFloating ) {
2609 GtkWidget* wnd = create_floating( this );
2610 gtk_window_set_title( GTK_WINDOW( wnd ), "Camera" );
2613 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2614 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2617 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posCamWnd );
2619 gtk_widget_show( wnd );
2621 m_pCamWnd = new CamWnd();
2624 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2625 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2628 m_pCamWnd->m_pParent = wnd;
2631 if ( g_PrefsDlg.m_bFloatingZ ) {
2632 m_pZWnd = create_floating_zwnd( this );
2635 GtkWidget* wnd = create_floating( this );
2636 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2639 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2640 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2643 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2645 m_pXYWnd = new XYWnd();
2646 m_pXYWnd->SetViewType( XY );
2649 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2650 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2653 m_pXYWnd->m_pParent = wnd;
2655 gtk_widget_show( wnd );
2660 GtkWidget* wnd = create_floating( this );
2661 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2664 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2665 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2668 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2670 m_pZWnd = new ZWnd();
2671 m_pZWnd->m_pParent = wnd;
2673 m_pXYWnd = new XYWnd();
2674 m_pXYWnd->SetViewType( XY );
2675 m_pXYWnd->m_pParent = wnd;
2679 GtkWidget* hsplit = gtk_hpaned_new();
2680 m_pSplits[0] = hsplit;
2681 gtk_container_add( GTK_CONTAINER( wnd ), hsplit );
2682 gtk_widget_show( hsplit );
2685 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2686 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2689 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2690 gtk_paned_add2( GTK_PANED( hsplit ), frame );
2694 gtk_widget_show( wnd );
2696 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nZFloatWidth );
2700 GtkWidget* wnd = create_floating( this );
2701 gtk_window_set_title( GTK_WINDOW( wnd ), _( "XZ View" ) );
2704 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2705 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2708 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXZWnd );
2710 m_pXZWnd = new XYWnd();
2711 m_pXZWnd->m_pParent = wnd;
2712 m_pXZWnd->SetViewType( XZ );
2715 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2716 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2719 if ( g_PrefsDlg.m_bXZVis ) {
2720 gtk_widget_show( wnd );
2725 GtkWidget* wnd = create_floating( this );
2726 gtk_window_set_title( GTK_WINDOW( wnd ), _( "YZ View" ) );
2729 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2730 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2733 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posYZWnd );
2735 m_pYZWnd = new XYWnd();
2736 m_pYZWnd->m_pParent = wnd;
2737 m_pYZWnd->SetViewType( YZ );
2740 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2741 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2744 if ( g_PrefsDlg.m_bYZVis ) {
2745 gtk_widget_show( wnd );
2749 m_pTexWnd = new TexWnd();
2751 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2752 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2755 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2756 gtk_widget_show( w );
2757 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2761 g_pGroupDlg->Show();
2766 GtkWidget* hsplit = gtk_hpaned_new();
2767 m_pSplits[0] = hsplit;
2768 gtk_box_pack_start( GTK_BOX( vbox ), hsplit, TRUE, TRUE, 0 );
2769 gtk_widget_show( hsplit );
2772 GtkWidget* vsplit1 = gtk_vpaned_new();
2773 m_pSplits[1] = vsplit1;
2774 gtk_paned_add1( GTK_PANED( hsplit ), vsplit1 );
2775 gtk_widget_show( vsplit1 );
2778 GtkWidget* vsplit2 = gtk_vpaned_new();
2779 m_pSplits[2] = vsplit2;
2780 gtk_paned_add2( GTK_PANED( hsplit ), vsplit2 );
2781 gtk_widget_show( vsplit2 );
2783 m_pCamWnd = new CamWnd();
2785 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2786 gtk_paned_add1( GTK_PANED( vsplit1 ), frame );
2789 m_pXYWnd = new XYWnd();
2790 m_pXYWnd->SetViewType( XY );
2792 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2793 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2796 m_pYZWnd = new XYWnd();
2797 m_pYZWnd->SetViewType( YZ );
2799 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2800 gtk_paned_add2( GTK_PANED( vsplit1 ), frame );
2803 m_pXZWnd = new XYWnd();
2804 m_pXZWnd->SetViewType( XZ );
2806 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2807 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2813 // g_qeglobals_gui.d_edit = NULL;
2816 m_pTexWnd = new TexWnd();
2817 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2820 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2821 gtk_widget_show( w );
2822 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2826 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2827 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2828 m_pZWnd = create_floating_zwnd( this );
2830 while ( gtk_events_pending() )
2831 gtk_main_iteration();
2834 int x = GTK_PANED( m_pSplits[0] )->max_position / 2 - gutter;
2835 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), x );
2839 int y = GTK_PANED( m_pSplits[1] )->max_position / 2 - gutter;
2840 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), y );
2841 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), y );
2845 if ( g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED ) {
2846 gtk_window_maximize( GTK_WINDOW( window ) );
2849 gtk_widget_show( window );
2853 if ( m_pXYWnd ) { // this is always true?
2854 m_pXYWnd->SetActive( true );
2856 m_bSplittersOK = true;
2857 Texture_SetMode( g_qeglobals.d_savedinfo.iTexMenu );
2859 g_pParentWnd->OnEntitiesSetViewAs( 0 );
2861 // m_wndTextureBar.Create (vbox);
2862 create_main_statusbar( window, vbox );
2865 ShowMenuItemKeyBindings( window );
2867 if ( g_qeglobals_gui.d_edit != NULL ) {
2868 console_construct( g_qeglobals_gui.d_edit );
2871 // bool load_last = FALSE;
2874 SetButtonMenuStates();
2876 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2878 g_bIgnoreCommands++;
2879 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
2880 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
2881 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaderlistonly" ) );
2882 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
2883 g_bIgnoreCommands--;
2885 // if (g_PrefsDlg.m_bTextureBar)
2886 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2888 SetActiveXY( m_pXYWnd );
2890 s_idle_id = gtk_timeout_add( 25, mainframe_idle, this );
2892 QGL_InitExtensions();
2894 if ( g_PrefsDlg.mLocalPrefs.mbEmpty ) {
2895 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2896 g_PrefsDlg.SavePrefs();
2899 // remove the pid file
2900 remove( g_pidGameFile.GetBuffer() );
2902 Sys_Printf( "Entering message loop\n" );
2906 m_nTimer = gtk_timeout_add( 1000, timer, this );
2909 // =============================================================================
2912 MainFrame::MainFrame(){
2914 m_bSplittersOK = false;
2915 g_pParentWnd = this;
2916 m_pXYWnd = (XYWnd*)NULL;
2918 m_pTexWnd = (TexWnd*)NULL;
2919 m_pZWnd = (ZWnd*)NULL;
2920 m_pYZWnd = (XYWnd*)NULL;
2921 m_pXZWnd = (XYWnd*)NULL;
2922 m_pActiveXY = (XYWnd*)NULL;
2923 m_bCamPreview = true;
2925 for ( int n = 0; n < 6; n++ )
2926 m_pStatusLabel[n] = NULL;
2927 m_bNeedStatusUpdate = false;
2929 m_bSleeping = false;
2933 MainFrame::~MainFrame(){
2934 while ( g_BSPFrontendCommands )
2936 free( g_BSPFrontendCommands->data );
2937 g_BSPFrontendCommands = g_slist_remove( g_BSPFrontendCommands, g_BSPFrontendCommands->data );
2941 void MainFrame::ReleaseContexts(){
2943 m_pXYWnd->DestroyContext();
2946 m_pYZWnd->DestroyContext();
2949 m_pXZWnd->DestroyContext();
2952 m_pCamWnd->DestroyContext();
2955 m_pTexWnd->DestroyContext();
2958 m_pZWnd->DestroyContext();
2962 void MainFrame::CreateContexts(){
2964 m_pCamWnd->CreateContext();
2967 m_pXYWnd->CreateContext();
2970 m_pYZWnd->CreateContext();
2973 m_pXZWnd->CreateContext();
2976 m_pTexWnd->CreateContext();
2979 m_pZWnd->CreateContext();
2983 static void Sys_Iconify( GtkWidget *w ){
2984 // we might not have been realized yet
2985 if ( w->window == NULL ) {
2989 if ( !GTK_WIDGET_MAPPED( w ) ) {
2993 #if defined ( __linux__ ) || defined ( __APPLE__ )
2994 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Iconify\n" );
2996 XWindowAttributes xattr;
2997 GdkWindowPrivate *Private;
2999 Private = (GdkWindowPrivate*)w->window;
3000 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 0 ) );
3002 if ( !Private->destroyed ) {
3003 xattr.map_state = IsUnmapped;
3004 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3006 if ( xattr.map_state != IsUnmapped ) {
3007 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 1 ) );
3010 XIconifyWindow( Private->xdisplay, Private->xwindow, 0 );
3016 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_MINIMIZE );
3020 static void Sys_Restore( GtkWidget *w ){
3021 // we might not have been realized yet
3022 if ( w->window == NULL ) {
3026 if ( !GTK_WIDGET_VISIBLE( w ) ) {
3030 #if defined ( __linux__ ) || defined ( __APPLE__ )
3031 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Restore\n" );
3033 XWindowAttributes xattr;
3034 GdkWindowPrivate *Private;
3036 Private = (GdkWindowPrivate*)w->window;
3038 xattr.map_state = IsUnmapped;
3039 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3041 if ( xattr.map_state == IsUnmapped ) {
3042 XMapRaised( Private->xdisplay, Private->xwindow );
3048 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_RESTORE );
3056 void RefreshModelSkin( GSList **pModels, entitymodel_t *model ){
3057 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3058 // so we avoid the fucked up ones, assuming they are at the end
3059 if ( !model->strSkin ) {
3061 Sys_Printf( "Dropping model %p with empty skin in RefreshModelSkin\n", model );
3064 // and also keeping it so we have an actual count of empty models
3065 g_slist_append( *pModels, model );
3068 // do we have this model already?
3069 if ( g_slist_find( *pModels, model ) ) {
3072 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3073 Sys_Printf( "Already processed model: %p %s\n", model, ( (GString *)model->strSkin )->str );
3077 model->nTextureBind = Texture_LoadSkin( ( (GString *)model->strSkin )->str, &model->nSkinWidth, &model->nSkinHeight );
3078 if ( model->nTextureBind != -1 ) {
3079 Sys_Printf( "LOADED SKIN: %s\n", ( (GString *)model->strSkin )->str );
3082 Sys_Printf( "Load skin failed: %s\n", ( (GString *)model->strSkin )->str );
3084 *pModels = g_slist_append( *pModels, model );
3086 Sys_Printf( "Processed model %p %s\n", model, ( (GString *)model->strSkin )->str );
3090 void MainFrame::OnSleep(){
3092 if ( m_bSleeping ) {
3093 // useful when trying to debug crashes in the sleep code
3094 Sys_Printf( "Going into sleep mode..\n" );
3096 Sys_Printf( "Dispatching sleep msg..." );
3097 DispatchRadiantMsg( RADIANT_SLEEP );
3098 Sys_Printf( "Done.\n" );
3100 if ( CurrentStyle() == eSplit ) {
3101 Sys_Iconify( m_pZWnd->m_pParent );
3104 Sys_Iconify( m_pWidget );
3106 QERApp_FreeShaders();
3107 g_bScreenUpdates = false;
3110 Sys_Printf( "Releasing contexts..." );
3112 Sys_Printf( "Done.\n" );
3114 // free all the skins in the caches
3115 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3116 g_lstSkinCache.RemoveAll();
3120 Sys_Printf( "Waking up\n" );
3121 if ( CurrentStyle() == eSplit ) {
3122 Sys_Restore( m_pZWnd->m_pParent );
3125 Sys_Restore( m_pWidget );
3128 Sys_Printf( "Creating contexts..." );
3130 Sys_Printf( "Done.\n" );
3132 Sys_Printf( "Making current on camera..." );
3133 m_pCamWnd->MakeCurrent();
3134 Sys_Printf( "Done.\n" );
3136 Sys_Printf( "Reloading shaders..." );
3137 // reload the shader scripts and textures
3138 QERApp_ReloadShaders();
3140 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3141 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
3142 Sys_Printf( "Done.\n" );
3144 // rebuild the patches by setting the bDirty flag on them
3145 for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next )
3147 if ( b->patchBrush ) {
3148 b->pPatch->bDirty = true;
3152 Sys_Printf( "Reloading skins..." );
3153 // we have purged all the skins before going to sleep
3154 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3155 // namely, all entitymodel_t
3156 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3157 // (a single eclass_t can reference several entitymodel_t)
3158 // FIXME: and what's up with md3Class then? what is it used for?
3162 GSList *Models = NULL;
3163 for (ent = entities.next; ent != &entities; ent = ent->next)
3165 // if it's a model with skin then the fixedsize flag must be on
3166 // only if there IS a model .. we are not trying to load
3167 if (ent->eclass->fixedsize)
3169 if (ent->eclass->model)
3173 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3175 entitymodel_t *model;
3176 for (model = ent->eclass->model; model; model=model->pNext)
3177 RefreshModelSkin (&Models, model);
3178 } else if (ent->md3Class)
3180 entitymodel_t *model;
3181 for (model = ent->md3Class->model; model; model=model->pNext)
3182 RefreshModelSkin (&Models, model);
3186 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3191 for (e = g_md3Cache; e ; e = e->next)
3193 entitymodel_t *model;
3194 for (model = e->model; model; model=model->pNext)
3195 if (!g_slist_find (Models, model))
3197 Sys_Printf("model %p ", model);
3199 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3201 Sys_Printf("not found in main loop (no skin)\n");
3205 // clean the model list
3206 g_slist_free (Models);
3208 Sys_Printf( "Done.\n" );
3210 g_bScreenUpdates = true;
3212 Sys_Printf( "Dispatching wake msg..." );
3213 DispatchRadiantMsg( RADIANT_WAKEUP );
3214 Sys_Printf( "Done\n" );
3218 void WINAPI QERApp_Sleep(){
3219 g_pParentWnd->OnSleep();
3224 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3225 and not in OnDestroy because the info may be lost already?
3226 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3228 void MainFrame::OnDelete(){
3229 save_window_pos( m_pWidget, g_PrefsDlg.mWindowInfo.position );
3231 // surface inspector and patch inspector
3232 save_window_pos( g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd );
3233 save_window_pos( g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd );
3235 // entity inspector / group dialog
3236 // NOTE TTimo do we have to save a different window depending on the view mode?
3237 save_window_pos( g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd );
3239 if ( g_PrefsDlg.m_bFloatingZ ) {
3240 save_window_pos( m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd );
3243 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED( m_pSplits[0] )->child1_size;
3246 if ( CurrentStyle() == eFloating ) {
3247 save_window_pos( m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd );
3248 save_window_pos( m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd );
3249 save_window_pos( m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd );
3250 save_window_pos( m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd );
3253 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state( g_pParentWnd->m_pWidget->window );
3256 void MainFrame::OnDestroy(){
3257 // shut down console output first
3258 // (we'll still get the info if we are running a log file anyway)
3259 g_qeglobals_gui.d_edit = NULL;
3262 Sys_Printf( "MainFrame::OnDestroy\n" );
3265 gtk_timeout_remove( s_idle_id );
3268 gtk_timeout_remove( m_nTimer );
3271 if ( !g_qeglobals.disable_ini ) {
3272 Sys_Printf( "Start writing prefs\n" );
3273 Sys_Printf( "MRU_Save... " );
3275 Sys_Printf( "OK\n" );
3279 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split1" );
3280 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED( w )->child1_size;
3281 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split2" );
3282 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED( w )->child1_size;
3284 if ( !FloatingGroupDialog() ) {
3285 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3287 vsplit = m_pSplits[0];
3288 vsplit2 = m_pSplits[1];
3289 hsplit = m_pSplits[2];
3290 hsplit2 = m_pSplits[3];
3292 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED( vsplit )->child1_size;
3293 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED( hsplit2 )->child1_size;
3295 if ( CurrentStyle() == eRegular ) {
3296 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED( hsplit )->child1_size;
3299 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED( hsplit )->child1_size;
3302 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED( vsplit2 )->child1_size;
3306 if ( g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit ) {
3307 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
3308 g_PrefsDlg.m_bZVis = TRUE;
3311 g_PrefsDlg.m_bZVis = FALSE;
3315 g_PrefsDlg.SavePrefs();
3316 Sys_Printf( "Done prefs\n" );
3319 // spog - this may be better in another place..
3320 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3321 g_qeglobals.d_savedinfo.filters = FilterListDelete( g_qeglobals.d_savedinfo.filters );
3323 delete m_pXYWnd; m_pXYWnd = NULL;
3324 delete m_pYZWnd; m_pYZWnd = NULL;
3325 delete m_pXZWnd; m_pXZWnd = NULL;
3326 delete m_pZWnd; m_pZWnd = NULL;
3327 delete m_pTexWnd; m_pTexWnd = NULL;
3328 delete m_pCamWnd; m_pCamWnd = NULL;
3330 if ( g_pGroupDlg->m_pWidget ) {
3331 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3332 gtk_widget_destroy( g_pGroupDlg->m_pWidget );
3333 g_pGroupDlg->m_pWidget = NULL;
3336 if ( strcmpi( currentmap, "unnamed.map" ) != 0 ) {
3337 g_PrefsDlg.m_strLastMap = currentmap;
3338 g_PrefsDlg.SavePrefs();
3340 Sys_Printf( "CleanUpEntities..." );
3342 Sys_Printf( "Done.\n" );
3344 Sys_Printf( "Releasing brushes..." );
3345 while ( active_brushes.next != &active_brushes )
3346 Brush_Free( active_brushes.next, false );
3347 while ( selected_brushes.next != &selected_brushes )
3348 Brush_Free( selected_brushes.next, false );
3349 while ( filtered_brushes.next != &filtered_brushes )
3350 Brush_Free( filtered_brushes.next, false );
3351 Sys_Printf( "Done.\n" );
3353 Sys_Printf( "Releasing entities..." );
3354 while ( entities.next != &entities )
3355 Entity_Free( entities.next );
3356 Sys_Printf( "Done.\n" );
3358 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3361 epair_t* pNextEPair = pEPair->next;
3362 free( pEPair->key );
3363 free( pEPair->value );
3365 pEPair = pNextEPair;
3368 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3369 while ( pEntity != NULL && pEntity != g_qeglobals.d_project_entity )
3371 entity_t* pNextEntity = pEntity->next;
3372 Entity_Free( pEntity );
3373 pEntity = pNextEntity;
3376 Sys_Printf( "Freeing world entity..." );
3377 if ( world_entity ) {
3378 Entity_Free( world_entity );
3380 Sys_Printf( "Done.\n" );
3382 Sys_Printf( "Shutdown VFS..." );
3384 Sys_Printf( "Done.\n" );
3386 Sys_Printf( "FreeShaders..." );
3387 QERApp_FreeShaders();
3388 Sys_Printf( "Done.\n" );
3391 // TTimo: now using profile.cpp code
3392 void MainFrame::LoadCommandMap(){
3395 bool bUserCmdList = false;
3397 // verbose a little: count of user commands we recognized
3399 int iOverrideCount = 0;
3403 #if defined ( __linux__ ) || defined ( __APPLE__ )
3404 strINI = g_PrefsDlg.m_rc_path->str;
3405 #elif defined( WIN32 )
3406 strINI = g_strGameToolsPath;
3408 #error "WTF are you compiling this on"
3411 strINI += "shortcuts.ini";
3413 f = fopen( strINI.GetBuffer(), "r" );
3416 // loop through all the commands
3417 for ( int i = 0; i < g_nCommandCount; i++ )
3420 if ( read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ) ) {
3421 if ( !bUserCmdList ) {
3422 Sys_Printf( "Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3423 bUserCmdList = true;
3428 strBuff.TrimRight();
3429 strBuff.MakeLower();
3430 int nSpecial = strBuff.Find( "+alt" );
3431 g_Commands[i].m_nModifiers = 0;
3432 if ( nSpecial >= 0 ) {
3433 g_Commands[i].m_nModifiers |= RAD_ALT;
3434 FindReplace( strBuff, "+alt", "" );
3436 nSpecial = strBuff.Find( "+ctrl" );
3437 if ( nSpecial >= 0 ) {
3438 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3439 FindReplace( strBuff, "+ctrl", "" );
3441 nSpecial = strBuff.Find( "+shift" );
3442 if ( nSpecial >= 0 ) {
3443 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3444 FindReplace( strBuff, "+shift", "" );
3447 strBuff.TrimRight();
3448 strBuff.MakeUpper();
3449 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3451 nLen = strBuff.GetLength();
3452 if ( nLen == 1 ) { // most often case.. deal with first
3453 g_Commands[i].m_nKey = __toascii( strBuff.GetAt( 0 ) );
3458 for ( j = 0; j < g_nKeyCount; j++ )
3460 if ( strBuff.CompareNoCase( g_Keys[j].m_strName ) == 0 ) {
3461 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3466 if ( j == g_nKeyCount ) {
3467 Sys_Printf( "WARNING: failed to parse user command %s\n", value );
3471 // maybe this new shortcut is overriding another one
3472 // then we need to disable the other binded key
3473 for ( j = 0; j < g_nCommandCount; j++ )
3478 if ( g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers ) {
3480 g_Commands[j].m_nKey = 0;
3483 // it's the only one
3489 if ( iOverrideCount ) {
3490 Sys_Printf( "User's command list overrides %d default commands\n", iOverrideCount );
3492 Sys_Printf( "Parsed %d custom shortcuts\n", iCount );
3495 Sys_Printf( "Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer() );
3499 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3500 // we also output the count of commands that are not binded .. dunno if it's much use ..
3501 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3502 void MainFrame::ShowMenuItemKeyBindings( GtkWidget* window ){
3503 //!\todo Find a better way to get the global accelerator group..
3504 GtkAccelGroup *accel = GTK_ACCEL_GROUP( gtk_accel_groups_from_object( G_OBJECT( window ) )->data );
3510 for ( i = 0; i < g_nCommandCount; i++ )
3512 if ( g_Commands[i].m_nKey == 0 ) {
3517 item = g_object_get_data( G_OBJECT( m_pWidget ), g_Commands[i].m_strMenu );
3518 if ( item == NULL ) {
3519 Sys_FPrintf( SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3520 g_Commands[i].m_strCommand );
3525 if ( g_Commands[i].m_nModifiers ) { // are there modifiers present?
3526 if ( g_Commands[i].m_nModifiers & RAD_SHIFT ) {
3527 mods |= GDK_SHIFT_MASK;
3529 if ( g_Commands[i].m_nModifiers & RAD_ALT ) {
3530 mods |= GDK_MOD1_MASK;
3532 if ( g_Commands[i].m_nModifiers & RAD_CONTROL ) {
3533 mods |= GDK_CONTROL_MASK;
3537 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3538 if ( gtk_accelerator_valid( g_Commands[i].m_nKey, (GdkModifierType)mods ) ) {
3540 // NOTE TTimo this is the important place where all the shortcuts are binded
3541 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 );
3543 gtk_widget_add_accelerator( GTK_WIDGET( item ), "activate", accel, g_Commands[i].m_nKey,
3544 (GdkModifierType)mods, GTK_ACCEL_VISIBLE );
3548 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL( GTK_BIN( item )->child );
3552 g_free( accel_label->accel_string );
3553 accel_label->accel_string = NULL;
3555 gstring = g_string_new( accel_label->accel_string );
3556 g_string_append( gstring, " " );
3559 if ( mods & GDK_SHIFT_MASK ) {
3560 g_string_append( gstring, "Shft" );
3563 if ( mods & GDK_CONTROL_MASK ) {
3565 g_string_append( gstring, "+" );
3567 g_string_append( gstring, "Ctl" );
3570 if ( mods & GDK_MOD1_MASK ) {
3572 g_string_append( gstring, "+" );
3574 g_string_append( gstring, "Alt" );
3579 g_string_append( gstring, "+" );
3581 if ( g_Commands[i].m_nKey < 0x80 || ( g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff ) ) {
3582 switch ( g_Commands[i].m_nKey )
3585 g_string_append( gstring, "Space" );
3588 g_string_append( gstring, "Backslash" );
3591 g_string_append_c( gstring, toupper( g_Commands[i].m_nKey ) );
3599 tmp = gtk_accelerator_name( g_Commands[i].m_nKey, (GdkModifierType)0 );
3600 if ( tmp[0] != 0 && tmp[1] == 0 ) {
3601 tmp[0] = toupper( tmp[0] );
3603 g_string_append( gstring, tmp );
3607 g_free( accel_label->accel_string );
3608 accel_label->accel_string = gstring->str;
3609 g_string_free( gstring, FALSE );
3611 if ( !accel_label->accel_string ) {
3612 accel_label->accel_string = g_strdup( "" );
3615 gtk_widget_queue_resize( GTK_WIDGET( accel_label ) );
3620 Sys_Printf( "%d commands not bound to a key\n", iCount );
3624 // Checks whether a given filename ends in .map
3625 const bool IsMap(const char* filename){
3626 return strlen(filename) >= 4 && strcmp(filename + strlen(filename) - 4, ".map") == 0;
3629 void MainFrame::CreateQEChildren(){
3630 // load the project file, if it is a project file. (Or at least no .map)
3631 if ( g_argc > 1 && !IsMap( g_argv[1] ) ) {
3632 Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
3633 if ( !QE_LoadProject( g_argv[1] ) ) {
3634 Error( "Unable to load project file %s\n", g_argv[1] );
3639 const char* filename = NULL;
3642 bool bTriedTemplate = false;
3644 if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
3645 // we need to regenerate from template
3646 Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
3647 g_PrefsDlg.m_strLastProject = "";
3650 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3652 while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
3654 if ( !bTriedTemplate ) {
3655 // try default project location
3656 bTriedTemplate = true;
3657 // for all OSes, we look for the template in the base installation (no homepath here)
3658 strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
3659 strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
3660 strcat( buf, "/scripts/" );
3661 strcat( buf, PROJECT_TEMPLATE_NAME );
3666 gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
3668 filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
3669 if ( filename != NULL ) {
3673 Error( "Cannot continue without loading a project..." );
3682 void MainFrame::OnTimer(){
3683 GdkModifierType mask;
3685 gdk_window_get_pointer( NULL, NULL, NULL, &mask );
3687 if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
3688 QE_CountBrushesAndUpdateStatusBar();
3692 // see MainFrame::UpdateStatusText below
3693 if ( m_bNeedStatusUpdate ) {
3694 for ( int n = 0; n < 6; n++ )
3696 if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
3697 gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
3700 m_bNeedStatusUpdate = false;
3704 void MainFrame::UpdateStatusText(){
3705 m_bNeedStatusUpdate = true;
3708 void MainFrame::SetStatusText( int nPane, const char* pText ){
3709 if ( pText && nPane <= 5 && nPane >= 0 ) {
3710 m_strStatus[nPane] = pText;
3714 void MainFrame::SetButtonMenuStates(){
3716 g_bIgnoreCommands++;
3718 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
3719 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
3720 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
3721 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
3722 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
3723 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
3724 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
3725 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
3726 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
3727 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
3728 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
3729 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
3730 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3731 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3732 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
3733 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3734 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3735 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3736 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3737 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3738 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3739 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
3740 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3741 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
3742 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
3743 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3744 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
3745 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
3746 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3747 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
3748 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
3749 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3750 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
3751 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
3752 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3753 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
3754 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
3755 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3756 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
3757 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
3758 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3759 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
3760 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
3761 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3762 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
3763 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
3764 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3765 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
3766 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
3767 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3768 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
3769 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3770 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3771 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3772 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3773 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3774 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3775 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
3776 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3777 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
3778 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
3779 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3780 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
3781 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
3782 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3783 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
3784 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
3785 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3786 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
3787 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
3788 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3789 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
3790 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
3791 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3792 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
3793 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
3794 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
3795 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
3796 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
3797 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
3798 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3799 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
3800 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
3801 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
3802 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
3804 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
3805 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3806 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
3807 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
3809 if ( !g_pGameDescription->mNoPatch ) {
3810 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
3811 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
3813 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
3814 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
3815 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
3816 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
3817 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
3818 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
3821 int id, n = g_PrefsDlg.m_nTextureScale;
3824 case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3825 case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3826 case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3827 case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3828 default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3830 SetTextureScale( id );
3832 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3834 if (g_qeglobals.d_project_entity)
3836 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3840 g_bIgnoreCommands--;
3843 void MainFrame::UpdateWindows( int nBits ){
3844 if ( !g_bScreenUpdates ) {
3847 #ifdef DBG_WINDOWPOS
3848 static int bean_count = 0;
3850 sprintf( bean_buf,"UpdateWindows %d",bean_count );
3851 CheckWatchit( bean_buf );
3855 if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
3857 m_pXYWnd->RedrawWindow();
3860 m_pXZWnd->RedrawWindow();
3863 m_pYZWnd->RedrawWindow();
3867 if ( nBits & W_CAMERA || ( ( nBits & W_CAMERA_IFON ) && m_bCamPreview ) ) {
3869 m_pCamWnd->RedrawWindow();
3873 if ( nBits & ( W_Z | W_Z_OVERLAY ) ) {
3875 m_pZWnd->RedrawWindow();
3879 if ( nBits & W_TEXTURE ) {
3881 m_pTexWnd->RedrawWindow();
3884 #ifdef DBG_WINDOWPOS
3885 sprintf( bean_buf,"%d (end UpdateWidows)",bean_count );
3886 CheckWatchit( bean_buf );
3890 void MainFrame::RoutineProcessing(){
3891 #ifdef DBG_WINDOWPOS
3892 static int bean_count = 0;
3894 sprintf( bean_buf,"RoutineProcessing %d",bean_count );
3895 CheckWatchit( bean_buf );
3901 double oldtime = 0.0;
3904 /* // checking KeyState works right
3906 a2 = GetKeyState(VK_MENU);
3909 Sys_Printf("VK_MENU: %d\n",a2);
3913 b2 = GetKeyState(VK_UP);
3916 Sys_Printf("VK_UP: %d\n",b2);
3920 time = Sys_DoubleTime();
3921 delta = time - oldtime;
3923 if ( delta > 0.2 ) {
3927 // update the BSP process watcher
3928 if ( m_pWatchBSP ) {
3929 m_pWatchBSP->RoutineProcessing();
3932 // run time dependant behavior
3934 m_pCamWnd->Cam_MouseControl( delta );
3937 if ( g_nUpdateBits ) {
3938 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3939 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3940 UpdateWindows( nBits ); // happens in rare cases but causes a stack overflow
3943 // Enable/disable the menu items
3946 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3947 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3948 if (!g_PrefsDlg.m_bWideToolbar)
3950 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3951 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3953 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3954 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3955 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3956 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3957 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3958 gtk_widget_set_sensitive (item, region_active);
3959 g_bIgnoreCommands++;
3960 // update the toolbar before displaying the menu:
3961 // show in use check box
3962 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3963 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3964 // show all check box
3965 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3966 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3967 g_bIgnoreCommands--;
3970 #ifdef DBG_WINDOWPOS
3971 sprintf( bean_buf,"%d (end RoutineProcessing)",bean_count );
3972 CheckWatchit( bean_buf );
3976 void MainFrame::DoWatchBSP(){
3977 // network monitoring of the BSP process
3978 if ( !m_pWatchBSP ) {
3979 m_pWatchBSP = new CWatchBSP();
3983 void MainFrame::CleanPlugInMenu(){
3984 GtkWidget *menu, *sep;
3987 // delete everything after the separator
3988 menu = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) );
3989 sep = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin_separator" ) );
3990 m_nNextPlugInID = ID_PLUGIN_START;
3992 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3995 gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( lst->next->data ) );
3996 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
4000 void MainFrame::AddPlugInMenuItem( IPlugIn* pPlugIn ){
4001 GtkWidget *menu, *item, *parent;
4002 const char *menuText;
4004 parent = gtk_menu_item_new_with_label( pPlugIn->getMenuName() );
4005 gtk_widget_show( parent );
4006 gtk_container_add( GTK_CONTAINER( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) ), parent );
4008 int nCount = pPlugIn->getCommandCount();
4010 menu = gtk_menu_new();
4011 while ( nCount > 0 )
4013 menuText = pPlugIn->getCommand( --nCount );
4014 if ( menuText != NULL && strlen( menuText ) > 0 ) {
4015 if ( !strcmp( menuText, "-" ) ) {
4016 item = gtk_menu_item_new();
4017 gtk_widget_set_sensitive( item, FALSE );
4021 item = gtk_menu_item_new_with_label( menuText );
4022 gtk_signal_connect( GTK_OBJECT( item ), "activate",
4023 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( m_nNextPlugInID ) );
4025 gtk_widget_show( item );
4026 gtk_container_add( GTK_CONTAINER( menu ), item );
4027 pPlugIn->addMenuID( m_nNextPlugInID++ );
4030 gtk_menu_item_set_submenu( GTK_MENU_ITEM( parent ), menu );
4034 void MainFrame::OnPlugIn( unsigned int nID, char* str ){
4035 m_PlugInMgr.Dispatch( nID, str );
4038 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype( IToolbarButton::EType type ){
4041 case IToolbarButton::eSpace:
4042 return GTK_TOOLBAR_CHILD_SPACE;
4043 case IToolbarButton::eButton:
4044 return GTK_TOOLBAR_CHILD_BUTTON;
4045 case IToolbarButton::eToggleButton:
4046 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4047 case IToolbarButton::eRadioButton:
4048 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4050 Error( "invalid toolbar button type" );
4051 return (GtkToolbarChildType)0;
4054 void toolbar_insert( GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data ){
4055 GtkWidget *w, *pixmap;
4056 GdkPixmap *gdkpixmap;
4059 load_plugin_bitmap( image, (void **)&gdkpixmap, (void **)&mask );
4060 pixmap = gtk_pixmap_new( gdkpixmap, mask );
4061 gdk_pixmap_unref( gdkpixmap );
4062 gdk_pixmap_unref( mask );
4063 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), gtktoolbarchildtype_for_toolbarbuttontype( type ), NULL, text, tooltip, "", GTK_WIDGET( pixmap ), handler, data );
4066 void SignalToolbarButton( GtkWidget *widget, gpointer data ){
4067 const_cast<const IToolbarButton*>( reinterpret_cast<IToolbarButton*>( data ) )->activate();
4070 void MainFrame::AddPlugInToolbarButton( const IToolbarButton* button ){
4071 GtkWidget*const toolbar = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "toolbar_plugin" ) );
4072 toolbar_insert( toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC( SignalToolbarButton ), reinterpret_cast<gpointer>( const_cast<IToolbarButton*>( button ) ) );
4075 void MainFrame::OnSelectionSelectNudgedown(){
4076 NudgeSelection( 3, g_qeglobals.d_gridsize );
4079 void MainFrame::OnSelectionSelectNudgeleft(){
4080 NudgeSelection( 0, g_qeglobals.d_gridsize );
4083 void MainFrame::OnSelectionSelectNudgeright(){
4084 NudgeSelection( 2, g_qeglobals.d_gridsize );
4087 void MainFrame::OnSelectionSelectNudgeup(){
4088 NudgeSelection( 1, g_qeglobals.d_gridsize );
4091 void MainFrame::NudgeSelection( int nDirection, float fAmount ){
4092 if ( ActiveXY()->RotateMode() ) {
4094 if ( ActiveXY()->GetViewType() == XY ) {
4098 if ( g_pParentWnd->ActiveXY()->GetViewType() == XZ ) {
4103 if ( nDirection == 2 || nDirection == 3 ) {
4107 float fDeg = -fAmount;
4108 float fAdj = fAmount;
4110 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4112 strStatus.Format( "Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4113 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2] );
4114 g_pParentWnd->SetStatusText( 2, strStatus );
4115 Select_RotateAxis( nAxis, fDeg, false, true );
4116 Sys_UpdateWindows( W_ALL );
4119 if ( ActiveXY()->ScaleMode() ) {
4120 if ( nDirection == 0 || nDirection == 3 ) {
4124 v[0] = v[1] = v[2] = 1.0;
4125 if ( fAmount > 0 ) {
4137 Select_Scale( ( g_nScaleHow & SCALE_X ) ? v[0] : 1.0,
4138 ( g_nScaleHow & SCALE_Y ) ? v[1] : 1.0,
4139 ( g_nScaleHow & SCALE_Z ) ? v[2] : 1.0 );
4140 Sys_UpdateWindows( W_ALL );
4144 // 0 - left, 1 - up, 2 - right, 3 - down
4146 if ( nDirection == 0 ) {
4147 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4150 else if ( nDirection == 1 ) {
4151 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4153 else if ( nDirection == 2 ) {
4154 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4158 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4161 Nudge( nDim, fAmount );
4165 void MainFrame::Nudge( int nDim, float fNudge ){
4167 vMove[0] = vMove[1] = vMove[2] = 0;
4168 vMove[nDim] = fNudge;
4170 if ( ( g_qeglobals.d_select_mode == sel_vertex ||
4171 g_qeglobals.d_select_mode == sel_curvepoint )
4172 && g_qeglobals.d_num_move_points ) {
4173 Select_NudgePoint( vMove, true );
4176 Select_Move( vMove, true );
4178 Sys_UpdateWindows( W_ALL );
4181 void MainFrame::SetGridStatus(){
4185 c1 = ( g_PrefsDlg.m_bTextureLock ) ? 'M' : ' ';
4186 c2 = ( g_PrefsDlg.m_bRotateLock ) ? 'R' : ' ';
4187 strStatus.Format( "G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4188 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2 );
4189 SetStatusText( 4, strStatus );
4192 void MainFrame::UpdatePatchToolbarButtons(){
4194 g_bIgnoreCommands++;
4195 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
4196 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
4197 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4198 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4199 g_bIgnoreCommands--;
4202 // =============================================================================
4205 void MainFrame::OnFileNew(){
4206 if ( ConfirmModified() ) {
4211 void MainFrame::OnFileOpen(){
4212 if ( !ConfirmModified() ) {
4219 if ( !g_pGameDescription->noMapsInHome ) {
4220 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4221 strcat( buf, "maps/" );
4227 str = file_dialog( m_pWidget, TRUE, _( "Open Map" ), buf, MAP_MAJOR, "maps/" );
4229 if ( str != NULL ) {
4230 strcpy( currentmap,str );
4232 Map_LoadFile( str );
4236 void MainFrame::OnFileImportmap(){
4240 if ( !g_pGameDescription->noMapsInHome ) {
4241 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4242 strcat( buf, "maps/" );
4248 str = file_dialog( m_pWidget, TRUE, _( "Import Map" ), buf, MAP_MAJOR, "maps/" );
4250 if ( str != NULL ) {
4251 Map_ImportFile( str );
4255 void MainFrame::OnFileSave(){
4256 if ( !strcmp( currentmap, "unnamed.map" ) ) {
4260 Map_SaveFile( currentmap, false );
4264 void MainFrame::OnFileSaveas(){
4268 if ( !g_pGameDescription->noMapsInHome ) {
4269 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4270 strcat( buf, "maps/" );
4276 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Save Map" ), buf, MAP_MAJOR, "maps/" );
4278 if ( str != NULL ) {
4279 strcpy( currentmap, str );
4281 Map_SaveFile( str, false ); // ignore region
4285 void MainFrame::OnFileExportmap(){
4289 if ( !g_pGameDescription->noMapsInHome ) {
4290 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4291 strcat( buf, "maps/" );
4297 str = file_dialog( m_pWidget, FALSE, _( "Export Selection" ), buf, MAP_MAJOR, "maps/" );
4299 if ( str != NULL ) {
4300 Map_SaveSelected( str );
4304 void MainFrame::OnFileSaveregion(){
4308 if ( !g_pGameDescription->noMapsInHome ) {
4309 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4310 strcat( buf, "maps/" );
4316 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Export Region" ), buf, MAP_MAJOR, "maps/" );
4318 if ( str != NULL ) {
4319 Map_SaveFile( str, true ); // ignore region
4323 void MainFrame::OnFileNewproject(){
4324 char* name = DoNewProjectDlg();
4326 // create a new project:
4327 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4328 // on linux we create under ~/.q3a, on win32 under strEnginePath
4329 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4330 if ( ( name != NULL ) && ( strlen( name ) > 0 ) ) {
4331 CString strNewBasePath;
4333 // NOTE TTimo this would probably not work right on *nix
4334 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4335 strNewBasePath += name;
4336 strNewBasePath += "/";
4338 CString strProjToLoad;
4339 CString strMapToLoad;
4341 // if the dir exists, ask the user if they want to continue anyway
4342 if ( Q_mkdir( strNewBasePath.GetBuffer(), 0755 ) != 0 ) {
4344 strMsg.Format( "The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer() );
4345 Sys_Printf( strMsg );
4346 if ( gtk_MessageBox( m_pWidget, _( strMsg ), _( "Error" ), MB_YESNO ) != IDYES ) {
4347 Sys_Printf( "New Project cancelled, directory already exists for project\n" );
4354 strDir = strNewBasePath;
4356 Q_mkdir( strDir.GetBuffer(), 0755 );
4358 strDir = strNewBasePath;
4359 strDir += "textures/";
4360 Q_mkdir( strDir.GetBuffer(), 0755 );
4362 strDir = strNewBasePath;
4363 strDir += "scripts/";
4364 Q_mkdir( strDir.GetBuffer(), 0755 );
4366 // print a warning for total conversions, since setting the basepath when required files are
4367 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4368 Sys_FPrintf( SYS_WRN, "*** Note: basepath unchanged\n" );
4370 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name );
4372 strDir = strNewBasePath;
4373 strDir += "maps/autosave.map";
4374 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4376 // state that this is a user project file, no templating
4377 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4378 // create the project file
4379 strProjToLoad = strNewBasePath;
4380 strProjToLoad += "scripts/";
4381 strProjToLoad += name;
4382 strProjToLoad += ".";
4383 strProjToLoad += PROJECT_FILETYPE;
4384 QE_SaveProject( strProjToLoad.GetBuffer() );
4389 void MainFrame::OnFileLoadproject(){
4390 if ( ConfirmModified() ) {
4395 void MainFrame::OnFileProjectsettings(){
4396 DoProjectSettings();
4399 void MainFrame::OnFilePointfile(){
4400 if ( g_qeglobals.d_pointfile_display_list ) {
4408 void MainFrame::OnMru( unsigned int nID ){
4409 if ( ConfirmModified() ) {
4410 MRU_Activate( nID - ID_FILE_RECENT1 );
4414 void MainFrame::OnFileExit(){
4415 if ( ConfirmModified() ) {
4416 // stop printing during shutdown
4417 // NOTE: we should cleanly release GL contexts and stuff when exiting
4421 g_qeglobals_gui.d_edit = NULL;
4422 gtk_widget_destroy( m_pWidget );
4426 void MainFrame::OnFileCheckUpdate(){
4429 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4431 URL += "&OS_dlup=1";
4433 URL += "&OS_dlup=2";
4435 URL += "&Version_dlup=" RADIANT_VERSION;
4436 g_PrefsDlg.mGamesDialog.AddPacksURL( URL );
4437 OpenURL( URL.GetBuffer() );
4440 void MainFrame::OnEditUndo(){
4444 void MainFrame::OnEditRedo(){
4448 void MainFrame::OnEditCopybrush(){
4452 void MainFrame::OnEditPastebrush(){
4455 Undo_Start( "paste" );
4459 Undo_EndBrushList( &selected_brushes );
4463 void MainFrame::OnEditPastebrushToCamera(){
4466 vec3_t mid, camorigin, delta;
4468 ActiveXY()->Paste();
4470 // Work out the delta
4471 Select_GetMid( mid );
4473 // Snap camera origin to grid
4474 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4475 camorigin[0] = floor( camorigin[0] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4476 camorigin[1] = floor( camorigin[1] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4477 camorigin[2] = floor( camorigin[2] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4479 VectorSubtract( camorigin, mid, delta );
4482 Select_Move( delta, false );
4484 Undo_Start( "paste to camera" );
4485 Undo_EndBrushList( &selected_brushes );
4490 void MainFrame::OnSelectionDelete(){
4493 // ActiveXY()->UndoCopy();
4494 Undo_Start( "delete" );
4495 Undo_AddBrushList( &selected_brushes );
4496 //add all deleted entities to the undo
4497 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
4499 Undo_AddEntity( brush->owner );
4501 // NOTE: Select_Delete does NOT delete entities
4503 Undo_EndBrushList( &selected_brushes );
4507 void MainFrame::OnEditMapinfo(){
4511 void MainFrame::OnEditEntityinfo(){
4515 void MainFrame::OnBrushScripts(){
4519 void MainFrame::OnEditLoadprefab(){
4520 const char *filename;
4523 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4524 CurPath = g_PrefsDlg.m_strPrefabPath;
4525 AddSlash( CurPath );
4528 filename = file_dialog( m_pWidget, TRUE, _( "Import Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4530 if ( filename != NULL ) {
4531 Map_ImportFile( filename );
4535 void MainFrame::OnEditSaveprefab(){
4536 const char *filename;
4539 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4540 CurPath = g_PrefsDlg.m_strPrefabPath;
4545 getcwd( tmp, PATH_MAX );
4548 AddSlash( CurPath );
4550 filename = file_dialog( m_pWidget, FALSE, _( "Export Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4551 if ( filename != NULL ) {
4552 Map_SaveSelected( filename );
4556 void MainFrame::OnPrefs(){
4557 int nView = g_PrefsDlg.m_nView;
4558 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4559 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4560 int nShader = g_PrefsDlg.m_nShader;
4561 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4562 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4563 g_PrefsDlg.LoadPrefs();
4565 if ( g_PrefsDlg.DoModal() == IDOK ) {
4566 if ( ( g_PrefsDlg.m_nLatchedView != nView ) ||
4567 ( g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus ) ||
4568 ( g_PrefsDlg.m_bLatchedWideToolbar != bToolbar ) ||
4569 ( g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar ) ||
4570 ( g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar ) ||
4571 ( g_PrefsDlg.m_nLatchedShader != nShader ) ||
4572 ( g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality )
4573 || ( g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ )
4575 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for the changes to take effect." ) );
4578 // if the view mode was switched to floating, set the Z window on by default
4579 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4580 // (and we simply hope there will be a SavePrefs before we die)
4581 if ( ( g_PrefsDlg.m_nView != nView ) && ( (EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating ) ) {
4582 g_PrefsDlg.m_bZVis = true;
4586 m_pTexWnd->UpdatePrefs();
4589 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
4590 g_bIgnoreCommands++;
4591 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4592 ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
4593 g_bIgnoreCommands--;
4597 void MainFrame::OnTogglecamera(){
4598 if ( CurrentStyle() == eFloating ) { // floating views
4599 if ( m_pCamWnd && m_pCamWnd->m_pParent ) {
4600 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->m_pParent ) ) {
4601 widget_delete_hide( m_pCamWnd->m_pParent );
4604 gtk_widget_show( m_pCamWnd->m_pParent );
4610 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->GetWidget() ) ) {
4611 gtk_widget_hide( m_pCamWnd->GetWidget() );
4614 gtk_widget_show( m_pCamWnd->GetWidget() );
4619 void MainFrame::OnToggleconsole(){
4620 if ( FloatingGroupDialog() ) { // QE4 style
4621 if ( inspector_mode == W_CONSOLE ) {
4622 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4623 widget_delete_hide( g_qeglobals_gui.d_entity );
4626 gtk_widget_show( g_qeglobals_gui.d_entity );
4631 gtk_widget_show( g_qeglobals_gui.d_entity );
4632 SetInspectorMode( W_CONSOLE );
4637 // trigger the entity inspector on/off
4638 void MainFrame::OnViewEntity(){
4639 // make sure we're working with the current selection (bugzilla #436)
4640 if ( !GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4644 if ( !FloatingGroupDialog() ) {
4645 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_ENTITY ) {
4646 widget_delete_hide( g_qeglobals_gui.d_entity );
4650 gtk_widget_show( g_qeglobals_gui.d_entity );
4651 SetInspectorMode( W_ENTITY );
4656 if ( inspector_mode == W_ENTITY ) {
4657 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4658 widget_delete_hide( g_qeglobals_gui.d_entity );
4661 gtk_widget_show( g_qeglobals_gui.d_entity );
4666 gtk_widget_show( g_qeglobals_gui.d_entity );
4667 SetInspectorMode( W_ENTITY );
4672 void MainFrame::OnViewGroups(){
4673 if ( !FloatingGroupDialog() ) {
4674 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_GROUP ) {
4675 widget_delete_hide( g_qeglobals_gui.d_entity );
4679 gtk_widget_show( g_qeglobals_gui.d_entity );
4680 SetInspectorMode( W_GROUP );
4685 if ( inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating ) {
4686 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4687 widget_delete_hide( g_qeglobals_gui.d_entity );
4690 gtk_widget_show( g_qeglobals_gui.d_entity );
4695 gtk_widget_show( g_qeglobals_gui.d_entity );
4696 SetInspectorMode( W_GROUP );
4701 void MainFrame::OnToggleview(){
4702 if ( CurrentStyle() == eFloating ) { // QE4 style
4703 if ( m_pXYWnd && m_pXYWnd->m_pParent ) {
4704 if ( GTK_WIDGET_VISIBLE( m_pXYWnd->m_pParent ) ) {
4705 widget_delete_hide( m_pXYWnd->m_pParent );
4708 gtk_widget_show( m_pXYWnd->m_pParent );
4714 void MainFrame::OnToggleviewXz(){
4715 if ( CurrentStyle() == eFloating ) { // QE4 style
4716 if ( m_pXZWnd && m_pXZWnd->m_pParent ) {
4717 // get windowplacement doesn't actually save this so we will here
4718 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE( m_pXZWnd->m_pParent );
4719 if ( g_PrefsDlg.m_bXZVis ) {
4720 widget_delete_hide( m_pXZWnd->m_pParent );
4723 gtk_widget_show( m_pXZWnd->m_pParent );
4725 g_PrefsDlg.m_bXZVis ^= 1;
4726 g_PrefsDlg.SavePrefs();
4731 void MainFrame::OnToggleviewYz(){
4732 if ( CurrentStyle() == eFloating ) { // QE4 style
4733 if ( m_pYZWnd && m_pYZWnd->m_pParent ) {
4734 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE( m_pYZWnd->m_pParent );
4735 if ( g_PrefsDlg.m_bYZVis ) {
4736 widget_delete_hide( m_pYZWnd->m_pParent );
4739 gtk_widget_show( m_pYZWnd->m_pParent );
4741 g_PrefsDlg.m_bYZVis ^= 1;
4742 g_PrefsDlg.SavePrefs();
4747 void MainFrame::OnTogglez(){
4748 if ( g_pParentWnd->FloatingGroupDialog() ) { // QE4 style
4749 if ( m_pZWnd && m_pZWnd->m_pParent ) {
4750 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
4751 widget_delete_hide( m_pZWnd->m_pParent );
4754 gtk_widget_show( m_pZWnd->m_pParent );
4756 g_PrefsDlg.m_bZVis ^= 1;
4757 g_PrefsDlg.SavePrefs();
4761 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4765 void MainFrame::OnViewCenter(){
4766 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4767 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor( ( m_pCamWnd->Camera()->angles[YAW] + 11 ) / 22.5 );
4768 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
4771 void MainFrame::OnViewUpfloor(){
4772 m_pCamWnd->Cam_ChangeFloor( true );
4775 void MainFrame::OnViewDownfloor(){
4776 m_pCamWnd->Cam_ChangeFloor( false );
4779 void MainFrame::OnViewCenterview(){
4780 if ( CurrentStyle() == eSplit ) {
4781 GetXYWnd()->PositionView();
4782 GetXZWnd()->PositionView();
4783 GetYZWnd()->PositionView();
4784 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4787 m_pXYWnd->PositionView();
4788 Sys_UpdateWindows( W_XY );
4792 void MainFrame::OnViewNextview(){
4793 if ( CurrentStyle() == eSplit ) {
4794 GetXYWnd()->PositionView();
4795 GetXZWnd()->PositionView();
4796 GetYZWnd()->PositionView();
4797 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4800 if ( m_pXYWnd->GetViewType() == XY ) {
4801 m_pXYWnd->SetViewType( XZ );
4804 if ( m_pXYWnd->GetViewType() == XZ ) {
4805 m_pXYWnd->SetViewType( YZ );
4808 m_pXYWnd->SetViewType( XY );
4810 m_pXYWnd->PositionView();
4811 Sys_UpdateWindows( W_XY );
4815 void MainFrame::OnViewXy(){
4816 if ( !FloatingGroupDialog() ) {
4817 m_pXYWnd->SetViewType( XY );
4818 m_pXYWnd->PositionView();
4820 Sys_UpdateWindows( W_XY );
4823 void MainFrame::OnViewSide(){
4824 if ( !FloatingGroupDialog() ) {
4825 m_pXYWnd->SetViewType( XZ );
4826 m_pXYWnd->PositionView();
4828 Sys_UpdateWindows( W_XY );
4831 void MainFrame::OnViewFront(){
4832 if ( !FloatingGroupDialog() ) {
4833 m_pXYWnd->SetViewType( YZ );
4834 m_pXYWnd->PositionView();
4836 Sys_UpdateWindows( W_XY );
4839 void MainFrame::OnView100(){
4841 m_pXYWnd->SetScale( 1 );
4844 m_pXZWnd->SetScale( 1 );
4847 m_pYZWnd->SetScale( 1 );
4849 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4852 void MainFrame::OnViewZoomin(){
4853 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4854 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0 / 4 );
4855 if ( m_pXYWnd->Scale() > 30 ) {
4856 m_pXYWnd->SetScale( 30 );
4860 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4861 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0 / 4 );
4862 if ( m_pXZWnd->Scale() > 30 ) {
4863 m_pXZWnd->SetScale( 30 );
4867 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4868 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0 / 4 );
4869 if ( m_pYZWnd->Scale() > 30 ) {
4870 m_pYZWnd->SetScale( 30 );
4874 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4877 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4878 // we don't go below a zoom factor corresponding to 10% of the max world size
4879 // (this has to be computed against the window size)
4880 void MainFrame::OnViewZoomout(){
4882 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4883 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0 / 5 );
4884 min_scale = MIN( m_pXYWnd->Width(),m_pXYWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4885 if ( m_pXYWnd->Scale() < min_scale ) {
4886 m_pXYWnd->SetScale( min_scale );
4890 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4891 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0 / 5 );
4892 min_scale = MIN( m_pXZWnd->Width(),m_pXZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4893 if ( m_pXZWnd->Scale() < min_scale ) {
4894 m_pXZWnd->SetScale( min_scale );
4898 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4899 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0 / 5 );
4900 min_scale = MIN( m_pYZWnd->Width(),m_pYZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4901 if ( m_pYZWnd->Scale() < min_scale ) {
4902 m_pYZWnd->SetScale( min_scale );
4905 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4908 void MainFrame::OnViewZ100(){
4910 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4913 void MainFrame::OnViewZzoomin(){
4915 if ( z.scale > 4 ) {
4918 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4921 void MainFrame::OnViewZzoomout(){
4922 z.scale *= 4.0f / 5;
4923 if ( z.scale < 0.125 ) {
4926 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4929 void MainFrame::OnViewCubein(){
4930 g_PrefsDlg.m_nCubicScale--;
4931 if ( g_PrefsDlg.m_nCubicScale < 1 ) {
4932 g_PrefsDlg.m_nCubicScale = 1;
4934 g_PrefsDlg.SavePrefs();
4935 Sys_UpdateWindows( W_CAMERA );
4939 void MainFrame::OnViewCubeout(){
4940 g_PrefsDlg.m_nCubicScale++;
4941 if ( g_PrefsDlg.m_nCubicScale > 22 ) {
4942 g_PrefsDlg.m_nCubicScale = 22;
4944 g_PrefsDlg.SavePrefs();
4945 Sys_UpdateWindows( W_CAMERA );
4949 void MainFrame::OnViewShownames(){
4950 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
4951 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
4952 g_bIgnoreCommands++;
4953 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4954 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE );
4955 g_bIgnoreCommands--;
4956 Sys_UpdateWindows( W_XY );
4959 void MainFrame::OnViewShowAngles(){
4960 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
4961 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
4962 g_bIgnoreCommands++;
4963 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4964 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE );
4965 g_bIgnoreCommands--;
4966 Sys_UpdateWindows( W_XY );
4969 void MainFrame::OnViewShowblocks(){
4970 g_qeglobals.show_blocks ^= 1;
4971 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showblocks" ) );
4972 g_bIgnoreCommands++;
4973 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.show_blocks ? TRUE : FALSE );
4974 g_bIgnoreCommands--;
4975 Sys_UpdateWindows( W_XY );
4978 void MainFrame::OnViewShowcoordinates(){
4979 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
4980 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
4981 g_bIgnoreCommands++;
4982 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4983 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE );
4984 g_bIgnoreCommands--;
4985 Sys_UpdateWindows( W_XY | W_Z );
4988 void MainFrame::OnViewShowOutline(){
4989 g_qeglobals.d_savedinfo.show_outline ^= 1;
4990 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
4991 g_bIgnoreCommands++;
4992 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4993 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE );
4994 g_bIgnoreCommands--;
4995 Sys_UpdateWindows( W_XY );
4998 void MainFrame::OnViewShowAxes(){
4999 g_qeglobals.d_savedinfo.show_axis ^= 1;
5000 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
5001 g_bIgnoreCommands++;
5002 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
5003 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE );
5004 g_bIgnoreCommands--;
5005 Sys_UpdateWindows( W_XY );
5008 void MainFrame::OnViewShowWorkzone(){
5009 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showworkzone" ) );
5010 g_bIgnoreCommands++;
5011 if ( g_qeglobals.d_show_work ) {
5012 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
5013 g_qeglobals.d_show_work = false;
5017 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5018 g_qeglobals.d_show_work = true;
5020 g_bIgnoreCommands--;
5021 Sys_UpdateWindows( W_XY );
5024 void MainFrame::OnViewHideshowHideselected(){
5029 void MainFrame::OnViewHideshowShowhidden(){
5030 Select_ShowAllHidden();
5034 sets the view mode for the entities
5035 called upon LoadPrefs too
5036 NOTE TTimo previous implementation had a SavePrefs call
5037 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5038 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5039 (otherwise we are always called following user action on the widget)
5041 void MainFrame::OnEntitiesSetViewAs( int mode ){
5042 gpointer item = NULL;
5044 switch ( g_PrefsDlg.m_nEntityShowState )
5047 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5050 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5052 case ENTITY_SELECTED:
5053 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5055 case ENTITY_SELECTED_SKIN:
5056 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5058 case ENTITY_SKINNED:
5059 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5061 case ENTITY_SKINNED_BOXED:
5062 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5065 g_bIgnoreCommands++;
5066 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5067 g_bIgnoreCommands--;
5073 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5074 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5075 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5077 case ID_VIEW_ENTITIESAS_WIREFRAME:
5078 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5079 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5081 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5082 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5083 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5085 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5086 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5087 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5089 case ID_VIEW_ENTITIESAS_SKINNED:
5090 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5091 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5093 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5094 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5095 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5098 Sys_FPrintf( SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n" );
5103 Sys_FPrintf( SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n" );
5107 g_bIgnoreCommands++;
5108 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5109 g_bIgnoreCommands--;
5111 Sys_UpdateWindows( W_ALL );
5114 void MainFrame::OnViewCubicclipping(){
5117 g_PrefsDlg.m_bCubicClipping ^= 1;
5118 g_bIgnoreCommands++;
5119 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
5120 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5121 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
5122 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5123 g_bIgnoreCommands--;
5124 g_PrefsDlg.SavePrefs();
5125 //Map_BuildBrushData ();
5126 Sys_UpdateWindows( W_CAMERA );
5129 void MainFrame::OnViewOpengllighting(){
5130 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
5131 g_PrefsDlg.m_bGLLighting ^= 1;
5132 g_PrefsDlg.SavePrefs();
5133 g_bIgnoreCommands++;
5134 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE );
5135 Sys_UpdateWindows( W_XY | W_CAMERA );
5136 g_bIgnoreCommands--;
5139 void MainFrame::OnSelectionDragedges(){
5140 if ( g_qeglobals.d_select_mode == sel_edge ) {
5141 g_qeglobals.d_select_mode = sel_brush;
5142 Sys_UpdateWindows( W_ALL );
5146 SetupVertexSelection();
5147 if ( g_qeglobals.d_numpoints ) {
5148 g_qeglobals.d_select_mode = sel_edge;
5150 Sys_UpdateWindows( W_ALL );
5154 void MainFrame::OnSelectionDragvertecies(){
5155 if ( g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint ) {
5156 g_qeglobals.d_select_mode = sel_brush;
5157 Sys_UpdateWindows( W_ALL );
5161 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5162 if ( OnlyPatchesSelected() ) {
5165 else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5167 SetupVertexSelection();
5168 if ( g_qeglobals.d_numpoints ) {
5169 g_qeglobals.d_select_mode = sel_vertex;
5172 Sys_UpdateWindows( W_ALL );
5176 void MainFrame::OnSelectionClone(){
5180 // called when the escape key is used (either on the main window or on an inspector)
5181 void MainFrame::OnSelectionDeselect(){
5182 if ( g_bClipMode ) {
5186 if ( g_bRotateMode ) {
5187 OnSelectMouserotate();
5190 if ( g_bScaleMode ) {
5191 OnSelectMousescale();
5194 if ( g_bPathMode ) {
5196 ActiveXY()->KillPathMode();
5201 if ( g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0 ) {
5202 g_qeglobals.d_num_move_points = 0;
5203 Sys_UpdateWindows( W_ALL );
5208 SetStatusText( 2, " " );
5213 void MainFrame::OnBrushFlipx(){
5214 Undo_Start( "flip X" );
5215 Undo_AddBrushList( &selected_brushes );
5217 Select_FlipAxis( 0 );
5218 // spog - this does not work - it's a rotate not a flip
5220 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5222 if(b->owner->eclass->fixedsize)
5225 float a = FloatForKey(b->owner, "angle");
5226 a = div ((int)(180 - a), 180).rem;
5227 sprintf (buf, "%d", (int)a);
5228 SetKeyValue(b->owner, "angle", buf);
5229 Brush_Build(b,true,true,false,false); // don't filter
5233 Undo_EndBrushList( &selected_brushes );
5237 void MainFrame::OnBrushFlipy(){
5238 Undo_Start( "flip Y" );
5239 Undo_AddBrushList( &selected_brushes );
5241 Select_FlipAxis( 1 );
5242 // spog - this does not work - it's a rotate not a flip
5244 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5246 if(b->owner->eclass->fixedsize)
5248 float a = FloatForKey(b->owner, "angle");
5249 if (a == 0 || a == 180 || a == 360)
5251 if ( a == 90 || a == 270)
5265 sprintf (buf, "%d", (int)a);
5266 SetKeyValue(b->owner, "angle", buf);
5267 Brush_Build(b,true,true,false,false); // don't filter
5272 Undo_EndBrushList( &selected_brushes );
5276 void MainFrame::OnBrushFlipz(){
5277 Undo_Start( "flip Z" );
5278 Undo_AddBrushList( &selected_brushes );
5279 Select_FlipAxis( 2 );
5280 Undo_EndBrushList( &selected_brushes );
5284 void MainFrame::OnBrushRotatex(){
5285 Undo_Start( "rotate X" );
5286 Undo_AddBrushList( &selected_brushes );
5287 Select_RotateAxis( 0, 90 );
5288 Undo_EndBrushList( &selected_brushes );
5292 void MainFrame::OnBrushRotatey(){
5293 Undo_Start( "rotate Y" );
5294 Undo_AddBrushList( &selected_brushes );
5295 Select_RotateAxis( 1, 90 );
5296 Undo_EndBrushList( &selected_brushes );
5300 void MainFrame::OnBrushRotatez(){
5301 Undo_Start( "rotate Z" );
5302 Undo_AddBrushList( &selected_brushes );
5303 Select_RotateAxis( 2, 90 );
5304 Undo_EndBrushList( &selected_brushes );
5308 void MainFrame::OnSelectionArbitraryrotation(){
5309 Undo_Start( "arbitrary rotation" );
5310 Undo_AddBrushList( &selected_brushes );
5314 Undo_EndBrushList( &selected_brushes );
5318 void MainFrame::OnSelectScale(){
5319 Undo_Start( "scale" );
5320 Undo_AddBrushList( &selected_brushes );
5322 Undo_EndBrushList( &selected_brushes );
5326 void MainFrame::OnSelectionMakehollow(){
5328 // ActiveXY()->UndoCopy();
5329 Undo_Start( "hollow" );
5330 Undo_AddBrushList( &selected_brushes );
5332 Undo_EndBrushList( &selected_brushes );
5336 void MainFrame::OnSelectionCsgsubtract(){
5337 Undo_Start( "CSG subtract" );
5342 void MainFrame::OnSelectionCsgmerge(){
5343 Undo_Start( "CSG merge" );
5344 Undo_AddBrushList( &selected_brushes );
5346 Undo_EndBrushList( &selected_brushes );
5350 void MainFrame::OnSelectionNoOutline(){
5351 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5352 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) ^ OUTLINE_ZBUF;
5353 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5354 g_bIgnoreCommands++;
5355 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5356 g_bIgnoreCommands--;
5357 Sys_UpdateWindows( W_CAMERA );
5360 void MainFrame::OnSelectionOutlineStyle(){
5361 if ( ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) && ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) ) {
5362 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5364 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) {
5365 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5367 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) {
5368 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5371 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5373 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5374 g_bIgnoreCommands++;
5375 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5376 g_bIgnoreCommands--;
5377 Sys_UpdateWindows( W_CAMERA );
5380 void MainFrame::OnSelectionSelectcompletetall(){
5382 ActiveXY()->UndoCopy();
5384 Select_CompleteTall();
5387 void MainFrame::OnSelectionSelecttouching(){
5391 void MainFrame::OnSelectionSelectpartialtall(){
5392 Select_PartialTall();
5395 void MainFrame::OnSelectionSelectinside(){
5399 void MainFrame::OnViewClipper(){
5400 GtkWidget *w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_clipper" ) );
5401 g_bIgnoreCommands++;
5404 if ( ActiveXY()->ClipMode() ) {
5405 ActiveXY()->SetClipMode( false );
5406 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), FALSE );
5410 if ( ActiveXY()->RotateMode() ) {
5411 OnSelectMouserotate();
5413 ActiveXY()->SetClipMode( true );
5414 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), TRUE );
5417 g_bIgnoreCommands--;
5420 void MainFrame::OnClipSelected(){
5421 if ( m_pActiveXY && m_pActiveXY->ClipMode() ) {
5422 Undo_Start( "clip selected" );
5423 Undo_AddBrushList( &selected_brushes );
5424 m_pActiveXY->Clip();
5425 Undo_EndBrushList( &selected_brushes );
5430 if ( g_bPatchBendMode ) {
5431 Patch_BendHandleENTER();
5433 // else if (g_bPatchBendMode)
5434 // Patch_InsDelHandleENTER();
5438 void MainFrame::OnSplitSelected(){
5439 if ( m_pActiveXY ) {
5440 Undo_Start( "split selected" );
5441 Undo_AddBrushList( &selected_brushes );
5442 m_pActiveXY->SplitClip();
5443 Undo_EndBrushList( &selected_brushes );
5448 void MainFrame::OnFlipClip(){
5449 if ( m_pActiveXY ) {
5450 m_pActiveXY->FlipClip();
5454 void MainFrame::OnSelectionConnect(){
5455 Undo_Start( "connect selected entities" );
5456 Undo_AddBrushList( &selected_brushes );
5458 Undo_EndBrushList( &selected_brushes );
5462 void MainFrame::OnSelectionUngroupentity(){
5463 Undo_Start( "ungroup selected entities" );
5464 Undo_AddBrushList( &selected_brushes );
5466 Undo_EndBrushList( &selected_brushes );
5470 void MainFrame::OnSelectionMergeentity(){
5471 Undo_Start( "merge entity" );
5472 Undo_AddBrushList( &selected_brushes );
5473 Select_MergeEntity();
5474 Undo_EndBrushList( &selected_brushes );
5478 void MainFrame::OnSelectionGroupworld(){
5479 Undo_Start( "group world" );
5480 Undo_AddBrushList( &selected_brushes );
5481 Select_GroupEntity( world_entity );
5482 Undo_EndBrushList( &selected_brushes );
5486 void MainFrame::OnSelectionMakeDetail(){
5487 Undo_Start( "make detail" );
5488 Undo_AddBrushList( &selected_brushes );
5489 Select_MakeDetail();
5490 Undo_EndBrushList( &selected_brushes );
5494 void MainFrame::OnSelectionMakeStructural(){
5495 Undo_Start( "make structural" );
5496 Undo_AddBrushList( &selected_brushes );
5497 Select_MakeStructural();
5498 Undo_EndBrushList( &selected_brushes );
5502 void MainFrame::OnBspCommand( unsigned int nID ){
5503 // make sure we don't attempt to region compile a map with the camera outside the region
5504 if ( region_active ) {
5507 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5508 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5509 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2] );
5512 for ( i = 0 ; i < 3 ; i++ )
5514 if ( vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i] ) {
5515 Sys_FPrintf( SYS_ERR, "The camera must be in the region to start a region compile.\n" );
5521 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5522 if ( stricmp( currentmap, "unnamed.map" ) == 0 ) {
5526 if ( g_PrefsDlg.m_bSnapShots && ( stricmp( currentmap, "unnamed.map" ) != 0 ) ) {
5530 if ( g_qeglobals.bBSPFrontendPlugin ) {
5531 char *cmd = (char*)g_slist_nth_data( g_BSPFrontendCommands, nID - CMD_BSPCOMMAND );
5532 g_BSPFrontendTable.m_pfnDispatchBSPCommand( cmd );
5536 RunBsp( bsp_commands[nID - CMD_BSPCOMMAND] );
5540 void MainFrame::OnGrid( unsigned int nID ){
5541 if ( nID == ID_GRID_025 ) {
5542 g_qeglobals.d_gridsize = 0.25f;
5543 g_qeglobals.d_bSmallGrid = true;
5545 else if ( nID == ID_GRID_05 ) {
5546 g_qeglobals.d_gridsize = 0.5f;
5547 g_qeglobals.d_bSmallGrid = true;
5553 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5554 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5555 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5556 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5557 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5558 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5559 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5560 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5561 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5563 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5564 g_qeglobals.d_bSmallGrid = false;
5569 // SnapTToGrid option: need to check everywhere the grid size is changed
5570 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5571 if ( g_PrefsDlg.m_bSnapTToGrid ) {
5575 Sys_UpdateWindows( W_XY | W_Z );
5578 void MainFrame::OnSnaptogrid(){
5579 g_PrefsDlg.m_bSnap ^= 1;
5580 g_PrefsDlg.SavePrefs();
5582 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
5583 g_bIgnoreCommands++;
5584 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bSnap ? TRUE : FALSE );
5585 g_bIgnoreCommands--;
5588 void MainFrame::OnTexturesShowinuse(){
5590 Texture_ShowInuse();
5592 if ( !g_bShowAllShaders ) {
5593 Sys_Printf( "Already showing only in-use textures.\n" );
5596 Sys_UpdateWindows( W_TEXTURE );
5600 void MainFrame::OnTexturesShowall(){
5604 // do some triggering on/off, if the inspector is already up then hide it
5605 void MainFrame::OnTexturesInspector(){
5609 void MainFrame::OnViewNearest( unsigned int nID ){
5610 Texture_SetMode( nID );
5613 void MainFrame::OnTextureReplaceall(){
5614 FindTextureDialog::show();
5617 void MainFrame::OnToggleLock(){
5618 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5620 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
5621 g_bIgnoreCommands++;
5622 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE );
5623 g_bIgnoreCommands--;
5624 g_PrefsDlg.SavePrefs();
5628 void MainFrame::OnToggleRotatelock(){
5629 g_PrefsDlg.m_bRotateLock ^= 1;
5631 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
5632 g_bIgnoreCommands++;
5633 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE );
5634 g_bIgnoreCommands--;
5635 g_PrefsDlg.SavePrefs();
5639 // use a dialog for direct selection of a texture menu
5640 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5641 void MainFrame::OnTexturesLoad(){
5642 char def_path[NAME_MAX];
5645 // check if that works with fs_game (I suspect some more design is needed)
5646 // see how this is done in 1.2?
5647 strcpy( def_path, g_pGameDescription->mEnginePath.GetBuffer() );
5648 strcat( def_path, g_pGameDescription->mBaseGame.GetBuffer() );
5649 strcat( def_path, "/" );
5651 char *dir = dir_dialog( m_pWidget, _( "Load textures from path" ), def_path );
5653 if ( dir != NULL ) {
5654 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5655 Sys_Printf( "user select: '%s'\n", dir );
5656 // remove a potential trailing slash?
5657 if ( dir[strlen( dir ) - 1] == '/' || dir[strlen( dir ) - 1] == '\\' ) {
5658 dir[strlen( dir ) - 1] = '\0';
5660 char *pouic = MAX( strrchr( dir, '/' ),strrchr( dir, '\\' ) );
5662 strcpy( texture_directory, pouic + 1 );
5663 Sys_Printf( "Loading '%s'\n", texture_directory );
5664 Texture_ShowDirectory();
5667 Sys_FPrintf( SYS_WRN, "Failed to extract the directory\n" );
5672 Sys_FPrintf( SYS_WRN, "texture load dialog cancelled\n" );
5676 void MainFrame::OnTexturesReloadshaders(){
5678 QERApp_ReloadShaders();
5680 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5681 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
5682 Sys_UpdateWindows( W_ALL );
5686 void MainFrame::OnTexturesShadersShow(){
5687 g_PrefsDlg.m_bShowShaders ^= 1;
5688 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
5689 g_bIgnoreCommands++;
5690 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
5691 g_bIgnoreCommands--;
5692 Sys_UpdateWindows( W_TEXTURE );
5695 void MainFrame::SetTextureScale( int id ){
5700 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5701 g_PrefsDlg.m_nTextureScale = 10;
5702 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_10" ) );
5704 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5705 g_PrefsDlg.m_nTextureScale = 25;
5706 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_25" ) );
5708 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5709 g_PrefsDlg.m_nTextureScale = 50;
5710 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_50" ) );
5712 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5713 g_PrefsDlg.m_nTextureScale = 200;
5714 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_200" ) );
5717 g_PrefsDlg.m_nTextureScale = 100;
5718 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_100" ) );
5722 g_bIgnoreCommands++;
5723 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5724 g_bIgnoreCommands--;
5726 Texture_ResetPosition();
5729 void MainFrame::OnTexturewindowScaleup(){
5730 switch ( g_PrefsDlg.m_nTextureScale ) {
5731 // 200, all the way in, don't do anything
5733 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_200 );
5736 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5739 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5742 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5747 void MainFrame::OnTexturewindowScaledown(){
5748 switch ( g_PrefsDlg.m_nTextureScale ) {
5750 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5753 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5756 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5759 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_10 );
5761 // 10, all the way out, don't do anything
5765 void MainFrame::OnTexturesLoadlist(){
5769 void MainFrame::OnTexturesShaderlistonly(){
5770 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5771 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ),"menu_textures_shaderlistonly" ) );
5772 g_bIgnoreCommands++;
5773 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
5774 g_bIgnoreCommands--;
5778 void MainFrame::OnTextureWad( unsigned int nID ){
5780 Texture_ShowDirectory( nID );
5781 Sys_UpdateWindows( W_ALL );
5785 void MainFrame::OnMiscBenchmark(){
5786 m_pCamWnd->BenchMark();
5789 void MainFrame::OnColorSetoriginal(){
5790 for ( int i = 0 ; i < 3 ; i++ )
5792 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5793 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5794 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5795 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5796 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5800 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5801 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5802 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5804 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5805 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5806 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5809 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5810 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5811 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5813 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5814 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5815 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5817 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5818 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5819 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5821 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5822 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5823 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5825 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5826 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5827 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5829 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5830 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5831 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5833 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5834 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5835 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5837 g_PrefsDlg.SavePrefs();
5838 Sys_UpdateWindows( W_ALL );
5841 void MainFrame::OnColorSetqer(){
5842 for ( int i = 0 ; i < 3 ; i++ )
5844 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5845 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5846 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5847 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5848 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5851 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5852 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5853 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5855 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5856 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5857 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5859 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5860 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5861 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5863 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5864 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5865 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5867 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5868 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5869 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5871 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5872 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5873 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5875 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5876 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5877 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5879 g_PrefsDlg.SavePrefs();
5880 Sys_UpdateWindows( W_ALL );
5883 void MainFrame::OnColorSetblack(){
5884 for ( int i = 0 ; i < 3 ; i++ )
5886 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5887 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5888 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
5889 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5892 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
5893 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
5894 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
5896 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5897 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5898 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5900 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
5901 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
5902 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
5904 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5905 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5906 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5908 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5909 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5910 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5912 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
5913 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
5914 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
5916 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
5917 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
5918 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
5920 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5921 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5922 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5924 g_PrefsDlg.SavePrefs();
5925 Sys_UpdateWindows( W_ALL );
5928 /* ydnar: to emulate maya/max/lightwave color schemes */
5929 void MainFrame::OnColorSetydnar(){
5930 for ( int i = 0 ; i < 3 ; i++ )
5932 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5933 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
5935 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
5936 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5939 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
5941 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5943 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5945 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5947 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5948 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5949 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5951 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5952 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5953 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5955 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5957 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5960 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5961 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5963 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5964 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5965 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5967 g_PrefsDlg.SavePrefs();
5968 Sys_UpdateWindows( W_ALL );
5971 void MainFrame::OnTexturebk(){
5972 DoColor( COLOR_TEXTUREBACK );
5973 Sys_UpdateWindows( W_ALL );
5976 void MainFrame::OnColorsXybk(){
5977 DoColor( COLOR_GRIDBACK );
5978 Sys_UpdateWindows( W_ALL );
5981 void MainFrame::OnColorsMajor(){
5982 DoColor( COLOR_GRIDMAJOR );
5983 Sys_UpdateWindows( W_ALL );
5986 void MainFrame::OnColorsMinor(){
5987 DoColor( COLOR_GRIDMINOR );
5988 Sys_UpdateWindows( W_ALL );
5991 void MainFrame::OnColorsMajor_Alt(){
5992 DoColor( COLOR_GRIDMAJOR_ALT );
5993 Sys_UpdateWindows( W_ALL );
5996 void MainFrame::OnColorsMinor_Alt(){
5997 DoColor( COLOR_GRIDMINOR_ALT );
5998 Sys_UpdateWindows( W_ALL );
6001 void MainFrame::OnColorsGridtext(){
6002 DoColor( COLOR_GRIDTEXT );
6003 Sys_UpdateWindows( W_ALL );
6006 void MainFrame::OnColorsGridblock(){
6007 DoColor( COLOR_GRIDBLOCK );
6008 Sys_UpdateWindows( W_ALL );
6011 void MainFrame::OnColorsCameraBack(){
6012 DoColor( COLOR_CAMERABACK );
6013 Sys_UpdateWindows( W_ALL );
6016 void MainFrame::OnColorsBrush(){
6017 DoColor( COLOR_BRUSHES );
6018 Sys_UpdateWindows( W_ALL );
6021 void MainFrame::OnColorsSelectedbrush(){
6022 DoColor( COLOR_SELBRUSHES );
6023 Sys_UpdateWindows( W_ALL );
6026 void MainFrame::OnColorsSelectedbrush3D(){
6027 DoColor( COLOR_SELBRUSHES3D );
6028 Sys_UpdateWindows( W_ALL );
6031 void MainFrame::OnColorsClipper(){
6032 DoColor( COLOR_CLIPPER );
6033 Sys_UpdateWindows( W_ALL );
6036 void MainFrame::OnColorsViewname(){
6037 DoColor( COLOR_VIEWNAME );
6038 Sys_UpdateWindows( W_ALL );
6041 void MainFrame::OnMiscGamma(){
6042 float fSave = g_qeglobals.d_savedinfo.fGamma;
6044 if ( fSave != g_qeglobals.d_savedinfo.fGamma ) {
6045 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for Gamma settings to take effect." ) );
6048 void MainFrame::OnMiscFindbrush(){
6052 void MainFrame::OnMiscNextleakspot(){
6056 void MainFrame::OnMiscPreviousleakspot(){
6060 void MainFrame::OnMiscPrintxy(){
6064 void MainFrame::OnMiscSelectentitycolor(){
6065 if ( edit_entity ) {
6066 CString strColor = ValueForKey( edit_entity, "_color" );
6067 if ( strColor.GetLength() > 0 ) {
6069 int n = sscanf( strColor,"%f %f %f", &fR, &fG, &fB );
6071 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6072 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6073 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6077 if ( inspector_mode == W_ENTITY && ( DoColor( COLOR_ENTITY ) ) ) {
6079 sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6080 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6081 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
6083 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntValueField] ), buffer );
6084 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntKeyField] ), "_color" );
6086 //DK - SOF change to get color to entity quickly
6087 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6088 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6091 Sys_UpdateWindows( W_ALL );
6095 void MainFrame::OnConvertcurves(){
6098 for ( brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next )
6100 if ( pb->curveBrush ) {
6101 for ( face_t* f = pb->brush_faces ; f ; f = f->next )
6103 if ( f->texdef.contents & CONTENTS_LADDER ) {
6104 f->texdef.contents &= ~CONTENTS_LADDER;
6105 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6110 Map_BuildBrushData();
6114 void MainFrame::OnRegionOff(){
6118 void MainFrame::OnRegionSetxy(){
6122 void MainFrame::OnRegionSettallbrush(){
6123 Map_RegionTallBrush();
6126 void MainFrame::OnRegionSetbrush(){
6130 void MainFrame::OnRegionSetselection(){
6131 Map_RegionSelectedBrushes();
6134 void MainFrame::OnBrush3sided(){
6135 Undo_Start( "3 sided" );
6136 Undo_AddBrushList( &selected_brushes );
6137 Brush_MakeSided( 3 );
6138 Undo_EndBrushList( &selected_brushes );
6142 void MainFrame::OnBrush4sided(){
6143 Undo_Start( "4 sided" );
6144 Undo_AddBrushList( &selected_brushes );
6145 Brush_MakeSided( 4 );
6146 Undo_EndBrushList( &selected_brushes );
6150 void MainFrame::OnBrush5sided(){
6151 Undo_Start( "5 sided" );
6152 Undo_AddBrushList( &selected_brushes );
6153 Brush_MakeSided( 5 );
6154 Undo_EndBrushList( &selected_brushes );
6158 void MainFrame::OnBrush6sided(){
6159 Undo_Start( "6 sided" );
6160 Undo_AddBrushList( &selected_brushes );
6161 Brush_MakeSided( 6 );
6162 Undo_EndBrushList( &selected_brushes );
6166 void MainFrame::OnBrush7sided(){
6167 Undo_Start( "7 sided" );
6168 Undo_AddBrushList( &selected_brushes );
6169 Brush_MakeSided( 7 );
6170 Undo_EndBrushList( &selected_brushes );
6174 void MainFrame::OnBrush8sided(){
6175 Undo_Start( "8 sided" );
6176 Undo_AddBrushList( &selected_brushes );
6177 Brush_MakeSided( 8 );
6178 Undo_EndBrushList( &selected_brushes );
6182 void MainFrame::OnBrush9sided(){
6183 Undo_Start( "9 sided" );
6184 Undo_AddBrushList( &selected_brushes );
6185 Brush_MakeSided( 9 );
6186 Undo_EndBrushList( &selected_brushes );
6190 void MainFrame::OnBrushArbitrarysided(){
6191 Undo_Start( "arbitrary sided" );
6192 Undo_AddBrushList( &selected_brushes );
6194 Undo_EndBrushList( &selected_brushes );
6198 void MainFrame::OnBrushMakecone(){
6199 Undo_Start( "make cone" );
6200 Undo_AddBrushList( &selected_brushes );
6202 Undo_EndBrushList( &selected_brushes );
6206 void MainFrame::OnBrushPrimitivesSphere(){
6207 Undo_Start( "make sphere" );
6208 Undo_AddBrushList( &selected_brushes );
6210 DoSides( false, true );
6212 Undo_EndBrushList( &selected_brushes );
6216 void MainFrame::OnCurvePatchtube(){
6217 Undo_Start( "make curve cylinder" );
6218 Undo_AddBrushList( &selected_brushes );
6219 Patch_BrushToMesh( false );
6220 Sys_UpdateWindows( W_ALL );
6221 Undo_EndBrushList( &selected_brushes );
6225 void MainFrame::OnCurvePatchdensetube(){
6226 Undo_Start( "dense cylinder" );
6227 Undo_AddBrushList( &selected_brushes );
6229 Patch_BrushToMesh( false );
6230 OnCurveInsertAddrow();
6231 Sys_UpdateWindows( W_ALL );
6233 Undo_EndBrushList( &selected_brushes );
6237 void MainFrame::OnCurvePatchverydensetube(){
6238 Undo_Start( "very dense cylinder" );
6239 Undo_AddBrushList( &selected_brushes );
6241 Patch_BrushToMesh( false );
6242 OnCurveInsertAddrow();
6243 OnCurveInsertInsertrow();
6244 OnCurveInsertAddrow();
6245 Sys_UpdateWindows( W_ALL );
6247 Undo_EndBrushList( &selected_brushes );
6251 void MainFrame::OnCurvePatchsquare(){
6252 Undo_Start( "square cylinder" );
6253 Undo_AddBrushList( &selected_brushes );
6255 Patch_BrushToMesh( false, false, false, true );
6256 Sys_UpdateWindows( W_ALL );
6258 Undo_EndBrushList( &selected_brushes );
6262 void MainFrame::OnCurvePatchendcap(){
6263 Undo_Start( "make end cap" );
6264 Undo_AddBrushList( &selected_brushes );
6265 Patch_BrushToMesh( false, false, true );
6266 Sys_UpdateWindows( W_ALL );
6267 Undo_EndBrushList( &selected_brushes );
6271 void MainFrame::OnCurvePatchbevel(){
6272 Undo_Start( "make bevel" );
6273 Undo_AddBrushList( &selected_brushes );
6274 Patch_BrushToMesh( false, true, false );
6275 Sys_UpdateWindows( W_ALL );
6276 Undo_EndBrushList( &selected_brushes );
6280 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel(){
6281 Undo_Start( "square bevel" );
6282 Undo_AddBrushList( &selected_brushes );
6284 Patch_BrushToMesh( false, true, false, true );
6285 Sys_UpdateWindows( W_ALL );
6287 Undo_EndBrushList( &selected_brushes );
6291 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap(){
6292 Undo_Start( "square endcap" );
6293 Undo_AddBrushList( &selected_brushes );
6295 Patch_BrushToMesh( false, false, true, true );
6296 Sys_UpdateWindows( W_ALL );
6298 Undo_EndBrushList( &selected_brushes );
6302 void MainFrame::OnCurvePatchcone(){
6303 Undo_Start( "make curve cone" );
6304 Undo_AddBrushList( &selected_brushes );
6305 Patch_BrushToMesh( true );
6306 Sys_UpdateWindows( W_ALL );
6307 Undo_EndBrushList( &selected_brushes );
6311 void MainFrame::OnCurveSimplepatchmesh(){
6312 Undo_Start( "make simpe patch mesh" );
6313 Undo_AddBrushList( &selected_brushes );
6315 Undo_EndBrushList( &selected_brushes );
6319 void MainFrame::OnCurveInsertInsertcolumn(){
6320 Undo_Start( "insert (2) columns" );
6321 Undo_AddBrushList( &selected_brushes );
6322 Patch_AdjustSelected( true, true, false );
6323 Sys_UpdateWindows( W_ALL );
6324 Undo_EndBrushList( &selected_brushes );
6328 void MainFrame::OnCurveInsertAddcolumn(){
6329 Undo_Start( "add (2) columns" );
6330 Undo_AddBrushList( &selected_brushes );
6331 Patch_AdjustSelected( true, true, true );
6332 Sys_UpdateWindows( W_ALL );
6333 Undo_EndBrushList( &selected_brushes );
6337 void MainFrame::OnCurveInsertInsertrow(){
6338 Undo_Start( "insert (2) rows" );
6339 Undo_AddBrushList( &selected_brushes );
6340 Patch_AdjustSelected( true, false, false );
6341 Sys_UpdateWindows( W_ALL );
6342 Undo_EndBrushList( &selected_brushes );
6346 void MainFrame::OnCurveInsertAddrow(){
6347 Undo_Start( "add (2) rows" );
6348 Undo_AddBrushList( &selected_brushes );
6349 Patch_AdjustSelected( true, false, true );
6350 Sys_UpdateWindows( W_ALL );
6351 Undo_EndBrushList( &selected_brushes );
6355 void MainFrame::OnCurveDeleteFirstcolumn(){
6356 Undo_Start( "delete first (2) columns" );
6357 Undo_AddBrushList( &selected_brushes );
6358 Patch_AdjustSelected( false, true, true );
6359 Sys_UpdateWindows( W_ALL );
6360 Undo_EndBrushList( &selected_brushes );
6364 void MainFrame::OnCurveDeleteLastcolumn(){
6365 Undo_Start( "delete last (2) columns" );
6366 Undo_AddBrushList( &selected_brushes );
6367 Patch_AdjustSelected( false, true, false );
6368 Sys_UpdateWindows( W_ALL );
6369 Undo_EndBrushList( &selected_brushes );
6373 void MainFrame::OnCurveDeleteFirstrow(){
6374 Undo_Start( "delete first (2) rows" );
6375 Undo_AddBrushList( &selected_brushes );
6376 Patch_AdjustSelected( false, false, true );
6377 Sys_UpdateWindows( W_ALL );
6378 Undo_EndBrushList( &selected_brushes );
6382 void MainFrame::OnCurveDeleteLastrow(){
6383 Undo_Start( "delete last (2) rows" );
6384 Undo_AddBrushList( &selected_brushes );
6385 Patch_AdjustSelected( false, false, false );
6386 Sys_UpdateWindows( W_ALL );
6387 Undo_EndBrushList( &selected_brushes );
6391 void MainFrame::OnCurveNegative(){
6392 Patch_ToggleInverted();
6393 //Sys_UpdateWindows(W_ALL);
6396 void MainFrame::OnCurveRedisperseRows(){
6397 Undo_Start( "redisperse rows" );
6398 Undo_AddBrushList( &selected_brushes );
6399 Patch_DisperseRows();
6400 Sys_UpdateWindows( W_ALL );
6401 Undo_EndBrushList( &selected_brushes );
6405 void MainFrame::OnCurveRedisperseIntermediateCols(){
6406 Undo_Start( "redisperse im cols" );
6407 Undo_AddBrushList( &selected_brushes );
6408 Patch_DisperseIntermediateColumns();
6409 Sys_UpdateWindows( W_ALL );
6410 Undo_EndBrushList( &selected_brushes );
6414 void MainFrame::OnCurveRedisperseIntermediateRows(){
6415 Undo_Start( "redisperse im rows" );
6416 Undo_AddBrushList( &selected_brushes );
6417 Patch_DisperseIntermediateRows();
6418 Sys_UpdateWindows( W_ALL );
6419 Undo_EndBrushList( &selected_brushes );
6423 void MainFrame::OnCurveMatrixTranspose(){
6425 Sys_UpdateWindows( W_ALL );
6428 void MainFrame::OnCurveCap(){
6430 Sys_UpdateWindows( W_ALL );
6433 void MainFrame::OnCurveCyclecap(){
6434 Patch_CycleCapSelected();
6435 Sys_UpdateWindows( W_ALL );
6438 void MainFrame::OnCurveOverlaySet(){
6439 Patch_SetOverlays();
6440 Sys_UpdateWindows( W_ALL );
6443 void MainFrame::OnCurveOverlayClear(){
6444 Patch_ClearOverlays();
6445 Sys_UpdateWindows( W_ALL );
6448 void MainFrame::OnCurveThicken(){
6449 Undo_Start( "curve thicken" );
6450 Undo_AddBrushList( &selected_brushes );
6452 Undo_EndBrushList( &selected_brushes );
6457 this can no longer be trigger manually from the menu
6458 happens only once at startup
6460 void MainFrame::OnPluginsRefresh(){
6465 // open the Q3Rad manual
6466 void MainFrame::OnHelp(){
6467 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6469 help = g_strAppPath;
6470 help += "Q3Rad_Manual/index.htm";
6471 OpenURL( help.GetBuffer() );
6474 // FIXME: we'll go towards a unified help thing soon
6475 void MainFrame::OnHelpLinks(){
6477 link = g_strAppPath;
6478 link += "links.htm";
6479 OpenURL( link.GetBuffer() );
6482 void MainFrame::OnHelpBugreport(){
6483 OpenURL( "http://www.qeradiant.com/faq/fom-serve/cache/138.html" );
6486 void MainFrame::OnHelpCommandlist(){
6490 void MainFrame::OnHelpAbout(){
6494 void MainFrame::OnPopupSelection(){
6495 GtkWidget *menu, *item;
6496 const gchar *labels[] = { _( "Select Complete Tall" ), _( "Select Touching" ), _( "Select Partial Tall" ), _( "Select Inside" )};
6497 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6498 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6500 menu = gtk_menu_new();
6502 for ( int i = 0; i < 4; i++ )
6504 item = gtk_menu_item_new_with_label( labels[i] );
6505 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( HandleCommand ),
6506 GINT_TO_POINTER( ids[i] ) );
6507 gtk_widget_show( item );
6508 gtk_menu_append( GTK_MENU( menu ), item );
6511 gtk_menu_popup( GTK_MENU( menu ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6514 void MainFrame::OnViewChange(){
6516 //HandlePopup(this, IDR_POPUP_VIEW);
6519 void MainFrame::OnTexturesPopup(){
6520 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "render_quality_menu" );
6521 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6524 void MainFrame::ToggleCamera(){
6525 if ( m_bCamPreview ) {
6526 m_bCamPreview = false;
6529 m_bCamPreview = true;
6533 void MainFrame::OnViewCameraupdate(){
6534 Sys_UpdateWindows( W_CAMERA );
6537 void MainFrame::OnSelectMouserotate(){
6538 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mouserotate" ) );
6539 g_bIgnoreCommands++;
6542 if ( ActiveXY()->ClipMode() ) {
6545 if ( ActiveXY()->RotateMode() ) {
6546 // SetRotateMode(false) always works
6547 ActiveXY()->SetRotateMode( false );
6548 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6552 // may not work if no brush selected, see return value
6553 if ( ActiveXY()->SetRotateMode( true ) ) {
6554 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6557 // if MFC called, we need to set back to FALSE ourselves
6558 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6562 g_bIgnoreCommands--;
6565 void MainFrame::OnSelectMousescale(){
6566 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mousescale" ) );
6567 g_bIgnoreCommands++;
6570 if ( ActiveXY()->ClipMode() ) {
6573 if ( ActiveXY()->RotateMode() ) {
6574 // SetRotateMode(false) always works
6575 ActiveXY()->SetRotateMode( false );
6576 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6578 if ( ActiveXY()->ScaleMode() ) {
6579 ActiveXY()->SetScaleMode( false );
6580 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6584 ActiveXY()->SetScaleMode( true );
6585 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6588 g_bIgnoreCommands--;
6591 void MainFrame::OnScalelockx(){
6592 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockx" ) );
6593 g_bIgnoreCommands++;
6595 if ( g_nScaleHow & SCALE_X ) {
6596 g_nScaleHow ^= SCALE_X;
6597 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6601 g_nScaleHow |= SCALE_X;
6602 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6604 g_bIgnoreCommands--;
6607 void MainFrame::OnScalelocky(){
6608 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelocky" ) );
6609 g_bIgnoreCommands++;
6611 if ( g_nScaleHow & SCALE_Y ) {
6612 g_nScaleHow ^= SCALE_Y;
6613 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6617 g_nScaleHow |= SCALE_Y;
6618 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6620 g_bIgnoreCommands--;
6623 void MainFrame::OnScalelockz(){
6624 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockz" ) );
6625 g_bIgnoreCommands++;
6627 if ( g_nScaleHow & SCALE_Z ) {
6628 g_nScaleHow ^= SCALE_Z;
6629 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6633 g_nScaleHow |= SCALE_Z;
6634 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6636 g_bIgnoreCommands--;
6639 void MainFrame::OnDontselectcurve(){
6640 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
6641 g_bIgnoreCommands++;
6642 g_PrefsDlg.m_bSelectCurves ^= 1;
6643 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
6644 g_bIgnoreCommands--;
6647 void MainFrame::OnPatchToggleBox(){
6648 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
6649 g_bIgnoreCommands++;
6650 g_bPatchShowBounds ^= 1;
6651 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
6652 g_bIgnoreCommands--;
6653 Sys_UpdateWindows( W_ALL );
6656 void MainFrame::OnPatchWireframe(){
6657 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_wireframe" ) );
6658 g_bIgnoreCommands++;
6659 g_bPatchWireFrame ^= 1;
6660 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWireFrame ) ? TRUE : FALSE );
6661 g_bIgnoreCommands--;
6662 Sys_UpdateWindows( W_ALL );
6665 void MainFrame::OnPatchBend(){
6666 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
6667 g_bIgnoreCommands++;
6669 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
6670 g_bIgnoreCommands--;
6671 Sys_UpdateWindows( W_ALL );
6674 void MainFrame::OnPatchWeld(){
6675 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
6676 g_bIgnoreCommands++;
6678 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
6679 g_bIgnoreCommands--;
6680 Sys_UpdateWindows( W_ALL );
6683 void MainFrame::OnPatchDrilldown(){
6684 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
6685 g_bIgnoreCommands++;
6686 g_bPatchDrillDown ^= 1;
6687 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
6688 g_bIgnoreCommands--;
6689 Sys_UpdateWindows( W_ALL );
6692 void MainFrame::OnShowEntities(){
6693 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "view_entitiesas_menu" ); // use pointer to existing menu object
6694 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6697 void MainFrame::OnDropGroupName(){
6699 char* name = DoNameDlg ("Name Selection");
6704 Sys_UpdateWindows (W_ALL);
6710 void MainFrame::OnDropGroupNewgroup(){
6714 void MainFrame::OnDropGroupRemove(){
6716 Select_AddToGroup("World");
6717 Sys_UpdateWindows (W_ALL);
6721 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6722 void MainFrame::OnFaceFit(){
6726 void MainFrame::OnDontselectmodel(){
6727 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
6728 g_bIgnoreCommands++;
6729 g_PrefsDlg.m_bSelectModels ^= 1;
6730 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
6731 g_bIgnoreCommands--;
6734 void MainFrame::OnViewTexture(){
6735 if ( FloatingGroupDialog() ) { // QE4 style
6736 if ( inspector_mode == W_TEXTURE ) {
6737 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
6738 widget_delete_hide( g_qeglobals_gui.d_entity );
6741 gtk_widget_show( g_qeglobals_gui.d_entity );
6746 gtk_widget_show( g_qeglobals_gui.d_entity );
6747 SetInspectorMode( W_TEXTURE );
6752 void MainFrame::OnPatchInspector(){
6753 TogglePatchInspector();
6756 void MainFrame::OnCurveNegativeTextureX(){
6757 Patch_InvertTexture( false );
6758 //Sys_UpdateWindows(W_ALL);
6761 void MainFrame::OnCurveNegativeTextureY(){
6762 Patch_InvertTexture( true );
6763 //Sys_UpdateWindows(W_ALL);
6766 void MainFrame::OnCurveInsertcolumn(){
6767 if ( &selected_brushes == selected_brushes.next ) {
6770 Undo_Start( "insert colum" );
6771 Undo_AddBrushList( &selected_brushes );
6772 //Patch_AdjustSelectedRowCols(0, 2);
6773 Patch_AdjustSelected( true, true, true );
6774 Sys_UpdateWindows( W_ALL );
6775 Undo_EndBrushList( &selected_brushes );
6779 void MainFrame::OnCurveInsertrow(){
6780 if ( &selected_brushes == selected_brushes.next ) {
6783 Undo_Start( "insert row" );
6784 Undo_AddBrushList( &selected_brushes );
6785 //Patch_AdjustSelectedRowCols(2, 0);
6786 Patch_AdjustSelected( true, false, true );
6787 Sys_UpdateWindows( W_ALL );
6788 Undo_EndBrushList( &selected_brushes );
6792 void MainFrame::OnCurveDeletecolumn(){
6793 if ( &selected_brushes == selected_brushes.next ) {
6796 Undo_Start( "delete column" );
6797 Undo_AddBrushList( &selected_brushes );
6798 Patch_AdjustSelected( false, true, true );
6799 Sys_UpdateWindows( W_ALL );
6800 Undo_EndBrushList( &selected_brushes );
6804 void MainFrame::OnCurveDeleterow(){
6805 if ( &selected_brushes == selected_brushes.next ) {
6808 Undo_Start( "delete row" );
6809 Undo_AddBrushList( &selected_brushes );
6810 Patch_AdjustSelected( false, false, true );
6811 Sys_UpdateWindows( W_ALL );
6812 Undo_EndBrushList( &selected_brushes );
6816 void MainFrame::OnPatchTab(){
6817 if ( g_bPatchBendMode ) {
6818 Patch_BendHandleTAB();
6820 // else if (g_bPatchInsertMode)
6821 // Patch_InsDelHandleTAB();
6824 // check to see if the selected brush is part of a func group
6825 // if it is, deselect everything and reselect the next brush
6827 brush_t *b2, *b = selected_brushes.next;
6829 if ( b != &selected_brushes ) {
6830 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6833 for ( b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext )
6840 if ( b2 == &e->brushes ) {
6844 Select_Brush( b2, false );
6845 Sys_UpdateWindows( W_ALL );
6851 void MainFrame::OnSelectFuncGroup(){
6852 // check to see if the selected brush is part of a func group
6853 // if it is, deselect everything and reselect the next brush
6855 brush_t *b = selected_brushes.next;
6857 if ( b != &selected_brushes ) {
6858 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6860 Select_SelectGroup( e );
6865 void MainFrame::OnCameraForward( bool keydown ){
6866 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6868 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6869 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6870 Sys_UpdateWindows( nUpdate );
6875 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
6878 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
6883 void MainFrame::OnCameraBack( bool keydown ){
6884 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6886 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6887 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6888 Sys_UpdateWindows( nUpdate );
6893 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
6896 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
6901 void MainFrame::OnCameraLeft( bool keydown ){
6903 if ( m_pCamWnd->m_bFreeMove ) {
6904 OnCameraStrafeleft( keydown );
6909 if ( g_PrefsDlg.m_bCamDiscrete ) {
6911 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
6912 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6913 Sys_UpdateWindows( nUpdate );
6918 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
6921 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
6926 void MainFrame::OnCameraRight( bool keydown ){
6928 if ( m_pCamWnd->m_bFreeMove ) {
6929 OnCameraStraferight( keydown );
6934 if ( g_PrefsDlg.m_bCamDiscrete ) {
6936 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
6937 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6938 Sys_UpdateWindows( nUpdate );
6943 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
6946 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
6951 void MainFrame::OnCameraUp(){
6952 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
6953 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6954 Sys_UpdateWindows( nUpdate );
6957 void MainFrame::OnCameraDown(){
6958 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
6959 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6960 Sys_UpdateWindows( nUpdate );
6963 void MainFrame::OnCameraAngleup(){
6964 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
6965 if ( m_pCamWnd->Camera()->angles[0] > 85 ) {
6966 m_pCamWnd->Camera()->angles[0] = 85;
6968 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6971 void MainFrame::OnCameraAngledown(){
6972 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
6973 if ( m_pCamWnd->Camera()->angles[0] < -85 ) {
6974 m_pCamWnd->Camera()->angles[0] = -85;
6976 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6979 void MainFrame::OnCameraStrafeleft( bool keydown ){
6980 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6982 if ( !m_pCamWnd->m_bFreeMove ) {
6984 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6985 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6986 Sys_UpdateWindows( nUpdate );
6993 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
6996 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7000 void MainFrame::OnCameraStraferight( bool keydown ){
7001 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7003 if ( !m_pCamWnd->m_bFreeMove ) {
7005 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
7006 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
7007 Sys_UpdateWindows( nUpdate );
7014 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7017 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7021 void MainFrame::OnGridToggle(){
7022 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7023 Sys_UpdateWindows( W_XY | W_Z );
7026 void MainFrame::OnViewCrosshair(){
7028 Sys_UpdateWindows( W_XY );
7031 void MainFrame::OnSelectionTextureRotateclock(){
7032 Select_RotateTexture( abs( g_PrefsDlg.m_nRotation ) );
7035 void MainFrame::OnSelectionTextureRotatecounter(){
7036 Select_RotateTexture( -abs( g_PrefsDlg.m_nRotation ) );
7039 void MainFrame::OnSelectionTextureScaleup(){
7040 Select_ScaleTexture( 0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7043 void MainFrame::OnSelectionTextureScaledown(){
7044 Select_ScaleTexture( 0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7047 void MainFrame::OnSelectionTextureScaleLeft(){
7048 Select_ScaleTexture( -g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7051 void MainFrame::OnSelectionTextureScaleRight(){
7052 Select_ScaleTexture( g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7055 void MainFrame::OnSelectionTextureShiftleft(){
7056 Select_ShiftTexture( (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7059 void MainFrame::OnSelectionTextureShiftright(){
7060 Select_ShiftTexture( (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7063 void MainFrame::OnSelectionTextureShiftup(){
7064 Select_ShiftTexture( 0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7067 void MainFrame::OnSelectionTextureShiftdown(){
7068 Select_ShiftTexture( 0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7071 void MainFrame::OnGridPrev(){
7073 if ( g_qeglobals.d_gridsize == 1 ) {
7074 g_qeglobals.d_gridsize = 0.5;
7075 g_qeglobals.d_bSmallGrid = true;
7076 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7078 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7079 g_qeglobals.d_gridsize = 0.25;
7080 g_qeglobals.d_bSmallGrid = true;
7081 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_025" ) );
7083 else if ( g_qeglobals.d_gridsize > 1 ) {
7084 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7085 g_qeglobals.d_bSmallGrid = false;
7087 switch ( (int)g_qeglobals.d_gridsize )
7089 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7090 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7091 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7092 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7093 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7094 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7095 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7096 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7097 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7105 // SnapTToGrid option: need to check everywhere the grid size is changed
7106 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7107 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7112 g_bIgnoreCommands++;
7113 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7114 g_bIgnoreCommands--;
7116 Sys_UpdateWindows( W_XY | W_Z );
7119 void MainFrame::OnGridNext(){
7121 if ( g_qeglobals.d_gridsize == 0.25 ) {
7122 g_qeglobals.d_gridsize = 0.5;
7123 g_qeglobals.d_bSmallGrid = true;
7124 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7126 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7127 g_qeglobals.d_gridsize = 1;
7128 g_qeglobals.d_bSmallGrid = false;
7129 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) );
7131 else if ( g_qeglobals.d_gridsize < 256 ) {
7132 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7133 g_qeglobals.d_bSmallGrid = false;
7135 switch ( (int)g_qeglobals.d_gridsize )
7137 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7138 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7139 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7140 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7141 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7142 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7143 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7144 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7145 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7146 default: item = NULL;
7154 // SnapTToGrid option: need to check everywhere the grid size is changed
7155 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7156 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7161 g_bIgnoreCommands++;
7162 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7163 g_bIgnoreCommands--;
7165 Sys_UpdateWindows( W_XY | W_Z );
7168 void MainFrame::OnSelectionMovedown(){
7169 if ( &selected_brushes == selected_brushes.next ) {
7172 Undo_Start( "move down" );
7173 Undo_AddBrushList( &selected_brushes );
7176 vAmt[0] = vAmt[1] = 0.0;
7177 vAmt[2] = -g_qeglobals.d_gridsize;
7178 Select_Move( vAmt );
7179 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7181 Undo_EndBrushList( &selected_brushes );
7185 void MainFrame::OnSelectionMoveup(){
7186 if ( &selected_brushes == selected_brushes.next ) {
7189 Undo_Start( "move up" );
7190 Undo_AddBrushList( &selected_brushes );
7193 vAmt[0] = vAmt[1] = 0.0;
7194 vAmt[2] = g_qeglobals.d_gridsize;
7195 Select_Move( vAmt );
7196 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7198 Undo_EndBrushList( &selected_brushes );
7202 void MainFrame::OnSelectionPrint(){
7203 for ( brush_t* b = selected_brushes.next ; b != &selected_brushes ; b = b->next )
7207 void MainFrame::OnSelectionTogglesizepaint(){
7208 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7209 Sys_UpdateWindows( W_XY );
7212 void MainFrame::OnPatchNaturalize(){
7213 Patch_NaturalizeSelected();
7214 Sys_UpdateWindows( W_ALL );
7217 void MainFrame::OnSnapToGrid(){
7218 if ( &selected_brushes == selected_brushes.next ) {
7221 Undo_Start( "snap selection to grid" );
7222 Undo_AddBrushList( &selected_brushes );
7223 //Select_SnapToGrid();
7224 for ( brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next )
7226 if ( pb->patchBrush ) {
7227 Patch_SnapToGrid( pb->pPatch );
7230 Brush_SnapToGrid( pb );
7233 Sys_UpdateWindows( W_ALL );
7234 Undo_EndBrushList( &selected_brushes );
7238 void MainFrame::OnSelectAll(){
7242 void MainFrame::OnSelectionInvert(){
7244 Sys_UpdateWindows( W_XY | W_Z | W_CAMERA );
7248 void PerformFiltering(){
7253 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7254 brush->bFiltered = FilterBrush( brush );
7256 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7257 brush->bFiltered = FilterBrush( brush );
7260 void MainFrame::OnFilterAreaportals(){
7261 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
7262 g_bIgnoreCommands++;
7263 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS ) & EXCLUDE_AREAPORTALS ) {
7264 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7267 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7269 g_bIgnoreCommands--;
7271 Sys_UpdateWindows( W_XY | W_CAMERA );
7274 void MainFrame::OnFilterCaulk(){
7275 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
7276 g_bIgnoreCommands++;
7277 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK ) & EXCLUDE_CAULK ) {
7278 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7281 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7283 g_bIgnoreCommands--;
7285 Sys_UpdateWindows( W_XY | W_CAMERA );
7288 void MainFrame::OnFilterClips(){
7289 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
7290 g_bIgnoreCommands++;
7291 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) {
7292 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7295 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7297 g_bIgnoreCommands--;
7299 Sys_UpdateWindows( W_XY | W_CAMERA );
7302 void MainFrame::OnFilterBotClips(){
7303 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
7304 g_bIgnoreCommands++;
7305 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP ) & EXCLUDE_BOTCLIP ) {
7306 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7309 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7311 g_bIgnoreCommands--;
7313 Sys_UpdateWindows( W_XY | W_CAMERA );
7316 void MainFrame::OnFilterStructural(){
7317 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
7318 g_bIgnoreCommands++;
7319 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL ) & EXCLUDE_STRUCTURAL ) {
7320 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7323 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7325 g_bIgnoreCommands--;
7327 Sys_UpdateWindows( W_XY | W_CAMERA );
7330 void MainFrame::OnFilterDetails(){
7331 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
7332 g_bIgnoreCommands++;
7333 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS ) & EXCLUDE_DETAILS ) {
7334 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7337 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7339 g_bIgnoreCommands--;
7341 Sys_UpdateWindows( W_XY | W_CAMERA );
7344 void MainFrame::OnFilterEntities(){
7345 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
7346 g_bIgnoreCommands++;
7347 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) {
7348 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7351 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7353 g_bIgnoreCommands--;
7355 Sys_UpdateWindows( W_XY | W_CAMERA );
7358 void MainFrame::OnFilterHintsskips(){
7359 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
7360 g_bIgnoreCommands++;
7361 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS ) & EXCLUDE_HINTSSKIPS ) {
7362 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7365 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7367 g_bIgnoreCommands--;
7369 Sys_UpdateWindows( W_XY | W_CAMERA );
7372 void MainFrame::OnFilterLights(){
7373 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
7374 g_bIgnoreCommands++;
7375 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) {
7376 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7379 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7381 g_bIgnoreCommands--;
7383 Sys_UpdateWindows( W_XY | W_CAMERA );
7386 void MainFrame::OnFilterLiquids(){
7387 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
7388 g_bIgnoreCommands++;
7389 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS ) & EXCLUDE_LIQUIDS ) {
7390 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7393 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7395 g_bIgnoreCommands--;
7397 Sys_UpdateWindows( W_XY | W_CAMERA );
7400 void MainFrame::OnFilterModels(){
7401 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
7402 g_bIgnoreCommands++;
7403 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS ) & EXCLUDE_MODELS ) {
7404 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7407 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7409 g_bIgnoreCommands--;
7411 Sys_UpdateWindows( W_XY | W_CAMERA );
7414 void MainFrame::OnFilterPatches(){
7415 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
7416 g_bIgnoreCommands++;
7417 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES ) & EXCLUDE_CURVES ) {
7418 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7421 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7423 g_bIgnoreCommands--;
7425 Sys_UpdateWindows( W_XY | W_CAMERA );
7428 void MainFrame::OnFilterPaths(){
7429 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
7430 g_bIgnoreCommands++;
7431 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) {
7432 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7435 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7437 g_bIgnoreCommands--;
7439 Sys_UpdateWindows( W_XY | W_CAMERA );
7442 void MainFrame::OnFilterClusterportals(){
7443 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
7444 g_bIgnoreCommands++;
7445 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS ) & EXCLUDE_CLUSTERPORTALS ) {
7446 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7449 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7451 g_bIgnoreCommands--;
7453 Sys_UpdateWindows( W_XY | W_CAMERA );
7456 void MainFrame::OnFilterLightgrid(){
7457 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
7458 g_bIgnoreCommands++;
7459 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID ) & EXCLUDE_LIGHTGRID ) {
7460 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7463 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7465 g_bIgnoreCommands--;
7467 Sys_UpdateWindows( W_XY | W_CAMERA );
7470 void MainFrame::OnFilterTranslucent(){
7471 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
7472 g_bIgnoreCommands++;
7473 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT ) & EXCLUDE_TRANSLUCENT ) {
7474 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7477 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7479 g_bIgnoreCommands--;
7481 Sys_UpdateWindows( W_XY | W_CAMERA );
7484 void MainFrame::OnFilterTriggers(){
7485 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
7486 g_bIgnoreCommands++;
7487 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS ) & EXCLUDE_TRIGGERS ) {
7488 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7491 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7493 g_bIgnoreCommands--;
7495 Sys_UpdateWindows( W_XY | W_CAMERA );
7498 void MainFrame::OnFilterWorld(){
7499 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
7500 g_bIgnoreCommands++;
7501 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) {
7502 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7505 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7507 g_bIgnoreCommands--;
7509 Sys_UpdateWindows( W_XY | W_CAMERA );
7519 // =============================================================================
7520 // leo: Unused functions, not called anywhere from the code (need to check)
7522 void MainFrame::OnViewConsole(){
7523 if ( FloatingGroupDialog() ) { // QE4 style
7524 if ( inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating ) { // are we in console mode already?
7525 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
7526 widget_delete_hide( g_qeglobals_gui.d_entity );
7529 gtk_widget_show( g_qeglobals_gui.d_entity );
7534 gtk_widget_show( g_qeglobals_gui.d_entity );
7535 SetInspectorMode( W_CONSOLE );
7540 void MainFrame::OnCurveFreeze(){
7544 void MainFrame::OnCurveUnFreeze(){
7545 Patch_UnFreeze( false );
7548 void MainFrame::OnCurveUnFreezeAll(){
7549 Patch_UnFreeze( true );
7552 void MainFrame::OnSelectReselect(){
7556 void MainFrame::OnSelectionTextureFit(){
7557 // TODO: Add your command handler code here
7560 void MainFrame::OnPatchEnter(){
7564 void MainFrame::OnDropGroupAddtoWorld(){
7566 Select_AddToGroup("World");
7567 Sys_UpdateWindows (W_ALL);