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 //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2025 gtk_window_set_transient_for( GTK_WINDOW( wnd ), GTK_WINDOW( mainframe->m_pWidget ) );
2026 gtk_widget_set_events( wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2027 gtk_signal_connect( GTK_OBJECT( wnd ), "delete_event", GTK_SIGNAL_FUNC( widget_delete_hide ), NULL );
2028 gtk_signal_connect( GTK_OBJECT( wnd ), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
2029 gtk_signal_connect( GTK_OBJECT( wnd ), "key_press_event",
2030 GTK_SIGNAL_FUNC( mainframe_keypress ), mainframe );
2031 gtk_signal_connect( GTK_OBJECT( wnd ), "key_release_event",
2032 GTK_SIGNAL_FUNC( mainframe_keyrelease ), mainframe );
2033 gtk_signal_connect( GTK_OBJECT( wnd ), "map_event",
2034 GTK_SIGNAL_FUNC( mainframe_map ), mainframe );
2036 gtk_window_set_default_size( GTK_WINDOW( wnd ), 100, 100 );
2038 #ifdef DBG_WINDOWPOS
2039 Sys_Printf( "create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd );
2045 void console_populate_popup( GtkTextView* textview, GtkMenu* menu, gpointer user_data ){
2046 menu_separator( GTK_WIDGET( menu ) );
2048 GtkWidget* item = gtk_menu_item_new_with_label( _( "Clear" ) );
2049 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( Sys_ClearPrintf ), NULL );
2050 gtk_widget_show( item );
2051 gtk_menu_append( GTK_MENU( menu ), item );
2054 void console_construct( GtkWidget* textview ){
2055 g_signal_connect( G_OBJECT( textview ), "populate-popup", G_CALLBACK( console_populate_popup ), NULL );
2058 extern MemStream g_Clipboard;
2060 void Clipboard_CopyMap(){
2061 g_Clipboard.SetLength( 0 );
2062 Map_Export( &g_Clipboard, "xmap", false, true );
2065 void Clipboard_PasteMap(){
2066 if ( g_Clipboard.GetLength() > 0 ) {
2067 g_Clipboard.Seek( 0, SEEK_SET );
2068 Map_Import( &g_Clipboard, "xmap", true );
2073 Platform-independent GTK clipboard support.
2074 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2076 #if defined ( __linux__ ) || defined ( __APPLE__ )
2080 RADIANT_CLIPPINGS = 23,
2083 static const GtkTargetEntry clipboard_targets[] = {
2084 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2087 static void clipboard_get( GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner ){
2090 GdkAtom type = GDK_NONE;
2092 len = g_Clipboard.GetLength();
2099 buffer = g_Clipboard.GetBuffer();
2102 if ( info == clipboard_targets[0].info ) {
2103 type = gdk_atom_intern( clipboard_targets[0].target, FALSE );
2106 gtk_selection_data_set( selection_data, type, 8, buffer, len );
2109 static void clipboard_clear( GtkClipboard *clipboard, gpointer user_data_or_owner ){
2112 static void clipboard_received( GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data ){
2113 g_Clipboard.SetLength( 0 );
2115 if ( data->length < 0 ) {
2116 Sys_FPrintf( SYS_ERR, "Error retrieving selection\n" );
2118 else if ( strcmp( gdk_atom_name( data->type ), clipboard_targets[0].target ) == 0 ) {
2119 g_Clipboard.Write( data->data, data->length );
2122 Clipboard_PasteMap();
2125 void clipboard_copy(){
2126 Clipboard_CopyMap();
2128 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2130 gtk_clipboard_set_with_data( clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL );
2133 void clipboard_paste(){
2134 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2136 gtk_clipboard_request_contents( clipboard, gdk_atom_intern( clipboard_targets[0].target, FALSE ), clipboard_received, NULL );
2140 #elif defined( WIN32 )
2142 void clipboard_copy(){
2143 Clipboard_CopyMap();
2145 bool bClipped = false;
2146 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2147 if ( nClipboard > 0 ) {
2148 if ( ::OpenClipboard( NULL ) ) {
2150 long lSize = g_Clipboard.GetLength();
2151 HANDLE h = ::GlobalAlloc( GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof( long ) );
2153 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2154 memcpy( cp, &lSize, sizeof( long ) );
2155 cp += sizeof( long );
2156 g_Clipboard.Seek( 0, SEEK_SET );
2157 g_Clipboard.Read( cp, lSize );
2158 ::GlobalUnlock( h );
2159 ::SetClipboardData( nClipboard, h );
2167 Sys_Printf( "Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n" );
2171 void clipboard_paste(){
2172 bool bPasted = false;
2173 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2174 if ( nClipboard > 0 && ::OpenClipboard( NULL ) ) {
2175 if ( IsClipboardFormatAvailable( nClipboard ) ) {
2176 HANDLE h = ::GetClipboardData( nClipboard );
2178 g_Clipboard.SetLength( 0 );
2179 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2181 memcpy( &lSize, cp, sizeof( long ) );
2182 cp += sizeof( long );
2183 g_Clipboard.Write( cp, lSize );
2184 ::GlobalUnlock( h );
2190 Clipboard_PasteMap();
2195 void MainFrame::Copy(){
2199 void MainFrame::Paste(){
2201 UpdateSurfaceDialog();
2205 #ifdef DBG_WINDOWPOS
2206 GtkWidget *watchit = NULL;
2208 void CheckWatchit( char *msg ){
2209 static int width = 0;
2210 if ( ( watchit != NULL ) && ( watchit->allocation.width != width ) ) {
2211 Sys_Printf( "CheckWatchit %s: %d\n", msg, watchit->allocation.width );
2212 width = watchit->allocation.width;
2218 BOOL CALLBACK m_pCountMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2219 int *n = (int *) dwData;
2226 struct monitorInfo_s {
2227 GdkRectangle *win_monitors;
2231 BOOL CALLBACK m_pEnumMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2232 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2233 GdkRectangle *monitor;
2236 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2238 memset( &lpmi, 0, sizeof( MONITORINFOEX ) );
2239 lpmi.cbSize = sizeof( MONITORINFOEX );
2241 GetMonitorInfo( hMonitor, &lpmi );
2243 if ( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2246 SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0 );
2247 monitor->x = rect.left;
2248 monitor->y = rect.top;
2249 monitor->width = rect.right - rect.left;
2250 monitor->height = rect.bottom - rect.top;
2252 if ( monitorInfo->i_win_mon != 0 ) {
2253 GdkRectangle temp = *monitor;
2254 *monitor = monitorInfo->win_monitors[0];
2255 monitorInfo->win_monitors[0] = temp;
2259 monitor->x = lpmi.rcMonitor.left;
2260 monitor->y = lpmi.rcMonitor.top;
2261 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2262 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2265 monitorInfo->i_win_mon++;
2270 void PositionWindowOnPrimaryScreen( window_position_t& position ){
2271 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2273 if ( position.x <= primaryMonitorRect.x + 6 ) {
2274 position.x = primaryMonitorRect.x + 6;
2276 else if ( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 ) {
2277 position.x = primaryMonitorRect.x + 6;
2280 if ( position.y <= primaryMonitorRect.y + 6 ) {
2281 position.y = primaryMonitorRect.y + 6;
2283 else if ( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 ) {
2284 position.y = primaryMonitorRect.y + 6;
2287 if ( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 ) {
2288 position.w = primaryMonitorRect.width - 18;
2290 if ( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 ) {
2291 position.h = primaryMonitorRect.height - 18;
2296 GtkWidget* create_framed_widget( GtkWidget* widget ){
2297 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2298 gtk_widget_show( frame );
2299 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2300 gtk_container_add( GTK_CONTAINER( frame ), widget );
2301 gtk_widget_show( widget );
2305 gboolean entry_focus_in( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2306 gtk_window_remove_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2310 gboolean entry_focus_out( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2311 gtk_window_add_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2315 GtkWidget* create_framed_texwnd( TexWnd* texwnd ){
2316 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2317 gtk_widget_show( frame );
2318 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2320 GtkWidget* hbox = gtk_hbox_new( FALSE, 0 );
2321 gtk_widget_show( hbox );
2322 gtk_container_add( GTK_CONTAINER( frame ), hbox );
2324 GtkWidget* w = gtk_vscrollbar_new( GTK_ADJUSTMENT( gtk_adjustment_new( 0,0,0,1,1,1 ) ) );
2325 gtk_widget_show( w );
2326 gtk_box_pack_end( GTK_BOX( hbox ), w, FALSE, TRUE, 0 );
2327 g_qeglobals_gui.d_texture_scroll = w;
2329 GtkWidget* texbox = gtk_vbox_new( FALSE, 0 );
2330 gtk_widget_show( texbox );
2331 gtk_box_pack_start( GTK_BOX( hbox ), texbox, TRUE, TRUE, 0 );
2333 w = gtk_entry_new();
2334 gtk_box_pack_start( GTK_BOX( texbox ), w, FALSE, FALSE, 0 );
2335 texwnd->m_pFilter = w;
2336 g_signal_connect( G_OBJECT( w ), "focus_in_event", G_CALLBACK( entry_focus_in ), NULL );
2337 g_signal_connect( G_OBJECT( w ), "focus_out_event", G_CALLBACK( entry_focus_out ), NULL );
2339 w = texwnd->GetWidget();
2340 gtk_box_pack_start( GTK_BOX( texbox ), w, TRUE, TRUE, 0 );
2341 gtk_widget_show( w );
2346 static ZWnd *create_floating_zwnd( MainFrame *mainframe ){
2347 ZWnd *pZWnd = new ZWnd();
2348 GtkWidget* wnd = create_floating( mainframe );
2350 gtk_window_set_title( GTK_WINDOW( wnd ), "Z" );
2352 pZWnd->m_pParent = wnd;
2355 GtkWidget* frame = create_framed_widget( pZWnd->GetWidget() );
2356 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2359 gtk_widget_realize( wnd );
2361 // turn OFF minimize and maximize boxes.
2362 // Must be *after* realize, or wnd->window is NULL
2363 // should do the right thing on *nix, need to verify.
2364 gdk_window_set_decorations( wnd->window,
2365 GdkWMDecoration( GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2366 //TODO 50 by observation, will vary depending on decoration sizes
2368 GdkGeometry geometry;
2369 geometry.min_width = 50;
2370 //we only care about width, but have to set this too, or get nasty bugs
2371 geometry.min_height = 10;
2372 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE );
2376 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2377 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2380 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posZWnd );
2382 if ( g_PrefsDlg.m_bZVis ) {
2383 gtk_widget_show( wnd );
2389 static const int gutter = 12;
2391 void MainFrame::Create(){
2392 GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2394 gtk_widget_set_events( window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2395 gtk_signal_connect( GTK_OBJECT( window ), "delete_event",
2396 GTK_SIGNAL_FUNC( mainframe_delete ), this );
2397 gtk_signal_connect( GTK_OBJECT( window ), "destroy",
2398 GTK_SIGNAL_FUNC( mainframe_destroy ), this );
2399 gtk_signal_connect( GTK_OBJECT( window ), "key_press_event",
2400 GTK_SIGNAL_FUNC( mainframe_keypress ), this );
2401 gtk_signal_connect( GTK_OBJECT( window ), "key_release_event",
2402 GTK_SIGNAL_FUNC( mainframe_keyrelease ), this );
2403 gtk_signal_connect( GTK_OBJECT( window ), "map_event",
2404 GTK_SIGNAL_FUNC( mainframe_map ), this );
2405 gtk_signal_connect( GTK_OBJECT( window ), "unmap_event",
2406 GTK_SIGNAL_FUNC( mainframe_unmap ), this );
2408 g_qeglobals_gui.d_main_window = window;
2411 // calculate gdk offset
2412 int n_win_monitors = 0;
2414 monitorInfo_s monitorInfo;
2416 // detect multiple monitors
2417 EnumDisplayMonitors( NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>( &n_win_monitors ) );
2419 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2420 monitorInfo.i_win_mon = 0;
2421 EnumDisplayMonitors( NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>( &monitorInfo ) );
2423 gdk_offset_x = G_MININT;
2424 gdk_offset_y = G_MININT;
2427 for ( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2428 gdk_offset_x = MAX( gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x );
2429 gdk_offset_y = MAX( gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y );
2432 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 );
2434 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2436 GdkDisplay *display;
2438 gint n_gdk_monitors = 0;
2442 // detect multiple monitors
2443 display = gdk_display_get_default();
2444 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name( display ), gdk_display_get_n_screens( display ) );
2446 screen = gdk_display_get_screen( display, 1 );
2447 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2449 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2451 for ( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2452 memset( &rect, 0, sizeof( rect ) );
2453 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2454 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2457 memcpy( &primaryMonitorRect, &rect, sizeof( primaryMonitorRect ) );
2461 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2464 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2465 primaryMonitorRect.width = gdk_screen_width();
2466 primaryMonitorRect.height = gdk_screen_height();
2471 load_window_pos( window, g_PrefsDlg.mWindowInfo.position );
2473 GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
2474 gtk_container_add( GTK_CONTAINER( window ), vbox );
2475 gtk_widget_show( vbox );
2477 create_main_menu( window, vbox );
2479 create_main_toolbar( window, vbox );
2480 create_plugin_toolbar( window,vbox );
2482 m_nCurrentStyle = g_PrefsDlg.m_nView;
2484 g_pGroupDlg->Create();
2489 gtk_widget_show( window );
2491 // not needed on win32, it's in the .rc
2496 load_pixmap( "icon.bmp", window, &pixmap, &mask );
2497 gdk_window_set_icon( window->window, NULL, pixmap, mask );
2501 if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) {
2503 GtkWidget* vsplit = gtk_vpaned_new();
2504 m_pSplits[0] = vsplit;
2505 gtk_box_pack_start( GTK_BOX( vbox ), vsplit, TRUE, TRUE, 0 );
2506 gtk_widget_show( vsplit );
2509 GtkWidget* hsplit = gtk_hpaned_new();
2510 m_pSplits[2] = hsplit;
2511 gtk_paned_add1( GTK_PANED( vsplit ), hsplit );
2512 gtk_widget_show( hsplit );
2515 GtkWidget* hsplit2 = gtk_hpaned_new();
2516 m_pSplits[3] = hsplit2;
2517 gtk_paned_add2( GTK_PANED( hsplit ), hsplit2 );
2518 gtk_widget_show( hsplit2 );
2521 GtkWidget* vsplit2 = gtk_vpaned_new();
2522 m_pSplits[1] = vsplit2;
2523 if ( CurrentStyle() == eRegular ) {
2524 gtk_paned_add2( GTK_PANED( hsplit2 ), vsplit2 );
2527 gtk_paned_add1( GTK_PANED( hsplit ), vsplit2 );
2529 gtk_widget_show( vsplit2 );
2532 m_pCamWnd = new CamWnd();
2534 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2535 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2539 m_pXYWnd = new XYWnd();
2540 m_pXYWnd->SetViewType( XY );
2542 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2543 gtk_paned_add1( GTK_PANED( hsplit2 ), frame );
2547 m_pZWnd = new ZWnd();
2549 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2550 if ( CurrentStyle() == eRegular ) {
2551 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2554 gtk_paned_add2( GTK_PANED( hsplit2 ), frame );
2559 m_pTexWnd = new TexWnd();
2561 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2562 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2567 GtkWidget* scr = gtk_scrolled_window_new( NULL, NULL );
2568 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
2569 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
2570 gtk_widget_show( scr );
2571 gtk_paned_pack2( GTK_PANED( vsplit ), scr, FALSE, TRUE );
2574 GtkWidget* text = gtk_text_view_new();
2575 gtk_widget_set_size_request( text, 0, -1 ); // allow shrinking
2576 gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( text ), GTK_WRAP_WORD );
2577 gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
2578 gtk_container_add( GTK_CONTAINER( scr ), text );
2579 gtk_widget_show( text );
2580 g_qeglobals_gui.d_edit = text;
2588 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nXYHeight + 28 );
2590 if ( CurrentStyle() == eRegular ) {
2591 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nZWidth );
2592 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2596 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nCamWidth );
2597 while ( gtk_events_pending() ) gtk_main_iteration();
2598 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2601 while ( gtk_events_pending() ) gtk_main_iteration();
2603 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), g_PrefsDlg.mWindowInfo.nCamHeight );
2605 else if ( CurrentStyle() == eFloating ) {
2607 GtkWidget* wnd = create_floating( this );
2608 gtk_window_set_title( GTK_WINDOW( wnd ), "Camera" );
2611 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2612 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2615 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posCamWnd );
2617 gtk_widget_show( wnd );
2619 m_pCamWnd = new CamWnd();
2622 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2623 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2626 m_pCamWnd->m_pParent = wnd;
2629 if ( g_PrefsDlg.m_bFloatingZ ) {
2630 m_pZWnd = create_floating_zwnd( this );
2633 GtkWidget* wnd = create_floating( this );
2634 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2637 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2638 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2641 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2643 m_pXYWnd = new XYWnd();
2644 m_pXYWnd->SetViewType( XY );
2647 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2648 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2651 m_pXYWnd->m_pParent = wnd;
2653 gtk_widget_show( wnd );
2658 GtkWidget* wnd = create_floating( this );
2659 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2662 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2663 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2666 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2668 m_pZWnd = new ZWnd();
2669 m_pZWnd->m_pParent = wnd;
2671 m_pXYWnd = new XYWnd();
2672 m_pXYWnd->SetViewType( XY );
2673 m_pXYWnd->m_pParent = wnd;
2677 GtkWidget* hsplit = gtk_hpaned_new();
2678 m_pSplits[0] = hsplit;
2679 gtk_container_add( GTK_CONTAINER( wnd ), hsplit );
2680 gtk_widget_show( hsplit );
2683 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2684 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2687 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2688 gtk_paned_add2( GTK_PANED( hsplit ), frame );
2692 gtk_widget_show( wnd );
2694 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nZFloatWidth );
2698 GtkWidget* wnd = create_floating( this );
2699 gtk_window_set_title( GTK_WINDOW( wnd ), _( "XZ View" ) );
2702 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2703 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2706 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXZWnd );
2708 m_pXZWnd = new XYWnd();
2709 m_pXZWnd->m_pParent = wnd;
2710 m_pXZWnd->SetViewType( XZ );
2713 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2714 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2717 if ( g_PrefsDlg.m_bXZVis ) {
2718 gtk_widget_show( wnd );
2723 GtkWidget* wnd = create_floating( this );
2724 gtk_window_set_title( GTK_WINDOW( wnd ), _( "YZ View" ) );
2727 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2728 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2731 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posYZWnd );
2733 m_pYZWnd = new XYWnd();
2734 m_pYZWnd->m_pParent = wnd;
2735 m_pYZWnd->SetViewType( YZ );
2738 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2739 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2742 if ( g_PrefsDlg.m_bYZVis ) {
2743 gtk_widget_show( wnd );
2747 m_pTexWnd = new TexWnd();
2749 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2750 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2753 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2754 gtk_widget_show( w );
2755 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2759 g_pGroupDlg->Show();
2764 GtkWidget* hsplit = gtk_hpaned_new();
2765 m_pSplits[0] = hsplit;
2766 gtk_box_pack_start( GTK_BOX( vbox ), hsplit, TRUE, TRUE, 0 );
2767 gtk_widget_show( hsplit );
2770 GtkWidget* vsplit1 = gtk_vpaned_new();
2771 m_pSplits[1] = vsplit1;
2772 gtk_paned_add1( GTK_PANED( hsplit ), vsplit1 );
2773 gtk_widget_show( vsplit1 );
2776 GtkWidget* vsplit2 = gtk_vpaned_new();
2777 m_pSplits[2] = vsplit2;
2778 gtk_paned_add2( GTK_PANED( hsplit ), vsplit2 );
2779 gtk_widget_show( vsplit2 );
2781 m_pCamWnd = new CamWnd();
2783 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2784 gtk_paned_add1( GTK_PANED( vsplit1 ), frame );
2787 m_pXYWnd = new XYWnd();
2788 m_pXYWnd->SetViewType( XY );
2790 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2791 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2794 m_pYZWnd = new XYWnd();
2795 m_pYZWnd->SetViewType( YZ );
2797 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2798 gtk_paned_add2( GTK_PANED( vsplit1 ), frame );
2801 m_pXZWnd = new XYWnd();
2802 m_pXZWnd->SetViewType( XZ );
2804 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2805 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2811 // g_qeglobals_gui.d_edit = NULL;
2814 m_pTexWnd = new TexWnd();
2815 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2818 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2819 gtk_widget_show( w );
2820 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2824 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2825 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2826 m_pZWnd = create_floating_zwnd( this );
2828 while ( gtk_events_pending() )
2829 gtk_main_iteration();
2832 int x = GTK_PANED( m_pSplits[0] )->max_position / 2 - gutter;
2833 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), x );
2837 int y = GTK_PANED( m_pSplits[1] )->max_position / 2 - gutter;
2838 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), y );
2839 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), y );
2843 if ( g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED ) {
2844 gtk_window_maximize( GTK_WINDOW( window ) );
2847 gtk_widget_show( window );
2851 if ( m_pXYWnd ) { // this is always true?
2852 m_pXYWnd->SetActive( true );
2854 m_bSplittersOK = true;
2855 Texture_SetMode( g_qeglobals.d_savedinfo.iTexMenu );
2857 g_pParentWnd->OnEntitiesSetViewAs( 0 );
2859 // m_wndTextureBar.Create (vbox);
2860 create_main_statusbar( window, vbox );
2863 ShowMenuItemKeyBindings( window );
2865 if ( g_qeglobals_gui.d_edit != NULL ) {
2866 console_construct( g_qeglobals_gui.d_edit );
2869 // bool load_last = FALSE;
2872 SetButtonMenuStates();
2874 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2876 g_bIgnoreCommands++;
2877 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
2878 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
2879 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaderlistonly" ) );
2880 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
2881 g_bIgnoreCommands--;
2883 // if (g_PrefsDlg.m_bTextureBar)
2884 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2886 SetActiveXY( m_pXYWnd );
2888 s_idle_id = gtk_timeout_add( 25, mainframe_idle, this );
2890 QGL_InitExtensions();
2892 if ( g_PrefsDlg.mLocalPrefs.mbEmpty ) {
2893 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2894 g_PrefsDlg.SavePrefs();
2897 // remove the pid file
2898 remove( g_pidGameFile.GetBuffer() );
2900 Sys_Printf( "Entering message loop\n" );
2904 m_nTimer = gtk_timeout_add( 1000, timer, this );
2907 // =============================================================================
2910 MainFrame::MainFrame(){
2912 m_bSplittersOK = false;
2913 g_pParentWnd = this;
2914 m_pXYWnd = (XYWnd*)NULL;
2916 m_pTexWnd = (TexWnd*)NULL;
2917 m_pZWnd = (ZWnd*)NULL;
2918 m_pYZWnd = (XYWnd*)NULL;
2919 m_pXZWnd = (XYWnd*)NULL;
2920 m_pActiveXY = (XYWnd*)NULL;
2921 m_bCamPreview = true;
2923 for ( int n = 0; n < 6; n++ )
2924 m_pStatusLabel[n] = NULL;
2925 m_bNeedStatusUpdate = false;
2927 m_bSleeping = false;
2931 MainFrame::~MainFrame(){
2932 while ( g_BSPFrontendCommands )
2934 free( g_BSPFrontendCommands->data );
2935 g_BSPFrontendCommands = g_slist_remove( g_BSPFrontendCommands, g_BSPFrontendCommands->data );
2939 void MainFrame::ReleaseContexts(){
2941 m_pXYWnd->DestroyContext();
2944 m_pYZWnd->DestroyContext();
2947 m_pXZWnd->DestroyContext();
2950 m_pCamWnd->DestroyContext();
2953 m_pTexWnd->DestroyContext();
2956 m_pZWnd->DestroyContext();
2960 void MainFrame::CreateContexts(){
2962 m_pCamWnd->CreateContext();
2965 m_pXYWnd->CreateContext();
2968 m_pYZWnd->CreateContext();
2971 m_pXZWnd->CreateContext();
2974 m_pTexWnd->CreateContext();
2977 m_pZWnd->CreateContext();
2981 static void Sys_Iconify( GtkWidget *w ){
2982 // we might not have been realized yet
2983 if ( w->window == NULL ) {
2987 if ( !GTK_WIDGET_MAPPED( w ) ) {
2991 #if defined ( __linux__ ) || defined ( __APPLE__ )
2992 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Iconify\n" );
2994 XWindowAttributes xattr;
2995 GdkWindowPrivate *Private;
2997 Private = (GdkWindowPrivate*)w->window;
2998 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 0 ) );
3000 if ( !Private->destroyed ) {
3001 xattr.map_state = IsUnmapped;
3002 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3004 if ( xattr.map_state != IsUnmapped ) {
3005 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 1 ) );
3008 XIconifyWindow( Private->xdisplay, Private->xwindow, 0 );
3014 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_MINIMIZE );
3018 static void Sys_Restore( GtkWidget *w ){
3019 // we might not have been realized yet
3020 if ( w->window == NULL ) {
3024 if ( !GTK_WIDGET_VISIBLE( w ) ) {
3028 #if defined ( __linux__ ) || defined ( __APPLE__ )
3029 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Restore\n" );
3031 XWindowAttributes xattr;
3032 GdkWindowPrivate *Private;
3034 Private = (GdkWindowPrivate*)w->window;
3036 xattr.map_state = IsUnmapped;
3037 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3039 if ( xattr.map_state == IsUnmapped ) {
3040 XMapRaised( Private->xdisplay, Private->xwindow );
3046 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_RESTORE );
3054 void RefreshModelSkin( GSList **pModels, entitymodel_t *model ){
3055 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3056 // so we avoid the fucked up ones, assuming they are at the end
3057 if ( !model->strSkin ) {
3059 Sys_Printf( "Dropping model %p with empty skin in RefreshModelSkin\n", model );
3062 // and also keeping it so we have an actual count of empty models
3063 g_slist_append( *pModels, model );
3066 // do we have this model already?
3067 if ( g_slist_find( *pModels, model ) ) {
3070 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3071 Sys_Printf( "Already processed model: %p %s\n", model, ( (GString *)model->strSkin )->str );
3075 model->nTextureBind = Texture_LoadSkin( ( (GString *)model->strSkin )->str, &model->nSkinWidth, &model->nSkinHeight );
3076 if ( model->nTextureBind != -1 ) {
3077 Sys_Printf( "LOADED SKIN: %s\n", ( (GString *)model->strSkin )->str );
3080 Sys_Printf( "Load skin failed: %s\n", ( (GString *)model->strSkin )->str );
3082 *pModels = g_slist_append( *pModels, model );
3084 Sys_Printf( "Processed model %p %s\n", model, ( (GString *)model->strSkin )->str );
3088 void MainFrame::OnSleep(){
3090 if ( m_bSleeping ) {
3091 // useful when trying to debug crashes in the sleep code
3092 Sys_Printf( "Going into sleep mode..\n" );
3094 Sys_Printf( "Dispatching sleep msg..." );
3095 DispatchRadiantMsg( RADIANT_SLEEP );
3096 Sys_Printf( "Done.\n" );
3098 if ( CurrentStyle() == eSplit ) {
3099 Sys_Iconify( m_pZWnd->m_pParent );
3102 Sys_Iconify( m_pWidget );
3104 QERApp_FreeShaders();
3105 g_bScreenUpdates = false;
3108 Sys_Printf( "Releasing contexts..." );
3110 Sys_Printf( "Done.\n" );
3112 // free all the skins in the caches
3113 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3114 g_lstSkinCache.RemoveAll();
3118 Sys_Printf( "Waking up\n" );
3119 if ( CurrentStyle() == eSplit ) {
3120 Sys_Restore( m_pZWnd->m_pParent );
3123 Sys_Restore( m_pWidget );
3126 Sys_Printf( "Creating contexts..." );
3128 Sys_Printf( "Done.\n" );
3130 Sys_Printf( "Making current on camera..." );
3131 m_pCamWnd->MakeCurrent();
3132 Sys_Printf( "Done.\n" );
3134 Sys_Printf( "Reloading shaders..." );
3135 // reload the shader scripts and textures
3136 QERApp_ReloadShaders();
3138 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3139 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
3140 Sys_Printf( "Done.\n" );
3142 // rebuild the patches by setting the bDirty flag on them
3143 for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next )
3145 if ( b->patchBrush ) {
3146 b->pPatch->bDirty = true;
3150 Sys_Printf( "Reloading skins..." );
3151 // we have purged all the skins before going to sleep
3152 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3153 // namely, all entitymodel_t
3154 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3155 // (a single eclass_t can reference several entitymodel_t)
3156 // FIXME: and what's up with md3Class then? what is it used for?
3160 GSList *Models = NULL;
3161 for (ent = entities.next; ent != &entities; ent = ent->next)
3163 // if it's a model with skin then the fixedsize flag must be on
3164 // only if there IS a model .. we are not trying to load
3165 if (ent->eclass->fixedsize)
3167 if (ent->eclass->model)
3171 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3173 entitymodel_t *model;
3174 for (model = ent->eclass->model; model; model=model->pNext)
3175 RefreshModelSkin (&Models, model);
3176 } else if (ent->md3Class)
3178 entitymodel_t *model;
3179 for (model = ent->md3Class->model; model; model=model->pNext)
3180 RefreshModelSkin (&Models, model);
3184 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3189 for (e = g_md3Cache; e ; e = e->next)
3191 entitymodel_t *model;
3192 for (model = e->model; model; model=model->pNext)
3193 if (!g_slist_find (Models, model))
3195 Sys_Printf("model %p ", model);
3197 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3199 Sys_Printf("not found in main loop (no skin)\n");
3203 // clean the model list
3204 g_slist_free (Models);
3206 Sys_Printf( "Done.\n" );
3208 g_bScreenUpdates = true;
3210 Sys_Printf( "Dispatching wake msg..." );
3211 DispatchRadiantMsg( RADIANT_WAKEUP );
3212 Sys_Printf( "Done\n" );
3216 void WINAPI QERApp_Sleep(){
3217 g_pParentWnd->OnSleep();
3222 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3223 and not in OnDestroy because the info may be lost already?
3224 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3226 void MainFrame::OnDelete(){
3227 save_window_pos( m_pWidget, g_PrefsDlg.mWindowInfo.position );
3229 // surface inspector and patch inspector
3230 save_window_pos( g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd );
3231 save_window_pos( g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd );
3233 // entity inspector / group dialog
3234 // NOTE TTimo do we have to save a different window depending on the view mode?
3235 save_window_pos( g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd );
3237 if ( g_PrefsDlg.m_bFloatingZ ) {
3238 save_window_pos( m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd );
3241 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED( m_pSplits[0] )->child1_size;
3244 if ( CurrentStyle() == eFloating ) {
3245 save_window_pos( m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd );
3246 save_window_pos( m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd );
3247 save_window_pos( m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd );
3248 save_window_pos( m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd );
3251 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state( g_pParentWnd->m_pWidget->window );
3254 void MainFrame::OnDestroy(){
3255 // shut down console output first
3256 // (we'll still get the info if we are running a log file anyway)
3257 g_qeglobals_gui.d_edit = NULL;
3260 Sys_Printf( "MainFrame::OnDestroy\n" );
3263 gtk_timeout_remove( s_idle_id );
3266 gtk_timeout_remove( m_nTimer );
3269 if ( !g_qeglobals.disable_ini ) {
3270 Sys_Printf( "Start writing prefs\n" );
3271 Sys_Printf( "MRU_Save... " );
3273 Sys_Printf( "OK\n" );
3277 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split1" );
3278 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED( w )->child1_size;
3279 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split2" );
3280 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED( w )->child1_size;
3282 if ( !FloatingGroupDialog() ) {
3283 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3285 vsplit = m_pSplits[0];
3286 vsplit2 = m_pSplits[1];
3287 hsplit = m_pSplits[2];
3288 hsplit2 = m_pSplits[3];
3290 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED( vsplit )->child1_size;
3291 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED( hsplit2 )->child1_size;
3293 if ( CurrentStyle() == eRegular ) {
3294 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED( hsplit )->child1_size;
3297 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED( hsplit )->child1_size;
3300 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED( vsplit2 )->child1_size;
3304 if ( g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit ) {
3305 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
3306 g_PrefsDlg.m_bZVis = TRUE;
3309 g_PrefsDlg.m_bZVis = FALSE;
3313 g_PrefsDlg.SavePrefs();
3314 Sys_Printf( "Done prefs\n" );
3317 // spog - this may be better in another place..
3318 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3319 g_qeglobals.d_savedinfo.filters = FilterListDelete( g_qeglobals.d_savedinfo.filters );
3321 delete m_pXYWnd; m_pXYWnd = NULL;
3322 delete m_pYZWnd; m_pYZWnd = NULL;
3323 delete m_pXZWnd; m_pXZWnd = NULL;
3324 delete m_pZWnd; m_pZWnd = NULL;
3325 delete m_pTexWnd; m_pTexWnd = NULL;
3326 delete m_pCamWnd; m_pCamWnd = NULL;
3328 if ( g_pGroupDlg->m_pWidget ) {
3329 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3330 gtk_widget_destroy( g_pGroupDlg->m_pWidget );
3331 g_pGroupDlg->m_pWidget = NULL;
3334 if ( strcmpi( currentmap, "unnamed.map" ) != 0 ) {
3335 g_PrefsDlg.m_strLastMap = currentmap;
3336 g_PrefsDlg.SavePrefs();
3338 Sys_Printf( "CleanUpEntities..." );
3340 Sys_Printf( "Done.\n" );
3342 Sys_Printf( "Releasing brushes..." );
3343 while ( active_brushes.next != &active_brushes )
3344 Brush_Free( active_brushes.next, false );
3345 while ( selected_brushes.next != &selected_brushes )
3346 Brush_Free( selected_brushes.next, false );
3347 while ( filtered_brushes.next != &filtered_brushes )
3348 Brush_Free( filtered_brushes.next, false );
3349 Sys_Printf( "Done.\n" );
3351 Sys_Printf( "Releasing entities..." );
3352 while ( entities.next != &entities )
3353 Entity_Free( entities.next );
3354 Sys_Printf( "Done.\n" );
3356 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3359 epair_t* pNextEPair = pEPair->next;
3360 free( pEPair->key );
3361 free( pEPair->value );
3363 pEPair = pNextEPair;
3366 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3367 while ( pEntity != NULL && pEntity != g_qeglobals.d_project_entity )
3369 entity_t* pNextEntity = pEntity->next;
3370 Entity_Free( pEntity );
3371 pEntity = pNextEntity;
3374 Sys_Printf( "Freeing world entity..." );
3375 if ( world_entity ) {
3376 Entity_Free( world_entity );
3378 Sys_Printf( "Done.\n" );
3380 Sys_Printf( "Shutdown VFS..." );
3382 Sys_Printf( "Done.\n" );
3384 Sys_Printf( "FreeShaders..." );
3385 QERApp_FreeShaders();
3386 Sys_Printf( "Done.\n" );
3389 // TTimo: now using profile.cpp code
3390 void MainFrame::LoadCommandMap(){
3393 bool bUserCmdList = false;
3395 // verbose a little: count of user commands we recognized
3397 int iOverrideCount = 0;
3401 #if defined ( __linux__ ) || defined ( __APPLE__ )
3402 strINI = g_PrefsDlg.m_rc_path->str;
3403 #elif defined( WIN32 )
3404 strINI = g_strGameToolsPath;
3406 #error "WTF are you compiling this on"
3409 strINI += "shortcuts.ini";
3411 f = fopen( strINI.GetBuffer(), "r" );
3414 // loop through all the commands
3415 for ( int i = 0; i < g_nCommandCount; i++ )
3418 if ( read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ) ) {
3419 if ( !bUserCmdList ) {
3420 Sys_Printf( "Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3421 bUserCmdList = true;
3426 strBuff.TrimRight();
3427 strBuff.MakeLower();
3428 int nSpecial = strBuff.Find( "+alt" );
3429 g_Commands[i].m_nModifiers = 0;
3430 if ( nSpecial >= 0 ) {
3431 g_Commands[i].m_nModifiers |= RAD_ALT;
3432 FindReplace( strBuff, "+alt", "" );
3434 nSpecial = strBuff.Find( "+ctrl" );
3435 if ( nSpecial >= 0 ) {
3436 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3437 FindReplace( strBuff, "+ctrl", "" );
3439 nSpecial = strBuff.Find( "+shift" );
3440 if ( nSpecial >= 0 ) {
3441 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3442 FindReplace( strBuff, "+shift", "" );
3445 strBuff.TrimRight();
3446 strBuff.MakeUpper();
3447 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3449 nLen = strBuff.GetLength();
3450 if ( nLen == 1 ) { // most often case.. deal with first
3451 g_Commands[i].m_nKey = __toascii( strBuff.GetAt( 0 ) );
3456 for ( j = 0; j < g_nKeyCount; j++ )
3458 if ( strBuff.CompareNoCase( g_Keys[j].m_strName ) == 0 ) {
3459 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3464 if ( j == g_nKeyCount ) {
3465 Sys_Printf( "WARNING: failed to parse user command %s\n", value );
3469 // maybe this new shortcut is overriding another one
3470 // then we need to disable the other binded key
3471 for ( j = 0; j < g_nCommandCount; j++ )
3476 if ( g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers ) {
3478 g_Commands[j].m_nKey = 0;
3481 // it's the only one
3487 if ( iOverrideCount ) {
3488 Sys_Printf( "User's command list overrides %d default commands\n", iOverrideCount );
3490 Sys_Printf( "Parsed %d custom shortcuts\n", iCount );
3493 Sys_Printf( "Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer() );
3497 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3498 // we also output the count of commands that are not binded .. dunno if it's much use ..
3499 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3500 void MainFrame::ShowMenuItemKeyBindings( GtkWidget* window ){
3501 //!\todo Find a better way to get the global accelerator group..
3502 GtkAccelGroup *accel = GTK_ACCEL_GROUP( gtk_accel_groups_from_object( G_OBJECT( window ) )->data );
3508 for ( i = 0; i < g_nCommandCount; i++ )
3510 if ( g_Commands[i].m_nKey == 0 ) {
3515 item = g_object_get_data( G_OBJECT( m_pWidget ), g_Commands[i].m_strMenu );
3516 if ( item == NULL ) {
3517 Sys_FPrintf( SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3518 g_Commands[i].m_strCommand );
3523 if ( g_Commands[i].m_nModifiers ) { // are there modifiers present?
3524 if ( g_Commands[i].m_nModifiers & RAD_SHIFT ) {
3525 mods |= GDK_SHIFT_MASK;
3527 if ( g_Commands[i].m_nModifiers & RAD_ALT ) {
3528 mods |= GDK_MOD1_MASK;
3530 if ( g_Commands[i].m_nModifiers & RAD_CONTROL ) {
3531 mods |= GDK_CONTROL_MASK;
3535 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3536 if ( gtk_accelerator_valid( g_Commands[i].m_nKey, (GdkModifierType)mods ) ) {
3538 // NOTE TTimo this is the important place where all the shortcuts are binded
3539 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 );
3541 gtk_widget_add_accelerator( GTK_WIDGET( item ), "activate", accel, g_Commands[i].m_nKey,
3542 (GdkModifierType)mods, GTK_ACCEL_VISIBLE );
3546 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL( GTK_BIN( item )->child );
3550 g_free( accel_label->accel_string );
3551 accel_label->accel_string = NULL;
3553 gstring = g_string_new( accel_label->accel_string );
3554 g_string_append( gstring, " " );
3557 if ( mods & GDK_SHIFT_MASK ) {
3558 g_string_append( gstring, "Shft" );
3561 if ( mods & GDK_CONTROL_MASK ) {
3563 g_string_append( gstring, "+" );
3565 g_string_append( gstring, "Ctl" );
3568 if ( mods & GDK_MOD1_MASK ) {
3570 g_string_append( gstring, "+" );
3572 g_string_append( gstring, "Alt" );
3577 g_string_append( gstring, "+" );
3579 if ( g_Commands[i].m_nKey < 0x80 || ( g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff ) ) {
3580 switch ( g_Commands[i].m_nKey )
3583 g_string_append( gstring, "Space" );
3586 g_string_append( gstring, "Backslash" );
3589 g_string_append_c( gstring, toupper( g_Commands[i].m_nKey ) );
3597 tmp = gtk_accelerator_name( g_Commands[i].m_nKey, (GdkModifierType)0 );
3598 if ( tmp[0] != 0 && tmp[1] == 0 ) {
3599 tmp[0] = toupper( tmp[0] );
3601 g_string_append( gstring, tmp );
3605 g_free( accel_label->accel_string );
3606 accel_label->accel_string = gstring->str;
3607 g_string_free( gstring, FALSE );
3609 if ( !accel_label->accel_string ) {
3610 accel_label->accel_string = g_strdup( "" );
3613 gtk_widget_queue_resize( GTK_WIDGET( accel_label ) );
3618 Sys_Printf( "%d commands not bound to a key\n", iCount );
3622 void MainFrame::CreateQEChildren(){
3623 // load the project file
3625 Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
3626 if ( !QE_LoadProject( g_argv[1] ) ) {
3627 Error( "Unable to load project file %s\n", g_argv[1] );
3632 const char* filename = NULL;
3635 bool bTriedTemplate = false;
3637 if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
3638 // we need to regenerate from template
3639 Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
3640 g_PrefsDlg.m_strLastProject = "";
3643 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3645 while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
3647 if ( !bTriedTemplate ) {
3648 // try default project location
3649 bTriedTemplate = true;
3650 // for all OSes, we look for the template in the base installation (no homepath here)
3651 strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
3652 strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
3653 strcat( buf, "/scripts/" );
3654 strcat( buf, PROJECT_TEMPLATE_NAME );
3659 gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
3661 filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
3662 if ( filename != NULL ) {
3666 Error( "Cannot continue without loading a project..." );
3675 void MainFrame::OnTimer(){
3676 GdkModifierType mask;
3678 gdk_window_get_pointer( NULL, NULL, NULL, &mask );
3680 if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
3681 QE_CountBrushesAndUpdateStatusBar();
3685 // see MainFrame::UpdateStatusText below
3686 if ( m_bNeedStatusUpdate ) {
3687 for ( int n = 0; n < 6; n++ )
3689 if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
3690 gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
3693 m_bNeedStatusUpdate = false;
3697 void MainFrame::UpdateStatusText(){
3698 m_bNeedStatusUpdate = true;
3701 void MainFrame::SetStatusText( int nPane, const char* pText ){
3702 if ( pText && nPane <= 5 && nPane >= 0 ) {
3703 m_strStatus[nPane] = pText;
3707 void MainFrame::SetButtonMenuStates(){
3709 g_bIgnoreCommands++;
3711 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
3712 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
3713 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
3714 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
3715 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
3716 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
3717 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
3718 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
3719 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
3720 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
3721 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
3722 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
3723 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3724 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3725 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
3726 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3727 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3728 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3729 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3730 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3731 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3732 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
3733 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3734 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
3735 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
3736 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3737 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
3738 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
3739 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3740 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
3741 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
3742 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3743 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
3744 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
3745 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3746 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
3747 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
3748 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3749 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
3750 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
3751 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3752 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
3753 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
3754 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3755 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
3756 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
3757 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3758 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
3759 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
3760 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3761 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
3762 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3763 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3764 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3765 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3766 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3767 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3768 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
3769 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3770 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
3771 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
3772 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3773 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
3774 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
3775 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3776 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
3777 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
3778 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3779 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
3780 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
3781 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3782 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
3783 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
3784 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3785 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
3786 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
3787 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
3788 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
3789 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
3790 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
3791 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3792 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
3793 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
3794 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
3795 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
3797 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
3798 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3799 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
3800 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
3802 if ( !g_pGameDescription->mNoPatch ) {
3803 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
3804 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
3806 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
3807 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
3808 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
3809 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
3810 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
3811 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
3814 int id, n = g_PrefsDlg.m_nTextureScale;
3817 case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3818 case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3819 case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3820 case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3821 default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3823 SetTextureScale( id );
3825 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3827 if (g_qeglobals.d_project_entity)
3829 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3833 g_bIgnoreCommands--;
3836 void MainFrame::UpdateWindows( int nBits ){
3837 if ( !g_bScreenUpdates ) {
3840 #ifdef DBG_WINDOWPOS
3841 static int bean_count = 0;
3843 sprintf( bean_buf,"UpdateWindows %d",bean_count );
3844 CheckWatchit( bean_buf );
3848 if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
3850 m_pXYWnd->RedrawWindow();
3853 m_pXZWnd->RedrawWindow();
3856 m_pYZWnd->RedrawWindow();
3860 if ( nBits & W_CAMERA || ( ( nBits & W_CAMERA_IFON ) && m_bCamPreview ) ) {
3862 m_pCamWnd->RedrawWindow();
3866 if ( nBits & ( W_Z | W_Z_OVERLAY ) ) {
3868 m_pZWnd->RedrawWindow();
3872 if ( nBits & W_TEXTURE ) {
3874 m_pTexWnd->RedrawWindow();
3877 #ifdef DBG_WINDOWPOS
3878 sprintf( bean_buf,"%d (end UpdateWidows)",bean_count );
3879 CheckWatchit( bean_buf );
3883 void MainFrame::RoutineProcessing(){
3884 #ifdef DBG_WINDOWPOS
3885 static int bean_count = 0;
3887 sprintf( bean_buf,"RoutineProcessing %d",bean_count );
3888 CheckWatchit( bean_buf );
3894 double oldtime = 0.0;
3897 /* // checking KeyState works right
3899 a2 = GetKeyState(VK_MENU);
3902 Sys_Printf("VK_MENU: %d\n",a2);
3906 b2 = GetKeyState(VK_UP);
3909 Sys_Printf("VK_UP: %d\n",b2);
3913 time = Sys_DoubleTime();
3914 delta = time - oldtime;
3916 if ( delta > 0.2 ) {
3920 // update the BSP process watcher
3921 if ( m_pWatchBSP ) {
3922 m_pWatchBSP->RoutineProcessing();
3925 // run time dependant behavior
3927 m_pCamWnd->Cam_MouseControl( delta );
3930 if ( g_nUpdateBits ) {
3931 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3932 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3933 UpdateWindows( nBits ); // happens in rare cases but causes a stack overflow
3936 // Enable/disable the menu items
3939 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3940 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3941 if (!g_PrefsDlg.m_bWideToolbar)
3943 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3944 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3946 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3947 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3948 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3949 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3950 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3951 gtk_widget_set_sensitive (item, region_active);
3952 g_bIgnoreCommands++;
3953 // update the toolbar before displaying the menu:
3954 // show in use check box
3955 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3956 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3957 // show all check box
3958 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3959 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3960 g_bIgnoreCommands--;
3963 #ifdef DBG_WINDOWPOS
3964 sprintf( bean_buf,"%d (end RoutineProcessing)",bean_count );
3965 CheckWatchit( bean_buf );
3969 void MainFrame::DoWatchBSP(){
3970 // network monitoring of the BSP process
3971 if ( !m_pWatchBSP ) {
3972 m_pWatchBSP = new CWatchBSP();
3976 void MainFrame::CleanPlugInMenu(){
3977 GtkWidget *menu, *sep;
3980 // delete everything after the separator
3981 menu = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) );
3982 sep = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin_separator" ) );
3983 m_nNextPlugInID = ID_PLUGIN_START;
3985 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3988 gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( lst->next->data ) );
3989 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3993 void MainFrame::AddPlugInMenuItem( IPlugIn* pPlugIn ){
3994 GtkWidget *menu, *item, *parent;
3995 const char *menuText;
3997 parent = gtk_menu_item_new_with_label( pPlugIn->getMenuName() );
3998 gtk_widget_show( parent );
3999 gtk_container_add( GTK_CONTAINER( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) ), parent );
4001 int nCount = pPlugIn->getCommandCount();
4003 menu = gtk_menu_new();
4004 while ( nCount > 0 )
4006 menuText = pPlugIn->getCommand( --nCount );
4007 if ( menuText != NULL && strlen( menuText ) > 0 ) {
4008 if ( !strcmp( menuText, "-" ) ) {
4009 item = gtk_menu_item_new();
4010 gtk_widget_set_sensitive( item, FALSE );
4014 item = gtk_menu_item_new_with_label( menuText );
4015 gtk_signal_connect( GTK_OBJECT( item ), "activate",
4016 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( m_nNextPlugInID ) );
4018 gtk_widget_show( item );
4019 gtk_container_add( GTK_CONTAINER( menu ), item );
4020 pPlugIn->addMenuID( m_nNextPlugInID++ );
4023 gtk_menu_item_set_submenu( GTK_MENU_ITEM( parent ), menu );
4027 void MainFrame::OnPlugIn( unsigned int nID, char* str ){
4028 m_PlugInMgr.Dispatch( nID, str );
4031 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype( IToolbarButton::EType type ){
4034 case IToolbarButton::eSpace:
4035 return GTK_TOOLBAR_CHILD_SPACE;
4036 case IToolbarButton::eButton:
4037 return GTK_TOOLBAR_CHILD_BUTTON;
4038 case IToolbarButton::eToggleButton:
4039 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4040 case IToolbarButton::eRadioButton:
4041 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4043 Error( "invalid toolbar button type" );
4044 return (GtkToolbarChildType)0;
4047 void toolbar_insert( GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data ){
4048 GtkWidget *w, *pixmap;
4049 GdkPixmap *gdkpixmap;
4052 load_plugin_bitmap( image, (void **)&gdkpixmap, (void **)&mask );
4053 pixmap = gtk_pixmap_new( gdkpixmap, mask );
4054 gdk_pixmap_unref( gdkpixmap );
4055 gdk_pixmap_unref( mask );
4056 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), gtktoolbarchildtype_for_toolbarbuttontype( type ), NULL, text, tooltip, "", GTK_WIDGET( pixmap ), handler, data );
4059 void SignalToolbarButton( GtkWidget *widget, gpointer data ){
4060 const_cast<const IToolbarButton*>( reinterpret_cast<IToolbarButton*>( data ) )->activate();
4063 void MainFrame::AddPlugInToolbarButton( const IToolbarButton* button ){
4064 GtkWidget*const toolbar = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "toolbar_plugin" ) );
4065 toolbar_insert( toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC( SignalToolbarButton ), reinterpret_cast<gpointer>( const_cast<IToolbarButton*>( button ) ) );
4068 void MainFrame::OnSelectionSelectNudgedown(){
4069 NudgeSelection( 3, g_qeglobals.d_gridsize );
4072 void MainFrame::OnSelectionSelectNudgeleft(){
4073 NudgeSelection( 0, g_qeglobals.d_gridsize );
4076 void MainFrame::OnSelectionSelectNudgeright(){
4077 NudgeSelection( 2, g_qeglobals.d_gridsize );
4080 void MainFrame::OnSelectionSelectNudgeup(){
4081 NudgeSelection( 1, g_qeglobals.d_gridsize );
4084 void MainFrame::NudgeSelection( int nDirection, float fAmount ){
4085 if ( ActiveXY()->RotateMode() ) {
4087 if ( ActiveXY()->GetViewType() == XY ) {
4091 if ( g_pParentWnd->ActiveXY()->GetViewType() == XZ ) {
4096 if ( nDirection == 2 || nDirection == 3 ) {
4100 float fDeg = -fAmount;
4101 float fAdj = fAmount;
4103 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4105 strStatus.Format( "Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4106 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2] );
4107 g_pParentWnd->SetStatusText( 2, strStatus );
4108 Select_RotateAxis( nAxis, fDeg, false, true );
4109 Sys_UpdateWindows( W_ALL );
4112 if ( ActiveXY()->ScaleMode() ) {
4113 if ( nDirection == 0 || nDirection == 3 ) {
4117 v[0] = v[1] = v[2] = 1.0;
4118 if ( fAmount > 0 ) {
4130 Select_Scale( ( g_nScaleHow & SCALE_X ) ? v[0] : 1.0,
4131 ( g_nScaleHow & SCALE_Y ) ? v[1] : 1.0,
4132 ( g_nScaleHow & SCALE_Z ) ? v[2] : 1.0 );
4133 Sys_UpdateWindows( W_ALL );
4137 // 0 - left, 1 - up, 2 - right, 3 - down
4139 if ( nDirection == 0 ) {
4140 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4143 else if ( nDirection == 1 ) {
4144 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4146 else if ( nDirection == 2 ) {
4147 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4151 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4154 Nudge( nDim, fAmount );
4158 void MainFrame::Nudge( int nDim, float fNudge ){
4160 vMove[0] = vMove[1] = vMove[2] = 0;
4161 vMove[nDim] = fNudge;
4163 if ( ( g_qeglobals.d_select_mode == sel_vertex ||
4164 g_qeglobals.d_select_mode == sel_curvepoint )
4165 && g_qeglobals.d_num_move_points ) {
4166 Select_NudgePoint( vMove, true );
4169 Select_Move( vMove, true );
4171 Sys_UpdateWindows( W_ALL );
4174 void MainFrame::SetGridStatus(){
4178 c1 = ( g_PrefsDlg.m_bTextureLock ) ? 'M' : ' ';
4179 c2 = ( g_PrefsDlg.m_bRotateLock ) ? 'R' : ' ';
4180 strStatus.Format( "G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4181 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2 );
4182 SetStatusText( 4, strStatus );
4185 void MainFrame::UpdatePatchToolbarButtons(){
4187 g_bIgnoreCommands++;
4188 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
4189 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
4190 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4191 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4192 g_bIgnoreCommands--;
4195 // =============================================================================
4198 void MainFrame::OnFileNew(){
4199 if ( ConfirmModified() ) {
4204 void MainFrame::OnFileOpen(){
4205 if ( !ConfirmModified() ) {
4212 if ( !g_pGameDescription->noMapsInHome ) {
4213 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4214 strcat( buf, "maps/" );
4220 str = file_dialog( m_pWidget, TRUE, _( "Open Map" ), buf, MAP_MAJOR, "maps/" );
4222 if ( str != NULL ) {
4223 strcpy( currentmap,str );
4225 Map_LoadFile( str );
4229 void MainFrame::OnFileImportmap(){
4233 if ( !g_pGameDescription->noMapsInHome ) {
4234 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4235 strcat( buf, "maps/" );
4241 str = file_dialog( m_pWidget, TRUE, _( "Import Map" ), buf, MAP_MAJOR, "maps/" );
4243 if ( str != NULL ) {
4244 Map_ImportFile( str );
4248 void MainFrame::OnFileSave(){
4249 if ( !strcmp( currentmap, "unnamed.map" ) ) {
4253 Map_SaveFile( currentmap, false );
4257 void MainFrame::OnFileSaveas(){
4261 if ( !g_pGameDescription->noMapsInHome ) {
4262 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4263 strcat( buf, "maps/" );
4269 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Save Map" ), buf, MAP_MAJOR, "maps/" );
4271 if ( str != NULL ) {
4272 strcpy( currentmap, str );
4274 Map_SaveFile( str, false ); // ignore region
4278 void MainFrame::OnFileExportmap(){
4282 if ( !g_pGameDescription->noMapsInHome ) {
4283 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4284 strcat( buf, "maps/" );
4290 str = file_dialog( m_pWidget, FALSE, _( "Export Selection" ), buf, MAP_MAJOR, "maps/" );
4292 if ( str != NULL ) {
4293 Map_SaveSelected( str );
4297 void MainFrame::OnFileSaveregion(){
4301 if ( !g_pGameDescription->noMapsInHome ) {
4302 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4303 strcat( buf, "maps/" );
4309 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Export Region" ), buf, MAP_MAJOR, "maps/" );
4311 if ( str != NULL ) {
4312 Map_SaveFile( str, true ); // ignore region
4316 void MainFrame::OnFileNewproject(){
4317 char* name = DoNewProjectDlg();
4319 // create a new project:
4320 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4321 // on linux we create under ~/.q3a, on win32 under strEnginePath
4322 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4323 if ( ( name != NULL ) && ( strlen( name ) > 0 ) ) {
4324 CString strNewBasePath;
4326 // NOTE TTimo this would probably not work right on *nix
4327 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4328 strNewBasePath += name;
4329 strNewBasePath += "/";
4331 CString strProjToLoad;
4332 CString strMapToLoad;
4334 // if the dir exists, ask the user if they want to continue anyway
4335 if ( Q_mkdir( strNewBasePath.GetBuffer(), 0755 ) != 0 ) {
4337 strMsg.Format( "The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer() );
4338 Sys_Printf( strMsg );
4339 if ( gtk_MessageBox( m_pWidget, _( strMsg ), _( "Error" ), MB_YESNO ) != IDYES ) {
4340 Sys_Printf( "New Project cancelled, directory already exists for project\n" );
4347 strDir = strNewBasePath;
4349 Q_mkdir( strDir.GetBuffer(), 0755 );
4351 strDir = strNewBasePath;
4352 strDir += "textures/";
4353 Q_mkdir( strDir.GetBuffer(), 0755 );
4355 strDir = strNewBasePath;
4356 strDir += "scripts/";
4357 Q_mkdir( strDir.GetBuffer(), 0755 );
4359 // print a warning for total conversions, since setting the basepath when required files are
4360 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4361 Sys_FPrintf( SYS_WRN, "*** Note: basepath unchanged\n" );
4363 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name );
4365 strDir = strNewBasePath;
4366 strDir += "maps/autosave.map";
4367 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4369 // state that this is a user project file, no templating
4370 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4371 // create the project file
4372 strProjToLoad = strNewBasePath;
4373 strProjToLoad += "scripts/";
4374 strProjToLoad += name;
4375 strProjToLoad += ".";
4376 strProjToLoad += PROJECT_FILETYPE;
4377 QE_SaveProject( strProjToLoad.GetBuffer() );
4382 void MainFrame::OnFileLoadproject(){
4383 if ( ConfirmModified() ) {
4388 void MainFrame::OnFileProjectsettings(){
4389 DoProjectSettings();
4392 void MainFrame::OnFilePointfile(){
4393 if ( g_qeglobals.d_pointfile_display_list ) {
4401 void MainFrame::OnMru( unsigned int nID ){
4402 if ( ConfirmModified() ) {
4403 MRU_Activate( nID - ID_FILE_RECENT1 );
4407 void MainFrame::OnFileExit(){
4408 if ( ConfirmModified() ) {
4409 // stop printing during shutdown
4410 // NOTE: we should cleanly release GL contexts and stuff when exiting
4414 g_qeglobals_gui.d_edit = NULL;
4415 gtk_widget_destroy( m_pWidget );
4419 void MainFrame::OnFileCheckUpdate(){
4422 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4424 URL += "&OS_dlup=1";
4426 URL += "&OS_dlup=2";
4428 URL += "&Version_dlup=" RADIANT_VERSION;
4429 g_PrefsDlg.mGamesDialog.AddPacksURL( URL );
4430 OpenURL( URL.GetBuffer() );
4433 void MainFrame::OnEditUndo(){
4437 void MainFrame::OnEditRedo(){
4441 void MainFrame::OnEditCopybrush(){
4445 void MainFrame::OnEditPastebrush(){
4448 Undo_Start( "paste" );
4452 Undo_EndBrushList( &selected_brushes );
4456 void MainFrame::OnEditPastebrushToCamera(){
4459 vec3_t mid, camorigin, delta;
4461 ActiveXY()->Paste();
4463 // Work out the delta
4464 Select_GetMid( mid );
4466 // Snap camera origin to grid
4467 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4468 camorigin[0] = floor( camorigin[0] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4469 camorigin[1] = floor( camorigin[1] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4470 camorigin[2] = floor( camorigin[2] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4472 VectorSubtract( camorigin, mid, delta );
4475 Select_Move( delta, false );
4477 Undo_Start( "paste to camera" );
4478 Undo_EndBrushList( &selected_brushes );
4483 void MainFrame::OnSelectionDelete(){
4486 // ActiveXY()->UndoCopy();
4487 Undo_Start( "delete" );
4488 Undo_AddBrushList( &selected_brushes );
4489 //add all deleted entities to the undo
4490 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
4492 Undo_AddEntity( brush->owner );
4494 // NOTE: Select_Delete does NOT delete entities
4496 Undo_EndBrushList( &selected_brushes );
4500 void MainFrame::OnEditMapinfo(){
4504 void MainFrame::OnEditEntityinfo(){
4508 void MainFrame::OnBrushScripts(){
4512 void MainFrame::OnEditLoadprefab(){
4513 const char *filename;
4516 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4517 CurPath = g_PrefsDlg.m_strPrefabPath;
4518 AddSlash( CurPath );
4521 filename = file_dialog( m_pWidget, TRUE, _( "Import Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4523 if ( filename != NULL ) {
4524 Map_ImportFile( filename );
4528 void MainFrame::OnEditSaveprefab(){
4529 const char *filename;
4532 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4533 CurPath = g_PrefsDlg.m_strPrefabPath;
4538 getcwd( tmp, PATH_MAX );
4541 AddSlash( CurPath );
4543 filename = file_dialog( m_pWidget, FALSE, _( "Export Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4544 if ( filename != NULL ) {
4545 Map_SaveSelected( filename );
4549 void MainFrame::OnPrefs(){
4550 int nView = g_PrefsDlg.m_nView;
4551 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4552 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4553 int nShader = g_PrefsDlg.m_nShader;
4554 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4555 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4556 g_PrefsDlg.LoadPrefs();
4558 if ( g_PrefsDlg.DoModal() == IDOK ) {
4559 if ( ( g_PrefsDlg.m_nLatchedView != nView ) ||
4560 ( g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus ) ||
4561 ( g_PrefsDlg.m_bLatchedWideToolbar != bToolbar ) ||
4562 ( g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar ) ||
4563 ( g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar ) ||
4564 ( g_PrefsDlg.m_nLatchedShader != nShader ) ||
4565 ( g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality )
4566 || ( g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ )
4568 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for the changes to take effect." ) );
4571 // if the view mode was switched to floating, set the Z window on by default
4572 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4573 // (and we simply hope there will be a SavePrefs before we die)
4574 if ( ( g_PrefsDlg.m_nView != nView ) && ( (EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating ) ) {
4575 g_PrefsDlg.m_bZVis = true;
4579 m_pTexWnd->UpdatePrefs();
4582 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
4583 g_bIgnoreCommands++;
4584 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4585 ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
4586 g_bIgnoreCommands--;
4590 void MainFrame::OnTogglecamera(){
4591 if ( CurrentStyle() == eFloating ) { // floating views
4592 if ( m_pCamWnd && m_pCamWnd->m_pParent ) {
4593 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->m_pParent ) ) {
4594 widget_delete_hide( m_pCamWnd->m_pParent );
4597 gtk_widget_show( m_pCamWnd->m_pParent );
4603 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->GetWidget() ) ) {
4604 gtk_widget_hide( m_pCamWnd->GetWidget() );
4607 gtk_widget_show( m_pCamWnd->GetWidget() );
4612 void MainFrame::OnToggleconsole(){
4613 if ( FloatingGroupDialog() ) { // QE4 style
4614 if ( inspector_mode == W_CONSOLE ) {
4615 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4616 widget_delete_hide( g_qeglobals_gui.d_entity );
4619 gtk_widget_show( g_qeglobals_gui.d_entity );
4624 gtk_widget_show( g_qeglobals_gui.d_entity );
4625 SetInspectorMode( W_CONSOLE );
4630 // trigger the entity inspector on/off
4631 void MainFrame::OnViewEntity(){
4632 // make sure we're working with the current selection (bugzilla #436)
4633 if ( !GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4637 if ( !FloatingGroupDialog() ) {
4638 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_ENTITY ) {
4639 widget_delete_hide( g_qeglobals_gui.d_entity );
4643 gtk_widget_show( g_qeglobals_gui.d_entity );
4644 SetInspectorMode( W_ENTITY );
4649 if ( inspector_mode == W_ENTITY ) {
4650 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4651 widget_delete_hide( g_qeglobals_gui.d_entity );
4654 gtk_widget_show( g_qeglobals_gui.d_entity );
4659 gtk_widget_show( g_qeglobals_gui.d_entity );
4660 SetInspectorMode( W_ENTITY );
4665 void MainFrame::OnViewGroups(){
4666 if ( !FloatingGroupDialog() ) {
4667 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_GROUP ) {
4668 widget_delete_hide( g_qeglobals_gui.d_entity );
4672 gtk_widget_show( g_qeglobals_gui.d_entity );
4673 SetInspectorMode( W_GROUP );
4678 if ( inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating ) {
4679 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4680 widget_delete_hide( g_qeglobals_gui.d_entity );
4683 gtk_widget_show( g_qeglobals_gui.d_entity );
4688 gtk_widget_show( g_qeglobals_gui.d_entity );
4689 SetInspectorMode( W_GROUP );
4694 void MainFrame::OnToggleview(){
4695 if ( CurrentStyle() == eFloating ) { // QE4 style
4696 if ( m_pXYWnd && m_pXYWnd->m_pParent ) {
4697 if ( GTK_WIDGET_VISIBLE( m_pXYWnd->m_pParent ) ) {
4698 widget_delete_hide( m_pXYWnd->m_pParent );
4701 gtk_widget_show( m_pXYWnd->m_pParent );
4707 void MainFrame::OnToggleviewXz(){
4708 if ( CurrentStyle() == eFloating ) { // QE4 style
4709 if ( m_pXZWnd && m_pXZWnd->m_pParent ) {
4710 // get windowplacement doesn't actually save this so we will here
4711 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE( m_pXZWnd->m_pParent );
4712 if ( g_PrefsDlg.m_bXZVis ) {
4713 widget_delete_hide( m_pXZWnd->m_pParent );
4716 gtk_widget_show( m_pXZWnd->m_pParent );
4718 g_PrefsDlg.m_bXZVis ^= 1;
4719 g_PrefsDlg.SavePrefs();
4724 void MainFrame::OnToggleviewYz(){
4725 if ( CurrentStyle() == eFloating ) { // QE4 style
4726 if ( m_pYZWnd && m_pYZWnd->m_pParent ) {
4727 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE( m_pYZWnd->m_pParent );
4728 if ( g_PrefsDlg.m_bYZVis ) {
4729 widget_delete_hide( m_pYZWnd->m_pParent );
4732 gtk_widget_show( m_pYZWnd->m_pParent );
4734 g_PrefsDlg.m_bYZVis ^= 1;
4735 g_PrefsDlg.SavePrefs();
4740 void MainFrame::OnTogglez(){
4741 if ( g_pParentWnd->FloatingGroupDialog() ) { // QE4 style
4742 if ( m_pZWnd && m_pZWnd->m_pParent ) {
4743 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
4744 widget_delete_hide( m_pZWnd->m_pParent );
4747 gtk_widget_show( m_pZWnd->m_pParent );
4749 g_PrefsDlg.m_bZVis ^= 1;
4750 g_PrefsDlg.SavePrefs();
4754 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4758 void MainFrame::OnViewCenter(){
4759 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4760 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor( ( m_pCamWnd->Camera()->angles[YAW] + 11 ) / 22.5 );
4761 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
4764 void MainFrame::OnViewUpfloor(){
4765 m_pCamWnd->Cam_ChangeFloor( true );
4768 void MainFrame::OnViewDownfloor(){
4769 m_pCamWnd->Cam_ChangeFloor( false );
4772 void MainFrame::OnViewCenterview(){
4773 if ( CurrentStyle() == eSplit ) {
4774 GetXYWnd()->PositionView();
4775 GetXZWnd()->PositionView();
4776 GetYZWnd()->PositionView();
4777 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4780 m_pXYWnd->PositionView();
4781 Sys_UpdateWindows( W_XY );
4785 void MainFrame::OnViewNextview(){
4786 if ( CurrentStyle() == eSplit ) {
4787 GetXYWnd()->PositionView();
4788 GetXZWnd()->PositionView();
4789 GetYZWnd()->PositionView();
4790 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4793 if ( m_pXYWnd->GetViewType() == XY ) {
4794 m_pXYWnd->SetViewType( XZ );
4797 if ( m_pXYWnd->GetViewType() == XZ ) {
4798 m_pXYWnd->SetViewType( YZ );
4801 m_pXYWnd->SetViewType( XY );
4803 m_pXYWnd->PositionView();
4804 Sys_UpdateWindows( W_XY );
4808 void MainFrame::OnViewXy(){
4809 if ( !FloatingGroupDialog() ) {
4810 m_pXYWnd->SetViewType( XY );
4811 m_pXYWnd->PositionView();
4813 Sys_UpdateWindows( W_XY );
4816 void MainFrame::OnViewSide(){
4817 if ( !FloatingGroupDialog() ) {
4818 m_pXYWnd->SetViewType( XZ );
4819 m_pXYWnd->PositionView();
4821 Sys_UpdateWindows( W_XY );
4824 void MainFrame::OnViewFront(){
4825 if ( !FloatingGroupDialog() ) {
4826 m_pXYWnd->SetViewType( YZ );
4827 m_pXYWnd->PositionView();
4829 Sys_UpdateWindows( W_XY );
4832 void MainFrame::OnView100(){
4834 m_pXYWnd->SetScale( 1 );
4837 m_pXZWnd->SetScale( 1 );
4840 m_pYZWnd->SetScale( 1 );
4842 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4845 void MainFrame::OnViewZoomin(){
4846 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4847 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0 / 4 );
4848 if ( m_pXYWnd->Scale() > 30 ) {
4849 m_pXYWnd->SetScale( 30 );
4853 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4854 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0 / 4 );
4855 if ( m_pXZWnd->Scale() > 30 ) {
4856 m_pXZWnd->SetScale( 30 );
4860 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4861 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0 / 4 );
4862 if ( m_pYZWnd->Scale() > 30 ) {
4863 m_pYZWnd->SetScale( 30 );
4867 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4870 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4871 // we don't go below a zoom factor corresponding to 10% of the max world size
4872 // (this has to be computed against the window size)
4873 void MainFrame::OnViewZoomout(){
4875 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4876 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0 / 5 );
4877 min_scale = MIN( m_pXYWnd->Width(),m_pXYWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4878 if ( m_pXYWnd->Scale() < min_scale ) {
4879 m_pXYWnd->SetScale( min_scale );
4883 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4884 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0 / 5 );
4885 min_scale = MIN( m_pXZWnd->Width(),m_pXZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4886 if ( m_pXZWnd->Scale() < min_scale ) {
4887 m_pXZWnd->SetScale( min_scale );
4891 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4892 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0 / 5 );
4893 min_scale = MIN( m_pYZWnd->Width(),m_pYZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4894 if ( m_pYZWnd->Scale() < min_scale ) {
4895 m_pYZWnd->SetScale( min_scale );
4898 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4901 void MainFrame::OnViewZ100(){
4903 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4906 void MainFrame::OnViewZzoomin(){
4908 if ( z.scale > 4 ) {
4911 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4914 void MainFrame::OnViewZzoomout(){
4915 z.scale *= 4.0f / 5;
4916 if ( z.scale < 0.125 ) {
4919 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4922 void MainFrame::OnViewCubein(){
4923 g_PrefsDlg.m_nCubicScale--;
4924 if ( g_PrefsDlg.m_nCubicScale < 1 ) {
4925 g_PrefsDlg.m_nCubicScale = 1;
4927 g_PrefsDlg.SavePrefs();
4928 Sys_UpdateWindows( W_CAMERA );
4932 void MainFrame::OnViewCubeout(){
4933 g_PrefsDlg.m_nCubicScale++;
4934 if ( g_PrefsDlg.m_nCubicScale > 22 ) {
4935 g_PrefsDlg.m_nCubicScale = 22;
4937 g_PrefsDlg.SavePrefs();
4938 Sys_UpdateWindows( W_CAMERA );
4942 void MainFrame::OnViewShownames(){
4943 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
4944 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
4945 g_bIgnoreCommands++;
4946 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4947 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE );
4948 g_bIgnoreCommands--;
4949 Sys_UpdateWindows( W_XY );
4952 void MainFrame::OnViewShowAngles(){
4953 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
4954 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
4955 g_bIgnoreCommands++;
4956 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4957 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE );
4958 g_bIgnoreCommands--;
4959 Sys_UpdateWindows( W_XY );
4962 void MainFrame::OnViewShowblocks(){
4963 g_qeglobals.show_blocks ^= 1;
4964 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showblocks" ) );
4965 g_bIgnoreCommands++;
4966 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.show_blocks ? TRUE : FALSE );
4967 g_bIgnoreCommands--;
4968 Sys_UpdateWindows( W_XY );
4971 void MainFrame::OnViewShowcoordinates(){
4972 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
4973 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
4974 g_bIgnoreCommands++;
4975 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4976 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE );
4977 g_bIgnoreCommands--;
4978 Sys_UpdateWindows( W_XY | W_Z );
4981 void MainFrame::OnViewShowOutline(){
4982 g_qeglobals.d_savedinfo.show_outline ^= 1;
4983 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
4984 g_bIgnoreCommands++;
4985 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4986 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE );
4987 g_bIgnoreCommands--;
4988 Sys_UpdateWindows( W_XY );
4991 void MainFrame::OnViewShowAxes(){
4992 g_qeglobals.d_savedinfo.show_axis ^= 1;
4993 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
4994 g_bIgnoreCommands++;
4995 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4996 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE );
4997 g_bIgnoreCommands--;
4998 Sys_UpdateWindows( W_XY );
5001 void MainFrame::OnViewShowWorkzone(){
5002 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showworkzone" ) );
5003 g_bIgnoreCommands++;
5004 if ( g_qeglobals.d_show_work ) {
5005 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
5006 g_qeglobals.d_show_work = false;
5010 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5011 g_qeglobals.d_show_work = true;
5013 g_bIgnoreCommands--;
5014 Sys_UpdateWindows( W_XY );
5017 void MainFrame::OnViewHideshowHideselected(){
5022 void MainFrame::OnViewHideshowShowhidden(){
5023 Select_ShowAllHidden();
5027 sets the view mode for the entities
5028 called upon LoadPrefs too
5029 NOTE TTimo previous implementation had a SavePrefs call
5030 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5031 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5032 (otherwise we are always called following user action on the widget)
5034 void MainFrame::OnEntitiesSetViewAs( int mode ){
5035 gpointer item = NULL;
5037 switch ( g_PrefsDlg.m_nEntityShowState )
5040 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5043 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5045 case ENTITY_SELECTED:
5046 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5048 case ENTITY_SELECTED_SKIN:
5049 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5051 case ENTITY_SKINNED:
5052 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5054 case ENTITY_SKINNED_BOXED:
5055 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5058 g_bIgnoreCommands++;
5059 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5060 g_bIgnoreCommands--;
5066 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5067 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5068 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5070 case ID_VIEW_ENTITIESAS_WIREFRAME:
5071 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5072 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5074 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5075 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5076 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5078 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5079 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5080 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5082 case ID_VIEW_ENTITIESAS_SKINNED:
5083 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5084 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5086 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5087 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5088 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5091 Sys_FPrintf( SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n" );
5096 Sys_FPrintf( SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n" );
5100 g_bIgnoreCommands++;
5101 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5102 g_bIgnoreCommands--;
5104 Sys_UpdateWindows( W_ALL );
5107 void MainFrame::OnViewCubicclipping(){
5110 g_PrefsDlg.m_bCubicClipping ^= 1;
5111 g_bIgnoreCommands++;
5112 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
5113 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5114 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
5115 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5116 g_bIgnoreCommands--;
5117 g_PrefsDlg.SavePrefs();
5118 //Map_BuildBrushData ();
5119 Sys_UpdateWindows( W_CAMERA );
5122 void MainFrame::OnViewOpengllighting(){
5123 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
5124 g_PrefsDlg.m_bGLLighting ^= 1;
5125 g_PrefsDlg.SavePrefs();
5126 g_bIgnoreCommands++;
5127 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE );
5128 Sys_UpdateWindows( W_XY | W_CAMERA );
5129 g_bIgnoreCommands--;
5132 void MainFrame::OnSelectionDragedges(){
5133 if ( g_qeglobals.d_select_mode == sel_edge ) {
5134 g_qeglobals.d_select_mode = sel_brush;
5135 Sys_UpdateWindows( W_ALL );
5139 SetupVertexSelection();
5140 if ( g_qeglobals.d_numpoints ) {
5141 g_qeglobals.d_select_mode = sel_edge;
5143 Sys_UpdateWindows( W_ALL );
5147 void MainFrame::OnSelectionDragvertecies(){
5148 if ( g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint ) {
5149 g_qeglobals.d_select_mode = sel_brush;
5150 Sys_UpdateWindows( W_ALL );
5154 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5155 if ( OnlyPatchesSelected() ) {
5158 else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5160 SetupVertexSelection();
5161 if ( g_qeglobals.d_numpoints ) {
5162 g_qeglobals.d_select_mode = sel_vertex;
5165 Sys_UpdateWindows( W_ALL );
5169 void MainFrame::OnSelectionClone(){
5173 // called when the escape key is used (either on the main window or on an inspector)
5174 void MainFrame::OnSelectionDeselect(){
5175 if ( g_bClipMode ) {
5179 if ( g_bRotateMode ) {
5180 OnSelectMouserotate();
5183 if ( g_bScaleMode ) {
5184 OnSelectMousescale();
5187 if ( g_bPathMode ) {
5189 ActiveXY()->KillPathMode();
5194 if ( g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0 ) {
5195 g_qeglobals.d_num_move_points = 0;
5196 Sys_UpdateWindows( W_ALL );
5201 SetStatusText( 2, " " );
5206 void MainFrame::OnBrushFlipx(){
5207 Undo_Start( "flip X" );
5208 Undo_AddBrushList( &selected_brushes );
5210 Select_FlipAxis( 0 );
5211 // spog - this does not work - it's a rotate not a flip
5213 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5215 if(b->owner->eclass->fixedsize)
5218 float a = FloatForKey(b->owner, "angle");
5219 a = div ((int)(180 - a), 180).rem;
5220 sprintf (buf, "%d", (int)a);
5221 SetKeyValue(b->owner, "angle", buf);
5222 Brush_Build(b,true,true,false,false); // don't filter
5226 Undo_EndBrushList( &selected_brushes );
5230 void MainFrame::OnBrushFlipy(){
5231 Undo_Start( "flip Y" );
5232 Undo_AddBrushList( &selected_brushes );
5234 Select_FlipAxis( 1 );
5235 // spog - this does not work - it's a rotate not a flip
5237 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5239 if(b->owner->eclass->fixedsize)
5241 float a = FloatForKey(b->owner, "angle");
5242 if (a == 0 || a == 180 || a == 360)
5244 if ( a == 90 || a == 270)
5258 sprintf (buf, "%d", (int)a);
5259 SetKeyValue(b->owner, "angle", buf);
5260 Brush_Build(b,true,true,false,false); // don't filter
5265 Undo_EndBrushList( &selected_brushes );
5269 void MainFrame::OnBrushFlipz(){
5270 Undo_Start( "flip Z" );
5271 Undo_AddBrushList( &selected_brushes );
5272 Select_FlipAxis( 2 );
5273 Undo_EndBrushList( &selected_brushes );
5277 void MainFrame::OnBrushRotatex(){
5278 Undo_Start( "rotate X" );
5279 Undo_AddBrushList( &selected_brushes );
5280 Select_RotateAxis( 0, 90 );
5281 Undo_EndBrushList( &selected_brushes );
5285 void MainFrame::OnBrushRotatey(){
5286 Undo_Start( "rotate Y" );
5287 Undo_AddBrushList( &selected_brushes );
5288 Select_RotateAxis( 1, 90 );
5289 Undo_EndBrushList( &selected_brushes );
5293 void MainFrame::OnBrushRotatez(){
5294 Undo_Start( "rotate Z" );
5295 Undo_AddBrushList( &selected_brushes );
5296 Select_RotateAxis( 2, 90 );
5297 Undo_EndBrushList( &selected_brushes );
5301 void MainFrame::OnSelectionArbitraryrotation(){
5302 Undo_Start( "arbitrary rotation" );
5303 Undo_AddBrushList( &selected_brushes );
5307 Undo_EndBrushList( &selected_brushes );
5311 void MainFrame::OnSelectScale(){
5312 Undo_Start( "scale" );
5313 Undo_AddBrushList( &selected_brushes );
5315 Undo_EndBrushList( &selected_brushes );
5319 void MainFrame::OnSelectionMakehollow(){
5321 // ActiveXY()->UndoCopy();
5322 Undo_Start( "hollow" );
5323 Undo_AddBrushList( &selected_brushes );
5325 Undo_EndBrushList( &selected_brushes );
5329 void MainFrame::OnSelectionCsgsubtract(){
5330 Undo_Start( "CSG subtract" );
5335 void MainFrame::OnSelectionCsgmerge(){
5336 Undo_Start( "CSG merge" );
5337 Undo_AddBrushList( &selected_brushes );
5339 Undo_EndBrushList( &selected_brushes );
5343 void MainFrame::OnSelectionNoOutline(){
5344 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5345 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) ^ OUTLINE_ZBUF;
5346 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5347 g_bIgnoreCommands++;
5348 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5349 g_bIgnoreCommands--;
5350 Sys_UpdateWindows( W_CAMERA );
5353 void MainFrame::OnSelectionOutlineStyle(){
5354 if ( ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) && ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) ) {
5355 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5357 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) {
5358 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5360 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) {
5361 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5364 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5366 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5367 g_bIgnoreCommands++;
5368 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5369 g_bIgnoreCommands--;
5370 Sys_UpdateWindows( W_CAMERA );
5373 void MainFrame::OnSelectionSelectcompletetall(){
5375 ActiveXY()->UndoCopy();
5377 Select_CompleteTall();
5380 void MainFrame::OnSelectionSelecttouching(){
5384 void MainFrame::OnSelectionSelectpartialtall(){
5385 Select_PartialTall();
5388 void MainFrame::OnSelectionSelectinside(){
5392 void MainFrame::OnViewClipper(){
5393 GtkWidget *w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_clipper" ) );
5394 g_bIgnoreCommands++;
5397 if ( ActiveXY()->ClipMode() ) {
5398 ActiveXY()->SetClipMode( false );
5399 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), FALSE );
5403 if ( ActiveXY()->RotateMode() ) {
5404 OnSelectMouserotate();
5406 ActiveXY()->SetClipMode( true );
5407 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), TRUE );
5410 g_bIgnoreCommands--;
5413 void MainFrame::OnClipSelected(){
5414 if ( m_pActiveXY && m_pActiveXY->ClipMode() ) {
5415 Undo_Start( "clip selected" );
5416 Undo_AddBrushList( &selected_brushes );
5417 m_pActiveXY->Clip();
5418 Undo_EndBrushList( &selected_brushes );
5423 if ( g_bPatchBendMode ) {
5424 Patch_BendHandleENTER();
5426 // else if (g_bPatchBendMode)
5427 // Patch_InsDelHandleENTER();
5431 void MainFrame::OnSplitSelected(){
5432 if ( m_pActiveXY ) {
5433 Undo_Start( "split selected" );
5434 Undo_AddBrushList( &selected_brushes );
5435 m_pActiveXY->SplitClip();
5436 Undo_EndBrushList( &selected_brushes );
5441 void MainFrame::OnFlipClip(){
5442 if ( m_pActiveXY ) {
5443 m_pActiveXY->FlipClip();
5447 void MainFrame::OnSelectionConnect(){
5448 Undo_Start( "connect selected entities" );
5449 Undo_AddBrushList( &selected_brushes );
5451 Undo_EndBrushList( &selected_brushes );
5455 void MainFrame::OnSelectionUngroupentity(){
5456 Undo_Start( "ungroup selected entities" );
5457 Undo_AddBrushList( &selected_brushes );
5459 Undo_EndBrushList( &selected_brushes );
5463 void MainFrame::OnSelectionMergeentity(){
5464 Undo_Start( "merge entity" );
5465 Undo_AddBrushList( &selected_brushes );
5466 Select_MergeEntity();
5467 Undo_EndBrushList( &selected_brushes );
5471 void MainFrame::OnSelectionGroupworld(){
5472 Undo_Start( "group world" );
5473 Undo_AddBrushList( &selected_brushes );
5474 Select_GroupEntity( world_entity );
5475 Undo_EndBrushList( &selected_brushes );
5479 void MainFrame::OnSelectionMakeDetail(){
5480 Undo_Start( "make detail" );
5481 Undo_AddBrushList( &selected_brushes );
5482 Select_MakeDetail();
5483 Undo_EndBrushList( &selected_brushes );
5487 void MainFrame::OnSelectionMakeStructural(){
5488 Undo_Start( "make structural" );
5489 Undo_AddBrushList( &selected_brushes );
5490 Select_MakeStructural();
5491 Undo_EndBrushList( &selected_brushes );
5495 void MainFrame::OnBspCommand( unsigned int nID ){
5496 // make sure we don't attempt to region compile a map with the camera outside the region
5497 if ( region_active ) {
5500 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5501 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5502 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2] );
5505 for ( i = 0 ; i < 3 ; i++ )
5507 if ( vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i] ) {
5508 Sys_FPrintf( SYS_ERR, "The camera must be in the region to start a region compile.\n" );
5514 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5515 if ( stricmp( currentmap, "unnamed.map" ) == 0 ) {
5519 if ( g_PrefsDlg.m_bSnapShots && ( stricmp( currentmap, "unnamed.map" ) != 0 ) ) {
5523 if ( g_qeglobals.bBSPFrontendPlugin ) {
5524 char *cmd = (char*)g_slist_nth_data( g_BSPFrontendCommands, nID - CMD_BSPCOMMAND );
5525 g_BSPFrontendTable.m_pfnDispatchBSPCommand( cmd );
5529 RunBsp( bsp_commands[nID - CMD_BSPCOMMAND] );
5533 void MainFrame::OnGrid( unsigned int nID ){
5534 if ( nID == ID_GRID_025 ) {
5535 g_qeglobals.d_gridsize = 0.25f;
5536 g_qeglobals.d_bSmallGrid = true;
5538 else if ( nID == ID_GRID_05 ) {
5539 g_qeglobals.d_gridsize = 0.5f;
5540 g_qeglobals.d_bSmallGrid = true;
5546 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5547 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5548 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5549 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5550 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5551 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5552 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5553 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5554 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5556 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5557 g_qeglobals.d_bSmallGrid = false;
5562 // SnapTToGrid option: need to check everywhere the grid size is changed
5563 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5564 if ( g_PrefsDlg.m_bSnapTToGrid ) {
5568 Sys_UpdateWindows( W_XY | W_Z );
5571 void MainFrame::OnSnaptogrid(){
5572 g_PrefsDlg.m_bSnap ^= 1;
5573 g_PrefsDlg.SavePrefs();
5575 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
5576 g_bIgnoreCommands++;
5577 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bSnap ? TRUE : FALSE );
5578 g_bIgnoreCommands--;
5581 void MainFrame::OnTexturesShowinuse(){
5583 Texture_ShowInuse();
5585 if ( !g_bShowAllShaders ) {
5586 Sys_Printf( "Already showing only in-use textures.\n" );
5589 Sys_UpdateWindows( W_TEXTURE );
5593 void MainFrame::OnTexturesShowall(){
5597 // do some triggering on/off, if the inspector is already up then hide it
5598 void MainFrame::OnTexturesInspector(){
5602 void MainFrame::OnViewNearest( unsigned int nID ){
5603 Texture_SetMode( nID );
5606 void MainFrame::OnTextureReplaceall(){
5607 FindTextureDialog::show();
5610 void MainFrame::OnToggleLock(){
5611 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5613 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
5614 g_bIgnoreCommands++;
5615 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE );
5616 g_bIgnoreCommands--;
5617 g_PrefsDlg.SavePrefs();
5621 void MainFrame::OnToggleRotatelock(){
5622 g_PrefsDlg.m_bRotateLock ^= 1;
5624 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
5625 g_bIgnoreCommands++;
5626 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE );
5627 g_bIgnoreCommands--;
5628 g_PrefsDlg.SavePrefs();
5632 // use a dialog for direct selection of a texture menu
5633 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5634 void MainFrame::OnTexturesLoad(){
5635 char def_path[NAME_MAX];
5638 // check if that works with fs_game (I suspect some more design is needed)
5639 // see how this is done in 1.2?
5640 strcpy( def_path, g_pGameDescription->mEnginePath.GetBuffer() );
5641 strcat( def_path, g_pGameDescription->mBaseGame.GetBuffer() );
5642 strcat( def_path, "/" );
5644 char *dir = dir_dialog( m_pWidget, _( "Load textures from path" ), def_path );
5646 if ( dir != NULL ) {
5647 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5648 Sys_Printf( "user select: '%s'\n", dir );
5649 // remove a potential trailing slash?
5650 if ( dir[strlen( dir ) - 1] == '/' || dir[strlen( dir ) - 1] == '\\' ) {
5651 dir[strlen( dir ) - 1] = '\0';
5653 char *pouic = MAX( strrchr( dir, '/' ),strrchr( dir, '\\' ) );
5655 strcpy( texture_directory, pouic + 1 );
5656 Sys_Printf( "Loading '%s'\n", texture_directory );
5657 Texture_ShowDirectory();
5660 Sys_FPrintf( SYS_WRN, "Failed to extract the directory\n" );
5665 Sys_FPrintf( SYS_WRN, "texture load dialog cancelled\n" );
5669 void MainFrame::OnTexturesReloadshaders(){
5671 QERApp_ReloadShaders();
5673 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5674 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
5675 Sys_UpdateWindows( W_ALL );
5679 void MainFrame::OnTexturesShadersShow(){
5680 g_PrefsDlg.m_bShowShaders ^= 1;
5681 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
5682 g_bIgnoreCommands++;
5683 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
5684 g_bIgnoreCommands--;
5685 Sys_UpdateWindows( W_TEXTURE );
5688 void MainFrame::SetTextureScale( int id ){
5693 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5694 g_PrefsDlg.m_nTextureScale = 10;
5695 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_10" ) );
5697 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5698 g_PrefsDlg.m_nTextureScale = 25;
5699 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_25" ) );
5701 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5702 g_PrefsDlg.m_nTextureScale = 50;
5703 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_50" ) );
5705 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5706 g_PrefsDlg.m_nTextureScale = 200;
5707 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_200" ) );
5710 g_PrefsDlg.m_nTextureScale = 100;
5711 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_100" ) );
5715 g_bIgnoreCommands++;
5716 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5717 g_bIgnoreCommands--;
5719 Texture_ResetPosition();
5722 void MainFrame::OnTexturewindowScaleup(){
5723 switch ( g_PrefsDlg.m_nTextureScale ) {
5724 // 200, all the way in, don't do anything
5726 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_200 );
5729 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5732 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5735 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5740 void MainFrame::OnTexturewindowScaledown(){
5741 switch ( g_PrefsDlg.m_nTextureScale ) {
5743 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5746 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5749 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5752 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_10 );
5754 // 10, all the way out, don't do anything
5758 void MainFrame::OnTexturesLoadlist(){
5762 void MainFrame::OnTexturesShaderlistonly(){
5763 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5764 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ),"menu_textures_shaderlistonly" ) );
5765 g_bIgnoreCommands++;
5766 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
5767 g_bIgnoreCommands--;
5771 void MainFrame::OnTextureWad( unsigned int nID ){
5773 Texture_ShowDirectory( nID );
5774 Sys_UpdateWindows( W_ALL );
5778 void MainFrame::OnMiscBenchmark(){
5779 m_pCamWnd->BenchMark();
5782 void MainFrame::OnColorSetoriginal(){
5783 for ( int i = 0 ; i < 3 ; i++ )
5785 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5786 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5787 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5788 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5789 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5793 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5794 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5795 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5797 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5798 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5799 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5802 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5803 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5804 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5806 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5807 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5808 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5810 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5811 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5812 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5814 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5815 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5816 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5818 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5819 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5820 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5822 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5823 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5824 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5826 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5827 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5828 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5830 g_PrefsDlg.SavePrefs();
5831 Sys_UpdateWindows( W_ALL );
5834 void MainFrame::OnColorSetqer(){
5835 for ( int i = 0 ; i < 3 ; i++ )
5837 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5838 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5839 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5840 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5841 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5844 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5845 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5846 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5848 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5849 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5850 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5852 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5853 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5854 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5856 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5857 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5858 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5860 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5861 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5862 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5864 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5865 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5866 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5868 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5869 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5870 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5872 g_PrefsDlg.SavePrefs();
5873 Sys_UpdateWindows( W_ALL );
5876 void MainFrame::OnColorSetblack(){
5877 for ( int i = 0 ; i < 3 ; i++ )
5879 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5880 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5881 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
5882 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5885 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
5886 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
5887 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
5889 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5890 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5891 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5893 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
5894 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
5895 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
5897 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5898 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5899 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5901 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5902 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5903 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5905 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
5906 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
5907 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
5909 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
5910 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
5911 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
5913 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5914 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5915 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5917 g_PrefsDlg.SavePrefs();
5918 Sys_UpdateWindows( W_ALL );
5921 /* ydnar: to emulate maya/max/lightwave color schemes */
5922 void MainFrame::OnColorSetydnar(){
5923 for ( int i = 0 ; i < 3 ; i++ )
5925 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5926 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
5927 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
5928 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
5929 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5932 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
5933 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5936 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5937 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5938 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5941 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5942 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5945 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5946 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5948 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5949 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5950 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5952 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5953 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5954 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5957 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5958 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5960 g_PrefsDlg.SavePrefs();
5961 Sys_UpdateWindows( W_ALL );
5964 void MainFrame::OnTexturebk(){
5965 DoColor( COLOR_TEXTUREBACK );
5966 Sys_UpdateWindows( W_ALL );
5969 void MainFrame::OnColorsXybk(){
5970 DoColor( COLOR_GRIDBACK );
5971 Sys_UpdateWindows( W_ALL );
5974 void MainFrame::OnColorsMajor(){
5975 DoColor( COLOR_GRIDMAJOR );
5976 Sys_UpdateWindows( W_ALL );
5979 void MainFrame::OnColorsMinor(){
5980 DoColor( COLOR_GRIDMINOR );
5981 Sys_UpdateWindows( W_ALL );
5984 void MainFrame::OnColorsMajor_Alt(){
5985 DoColor( COLOR_GRIDMAJOR_ALT );
5986 Sys_UpdateWindows( W_ALL );
5989 void MainFrame::OnColorsMinor_Alt(){
5990 DoColor( COLOR_GRIDMINOR_ALT );
5991 Sys_UpdateWindows( W_ALL );
5994 void MainFrame::OnColorsGridtext(){
5995 DoColor( COLOR_GRIDTEXT );
5996 Sys_UpdateWindows( W_ALL );
5999 void MainFrame::OnColorsGridblock(){
6000 DoColor( COLOR_GRIDBLOCK );
6001 Sys_UpdateWindows( W_ALL );
6004 void MainFrame::OnColorsCameraBack(){
6005 DoColor( COLOR_CAMERABACK );
6006 Sys_UpdateWindows( W_ALL );
6009 void MainFrame::OnColorsBrush(){
6010 DoColor( COLOR_BRUSHES );
6011 Sys_UpdateWindows( W_ALL );
6014 void MainFrame::OnColorsSelectedbrush(){
6015 DoColor( COLOR_SELBRUSHES );
6016 Sys_UpdateWindows( W_ALL );
6019 void MainFrame::OnColorsSelectedbrush3D(){
6020 DoColor( COLOR_SELBRUSHES3D );
6021 Sys_UpdateWindows( W_ALL );
6024 void MainFrame::OnColorsClipper(){
6025 DoColor( COLOR_CLIPPER );
6026 Sys_UpdateWindows( W_ALL );
6029 void MainFrame::OnColorsViewname(){
6030 DoColor( COLOR_VIEWNAME );
6031 Sys_UpdateWindows( W_ALL );
6034 void MainFrame::OnMiscGamma(){
6035 float fSave = g_qeglobals.d_savedinfo.fGamma;
6037 if ( fSave != g_qeglobals.d_savedinfo.fGamma ) {
6038 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for Gamma settings to take effect." ) );
6041 void MainFrame::OnMiscFindbrush(){
6045 void MainFrame::OnMiscNextleakspot(){
6049 void MainFrame::OnMiscPreviousleakspot(){
6053 void MainFrame::OnMiscPrintxy(){
6057 void MainFrame::OnMiscSelectentitycolor(){
6058 if ( edit_entity ) {
6059 CString strColor = ValueForKey( edit_entity, "_color" );
6060 if ( strColor.GetLength() > 0 ) {
6062 int n = sscanf( strColor,"%f %f %f", &fR, &fG, &fB );
6064 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6065 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6066 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6070 if ( inspector_mode == W_ENTITY && ( DoColor( COLOR_ENTITY ) ) ) {
6072 sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6073 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6074 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
6076 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntValueField] ), buffer );
6077 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntKeyField] ), "_color" );
6079 //DK - SOF change to get color to entity quickly
6080 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6081 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6084 Sys_UpdateWindows( W_ALL );
6088 void MainFrame::OnConvertcurves(){
6091 for ( brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next )
6093 if ( pb->curveBrush ) {
6094 for ( face_t* f = pb->brush_faces ; f ; f = f->next )
6096 if ( f->texdef.contents & CONTENTS_LADDER ) {
6097 f->texdef.contents &= ~CONTENTS_LADDER;
6098 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6103 Map_BuildBrushData();
6107 void MainFrame::OnRegionOff(){
6111 void MainFrame::OnRegionSetxy(){
6115 void MainFrame::OnRegionSettallbrush(){
6116 Map_RegionTallBrush();
6119 void MainFrame::OnRegionSetbrush(){
6123 void MainFrame::OnRegionSetselection(){
6124 Map_RegionSelectedBrushes();
6127 void MainFrame::OnBrush3sided(){
6128 Undo_Start( "3 sided" );
6129 Undo_AddBrushList( &selected_brushes );
6130 Brush_MakeSided( 3 );
6131 Undo_EndBrushList( &selected_brushes );
6135 void MainFrame::OnBrush4sided(){
6136 Undo_Start( "4 sided" );
6137 Undo_AddBrushList( &selected_brushes );
6138 Brush_MakeSided( 4 );
6139 Undo_EndBrushList( &selected_brushes );
6143 void MainFrame::OnBrush5sided(){
6144 Undo_Start( "5 sided" );
6145 Undo_AddBrushList( &selected_brushes );
6146 Brush_MakeSided( 5 );
6147 Undo_EndBrushList( &selected_brushes );
6151 void MainFrame::OnBrush6sided(){
6152 Undo_Start( "6 sided" );
6153 Undo_AddBrushList( &selected_brushes );
6154 Brush_MakeSided( 6 );
6155 Undo_EndBrushList( &selected_brushes );
6159 void MainFrame::OnBrush7sided(){
6160 Undo_Start( "7 sided" );
6161 Undo_AddBrushList( &selected_brushes );
6162 Brush_MakeSided( 7 );
6163 Undo_EndBrushList( &selected_brushes );
6167 void MainFrame::OnBrush8sided(){
6168 Undo_Start( "8 sided" );
6169 Undo_AddBrushList( &selected_brushes );
6170 Brush_MakeSided( 8 );
6171 Undo_EndBrushList( &selected_brushes );
6175 void MainFrame::OnBrush9sided(){
6176 Undo_Start( "9 sided" );
6177 Undo_AddBrushList( &selected_brushes );
6178 Brush_MakeSided( 9 );
6179 Undo_EndBrushList( &selected_brushes );
6183 void MainFrame::OnBrushArbitrarysided(){
6184 Undo_Start( "arbitrary sided" );
6185 Undo_AddBrushList( &selected_brushes );
6187 Undo_EndBrushList( &selected_brushes );
6191 void MainFrame::OnBrushMakecone(){
6192 Undo_Start( "make cone" );
6193 Undo_AddBrushList( &selected_brushes );
6195 Undo_EndBrushList( &selected_brushes );
6199 void MainFrame::OnBrushPrimitivesSphere(){
6200 Undo_Start( "make sphere" );
6201 Undo_AddBrushList( &selected_brushes );
6203 DoSides( false, true );
6205 Undo_EndBrushList( &selected_brushes );
6209 void MainFrame::OnCurvePatchtube(){
6210 Undo_Start( "make curve cylinder" );
6211 Undo_AddBrushList( &selected_brushes );
6212 Patch_BrushToMesh( false );
6213 Sys_UpdateWindows( W_ALL );
6214 Undo_EndBrushList( &selected_brushes );
6218 void MainFrame::OnCurvePatchdensetube(){
6219 Undo_Start( "dense cylinder" );
6220 Undo_AddBrushList( &selected_brushes );
6222 Patch_BrushToMesh( false );
6223 OnCurveInsertAddrow();
6224 Sys_UpdateWindows( W_ALL );
6226 Undo_EndBrushList( &selected_brushes );
6230 void MainFrame::OnCurvePatchverydensetube(){
6231 Undo_Start( "very dense cylinder" );
6232 Undo_AddBrushList( &selected_brushes );
6234 Patch_BrushToMesh( false );
6235 OnCurveInsertAddrow();
6236 OnCurveInsertInsertrow();
6237 OnCurveInsertAddrow();
6238 Sys_UpdateWindows( W_ALL );
6240 Undo_EndBrushList( &selected_brushes );
6244 void MainFrame::OnCurvePatchsquare(){
6245 Undo_Start( "square cylinder" );
6246 Undo_AddBrushList( &selected_brushes );
6248 Patch_BrushToMesh( false, false, false, true );
6249 Sys_UpdateWindows( W_ALL );
6251 Undo_EndBrushList( &selected_brushes );
6255 void MainFrame::OnCurvePatchendcap(){
6256 Undo_Start( "make end cap" );
6257 Undo_AddBrushList( &selected_brushes );
6258 Patch_BrushToMesh( false, false, true );
6259 Sys_UpdateWindows( W_ALL );
6260 Undo_EndBrushList( &selected_brushes );
6264 void MainFrame::OnCurvePatchbevel(){
6265 Undo_Start( "make bevel" );
6266 Undo_AddBrushList( &selected_brushes );
6267 Patch_BrushToMesh( false, true, false );
6268 Sys_UpdateWindows( W_ALL );
6269 Undo_EndBrushList( &selected_brushes );
6273 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel(){
6274 Undo_Start( "square bevel" );
6275 Undo_AddBrushList( &selected_brushes );
6277 Patch_BrushToMesh( false, true, false, true );
6278 Sys_UpdateWindows( W_ALL );
6280 Undo_EndBrushList( &selected_brushes );
6284 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap(){
6285 Undo_Start( "square endcap" );
6286 Undo_AddBrushList( &selected_brushes );
6288 Patch_BrushToMesh( false, false, true, true );
6289 Sys_UpdateWindows( W_ALL );
6291 Undo_EndBrushList( &selected_brushes );
6295 void MainFrame::OnCurvePatchcone(){
6296 Undo_Start( "make curve cone" );
6297 Undo_AddBrushList( &selected_brushes );
6298 Patch_BrushToMesh( true );
6299 Sys_UpdateWindows( W_ALL );
6300 Undo_EndBrushList( &selected_brushes );
6304 void MainFrame::OnCurveSimplepatchmesh(){
6305 Undo_Start( "make simpe patch mesh" );
6306 Undo_AddBrushList( &selected_brushes );
6308 Undo_EndBrushList( &selected_brushes );
6312 void MainFrame::OnCurveInsertInsertcolumn(){
6313 Undo_Start( "insert (2) columns" );
6314 Undo_AddBrushList( &selected_brushes );
6315 Patch_AdjustSelected( true, true, false );
6316 Sys_UpdateWindows( W_ALL );
6317 Undo_EndBrushList( &selected_brushes );
6321 void MainFrame::OnCurveInsertAddcolumn(){
6322 Undo_Start( "add (2) columns" );
6323 Undo_AddBrushList( &selected_brushes );
6324 Patch_AdjustSelected( true, true, true );
6325 Sys_UpdateWindows( W_ALL );
6326 Undo_EndBrushList( &selected_brushes );
6330 void MainFrame::OnCurveInsertInsertrow(){
6331 Undo_Start( "insert (2) rows" );
6332 Undo_AddBrushList( &selected_brushes );
6333 Patch_AdjustSelected( true, false, false );
6334 Sys_UpdateWindows( W_ALL );
6335 Undo_EndBrushList( &selected_brushes );
6339 void MainFrame::OnCurveInsertAddrow(){
6340 Undo_Start( "add (2) rows" );
6341 Undo_AddBrushList( &selected_brushes );
6342 Patch_AdjustSelected( true, false, true );
6343 Sys_UpdateWindows( W_ALL );
6344 Undo_EndBrushList( &selected_brushes );
6348 void MainFrame::OnCurveDeleteFirstcolumn(){
6349 Undo_Start( "delete first (2) columns" );
6350 Undo_AddBrushList( &selected_brushes );
6351 Patch_AdjustSelected( false, true, true );
6352 Sys_UpdateWindows( W_ALL );
6353 Undo_EndBrushList( &selected_brushes );
6357 void MainFrame::OnCurveDeleteLastcolumn(){
6358 Undo_Start( "delete last (2) columns" );
6359 Undo_AddBrushList( &selected_brushes );
6360 Patch_AdjustSelected( false, true, false );
6361 Sys_UpdateWindows( W_ALL );
6362 Undo_EndBrushList( &selected_brushes );
6366 void MainFrame::OnCurveDeleteFirstrow(){
6367 Undo_Start( "delete first (2) rows" );
6368 Undo_AddBrushList( &selected_brushes );
6369 Patch_AdjustSelected( false, false, true );
6370 Sys_UpdateWindows( W_ALL );
6371 Undo_EndBrushList( &selected_brushes );
6375 void MainFrame::OnCurveDeleteLastrow(){
6376 Undo_Start( "delete last (2) rows" );
6377 Undo_AddBrushList( &selected_brushes );
6378 Patch_AdjustSelected( false, false, false );
6379 Sys_UpdateWindows( W_ALL );
6380 Undo_EndBrushList( &selected_brushes );
6384 void MainFrame::OnCurveNegative(){
6385 Patch_ToggleInverted();
6386 //Sys_UpdateWindows(W_ALL);
6389 void MainFrame::OnCurveRedisperseRows(){
6390 Undo_Start( "redisperse rows" );
6391 Undo_AddBrushList( &selected_brushes );
6392 Patch_DisperseRows();
6393 Sys_UpdateWindows( W_ALL );
6394 Undo_EndBrushList( &selected_brushes );
6398 void MainFrame::OnCurveRedisperseIntermediateCols(){
6399 Undo_Start( "redisperse im cols" );
6400 Undo_AddBrushList( &selected_brushes );
6401 Patch_DisperseIntermediateColumns();
6402 Sys_UpdateWindows( W_ALL );
6403 Undo_EndBrushList( &selected_brushes );
6407 void MainFrame::OnCurveRedisperseIntermediateRows(){
6408 Undo_Start( "redisperse im rows" );
6409 Undo_AddBrushList( &selected_brushes );
6410 Patch_DisperseIntermediateRows();
6411 Sys_UpdateWindows( W_ALL );
6412 Undo_EndBrushList( &selected_brushes );
6416 void MainFrame::OnCurveMatrixTranspose(){
6418 Sys_UpdateWindows( W_ALL );
6421 void MainFrame::OnCurveCap(){
6423 Sys_UpdateWindows( W_ALL );
6426 void MainFrame::OnCurveCyclecap(){
6427 Patch_CycleCapSelected();
6428 Sys_UpdateWindows( W_ALL );
6431 void MainFrame::OnCurveOverlaySet(){
6432 Patch_SetOverlays();
6433 Sys_UpdateWindows( W_ALL );
6436 void MainFrame::OnCurveOverlayClear(){
6437 Patch_ClearOverlays();
6438 Sys_UpdateWindows( W_ALL );
6441 void MainFrame::OnCurveThicken(){
6442 Undo_Start( "curve thicken" );
6443 Undo_AddBrushList( &selected_brushes );
6445 Undo_EndBrushList( &selected_brushes );
6450 this can no longer be trigger manually from the menu
6451 happens only once at startup
6453 void MainFrame::OnPluginsRefresh(){
6458 // open the Q3Rad manual
6459 void MainFrame::OnHelp(){
6460 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6462 help = g_strAppPath;
6463 help += "Q3Rad_Manual/index.htm";
6464 OpenURL( help.GetBuffer() );
6467 // FIXME: we'll go towards a unified help thing soon
6468 void MainFrame::OnHelpLinks(){
6470 link = g_strAppPath;
6471 link += "links.htm";
6472 OpenURL( link.GetBuffer() );
6475 void MainFrame::OnHelpBugreport(){
6476 OpenURL( "http://www.qeradiant.com/faq/fom-serve/cache/138.html" );
6479 void MainFrame::OnHelpCommandlist(){
6483 void MainFrame::OnHelpAbout(){
6487 void MainFrame::OnPopupSelection(){
6488 GtkWidget *menu, *item;
6489 const gchar *labels[] = { _( "Select Complete Tall" ), _( "Select Touching" ), _( "Select Partial Tall" ), _( "Select Inside" )};
6490 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6491 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6493 menu = gtk_menu_new();
6495 for ( int i = 0; i < 4; i++ )
6497 item = gtk_menu_item_new_with_label( labels[i] );
6498 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( HandleCommand ),
6499 GINT_TO_POINTER( ids[i] ) );
6500 gtk_widget_show( item );
6501 gtk_menu_append( GTK_MENU( menu ), item );
6504 gtk_menu_popup( GTK_MENU( menu ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6507 void MainFrame::OnViewChange(){
6509 //HandlePopup(this, IDR_POPUP_VIEW);
6512 void MainFrame::OnTexturesPopup(){
6513 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "render_quality_menu" );
6514 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6517 void MainFrame::ToggleCamera(){
6518 if ( m_bCamPreview ) {
6519 m_bCamPreview = false;
6522 m_bCamPreview = true;
6526 void MainFrame::OnViewCameraupdate(){
6527 Sys_UpdateWindows( W_CAMERA );
6530 void MainFrame::OnSelectMouserotate(){
6531 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mouserotate" ) );
6532 g_bIgnoreCommands++;
6535 if ( ActiveXY()->ClipMode() ) {
6538 if ( ActiveXY()->RotateMode() ) {
6539 // SetRotateMode(false) always works
6540 ActiveXY()->SetRotateMode( false );
6541 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6545 // may not work if no brush selected, see return value
6546 if ( ActiveXY()->SetRotateMode( true ) ) {
6547 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6550 // if MFC called, we need to set back to FALSE ourselves
6551 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6555 g_bIgnoreCommands--;
6558 void MainFrame::OnSelectMousescale(){
6559 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mousescale" ) );
6560 g_bIgnoreCommands++;
6563 if ( ActiveXY()->ClipMode() ) {
6566 if ( ActiveXY()->RotateMode() ) {
6567 // SetRotateMode(false) always works
6568 ActiveXY()->SetRotateMode( false );
6569 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6571 if ( ActiveXY()->ScaleMode() ) {
6572 ActiveXY()->SetScaleMode( false );
6573 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6577 ActiveXY()->SetScaleMode( true );
6578 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6581 g_bIgnoreCommands--;
6584 void MainFrame::OnScalelockx(){
6585 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockx" ) );
6586 g_bIgnoreCommands++;
6588 if ( g_nScaleHow & SCALE_X ) {
6589 g_nScaleHow ^= SCALE_X;
6590 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6594 g_nScaleHow |= SCALE_X;
6595 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6597 g_bIgnoreCommands--;
6600 void MainFrame::OnScalelocky(){
6601 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelocky" ) );
6602 g_bIgnoreCommands++;
6604 if ( g_nScaleHow & SCALE_Y ) {
6605 g_nScaleHow ^= SCALE_Y;
6606 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6610 g_nScaleHow |= SCALE_Y;
6611 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6613 g_bIgnoreCommands--;
6616 void MainFrame::OnScalelockz(){
6617 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockz" ) );
6618 g_bIgnoreCommands++;
6620 if ( g_nScaleHow & SCALE_Z ) {
6621 g_nScaleHow ^= SCALE_Z;
6622 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6626 g_nScaleHow |= SCALE_Z;
6627 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6629 g_bIgnoreCommands--;
6632 void MainFrame::OnDontselectcurve(){
6633 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
6634 g_bIgnoreCommands++;
6635 g_PrefsDlg.m_bSelectCurves ^= 1;
6636 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
6637 g_bIgnoreCommands--;
6640 void MainFrame::OnPatchToggleBox(){
6641 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
6642 g_bIgnoreCommands++;
6643 g_bPatchShowBounds ^= 1;
6644 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
6645 g_bIgnoreCommands--;
6646 Sys_UpdateWindows( W_ALL );
6649 void MainFrame::OnPatchWireframe(){
6650 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_wireframe" ) );
6651 g_bIgnoreCommands++;
6652 g_bPatchWireFrame ^= 1;
6653 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWireFrame ) ? TRUE : FALSE );
6654 g_bIgnoreCommands--;
6655 Sys_UpdateWindows( W_ALL );
6658 void MainFrame::OnPatchBend(){
6659 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
6660 g_bIgnoreCommands++;
6662 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
6663 g_bIgnoreCommands--;
6664 Sys_UpdateWindows( W_ALL );
6667 void MainFrame::OnPatchWeld(){
6668 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
6669 g_bIgnoreCommands++;
6671 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
6672 g_bIgnoreCommands--;
6673 Sys_UpdateWindows( W_ALL );
6676 void MainFrame::OnPatchDrilldown(){
6677 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
6678 g_bIgnoreCommands++;
6679 g_bPatchDrillDown ^= 1;
6680 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
6681 g_bIgnoreCommands--;
6682 Sys_UpdateWindows( W_ALL );
6685 void MainFrame::OnShowEntities(){
6686 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "view_entitiesas_menu" ); // use pointer to existing menu object
6687 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6690 void MainFrame::OnDropGroupName(){
6692 char* name = DoNameDlg ("Name Selection");
6697 Sys_UpdateWindows (W_ALL);
6703 void MainFrame::OnDropGroupNewgroup(){
6707 void MainFrame::OnDropGroupRemove(){
6709 Select_AddToGroup("World");
6710 Sys_UpdateWindows (W_ALL);
6714 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6715 void MainFrame::OnFaceFit(){
6719 void MainFrame::OnDontselectmodel(){
6720 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
6721 g_bIgnoreCommands++;
6722 g_PrefsDlg.m_bSelectModels ^= 1;
6723 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
6724 g_bIgnoreCommands--;
6727 void MainFrame::OnViewTexture(){
6728 if ( FloatingGroupDialog() ) { // QE4 style
6729 if ( inspector_mode == W_TEXTURE ) {
6730 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
6731 widget_delete_hide( g_qeglobals_gui.d_entity );
6734 gtk_widget_show( g_qeglobals_gui.d_entity );
6739 gtk_widget_show( g_qeglobals_gui.d_entity );
6740 SetInspectorMode( W_TEXTURE );
6745 void MainFrame::OnPatchInspector(){
6746 TogglePatchInspector();
6749 void MainFrame::OnCurveNegativeTextureX(){
6750 Patch_InvertTexture( false );
6751 //Sys_UpdateWindows(W_ALL);
6754 void MainFrame::OnCurveNegativeTextureY(){
6755 Patch_InvertTexture( true );
6756 //Sys_UpdateWindows(W_ALL);
6759 void MainFrame::OnCurveInsertcolumn(){
6760 if ( &selected_brushes == selected_brushes.next ) {
6763 Undo_Start( "insert colum" );
6764 Undo_AddBrushList( &selected_brushes );
6765 //Patch_AdjustSelectedRowCols(0, 2);
6766 Patch_AdjustSelected( true, true, true );
6767 Sys_UpdateWindows( W_ALL );
6768 Undo_EndBrushList( &selected_brushes );
6772 void MainFrame::OnCurveInsertrow(){
6773 if ( &selected_brushes == selected_brushes.next ) {
6776 Undo_Start( "insert row" );
6777 Undo_AddBrushList( &selected_brushes );
6778 //Patch_AdjustSelectedRowCols(2, 0);
6779 Patch_AdjustSelected( true, false, true );
6780 Sys_UpdateWindows( W_ALL );
6781 Undo_EndBrushList( &selected_brushes );
6785 void MainFrame::OnCurveDeletecolumn(){
6786 if ( &selected_brushes == selected_brushes.next ) {
6789 Undo_Start( "delete column" );
6790 Undo_AddBrushList( &selected_brushes );
6791 Patch_AdjustSelected( false, true, true );
6792 Sys_UpdateWindows( W_ALL );
6793 Undo_EndBrushList( &selected_brushes );
6797 void MainFrame::OnCurveDeleterow(){
6798 if ( &selected_brushes == selected_brushes.next ) {
6801 Undo_Start( "delete row" );
6802 Undo_AddBrushList( &selected_brushes );
6803 Patch_AdjustSelected( false, false, true );
6804 Sys_UpdateWindows( W_ALL );
6805 Undo_EndBrushList( &selected_brushes );
6809 void MainFrame::OnPatchTab(){
6810 if ( g_bPatchBendMode ) {
6811 Patch_BendHandleTAB();
6813 // else if (g_bPatchInsertMode)
6814 // Patch_InsDelHandleTAB();
6817 // check to see if the selected brush is part of a func group
6818 // if it is, deselect everything and reselect the next brush
6820 brush_t *b2, *b = selected_brushes.next;
6822 if ( b != &selected_brushes ) {
6823 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6826 for ( b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext )
6833 if ( b2 == &e->brushes ) {
6837 Select_Brush( b2, false );
6838 Sys_UpdateWindows( W_ALL );
6844 void MainFrame::OnSelectFuncGroup(){
6845 // check to see if the selected brush is part of a func group
6846 // if it is, deselect everything and reselect the next brush
6848 brush_t *b = selected_brushes.next;
6850 if ( b != &selected_brushes ) {
6851 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6853 Select_SelectGroup( e );
6858 void MainFrame::OnCameraForward( bool keydown ){
6859 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6861 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6862 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6863 Sys_UpdateWindows( nUpdate );
6868 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
6871 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
6876 void MainFrame::OnCameraBack( bool keydown ){
6877 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6879 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6880 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6881 Sys_UpdateWindows( nUpdate );
6886 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
6889 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
6894 void MainFrame::OnCameraLeft( bool keydown ){
6896 if ( m_pCamWnd->m_bFreeMove ) {
6897 OnCameraStrafeleft( keydown );
6902 if ( g_PrefsDlg.m_bCamDiscrete ) {
6904 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
6905 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6906 Sys_UpdateWindows( nUpdate );
6911 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
6914 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
6919 void MainFrame::OnCameraRight( bool keydown ){
6921 if ( m_pCamWnd->m_bFreeMove ) {
6922 OnCameraStraferight( keydown );
6927 if ( g_PrefsDlg.m_bCamDiscrete ) {
6929 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
6930 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6931 Sys_UpdateWindows( nUpdate );
6936 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
6939 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
6944 void MainFrame::OnCameraUp(){
6945 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
6946 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6947 Sys_UpdateWindows( nUpdate );
6950 void MainFrame::OnCameraDown(){
6951 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
6952 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6953 Sys_UpdateWindows( nUpdate );
6956 void MainFrame::OnCameraAngleup(){
6957 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
6958 if ( m_pCamWnd->Camera()->angles[0] > 85 ) {
6959 m_pCamWnd->Camera()->angles[0] = 85;
6961 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6964 void MainFrame::OnCameraAngledown(){
6965 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
6966 if ( m_pCamWnd->Camera()->angles[0] < -85 ) {
6967 m_pCamWnd->Camera()->angles[0] = -85;
6969 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6972 void MainFrame::OnCameraStrafeleft( bool keydown ){
6973 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6975 if ( !m_pCamWnd->m_bFreeMove ) {
6977 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6978 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6979 Sys_UpdateWindows( nUpdate );
6986 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
6989 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
6993 void MainFrame::OnCameraStraferight( bool keydown ){
6994 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6996 if ( !m_pCamWnd->m_bFreeMove ) {
6998 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6999 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
7000 Sys_UpdateWindows( nUpdate );
7007 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7010 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7014 void MainFrame::OnGridToggle(){
7015 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7016 Sys_UpdateWindows( W_XY | W_Z );
7019 void MainFrame::OnViewCrosshair(){
7021 Sys_UpdateWindows( W_XY );
7024 void MainFrame::OnSelectionTextureRotateclock(){
7025 Select_RotateTexture( abs( g_PrefsDlg.m_nRotation ) );
7028 void MainFrame::OnSelectionTextureRotatecounter(){
7029 Select_RotateTexture( -abs( g_PrefsDlg.m_nRotation ) );
7032 void MainFrame::OnSelectionTextureScaleup(){
7033 Select_ScaleTexture( 0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7036 void MainFrame::OnSelectionTextureScaledown(){
7037 Select_ScaleTexture( 0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7040 void MainFrame::OnSelectionTextureScaleLeft(){
7041 Select_ScaleTexture( -g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7044 void MainFrame::OnSelectionTextureScaleRight(){
7045 Select_ScaleTexture( g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7048 void MainFrame::OnSelectionTextureShiftleft(){
7049 Select_ShiftTexture( (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7052 void MainFrame::OnSelectionTextureShiftright(){
7053 Select_ShiftTexture( (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7056 void MainFrame::OnSelectionTextureShiftup(){
7057 Select_ShiftTexture( 0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7060 void MainFrame::OnSelectionTextureShiftdown(){
7061 Select_ShiftTexture( 0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7064 void MainFrame::OnGridPrev(){
7066 if ( g_qeglobals.d_gridsize == 1 ) {
7067 g_qeglobals.d_gridsize = 0.5;
7068 g_qeglobals.d_bSmallGrid = true;
7069 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7071 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7072 g_qeglobals.d_gridsize = 0.25;
7073 g_qeglobals.d_bSmallGrid = true;
7074 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_025" ) );
7076 else if ( g_qeglobals.d_gridsize > 1 ) {
7077 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7078 g_qeglobals.d_bSmallGrid = false;
7080 switch ( (int)g_qeglobals.d_gridsize )
7082 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7083 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7084 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7085 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7086 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7087 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7088 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7089 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7090 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7098 // SnapTToGrid option: need to check everywhere the grid size is changed
7099 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7100 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7105 g_bIgnoreCommands++;
7106 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7107 g_bIgnoreCommands--;
7109 Sys_UpdateWindows( W_XY | W_Z );
7112 void MainFrame::OnGridNext(){
7114 if ( g_qeglobals.d_gridsize == 0.25 ) {
7115 g_qeglobals.d_gridsize = 0.5;
7116 g_qeglobals.d_bSmallGrid = true;
7117 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7119 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7120 g_qeglobals.d_gridsize = 1;
7121 g_qeglobals.d_bSmallGrid = false;
7122 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) );
7124 else if ( g_qeglobals.d_gridsize < 256 ) {
7125 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7126 g_qeglobals.d_bSmallGrid = false;
7128 switch ( (int)g_qeglobals.d_gridsize )
7130 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7131 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7132 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7133 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7134 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7135 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7136 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7137 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7138 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7139 default: item = NULL;
7147 // SnapTToGrid option: need to check everywhere the grid size is changed
7148 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7149 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7154 g_bIgnoreCommands++;
7155 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7156 g_bIgnoreCommands--;
7158 Sys_UpdateWindows( W_XY | W_Z );
7161 void MainFrame::OnSelectionMovedown(){
7162 if ( &selected_brushes == selected_brushes.next ) {
7165 Undo_Start( "move down" );
7166 Undo_AddBrushList( &selected_brushes );
7169 vAmt[0] = vAmt[1] = 0.0;
7170 vAmt[2] = -g_qeglobals.d_gridsize;
7171 Select_Move( vAmt );
7172 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7174 Undo_EndBrushList( &selected_brushes );
7178 void MainFrame::OnSelectionMoveup(){
7179 if ( &selected_brushes == selected_brushes.next ) {
7182 Undo_Start( "move up" );
7183 Undo_AddBrushList( &selected_brushes );
7186 vAmt[0] = vAmt[1] = 0.0;
7187 vAmt[2] = g_qeglobals.d_gridsize;
7188 Select_Move( vAmt );
7189 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7191 Undo_EndBrushList( &selected_brushes );
7195 void MainFrame::OnSelectionPrint(){
7196 for ( brush_t* b = selected_brushes.next ; b != &selected_brushes ; b = b->next )
7200 void MainFrame::OnSelectionTogglesizepaint(){
7201 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7202 Sys_UpdateWindows( W_XY );
7205 void MainFrame::OnPatchNaturalize(){
7206 Patch_NaturalizeSelected();
7207 Sys_UpdateWindows( W_ALL );
7210 void MainFrame::OnSnapToGrid(){
7211 if ( &selected_brushes == selected_brushes.next ) {
7214 Undo_Start( "snap selection to grid" );
7215 Undo_AddBrushList( &selected_brushes );
7216 //Select_SnapToGrid();
7217 for ( brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next )
7219 if ( pb->patchBrush ) {
7220 Patch_SnapToGrid( pb->pPatch );
7223 Brush_SnapToGrid( pb );
7226 Sys_UpdateWindows( W_ALL );
7227 Undo_EndBrushList( &selected_brushes );
7231 void MainFrame::OnSelectAll(){
7235 void MainFrame::OnSelectionInvert(){
7237 Sys_UpdateWindows( W_XY | W_Z | W_CAMERA );
7241 void PerformFiltering(){
7246 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7247 brush->bFiltered = FilterBrush( brush );
7249 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7250 brush->bFiltered = FilterBrush( brush );
7253 void MainFrame::OnFilterAreaportals(){
7254 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
7255 g_bIgnoreCommands++;
7256 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS ) & EXCLUDE_AREAPORTALS ) {
7257 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7260 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7262 g_bIgnoreCommands--;
7264 Sys_UpdateWindows( W_XY | W_CAMERA );
7267 void MainFrame::OnFilterCaulk(){
7268 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
7269 g_bIgnoreCommands++;
7270 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK ) & EXCLUDE_CAULK ) {
7271 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7274 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7276 g_bIgnoreCommands--;
7278 Sys_UpdateWindows( W_XY | W_CAMERA );
7281 void MainFrame::OnFilterClips(){
7282 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
7283 g_bIgnoreCommands++;
7284 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) {
7285 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7288 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7290 g_bIgnoreCommands--;
7292 Sys_UpdateWindows( W_XY | W_CAMERA );
7295 void MainFrame::OnFilterBotClips(){
7296 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
7297 g_bIgnoreCommands++;
7298 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP ) & EXCLUDE_BOTCLIP ) {
7299 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7302 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7304 g_bIgnoreCommands--;
7306 Sys_UpdateWindows( W_XY | W_CAMERA );
7309 void MainFrame::OnFilterStructural(){
7310 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
7311 g_bIgnoreCommands++;
7312 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL ) & EXCLUDE_STRUCTURAL ) {
7313 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7316 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7318 g_bIgnoreCommands--;
7320 Sys_UpdateWindows( W_XY | W_CAMERA );
7323 void MainFrame::OnFilterDetails(){
7324 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
7325 g_bIgnoreCommands++;
7326 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS ) & EXCLUDE_DETAILS ) {
7327 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7330 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7332 g_bIgnoreCommands--;
7334 Sys_UpdateWindows( W_XY | W_CAMERA );
7337 void MainFrame::OnFilterEntities(){
7338 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
7339 g_bIgnoreCommands++;
7340 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) {
7341 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7344 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7346 g_bIgnoreCommands--;
7348 Sys_UpdateWindows( W_XY | W_CAMERA );
7351 void MainFrame::OnFilterHintsskips(){
7352 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
7353 g_bIgnoreCommands++;
7354 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS ) & EXCLUDE_HINTSSKIPS ) {
7355 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7358 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7360 g_bIgnoreCommands--;
7362 Sys_UpdateWindows( W_XY | W_CAMERA );
7365 void MainFrame::OnFilterLights(){
7366 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
7367 g_bIgnoreCommands++;
7368 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) {
7369 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7372 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7374 g_bIgnoreCommands--;
7376 Sys_UpdateWindows( W_XY | W_CAMERA );
7379 void MainFrame::OnFilterLiquids(){
7380 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
7381 g_bIgnoreCommands++;
7382 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS ) & EXCLUDE_LIQUIDS ) {
7383 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7386 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7388 g_bIgnoreCommands--;
7390 Sys_UpdateWindows( W_XY | W_CAMERA );
7393 void MainFrame::OnFilterModels(){
7394 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
7395 g_bIgnoreCommands++;
7396 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS ) & EXCLUDE_MODELS ) {
7397 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7400 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7402 g_bIgnoreCommands--;
7404 Sys_UpdateWindows( W_XY | W_CAMERA );
7407 void MainFrame::OnFilterPatches(){
7408 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
7409 g_bIgnoreCommands++;
7410 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES ) & EXCLUDE_CURVES ) {
7411 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7414 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7416 g_bIgnoreCommands--;
7418 Sys_UpdateWindows( W_XY | W_CAMERA );
7421 void MainFrame::OnFilterPaths(){
7422 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
7423 g_bIgnoreCommands++;
7424 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) {
7425 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7428 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7430 g_bIgnoreCommands--;
7432 Sys_UpdateWindows( W_XY | W_CAMERA );
7435 void MainFrame::OnFilterClusterportals(){
7436 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
7437 g_bIgnoreCommands++;
7438 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS ) & EXCLUDE_CLUSTERPORTALS ) {
7439 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7442 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7444 g_bIgnoreCommands--;
7446 Sys_UpdateWindows( W_XY | W_CAMERA );
7449 void MainFrame::OnFilterLightgrid(){
7450 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
7451 g_bIgnoreCommands++;
7452 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID ) & EXCLUDE_LIGHTGRID ) {
7453 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7456 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7458 g_bIgnoreCommands--;
7460 Sys_UpdateWindows( W_XY | W_CAMERA );
7463 void MainFrame::OnFilterTranslucent(){
7464 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
7465 g_bIgnoreCommands++;
7466 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT ) & EXCLUDE_TRANSLUCENT ) {
7467 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7470 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7472 g_bIgnoreCommands--;
7474 Sys_UpdateWindows( W_XY | W_CAMERA );
7477 void MainFrame::OnFilterTriggers(){
7478 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
7479 g_bIgnoreCommands++;
7480 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS ) & EXCLUDE_TRIGGERS ) {
7481 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7484 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7486 g_bIgnoreCommands--;
7488 Sys_UpdateWindows( W_XY | W_CAMERA );
7491 void MainFrame::OnFilterWorld(){
7492 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
7493 g_bIgnoreCommands++;
7494 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) {
7495 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7498 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7500 g_bIgnoreCommands--;
7502 Sys_UpdateWindows( W_XY | W_CAMERA );
7512 // =============================================================================
7513 // leo: Unused functions, not called anywhere from the code (need to check)
7515 void MainFrame::OnViewConsole(){
7516 if ( FloatingGroupDialog() ) { // QE4 style
7517 if ( inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating ) { // are we in console mode already?
7518 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
7519 widget_delete_hide( g_qeglobals_gui.d_entity );
7522 gtk_widget_show( g_qeglobals_gui.d_entity );
7527 gtk_widget_show( g_qeglobals_gui.d_entity );
7528 SetInspectorMode( W_CONSOLE );
7533 void MainFrame::OnCurveFreeze(){
7537 void MainFrame::OnCurveUnFreeze(){
7538 Patch_UnFreeze( false );
7541 void MainFrame::OnCurveUnFreezeAll(){
7542 Patch_UnFreeze( true );
7545 void MainFrame::OnSelectReselect(){
7549 void MainFrame::OnSelectionTextureFit(){
7550 // TODO: Add your command handler code here
7553 void MainFrame::OnPatchEnter(){
7557 void MainFrame::OnDropGroupAddtoWorld(){
7559 Select_AddToGroup("World");
7560 Sys_UpdateWindows (W_ALL);