2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 // Main Window for Q3Radiant
25 // Leonardo Zide (leo@lokigames.com)
31 #include <gdk/gdkwin32.h>
32 #define COMPILE_MULTIMON_STUBS
37 #include <glib/gi18n.h>
38 #include <gdk/gdkkeysyms.h>
39 #include <gdk/gdkprivate.h>
41 #if defined ( __linux__ ) || defined ( __APPLE__ )
45 #include "groupdialog.h"
46 #include "patchdialog.h"
49 // use this to verbose what happens with the beyboard
55 CString g_strAppPath; ///< holds the full path of the executable
56 CString g_strDTDPath; ///< path to the DTD files
57 CString g_pidFile; ///< the global .pid file (only for global part of the startup)
58 CString g_pidGameFile; ///< the game-specific .pid file
59 CString g_strBitmapsPath; // directory where the bitmaps are stored
62 points to the game tools directory, for instance
63 C:\Program Files\Quake III Arena\GtkRadiant
65 this is one of the main variables that are configured by the game selection on startup
66 <g_strGameToolsPath>/plugins
67 <g_strGameToolsPath>/modules
70 CString g_strGameToolsPath; ///< this is set by g_PrefsDlg.mGamesDialog
71 CGameDescription *g_pGameDescription; ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
72 CString g_strPluginsDir; ///< name of plugins directory, always sub-directory of toolspath
73 CString g_strModulesDir; ///< name of modules directory, always sub-directory of toolspath
76 directory for temp files
77 NOTE: on *nix this is were we check for .pid
79 CString g_strTempPath;
80 MainFrame* g_pParentWnd = NULL; // used to precast to CMainFrame
81 PrefsDlg g_Preferences; // global prefs instance
82 PrefsDlg& g_PrefsDlg = g_Preferences; // reference used throughout
83 int g_nUpdateBits = 0; // window update flags
84 bool g_bScreenUpdates = true; // whether window painting is active, used in a few places
85 // to disable updates for speed reasons
86 // both of the above should be made members of CMainFrame
87 int g_bIgnoreCommands; // Used to ignore commands when checking menus/toolbars
88 GSList *g_BSPFrontendCommands; // List of commands in the BSP menu
90 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
91 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
93 extern bool g_bCrossHairs;
96 extern PatchDialog g_PatchDialog;
98 GtkAccelGroup* global_accel;
100 void Select_Ungroup();
102 // command mapping stuff
104 // m_strCommand is the command string
105 // m_nKey is the GDK_??? equivelant
106 // m_nModifiers are key states as follows
113 #define SPEED_MOVE 32
114 #define SPEED_TURN 22.5
116 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
117 // - if you add a command here and you don't want a menu item, use the "hidden" menu
118 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
119 SCommandInfo g_Commands[] =
121 {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
122 {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
123 {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
124 // {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
125 {"SelectFuncGroup", 'G', 0x00, ID_SELECT_FUNC_GROUP, "menu_select_func_group"},
126 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
127 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
128 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
129 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
130 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
131 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
132 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
133 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
134 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
135 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
136 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
137 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
138 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
139 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
140 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
141 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
142 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
143 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
144 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
145 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
146 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
147 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
148 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
149 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
150 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
151 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
152 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
153 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
154 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
155 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
156 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
157 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
158 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
159 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
160 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
161 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
162 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
163 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
164 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
165 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
166 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
167 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
168 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
169 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
170 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
171 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
172 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
173 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
174 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
175 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
176 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
177 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
178 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
179 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
180 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
181 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
182 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
183 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
184 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
185 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
186 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
187 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
188 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
189 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
190 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
191 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
192 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
193 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
194 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
195 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
196 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
197 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
198 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
199 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
200 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
201 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
202 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
203 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
204 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
205 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
206 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
207 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
208 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
209 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
210 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
211 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
212 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
213 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
214 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
215 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
216 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
217 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
218 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
219 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
220 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
221 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
222 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
223 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
224 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
225 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
226 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
227 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
228 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
229 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
230 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
231 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
232 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
233 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
234 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
235 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
236 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
237 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
238 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
239 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
240 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
241 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
242 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
243 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
244 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
245 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
246 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
247 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
248 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
249 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
250 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
251 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
252 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
253 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
254 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
255 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
256 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
257 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
258 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
259 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
260 {"FilterCaulk", '6', RAD_ALT, ID_FILTER_CAULK, "menu_filter_caulk"},
261 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
262 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
263 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
264 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
265 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
266 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
267 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
268 {"FilterStructural", 'D', RAD_CONTROL | RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
269 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
270 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
271 {"FilterTriggers", 'T', RAD_CONTROL | RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
272 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
273 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
274 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
277 int g_nCommandCount = sizeof( g_Commands ) / sizeof( SCommandInfo );
281 {"Space", GDK_space},
282 {"Backspace", GDK_BackSpace},
283 {"Escape", GDK_Escape},
285 {"Insert", GDK_Insert},
286 {"Delete", GDK_Delete},
287 {"PageUp", GDK_Prior},
288 {"PageDown", GDK_Next},
292 {"Right", GDK_Right},
306 {"Return", GDK_Return},
307 {"Comma", GDK_comma},
308 {"Period", GDK_period},
309 {"Plus", GDK_KP_Add},
310 {"Multiply", GDK_multiply},
311 {"Subtract", GDK_KP_Subtract},
312 {"NumPad0", GDK_KP_0},
313 {"NumPad1", GDK_KP_1},
314 {"NumPad2", GDK_KP_2},
315 {"NumPad3", GDK_KP_3},
316 {"NumPad4", GDK_KP_4},
317 {"NumPad5", GDK_KP_5},
318 {"NumPad6", GDK_KP_6},
319 {"NumPad7", GDK_KP_7},
320 {"NumPad8", GDK_KP_8},
321 {"NumPad9", GDK_KP_9},
328 int g_nKeyCount = sizeof( g_Keys ) / sizeof( SKeyInfo );
330 // =============================================================================
333 void WINAPI Sys_UpdateWindows( int nBits ){
334 g_nUpdateBits |= nBits;
337 // =============================================================================
340 // Gef: Separate handling for keyup events
341 void HandleKeyUp( GtkWidget *widget, gpointer data ){
342 int id = GPOINTER_TO_INT( data );
344 Sys_Printf( "HandleKeyUp: %d\n", id );
347 if ( g_bIgnoreCommands ) {
353 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward( FALSE ); break;
354 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack( FALSE ); break;
355 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft( FALSE ); break;
356 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight( FALSE ); break;
357 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft( FALSE ); break;
358 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight( FALSE ); break;
362 gint HandleCommand( GtkWidget *widget, gpointer data ){
363 int id = GPOINTER_TO_INT( data );
365 Sys_Printf( "HandleCommand %d\n", id );
368 if ( g_bIgnoreCommands ) {
370 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
375 if ( id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END ) {
376 g_pParentWnd->OnTextureWad( id );
378 else if ( id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END ) {
379 g_pParentWnd->OnBspCommand( id );
381 else if ( id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4 ) {
382 g_pParentWnd->OnMru( id );
384 else if ( id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE ) {
385 if ( GTK_CHECK_MENU_ITEM( widget )->active ) {
386 g_pParentWnd->OnViewNearest( id );
389 else if ( id >= ID_GRID_025 && id <= ID_GRID_256 ) {
390 g_pParentWnd->OnGrid( id );
392 else if ( id >= ID_PLUGIN_START && id <= ID_PLUGIN_END ) {
394 gtk_label_get( GTK_LABEL( GTK_BIN( widget )->child ), &str );
395 g_pParentWnd->OnPlugIn( id, str );
397 else if ( id >= ID_ENTITY_START && id <= ID_ENTITY_END ) {
399 gtk_label_get( GTK_LABEL( GTK_BIN( widget )->child ), &str );
400 g_pParentWnd->ActiveXY()->OnEntityCreate( str );
404 case ID_FILE_NEW: g_pParentWnd->OnFileNew(); break;
405 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
406 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen(); break;
407 case ID_FILE_SAVE: g_pParentWnd->OnFileSave(); break;
408 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas(); break;
409 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap(); break;
410 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion(); break;
411 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject(); break;
412 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject(); break;
413 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings(); break;
414 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile(); break;
415 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate(); break;
416 case ID_FILE_EXIT: g_pParentWnd->OnFileExit(); break;
417 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap(); break;
418 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo(); break;
419 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo(); break;
420 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush(); break;
421 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush(); break;
422 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera(); break;
423 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete(); break;
424 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo(); break;
425 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo(); break;
426 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts(); break;
427 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab(); break;
428 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab(); break;
429 case ID_PREFS: g_pParentWnd->OnPrefs(); break;
430 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera(); break;
431 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole(); break;
432 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity(); break;
433 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups(); break;
434 case ID_SELECT_FUNC_GROUP: g_pParentWnd->OnSelectFuncGroup(); break;
435 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview(); break;
436 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz(); break;
437 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz(); break;
438 case ID_TOGGLEZ: g_pParentWnd->OnTogglez(); break;
439 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter(); break;
440 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor(); break;
441 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor(); break;
442 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview(); break;
443 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview(); break;
444 case ID_VIEW_XY: g_pParentWnd->OnViewXy(); break;
445 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide(); break;
446 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront(); break;
447 case ID_VIEW_100: g_pParentWnd->OnView100(); break;
448 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin(); break;
449 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout(); break;
450 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100(); break;
451 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin(); break;
452 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout(); break;
453 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein(); break;
454 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout(); break;
455 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames(); break;
456 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks(); break;
457 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates(); break;
458 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline(); break;
459 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes(); break;
460 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone(); break;
461 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles(); break;
462 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected(); break;
463 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden(); break;
464 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
465 case ID_VIEW_ENTITIESAS_WIREFRAME:
466 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
467 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
468 case ID_VIEW_ENTITIESAS_SKINNED:
469 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
470 g_pParentWnd->OnEntitiesSetViewAs( id );
472 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping(); break;
473 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting(); break;
474 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges(); break;
475 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies(); break;
476 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone(); break;
477 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect(); break;
478 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx(); break;
479 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy(); break;
480 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz(); break;
481 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex(); break;
482 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey(); break;
483 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez(); break;
484 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation(); break;
485 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale(); break;
486 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow(); break;
487 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract(); break;
488 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge(); break;
489 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline(); break;
490 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle(); break;
491 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall(); break;
492 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching(); break;
493 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall(); break;
494 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside(); break;
495 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft(); break;
496 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright(); break;
497 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup(); break;
498 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown(); break;
499 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper(); break;
500 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected(); break;
501 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected(); break;
502 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip(); break;
503 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect(); break;
504 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity(); break;
505 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
506 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
507 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail(); break;
508 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural(); break;
509 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid(); break;
510 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse(); break;
511 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall(); break;
512 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector(); break;
513 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall(); break;
514 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock(); break;
515 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock(); break;
516 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad(); break;
517 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders(); break;
518 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow(); break;
519 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
520 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
521 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
522 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
523 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
524 g_pParentWnd->SetTextureScale( id );
526 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist(); break;
527 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly(); break;
528 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup(); break;
529 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown(); break;
530 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark(); break;
531 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal(); break;
532 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer(); break;
533 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack(); break;
534 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar(); break; /* ydnar */
535 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk(); break;
536 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk(); break;
537 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor(); break;
538 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor(); break;
539 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext(); break;
540 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock(); break;
541 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack(); break;
542 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush(); break;
543 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush(); break;
544 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D(); break;
545 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper(); break;
546 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname(); break;
547 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma(); break;
548 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush(); break;
549 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot(); break;
550 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot(); break;
551 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy(); break;
552 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor(); break;
553 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves(); break;
554 case ID_REGION_OFF: g_pParentWnd->OnRegionOff(); break;
555 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy(); break;
556 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush(); break;
557 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush(); break;
558 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection(); break;
559 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided(); break;
560 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided(); break;
561 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided(); break;
562 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided(); break;
563 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided(); break;
564 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided(); break;
565 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided(); break;
566 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided(); break;
567 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone(); break;
568 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere(); break;
569 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube(); break;
570 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube(); break;
571 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube(); break;
572 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare(); break;
573 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap(); break;
574 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel(); break;
575 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel(); break;
576 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap(); break;
577 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone(); break;
578 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh(); break;
579 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn(); break;
580 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn(); break;
581 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow(); break;
582 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow(); break;
583 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn(); break;
584 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn(); break;
585 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow(); break;
586 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow(); break;
587 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative(); break;
588 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows(); break;
589 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols(); break;
590 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows(); break;
591 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose(); break;
592 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap(); break;
593 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap(); break;
594 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet(); break;
595 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear(); break;
596 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken(); break;
597 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh(); break;
598 case ID_HELP: g_pParentWnd->OnHelp(); break;
599 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
600 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
601 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist(); break;
602 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout(); break;
603 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel(); break;
604 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals(); break;
605 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk(); break;
606 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural(); break;
607 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips(); break;
608 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips(); break;
609 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails(); break;
610 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities(); break;
611 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips(); break;
612 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights(); break;
613 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids(); break;
614 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels(); break;
615 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches(); break;
616 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent(); break;
617 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers(); break;
618 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld(); break;
619 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths(); break;
620 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals(); break;
621 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid(); break;
623 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection(); break;
624 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange(); break;
625 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup(); break;
626 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera(); break;
627 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate(); break;
628 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate(); break;
629 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale(); break;
630 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx(); break;
631 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky(); break;
632 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz(); break;
633 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve(); break;
634 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox(); break;
635 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe(); break;
636 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend(); break;
637 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld(); break;
638 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown(); break;
639 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName(); break;
640 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup(); break;
641 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove(); break;
642 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities(); break;
644 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit(); break;
645 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture(); break;
646 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector(); break;
647 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX(); break;
648 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY(); break;
649 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn(); break;
650 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow(); break;
651 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn(); break;
652 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow(); break;
653 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab(); break;
654 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward( TRUE ); break;
655 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack( TRUE ); break;
656 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft( TRUE ); break;
657 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight( TRUE ); break;
658 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp(); break;
659 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown(); break;
660 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup(); break;
661 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown(); break;
662 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft( TRUE ); break;
663 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight( TRUE ); break;
664 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle(); break;
665 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole(); break;
666 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair(); break;
667 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit(); break;
668 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock(); break;
669 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter(); break;
670 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup(); break;
671 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown(); break;
672 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft(); break;
673 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright(); break;
674 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup(); break;
675 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown(); break;
676 case ID_GRID_PREV: g_pParentWnd->OnGridPrev(); break;
677 case ID_GRID_NEXT: g_pParentWnd->OnGridNext(); break;
678 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft(); break;
679 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight(); break;
680 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown(); break;
681 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup(); break;
682 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint(); break;
683 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint(); break;
684 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize(); break;
685 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid(); break;
686 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll(); break;
687 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert(); break;
693 static gint timer( gpointer data ){
694 MainFrame *wnd = (MainFrame*)data;
699 static gint mainframe_delete( GtkWidget *widget, GdkEvent *event, gpointer data ){
700 MainFrame *wnd = (MainFrame*)data;
704 if ( ConfirmModified() ) {
708 g_qeglobals_gui.d_edit = NULL;
713 static void mainframe_destroy( GtkWidget *widget, gpointer data ){
714 MainFrame *wnd = (MainFrame*)data;
716 // avoid saving prefs when the app is minimized
717 if ( g_pParentWnd->IsSleeping() ) {
718 Sys_Printf( "Shutdown while sleeping, not saving prefs\n" );
719 g_qeglobals.disable_ini = true;
722 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
723 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
724 g_PrefsDlg.SavePrefs();
729 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
730 // and modules / plugins decide to save some stuff
731 g_pParentWnd->GetPlugInMgr().Shutdown();
736 g_PrefsDlg.Destroy();
737 g_dlgSurface.Destroy();
739 g_PatchDialog.Destroy();
744 static gint mainframe_keypress( GtkWidget* widget, GdkEventKey* event, gpointer data ){
745 unsigned int code = gdk_keyval_to_upper( event->keyval );
747 if ( code == GDK_ISO_Left_Tab ) {
752 Sys_Printf( "key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK );
755 // return only if Texture Viewport is in main window, otherwise if Tex viewport is in it's own window
756 // the Filter GtkEntry won't release focus
757 if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus( GTK_WINDOW( widget ) ) ) {
758 if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) ) {
764 Sys_Printf( "mainframe_keypress processing into a command\n" );
766 for ( int i = 0; i < g_nCommandCount; i++ )
768 if ( g_Commands[i].m_nKey == code ) { // find a match?
770 unsigned int nState = 0;
771 if ( Sys_AltDown() ) {
774 if ( ( event->state & GDK_CONTROL_MASK ) != 0 ) {
775 nState |= RAD_CONTROL;
777 if ( ( event->state & GDK_SHIFT_MASK ) != 0 ) {
780 if ( ( g_Commands[i].m_nModifiers & 0x7 ) == nState ) {
781 HandleCommand( NULL, GINT_TO_POINTER( g_Commands[i].m_nCommand ) );
782 gtk_signal_emit_stop_by_name( GTK_OBJECT( widget ), "key_press_event" );
791 static gint mainframe_keyrelease( GtkWidget* widget, GdkEventKey* event, gpointer data ){
792 unsigned int code = gdk_keyval_to_upper( event->keyval );
794 if ( gtk_accelerator_valid( event->keyval, (GdkModifierType)0 ) ) {
798 for ( int i = 0; i < g_nCommandCount; i++ )
800 if ( g_Commands[i].m_nKey == code ) { // find a match?
801 if ( !g_Commands[i].m_nModifiers ) {
802 // Gef: Only call the handler if it's a key that needs keyup events
803 switch ( g_Commands[i].m_nCommand )
805 case ID_CAMERA_FORWARD:
808 case ID_CAMERA_RIGHT:
809 case ID_CAMERA_STRAFELEFT:
810 case ID_CAMERA_STRAFERIGHT:
812 HandleKeyUp( NULL, GINT_TO_POINTER( g_Commands[i].m_nCommand ) );
813 gtk_signal_emit_stop_by_name( GTK_OBJECT( widget ), "key_release_event" );
826 // =============================================================================
827 // Window creation functions
829 void AddMenuItem( GtkWidget* item, unsigned int id ){
830 for ( int i = 0; i < g_nCommandCount; i++ )
831 if ( g_Commands[i].m_nCommand == id ) {
832 g_object_set_data( G_OBJECT( g_pParentWnd->m_pWidget ), g_Commands[i].m_strMenu, item );
837 void MainFrame::handle_help_command( int id ){
838 OpenURL( mHelpURLs[id]->GetBuffer() );
842 needed for hooking in Gtk+
844 void HandleHelpCommand( GtkWidget *widget, gpointer data ){
845 int id = GPOINTER_TO_INT( data );
846 g_pParentWnd->handle_help_command( id );
849 void MainFrame::process_xlink( Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel ){
851 pDoc = xmlParseFile( FileName.GetBuffer() );
853 Sys_Printf( "Processing .xlink file '%s'\n", FileName.GetBuffer() );
855 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic( menu, menu_name );
856 // start walking the nodes, find the 'links' one
857 xmlNodePtr pNode = pDoc->children;
858 while ( pNode && strcmp( (const char*)pNode->name, "links" ) )
861 pNode = pNode->children;
864 if ( !strcmp( (const char*)pNode->name, "item" ) ) {
867 if ( strstr( (char *)xmlGetProp( pNode, (xmlChar *)"url" ), "http://" ) ) {
870 *url = (char *)xmlGetProp( pNode, (xmlChar *)"url" );
877 *url += (char *)xmlGetProp( pNode, (xmlChar *)"url" );
879 mHelpURLs.push_back( url );
880 create_menu_item_with_mnemonic( menu_in_menu, (char *)xmlGetProp( pNode, (xmlChar *)"name" ), GTK_SIGNAL_FUNC( HandleHelpCommand ), mHelpURLs.size() - 1 );
889 Sys_Printf( "'%s' not found / parse failed\n", FileName.GetBuffer() );
893 void MainFrame::create_game_help_menu( GtkWidget *menu, GtkAccelGroup *accel ){
895 list<CGameDescription *>::iterator iGame;
897 // start in the global dir
898 FileName = g_strAppPath;
899 FileName += "global.xlink";
900 process_xlink( FileName, "General", g_strAppPath.GetBuffer(), menu, accel );
902 for ( iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++ )
904 FileName = ( *iGame )->mGameToolsPath;
905 FileName += "game.xlink";
906 process_xlink( FileName, ( *iGame )->mGameName, ( *iGame )->mGameToolsPath.GetBuffer(), menu, accel );
910 void MainFrame::create_main_menu( GtkWidget *window, GtkWidget *vbox ){
911 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
912 GtkAccelGroup *accel;
915 accel = gtk_accel_group_new();
916 global_accel = accel;
917 gtk_window_add_accel_group( GTK_WINDOW( window ), accel );
919 handle_box = gtk_handle_box_new();
920 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
921 gtk_widget_show( handle_box );
923 menu_bar = gtk_menu_bar_new();
924 gtk_container_add( GTK_CONTAINER( handle_box ), menu_bar );
925 gtk_widget_show( menu_bar );
928 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_File" ) );
929 if ( g_PrefsDlg.m_bDetachableMenus ) {
930 menu_tearoff( menu );
933 create_menu_item_with_mnemonic( menu, _( "_New Map" ),
934 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_NEW );
935 menu_separator( menu );
937 //++timo temporary experimental stuff for sleep mode..
938 item = create_menu_item_with_mnemonic( menu, _( "_Sleep" ),
939 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SLEEP );
940 g_object_set_data( G_OBJECT( window ), "menu_file_sleep", item );
941 menu_separator( menu );
944 item = create_menu_item_with_mnemonic( menu, _( "_Open..." ),
945 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_OPEN );
946 g_object_set_data( G_OBJECT( window ), "menu_file_open", item );
947 create_menu_item_with_mnemonic( menu, _( "_Import..." ), // Hydra: give it it's proper name
948 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_IMPORTMAP );
949 item = create_menu_item_with_mnemonic( menu, _( "_Save" ),
950 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVE );
951 g_object_set_data( G_OBJECT( window ), "menu_file_save", item );
952 create_menu_item_with_mnemonic( menu, _( "Save _as..." ),
953 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVEAS );
954 create_menu_item_with_mnemonic( menu, _( "Save s_elected..." ),
955 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_EXPORTMAP );
956 menu_separator( menu );
957 item = create_menu_item_with_mnemonic( menu, _( "Save re_gion..." ),
958 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVEREGION );
959 g_object_set_data( G_OBJECT( window ), "menu_file_saveregion", item );
960 menu_separator( menu );
961 create_menu_item_with_mnemonic( menu, _( "New p_roject..." ),
962 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_NEWPROJECT );
963 create_menu_item_with_mnemonic( menu, _( "Load _project..." ),
964 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_LOADPROJECT );
965 create_menu_item_with_mnemonic( menu, _( "Pro_ject settings..." ),
966 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_PROJECTSETTINGS );
967 menu_separator( menu );
968 create_menu_item_with_mnemonic( menu, _( "_Pointfile..." ),
969 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_POINTFILE );
970 menu_separator( menu );
971 item = create_menu_item_with_mnemonic( menu, _( "Recent Files" ),
972 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT1 );
973 g_object_set_data( G_OBJECT( item ), "accel", accel );
974 gtk_widget_set_sensitive( item, FALSE );
975 MRU_AddWidget( item, 0 );
976 item = create_menu_item_with_mnemonic( menu, "2",
977 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT2 );
978 gtk_widget_hide( item );
979 MRU_AddWidget( item, 1 );
980 item = create_menu_item_with_mnemonic( menu, "3",
981 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT3 );
982 gtk_widget_hide( item );
983 MRU_AddWidget( item, 2 );
984 item = create_menu_item_with_mnemonic( menu, "4",
985 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT4 );
986 gtk_widget_hide( item );
987 MRU_AddWidget( item, 3 );
988 menu_separator( menu );
989 item = create_menu_item_with_mnemonic( menu, _( "Check for GtkRadiant update (web)" ),
990 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_CHECKUPDATE );
991 // disable, the functionality is no longer available
992 gtk_widget_set_sensitive( item, FALSE );
994 create_menu_item_with_mnemonic( menu, _( "E_xit" ),
995 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_EXIT );
998 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Edit" ) );
999 if ( g_PrefsDlg.m_bDetachableMenus ) {
1000 menu_tearoff( menu );
1002 item = create_menu_item_with_mnemonic( menu, _( "_Undo" ),
1003 GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_UNDO );
1004 g_object_set_data( G_OBJECT( window ), "menu_edit_undo", item );
1005 item = create_menu_item_with_mnemonic( menu, _( "_Redo" ),
1006 GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_REDO );
1007 g_object_set_data( G_OBJECT( window ), "menu_edit_redo", item );
1008 menu_separator( menu );
1009 item = create_menu_item_with_mnemonic( menu, _( "_Copy" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_COPYBRUSH );
1010 item = create_menu_item_with_mnemonic( menu, _( "_Paste" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_PASTEBRUSH );
1011 item = create_menu_item_with_mnemonic( menu, _( "P_aste To Camera" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_PASTEBRUSHTOCAMERA );
1012 item = create_menu_item_with_mnemonic( menu, _( "_Delete" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DELETE );
1013 g_object_set_data( G_OBJECT( window ), "menu_selection_delete", item );
1014 menu_separator( menu );
1015 create_menu_item_with_mnemonic( menu, _( "Map Info..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_MAPINFO );
1016 create_menu_item_with_mnemonic( menu, _( "Entity Info..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_ENTITYINFO );
1017 menu_separator( menu );
1018 create_menu_item_with_mnemonic( menu, _( "Brush Scripts..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_SCRIPTS );
1019 menu_separator( menu );
1020 create_menu_item_with_mnemonic( menu, _( "Load Pre_fab..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_LOADPREFAB );
1021 create_menu_item_with_mnemonic( menu, _( "Save Selection as Prefab..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_SAVEPREFAB );
1022 menu_separator( menu );
1023 create_menu_item_with_mnemonic( menu, _( "Preferences..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_PREFS );
1026 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_View" ) );
1027 if ( g_PrefsDlg.m_bDetachableMenus ) {
1028 menu_tearoff( menu );
1031 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Toggle" ) );
1032 create_menu_item_with_mnemonic( menu_in_menu, _( "Camera View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLECAMERA );
1033 create_menu_item_with_mnemonic( menu_in_menu, _( "Console View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLECONSOLE );
1034 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Entity View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITY );
1035 g_object_set_data( G_OBJECT( window ), "menu_view_entity", item );
1036 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1037 create_menu_item_with_mnemonic( menu_in_menu, _( "XY (Top)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW );
1038 create_menu_item_with_mnemonic( menu_in_menu, _( "YZ (Side)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW_YZ );
1039 create_menu_item_with_mnemonic( menu_in_menu, _( "XZ (Front)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW_XZ );
1040 create_menu_item_with_mnemonic( menu_in_menu, _( "Z View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEZ );
1041 menu_separator( menu );
1042 item = create_menu_item_with_mnemonic( menu, _( "_Center" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CENTER );
1043 item = create_menu_item_with_mnemonic( menu, _( "_Center 2d" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CENTERVIEW );
1044 item = create_menu_item_with_mnemonic( menu, _( "_Up Floor" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_UPFLOOR );
1045 item = create_menu_item_with_mnemonic( menu, _( "_Down Floor" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_DOWNFLOOR );
1046 menu_separator( menu );
1047 item = create_menu_item_with_mnemonic( menu, _( "_Next (XY, YZ, XY)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEXTVIEW );
1048 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Layout" ) );
1049 create_menu_item_with_mnemonic( menu_in_menu, _( "XY (Top)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_XY );
1050 create_menu_item_with_mnemonic( menu_in_menu, _( "YZ" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SIDE );
1051 create_menu_item_with_mnemonic( menu_in_menu, _( "XZ" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_FRONT );
1052 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Zoom" ) );
1053 create_menu_item_with_mnemonic( menu_in_menu, _( "_XY 100%" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_100 );
1054 item = create_menu_item_with_mnemonic( menu_in_menu, _( "XY Zoom _In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZOOMIN );
1055 item = create_menu_item_with_mnemonic( menu_in_menu, _( "XY Zoom _Out" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZOOMOUT );
1056 menu_separator( menu_in_menu );
1057 create_menu_item_with_mnemonic( menu_in_menu, _( "_Z 100%" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_Z100 );
1058 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Z Zoo_m In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZZOOMIN );
1059 g_object_set_data( G_OBJECT( window ), "menu_view_zzoomin", item );
1060 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Z Zoom O_ut" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZZOOMOUT );
1061 g_object_set_data( G_OBJECT( window ), "menu_view_zzoomout", item );
1062 menu_separator( menu_in_menu );
1063 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Cubic Clip Zoom In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBEIN );
1064 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Cubic Clip Zoom Out" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBEOUT );
1065 menu_separator( menu );
1067 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Show" ) );
1068 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show _Angles" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWANGLES, FALSE );
1069 g_object_set_data( G_OBJECT( window ), "menu_view_showangles", item );
1070 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show _Names" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWNAMES, TRUE );
1071 g_object_set_data( G_OBJECT( window ), "menu_view_shownames", item );
1072 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Blocks" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWBLOCKS, FALSE );
1073 g_object_set_data( G_OBJECT( window ), "menu_view_showblocks", item );
1074 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show C_oordinates" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWCOORDINATES, TRUE );
1075 g_object_set_data( G_OBJECT( window ), "menu_view_showcoordinates", item );
1076 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Window Outline" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWOUTLINE, TRUE );
1077 g_object_set_data( G_OBJECT( window ), "menu_view_showoutline", item );
1078 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show ZBuffered Outline" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_NOOUTLINE, TRUE );
1079 g_object_set_data( G_OBJECT( window ), "menu_selection_nooutline", item );
1080 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Axes" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWAXES, TRUE );
1081 g_object_set_data( G_OBJECT( window ), "menu_view_showaxes", item );
1082 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Workzone" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWWORKZONE, FALSE );
1083 g_object_set_data( G_OBJECT( window ), "menu_view_showworkzone", item );
1085 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Filter" ) );
1086 create_check_menu_item_with_mnemonic( menu_in_menu, _( "World" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_WORLD, FALSE );
1087 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Entities" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_ENTITIES, FALSE );
1088 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Areaportals" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_AREAPORTALS, FALSE );
1089 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Translucent" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_TRANSLUCENT, FALSE );
1090 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Liquids" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIQUIDS, FALSE );
1091 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Caulk" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CAULK, FALSE );
1092 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Clips" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CLIPS, FALSE );
1093 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Paths" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_PATHS, FALSE );
1094 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Clusterportals" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CLUSTERPORTALS, FALSE );
1095 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Lights" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIGHTS, FALSE );
1096 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Structural" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_STRUCTURAL, FALSE );
1097 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Lightgrid" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIGHTGRID, FALSE );
1098 g_object_set_data( G_OBJECT( window ), "menu_filter_lightgrid", item );
1099 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Patches" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_PATCHES, FALSE );
1100 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Details" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_DETAILS, FALSE );
1101 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Hints" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_HINTSSKIPS, FALSE );
1102 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Models" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_MODELS, FALSE );
1103 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Triggers" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_TRIGGERS, FALSE );
1104 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Botclips" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_BOTCLIPS, FALSE );
1106 menu_separator( menu );
1107 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Hide/Show" ) );
1108 create_menu_item_with_mnemonic( menu_in_menu, _( "Hide Selected" ),
1109 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_HIDESHOW_HIDESELECTED );
1110 create_menu_item_with_mnemonic( menu_in_menu, _( "Show Hidden" ),
1111 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_HIDESHOW_SHOWHIDDEN );
1112 menu_separator( menu );
1113 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Entities as" ) );
1114 g_object_set_data( G_OBJECT( window ), "view_entitiesas_menu", menu_in_menu );
1115 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "Bounding box" ),
1116 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE );
1117 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_boundingbox", item );
1118 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Wireframe" ),
1119 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE );
1120 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_wireframe", item );
1121 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Selected Wireframe" ),
1122 GTK_SIGNAL_FUNC( HandleCommand ),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE );
1123 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_selectedwireframe", item );
1124 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Selected Skinned" ),
1125 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE );
1126 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_selectedskinned", item );
1127 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Skinned" ),
1128 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SKINNED,FALSE );
1129 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_skinned", item );
1130 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Skinned and Boxed" ),
1131 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE );
1132 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_skinnedandboxed", item );
1133 menu_separator( menu );
1134 item = create_check_menu_item_with_mnemonic( menu, _( "Cubic Clipping" ),
1135 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBICCLIPPING, TRUE );
1136 g_object_set_data( G_OBJECT( window ), "menu_view_cubicclipping", item );
1137 menu_separator( menu );
1138 item = create_check_menu_item_with_mnemonic( menu, _( "OpenGL Lighting" ),
1139 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_OPENGLLIGHTING, FALSE );
1140 g_object_set_data( G_OBJECT( window ), "menu_view_opengllighting", item );
1143 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Selection" ) );
1144 if ( g_PrefsDlg.m_bDetachableMenus ) {
1145 menu_tearoff( menu );
1148 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Drag" ) );
1149 create_menu_item_with_mnemonic( menu_in_menu, _( "Drag _Edges" ),
1150 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DRAGEDGES );
1151 create_menu_item_with_mnemonic( menu_in_menu, _( "Drag _Vertices" ),
1152 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DRAGVERTECIES );
1153 menu_separator( menu );
1154 create_menu_item_with_mnemonic( menu, _( "_Clone" ),
1155 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CLONE );
1156 item = create_menu_item_with_mnemonic( menu, _( "Deselect" ),
1157 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DESELECT );
1158 item = create_menu_item_with_mnemonic( menu, _( "Invert" ),
1159 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_INVERT );
1161 create_menu_item_with_mnemonic( menu, _( "_Delete" ),
1162 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DELETE );
1164 menu_separator( menu );
1165 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Flip" ) );
1166 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _X" ),
1167 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPX );
1168 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _Y" ),
1169 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPY );
1170 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _Z" ),
1171 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPZ );
1172 menu_separator( menu );
1173 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Rotate" ) );
1174 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate X" ),
1175 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEX );
1176 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate Y" ),
1177 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEY );
1178 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate Z" ),
1179 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEZ );
1180 create_menu_item_with_mnemonic( menu_in_menu, _( "Arbitrary rotation..." ),
1181 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_ARBITRARYROTATION );
1182 menu_separator( menu );
1183 create_menu_item_with_mnemonic( menu, _( "Scale..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_SCALE );
1184 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "CSG" ) );
1185 create_menu_item_with_mnemonic( menu_in_menu, _( "Make _Hollow" ),
1186 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKEHOLLOW );
1187 create_menu_item_with_mnemonic( menu_in_menu, _( "CSG _Subtract" ),
1188 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CSGSUBTRACT );
1189 create_menu_item_with_mnemonic( menu_in_menu, _( "CSG _Merge" ),
1190 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CSGMERGE );
1191 menu_separator( menu );
1192 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Select" ) );
1193 create_menu_item_with_mnemonic( menu_in_menu, _( "Select Complete _Tall" ),
1194 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTCOMPLETETALL );
1195 create_menu_item_with_mnemonic( menu_in_menu, _( "Select T_ouching" ),
1196 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTTOUCHING );
1197 create_menu_item_with_mnemonic( menu_in_menu, _( "Select _Partial Tall" ),
1198 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTPARTIALTALL );
1199 create_menu_item_with_mnemonic( menu_in_menu, _( "Select _Inside" ),
1200 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTINSIDE );
1201 create_menu_item_with_mnemonic( menu_in_menu, "Select Func _Group", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_FUNC_GROUP );
1203 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Left" ),
1204 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGELEFT );
1205 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Right" ),
1206 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGERIGHT );
1207 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Up" ),
1208 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEUP );
1209 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Down" ),
1210 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEDOWN );
1212 menu_separator( menu );
1213 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Clipper" ) );
1214 create_menu_item_with_mnemonic( menu_in_menu, _( "Toggle Clipper" ),
1215 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CLIPPER );
1216 menu_separator( menu_in_menu );
1217 create_menu_item_with_mnemonic( menu_in_menu, _( "Clip selection" ),
1218 GTK_SIGNAL_FUNC( HandleCommand ), ID_CLIP_SELECTED );
1219 create_menu_item_with_mnemonic( menu_in_menu, _( "Split selection" ),
1220 GTK_SIGNAL_FUNC( HandleCommand ), ID_SPLIT_SELECTED );
1221 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip Clip orientation" ),
1222 GTK_SIGNAL_FUNC( HandleCommand ), ID_FLIP_CLIP );
1223 menu_separator( menu );
1224 create_menu_item_with_mnemonic( menu, _( "Connect entities" ),
1225 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CONNECT );
1226 create_menu_item_with_mnemonic( menu, _( "Ungroup entity" ),
1227 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_UNGROUPENTITY );
1228 create_menu_item_with_mnemonic( menu, _( "Make detail" ),
1229 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKE_DETAIL );
1230 create_menu_item_with_mnemonic( menu, _( "Make structural" ),
1231 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKE_STRUCTURAL );
1234 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Bsp" ) );
1236 menu_separator( menu );
1237 g_object_set_data( G_OBJECT( window ), "menu_bsp", menu );
1240 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Grid" ) );
1241 if ( g_PrefsDlg.m_bDetachableMenus ) {
1242 menu_tearoff( menu );
1245 item = create_radio_menu_item_with_mnemonic( menu, NULL, _( "Grid0.25" ),
1246 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_025, FALSE );
1247 g_object_set_data( G_OBJECT( window ), "menu_grid_025", item );
1248 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid0.5" ),
1249 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_05, FALSE );
1250 g_object_set_data( G_OBJECT( window ), "menu_grid_05", item );
1251 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid1" ),
1252 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_1, FALSE );
1253 g_object_set_data( G_OBJECT( window ), "menu_grid_1", item );
1254 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid2" ),
1255 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_2, FALSE );
1256 g_object_set_data( G_OBJECT( window ), "menu_grid_2", item );
1257 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid4" ),
1258 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_4, FALSE );
1259 g_object_set_data( G_OBJECT( window ), "menu_grid_4", item );
1260 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid8" ),
1261 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_8, TRUE );
1262 g_object_set_data( G_OBJECT( window ), "menu_grid_8", item );
1263 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid16" ),
1264 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_16, FALSE );
1265 g_object_set_data( G_OBJECT( window ), "menu_grid_16", item );
1266 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid32" ),
1267 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_32, FALSE );
1268 g_object_set_data( G_OBJECT( window ), "menu_grid_32", item );
1269 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid64" ),
1270 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_64, FALSE );
1271 g_object_set_data( G_OBJECT( window ), "menu_grid_64", item );
1272 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid128" ),
1273 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_128, FALSE );
1274 g_object_set_data( G_OBJECT( window ), "menu_grid_128", item );
1275 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid256" ),
1276 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_256, FALSE );
1277 g_object_set_data( G_OBJECT( window ), "menu_grid_256", item );
1278 menu_separator( menu );
1279 item = create_check_menu_item_with_mnemonic( menu, _( "Snap to grid" ),
1280 GTK_SIGNAL_FUNC( HandleCommand ), ID_SNAPTOGRID, TRUE );
1281 g_object_set_data( G_OBJECT( window ), "menu_snaptogrid", item );
1284 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Textures" ) );
1285 if ( g_PrefsDlg.m_bDetachableMenus ) {
1286 menu_tearoff( menu );
1289 item = create_check_menu_item_with_mnemonic( menu, _( "Show In _Use" ),
1290 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHOWINUSE, FALSE );
1291 g_object_set_data( G_OBJECT( window ), "menu_textures_showinuse", item );
1292 item = create_check_menu_item_with_mnemonic( menu, _( "Show _All" ),
1293 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHOWALL, FALSE );
1294 g_object_set_data( G_OBJECT( window ), "menu_textures_showall", item );
1295 menu_separator( menu );
1296 item = create_check_menu_item_with_mnemonic( menu, _( "Show shaders" ),
1297 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHADERS_SHOW, FALSE );
1298 g_object_set_data( G_OBJECT( window ), "menu_textures_shaders_show", item );
1299 item = create_menu_item_with_mnemonic( menu, _( "Flush & Reload Shaders" ),
1300 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_RELOADSHADERS );
1301 g_object_set_data( G_OBJECT( window ), "menu_textures_reloadshaders", item );
1302 item = create_menu_item_with_mnemonic( menu, _( "Load directory..." ),
1303 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_LOAD );
1304 g_object_set_data( G_OBJECT( window ), "menu_textures_load", item );
1305 item = create_menu_item_with_mnemonic( menu, _( "Directory list..." ),
1306 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_LOADLIST );
1307 menu_separator( menu );
1309 item = create_menu_item_with_mnemonic( menu, _( "_Surface Inspector" ),
1310 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_INSPECTOR );
1311 menu_separator( menu );
1312 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Render Quality" ) );
1313 g_object_set_data( G_OBJECT( window ), "render_quality_menu", menu_in_menu );
1314 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "_Wireframe" ),
1315 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_WIREFRAME, FALSE );
1316 g_object_set_data( G_OBJECT( window ), "menu_textures_wireframe", item );
1317 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Flat shade" ),
1318 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_FLATSHADE, FALSE );
1319 g_object_set_data( G_OBJECT( window ), "menu_textures_flatshade", item );
1320 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Nearest" ),
1321 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEAREST, FALSE );
1322 g_object_set_data( G_OBJECT( window ), "menu_view_nearest", item );
1323 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Nearest _Mipmap" ),
1324 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEARESTMIPMAP, FALSE );
1325 g_object_set_data( G_OBJECT( window ), "menu_view_nearestmipmap", item );
1326 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Linear" ),
1327 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_LINEAR, FALSE );
1328 g_object_set_data( G_OBJECT( window ), "menu_view_linear", item );
1329 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Bilinear" ),
1330 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_BILINEAR, FALSE );
1331 g_object_set_data( G_OBJECT( window ), "menu_view_bilinear", item );
1332 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "B_ilinear Mipmap" ),
1333 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_BILINEARMIPMAP, FALSE );
1334 g_object_set_data( G_OBJECT( window ), "menu_view_bilinearmipmap", item );
1335 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "T_rilinear" ),
1336 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_TRILINEAR, FALSE );
1337 g_object_set_data( G_OBJECT( window ), "menu_view_trilinear", item );
1338 create_menu_item_with_mnemonic( menu, _( "Find / Replace..." ),
1339 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURE_REPLACEALL );
1341 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Texture Lock" ) );
1342 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Moves" ),
1343 GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLE_LOCK, TRUE );
1344 g_object_set_data( G_OBJECT( window ), "menu_toggle_lock", item );
1345 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Rotations" ),
1346 GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLE_ROTATELOCK, TRUE );
1347 g_object_set_data( G_OBJECT( window ), "menu_toggle_rotatelock", item );
1348 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Texture Window Scale" ) );
1349 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "200%" ),
1350 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE );
1351 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_200", item );
1352 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "100%" ),
1353 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE );
1354 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_100", item );
1355 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "50%" ),
1356 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE );
1357 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_50", item );
1358 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "25%" ),
1359 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE );
1360 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_25", item );
1361 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "10%" ),
1362 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE );
1363 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_10", item );
1364 item = menu_separator( menu );
1365 item = create_check_menu_item_with_mnemonic( menu, _( "shaderlist.txt only" ),
1366 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHADERLISTONLY, FALSE );
1367 g_object_set_data( G_OBJECT( window ), "menu_textures_shaderlistonly", item );
1368 item = menu_separator( menu );
1369 g_object_set_data( G_OBJECT( window ), "menu_textures_separator", item );
1370 g_object_set_data( G_OBJECT( window ), "menu_textures", menu );
1373 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Misc" ) );
1374 if ( g_PrefsDlg.m_bDetachableMenus ) {
1375 menu_tearoff( menu );
1378 create_menu_item_with_mnemonic( menu, _( "_Benchmark" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_BENCHMARK );
1379 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Colors" ) );
1380 menu_3 = create_menu_in_menu_with_mnemonic( menu_in_menu, _( "Themes" ) );
1381 create_menu_item_with_mnemonic( menu_3, _( "QE4 Original" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETORIGINAL );
1382 create_menu_item_with_mnemonic( menu_3, _( "Q3Radiant Original" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETQER );
1383 create_menu_item_with_mnemonic( menu_3, _( "Black and Green" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETBLACK );
1384 create_menu_item_with_mnemonic( menu_3, _( "Maya/Max/Lightwave Emulation" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETYDNAR );
1386 menu_separator( menu_in_menu );
1387 create_menu_item_with_mnemonic( menu_in_menu, _( "_Texture Background..." ),
1388 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREBK );
1389 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Background..." ),
1390 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_XYBK );
1391 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Major..." ),
1392 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MAJOR );
1393 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Minor..." ),
1394 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MINOR );
1395 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Major Small..." ),
1396 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MAJOR_ALT );
1397 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Minor Small..." ),
1398 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MINOR_ALT );
1399 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Text..." ),
1400 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_GRIDTEXT );
1401 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Block..." ),
1402 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_GRIDBLOCK );
1403 create_menu_item_with_mnemonic( menu_in_menu, _( "Default Brush..." ),
1404 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_BRUSH );
1405 create_menu_item_with_mnemonic( menu_in_menu, _( "Camera Background..." ),
1406 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_CAMERABACK );
1407 create_menu_item_with_mnemonic( menu_in_menu, _( "Selected Brush..." ),
1408 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_SELECTEDBRUSH );
1409 create_menu_item_with_mnemonic( menu_in_menu, _( "Selected Brush (Camera)..." ),
1410 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_SELECTEDBRUSH3D );
1411 create_menu_item_with_mnemonic( menu_in_menu, _( "Clipper..." ),
1412 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_CLIPPER );
1413 create_menu_item_with_mnemonic( menu_in_menu, _( "Active View name..." ),
1414 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_VIEWNAME );
1416 create_menu_item_with_mnemonic( menu, _( "_Gamma..." ),
1417 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_GAMMA );
1418 create_menu_item_with_mnemonic( menu, _( "Find brush..." ),
1419 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_FINDBRUSH );
1420 item = create_menu_item_with_mnemonic( menu, _( "Next leak spot" ),
1421 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_NEXTLEAKSPOT );
1422 item = create_menu_item_with_mnemonic( menu, _( "Previous leak spot" ),
1423 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_PREVIOUSLEAKSPOT );
1424 create_menu_item_with_mnemonic( menu, _( "_Print XY View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_PRINTXY );
1425 item = create_menu_item_with_mnemonic( menu, _( "_Select Entity Color..." ),
1426 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_SELECTENTITYCOLOR );
1427 g_object_set_data( G_OBJECT( window ), "menu_misc_selectentitycolor", item );
1430 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Region" ) );
1431 if ( g_PrefsDlg.m_bDetachableMenus ) {
1432 menu_tearoff( menu );
1435 create_menu_item_with_mnemonic( menu, _( "_Off" ),
1436 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_OFF );
1437 create_menu_item_with_mnemonic( menu, _( "_Set XY" ),
1438 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETXY );
1439 create_menu_item_with_mnemonic( menu, _( "Set _Tall Brush" ),
1440 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETTALLBRUSH );
1441 create_menu_item_with_mnemonic( menu, _( "Set _Brush" ),
1442 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETBRUSH );
1443 create_menu_item_with_mnemonic( menu, _( "Set Se_lected Brushes" ),
1444 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETSELECTION );
1447 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Brush" ) );
1448 if ( g_PrefsDlg.m_bDetachableMenus ) {
1449 menu_tearoff( menu );
1452 item = create_menu_item_with_mnemonic( menu, _( "3 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_3SIDED );
1453 item = create_menu_item_with_mnemonic( menu, _( "4 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_4SIDED );
1454 item = create_menu_item_with_mnemonic( menu, _( "5 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_5SIDED );
1455 item = create_menu_item_with_mnemonic( menu, _( "6 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_6SIDED );
1456 item = create_menu_item_with_mnemonic( menu, _( "7 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_7SIDED );
1457 item = create_menu_item_with_mnemonic( menu, _( "8 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_8SIDED );
1458 item = create_menu_item_with_mnemonic( menu, _( "9 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_9SIDED );
1459 menu_separator( menu );
1460 create_menu_item_with_mnemonic( menu, _( "Arbitrary sided..." ),
1461 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ARBITRARYSIDED );
1462 menu_separator( menu );
1463 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Primitives" ) );
1464 create_menu_item_with_mnemonic( menu_in_menu, _( "Cone..." ),
1465 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_MAKECONE );
1466 create_menu_item_with_mnemonic( menu_in_menu, _( "Sphere..." ),
1467 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_PRIMITIVES_SPHERE );
1470 if ( !g_pGameDescription->mNoPatch ) {
1471 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Curve" ) );
1472 if ( g_PrefsDlg.m_bDetachableMenus ) {
1473 menu_tearoff( menu );
1476 create_menu_item_with_mnemonic( menu, _( "Cylinder" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHTUBE );
1477 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "More Cylinders" ) );
1478 create_menu_item_with_mnemonic( menu_in_menu, _( "Dense Cylinder" ),
1479 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHDENSETUBE );
1480 create_menu_item_with_mnemonic( menu_in_menu, _( "Very Dense Cylinder" ),
1481 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHVERYDENSETUBE );
1482 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Cylinder" ),
1483 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHSQUARE );
1484 menu_separator( menu );
1485 create_menu_item_with_mnemonic( menu, _( "End cap" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHENDCAP );
1486 create_menu_item_with_mnemonic( menu, _( "Bevel" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHBEVEL );
1487 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "More End caps, Bevels" ) );
1488 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Endcap" ),
1489 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL );
1490 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Bevel" ),
1491 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP );
1492 menu_separator( menu );
1493 create_menu_item_with_mnemonic( menu, _( "Cone" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHCONE );
1494 item = create_menu_item_with_mnemonic( menu, _( "Sphere" ),
1495 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PRIMITIVES_SPHERE );
1496 gtk_widget_set_sensitive( item, FALSE );
1497 menu_separator( menu );
1498 item = create_menu_item_with_mnemonic( menu, _( "Simple Patch Mesh..." ),
1499 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_SIMPLEPATCHMESH );
1500 g_object_set_data( G_OBJECT( window ), "menu_simplepatchmesh", item );
1501 menu_separator( menu );
1502 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Insert" ) );
1503 create_menu_item_with_mnemonic( menu_in_menu, _( "Insert (2) Columns" ),
1504 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_INSERTCOLUMN );
1505 create_menu_item_with_mnemonic( menu_in_menu, _( "Add (2) Columns" ),
1506 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_ADDCOLUMN );
1507 menu_separator( menu_in_menu );
1508 create_menu_item_with_mnemonic( menu_in_menu, _( "Insert (2) Rows" ),
1509 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_INSERTROW );
1510 create_menu_item_with_mnemonic( menu_in_menu, _( "Add (2) Rows" ),
1511 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_ADDROW );
1512 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Delete" ) );
1513 create_menu_item_with_mnemonic( menu_in_menu, _( "First (2) Columns" ),
1514 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_FIRSTCOLUMN );
1515 create_menu_item_with_mnemonic( menu_in_menu, _( "Last (2) Columns" ),
1516 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_LASTCOLUMN );
1517 menu_separator( menu_in_menu );
1518 create_menu_item_with_mnemonic( menu_in_menu, _( "First (2) Rows" ),
1519 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_FIRSTROW );
1520 create_menu_item_with_mnemonic( menu_in_menu, _( "Last (2) Rows" ),
1521 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_LASTROW );
1522 menu_separator( menu );
1523 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Matrix" ) );
1524 create_menu_item_with_mnemonic( menu_in_menu, _( "Invert" ),
1525 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVE );
1526 menu_3 = create_menu_in_menu_with_mnemonic( menu_in_menu, _( "Re-disperse" ) );
1527 create_menu_item_with_mnemonic( menu_3, _( "Rows" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_ROWS );
1528 create_menu_item_with_mnemonic( menu_3, _( "Cols (Intermediate)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS );
1529 create_menu_item_with_mnemonic( menu_3, _( "Rows (Intermediate)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS );
1530 create_menu_item_with_mnemonic( menu_in_menu, _( "Transpose" ),
1531 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MATRIX_TRANSPOSE );
1532 menu_separator( menu );
1533 create_menu_item_with_mnemonic( menu, _( "Cap Selection" ),
1534 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_CAP );
1535 create_menu_item_with_mnemonic( menu, _( "Cycle Cap Texture" ),
1536 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_CYCLECAP );
1537 menu_separator( menu );
1538 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Overlay" ) );
1539 create_menu_item_with_mnemonic( menu_in_menu, _( "Set" ),
1540 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_OVERLAY_SET );
1541 create_menu_item_with_mnemonic( menu_in_menu, _( "Clear" ),
1542 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_OVERLAY_CLEAR );
1543 menu_separator( menu );
1544 create_menu_item_with_mnemonic( menu, _( "Thicken..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_THICKEN );
1547 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Plugins" ) );
1548 if ( g_PrefsDlg.m_bDetachableMenus ) {
1549 menu_tearoff( menu );
1553 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1555 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1556 item = menu_separator( menu );
1557 g_object_set_data( G_OBJECT( window ), "menu_plugin_separator", item );
1558 g_object_set_data( G_OBJECT( window ), "menu_plugin", menu );
1561 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Help" ) );
1562 if ( g_PrefsDlg.m_bDetachableMenus ) {
1563 menu_tearoff( menu );
1566 item = create_menu_item_with_mnemonic( menu, _( "Manual" ),
1567 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP );
1568 gtk_widget_add_accelerator( item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
1570 // this creates all the per-game drop downs for the game pack helps
1571 // it will take care of hooking the Sys_OpenURL calls etc.
1572 create_game_help_menu( menu, accel );
1574 // TTimo: this is in global.xlink now
1575 //create_menu_item_with_mnemonic (menu, "Links",
1576 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1577 create_menu_item_with_mnemonic( menu, _( "Bug report" ),
1578 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_BUGREPORT );
1579 create_menu_item_with_mnemonic( menu, _( "Shortcuts list" ),
1580 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_COMMANDLIST );
1581 create_menu_item_with_mnemonic( menu, _( "_About" ),
1582 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_ABOUT );
1585 // leo: Hidden menu to make the accelerators work,
1586 // this is a hack that needs to be changed later if someone has a better idea.
1588 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1589 menu = create_sub_menu_with_mnemonic( menu_bar, "Hidden" );
1590 if ( g_PrefsDlg.m_bDetachableMenus ) {
1591 menu_tearoff( menu );
1594 gtk_widget_hide( gtk_menu_get_attach_widget( GTK_MENU( menu ) ) );
1596 create_menu_item_with_mnemonic( menu, "BendMode", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_BEND );
1597 create_menu_item_with_mnemonic( menu, "FitTexture", GTK_SIGNAL_FUNC( HandleCommand ), IDC_BTN_FACEFIT );
1598 create_menu_item_with_mnemonic( menu, "ViewTextures", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_TEXTURE );
1599 create_menu_item_with_mnemonic( menu, "PatchInspector", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_INSPECTOR );
1600 create_menu_item_with_mnemonic( menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVETEXTUREY );
1601 create_menu_item_with_mnemonic( menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVETEXTUREX );
1602 create_menu_item_with_mnemonic( menu, "IncPatchColumn", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERTCOLUMN );
1603 create_menu_item_with_mnemonic( menu, "IncPatchRow", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERTROW );
1604 create_menu_item_with_mnemonic( menu, "DecPatchColumn", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETECOLUMN );
1605 create_menu_item_with_mnemonic( menu, "DecPatchRow", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETEROW );
1606 create_menu_item_with_mnemonic( menu, "Patch TAB", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_TAB );
1607 create_menu_item_with_mnemonic( menu, "Patch TAB", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_TAB );
1608 create_menu_item_with_mnemonic( menu, "SelectNudgeDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEDOWN );
1609 create_menu_item_with_mnemonic( menu, "CameraForward", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_FORWARD );
1610 create_menu_item_with_mnemonic( menu, "CameraBack", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_BACK );
1611 create_menu_item_with_mnemonic( menu, "CameraLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_LEFT );
1612 create_menu_item_with_mnemonic( menu, "CameraRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_RIGHT );
1613 create_menu_item_with_mnemonic( menu, "CameraUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_UP );
1614 create_menu_item_with_mnemonic( menu, "CameraDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_DOWN );
1615 create_menu_item_with_mnemonic( menu, "CameraAngleUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_ANGLEUP );
1616 create_menu_item_with_mnemonic( menu, "CameraAngleDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_ANGLEDOWN );
1617 create_menu_item_with_mnemonic( menu, "CameraStrafeRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_STRAFERIGHT );
1618 create_menu_item_with_mnemonic( menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_STRAFELEFT );
1619 create_menu_item_with_mnemonic( menu, "ToggleGrid", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_TOGGLE );
1620 create_menu_item_with_mnemonic( menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CROSSHAIR );
1621 create_menu_item_with_mnemonic( menu, "ToggleRealtime", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CAMERAUPDATE );
1622 create_menu_item_with_mnemonic( menu, "MouseRotate", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_MOUSEROTATE );
1623 create_menu_item_with_mnemonic( menu, "TexRotateClock", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_ROTATECLOCK );
1624 create_menu_item_with_mnemonic( menu, "TexRotateCounter", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_ROTATECOUNTER );
1625 create_menu_item_with_mnemonic( menu, "TexScaleUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALEUP );
1626 create_menu_item_with_mnemonic( menu, "TexScaleDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALEDOWN );
1627 create_menu_item_with_mnemonic( menu, "TexShiftLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTLEFT );
1628 create_menu_item_with_mnemonic( menu, "TexShiftRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTRIGHT );
1629 create_menu_item_with_mnemonic( menu, "TexShiftUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTUP );
1630 create_menu_item_with_mnemonic( menu, "TexShiftDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTDOWN );
1631 create_menu_item_with_mnemonic( menu, "GridDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_PREV );
1632 create_menu_item_with_mnemonic( menu, "GridUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_NEXT );
1633 create_menu_item_with_mnemonic( menu, "TexScaleLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALELEFT );
1634 create_menu_item_with_mnemonic( menu, "TexScaleRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALERIGHT );
1635 create_menu_item_with_mnemonic( menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MOVEDOWN );
1636 create_menu_item_with_mnemonic( menu, "MoveSelectionUP", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MOVEUP );
1637 create_menu_item_with_mnemonic( menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_PRINT );
1638 create_menu_item_with_mnemonic( menu, "ToggleSizePaint", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TOGGLESIZEPAINT );
1639 create_menu_item_with_mnemonic( menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGELEFT );
1640 create_menu_item_with_mnemonic( menu, "SelectNudgeRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGERIGHT );
1641 create_menu_item_with_mnemonic( menu, "SelectNudgeUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEUP );
1642 create_menu_item_with_mnemonic( menu, "NaturalizePatch", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_NATURALIZE );
1643 create_menu_item_with_mnemonic( menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_SNAPTOGRID );
1644 create_menu_item_with_mnemonic( menu, "SelectAllOfType", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_ALL );
1645 create_menu_item_with_mnemonic( menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_OUTLINESTYLE );
1646 create_menu_item_with_mnemonic( menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREWINDOW_SCALEUP );
1647 create_menu_item_with_mnemonic( menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREWINDOW_SCALEDOWN );
1649 g_bIgnoreCommands--;
1652 void MainFrame::create_main_toolbar( GtkWidget *window, GtkWidget *vbox ){
1653 GtkWidget *handle_box, *toolbar, *w;
1655 handle_box = gtk_handle_box_new();
1656 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
1657 gtk_widget_show( handle_box );
1658 g_object_set_data( G_OBJECT( window ), "tb_handle_box", handle_box );
1660 toolbar = gtk_toolbar_new();
1661 gtk_toolbar_set_orientation( GTK_TOOLBAR( toolbar ), GTK_ORIENTATION_HORIZONTAL );
1662 gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
1663 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1664 gtk_container_add( GTK_CONTAINER( handle_box ), toolbar );
1666 gtk_widget_show( toolbar );
1668 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), _( "Open" ), _( "Open an existing map" ), "",
1669 new_pixmap( window, "file_open.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1670 GINT_TO_POINTER( ID_FILE_OPEN ) );
1671 g_object_set_data( G_OBJECT( window ), "tb_file_open", w );
1672 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), _( "Save" ), _( "Save the active map" ), "",
1673 new_pixmap( window, "file_save.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1674 GINT_TO_POINTER( ID_FILE_SAVE ) );
1675 g_object_set_data( G_OBJECT( window ), "tb_file_save", w );
1676 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1677 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "x-axis Flip" ), "",
1678 new_pixmap( window, "brush_flipx.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1679 GINT_TO_POINTER( ID_BRUSH_FLIPX ) );
1680 g_object_set_data( G_OBJECT( window ), "tb_brush_flipx", w );
1681 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "x-axis Rotate" ), "",
1682 new_pixmap( window, "brush_rotatex.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1683 GINT_TO_POINTER( ID_BRUSH_ROTATEX ) );
1684 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatex", w );
1685 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "y-axis Flip" ), "",
1686 new_pixmap( window, "brush_flipy.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1687 GINT_TO_POINTER( ID_BRUSH_FLIPY ) );
1688 g_object_set_data( G_OBJECT( window ), "tb_brush_flipy", w );
1689 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "y-axis Rotate" ), "",
1690 new_pixmap( window, "brush_rotatey.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1691 GINT_TO_POINTER( ID_BRUSH_ROTATEY ) );
1692 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatey", w );
1693 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "z-axis Flip" ), "",
1694 new_pixmap( window, "brush_flipz.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1695 GINT_TO_POINTER( ID_BRUSH_FLIPZ ) );
1696 g_object_set_data( G_OBJECT( window ), "tb_brush_flipz", w );
1697 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "z-axis Rotate" ), "",
1698 new_pixmap( window, "brush_rotatez.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1699 GINT_TO_POINTER( ID_BRUSH_ROTATEZ ) );
1700 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatez", w );
1701 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1703 if ( g_PrefsDlg.m_bWideToolbar ) {
1704 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Complete Tall" ), "",
1705 new_pixmap( window, "selection_selectcompletetall.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1706 GINT_TO_POINTER( ID_SELECTION_SELECTCOMPLETETALL ) );
1707 g_object_set_data( G_OBJECT( window ), "tb_selection_selectcompletetall", w );
1708 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Touching" ), "",
1709 new_pixmap( window, "selection_selecttouching.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1710 GINT_TO_POINTER( ID_SELECTION_SELECTTOUCHING ) );
1711 g_object_set_data( G_OBJECT( window ), "tb_selection_selecttouching", w );
1712 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Partial Tall" ), "",
1713 new_pixmap( window, "selection_selectpartialtall.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1714 GINT_TO_POINTER( ID_SELECTION_SELECTPARTIALTALL ) );
1715 g_object_set_data( G_OBJECT( window ), "tb_selection_selectpartialtall", w );
1716 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Inside" ), "",
1717 new_pixmap( window, "selection_selectinside.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1718 GINT_TO_POINTER( ID_SELECTION_SELECTINSIDE ) );
1719 g_object_set_data( G_OBJECT( window ), "tb_selection_selectinside", w );
1723 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Selection" ), "",
1724 new_pixmap( window, "popup_selection.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1725 GINT_TO_POINTER( ID_POPUP_SELECTION ) );
1726 g_object_set_data( G_OBJECT( window ), "tb_popup_selection", w );
1728 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1730 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "CSG Subtract" ), "",
1731 new_pixmap( window, "selection_csgsubtract.bmp" ),
1732 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_CSGSUBTRACT ) );
1733 g_object_set_data( G_OBJECT( window ), "tb_selection_csgsubtract", w );
1735 if ( g_PrefsDlg.m_bWideToolbar ) {
1736 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "CSG Merge" ), "",
1737 new_pixmap( window, "selection_csgmerge.bmp" ),
1738 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_CSGMERGE ) );
1739 g_object_set_data( G_OBJECT( window ), "tb_selection_csgmerge", w );
1742 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Hollow" ), "",
1743 new_pixmap( window, "selection_makehollow.bmp" ),
1744 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_MAKEHOLLOW ) );
1745 g_object_set_data( G_OBJECT( window ), "tb_selection_makehollow", w );
1747 if ( g_PrefsDlg.m_bWideToolbar ) {
1748 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1749 "", _( "Clipper" ), "", new_pixmap( window, "view_clipper.bmp" ),
1750 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CLIPPER ) );
1751 g_object_set_data( G_OBJECT( window ), "tb_view_clipper", w );
1754 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1756 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Change views" ), "",
1757 new_pixmap( window, "view_change.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1758 GINT_TO_POINTER( ID_VIEW_CHANGE ) );
1759 g_object_set_data( G_OBJECT( window ), "tb_view_change", w );
1761 if ( !g_PrefsDlg.m_bWideToolbar ) {
1762 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1765 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Texture view mode" ), "",
1766 new_pixmap( window, "textures_popup.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1767 GINT_TO_POINTER( ID_TEXTURES_POPUP ) );
1768 g_object_set_data( G_OBJECT( window ), "tb_textures_popup", w );
1770 if ( g_PrefsDlg.m_bWideToolbar ) {
1771 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1772 "", _( "Cubic clip the camera view" ), "",
1773 new_pixmap( window, "view_cubicclipping.bmp" ),
1774 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CUBICCLIPPING ) );
1775 g_object_set_data( G_OBJECT( window ), "tb_view_cubicclipping", w );
1778 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1780 if ( !g_PrefsDlg.m_bWideToolbar ) {
1781 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1782 "", _( "Camera preview" ), "", new_pixmap( window, "view_cameratoggle.bmp" ),
1783 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CAMERATOGGLE ) );
1784 g_object_set_data( G_OBJECT( window ), "tb_view_cameratoggle", w );
1785 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", "Update Camera", "",
1786 new_pixmap( window, "view_cameraupdate.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1787 GINT_TO_POINTER( ID_VIEW_CAMERAUPDATE ) );
1788 g_object_set_data( G_OBJECT( window ), "tb_view_cameraupdate", w );
1789 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1790 "", _( "Cubic clip the camera view" ), "",
1791 new_pixmap( window, "view_cubicclipping.bmp" ),
1792 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CUBICCLIPPING ) );
1793 g_object_set_data( G_OBJECT( window ), "tb_view_cubicclipping", w );
1794 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1795 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1796 "", _( "Entity inspector" ), "", new_pixmap( window, "view_entity.bmp" ),
1797 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_ENTITY ) );
1798 g_object_set_data( G_OBJECT( window ), "tb_view_entity", w );
1799 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1800 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1801 "", _( "Clipper" ), "", new_pixmap( window, "view_clipper.bmp" ),
1802 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CLIPPER ) );
1803 g_object_set_data( G_OBJECT( window ), "tb_view_clipper", w );
1804 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1807 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1808 "", _( "Free Rotation" ), "", new_pixmap( window, "select_mouserotate.bmp" ),
1809 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECT_MOUSEROTATE ) );
1810 g_object_set_data( G_OBJECT( window ), "tb_select_mouserotate", w );
1811 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1812 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1813 "", _( "Free Scaling" ), "", new_pixmap( window, "select_mousescale.bmp" ),
1814 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECT_MOUSESCALE ) );
1815 g_object_set_data( G_OBJECT( window ), "tb_select_mousescale", w );
1816 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1817 "", _( "Scale X" ), "", new_pixmap( window, "scalelockx.bmp" ),
1818 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKX ) );
1819 g_object_set_data( G_OBJECT( window ), "tb_scalelockx", w );
1820 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1821 "", _( "Scale Y" ), "", new_pixmap( window, "scalelocky.bmp" ),
1822 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKY ) );
1823 g_object_set_data( G_OBJECT( window ), "tb_scalelocky", w );
1824 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1825 "", _( "Scale Z" ), "", new_pixmap( window, "scalelockz.bmp" ),
1826 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKZ ) );
1827 g_object_set_data( G_OBJECT( window ), "tb_scalelockz", w );
1829 if ( g_PrefsDlg.m_bWideToolbar ) {
1830 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1831 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1832 "", _( "Don't select model brushes" ), "",
1833 new_pixmap( window, "dontselectmodel.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1834 GINT_TO_POINTER( ID_DONTSELECTMODEL ) );
1835 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1836 g_object_set_data( G_OBJECT( window ), "tb_dontselectmodel", w );
1838 if ( !g_pGameDescription->mNoPatch ) {
1839 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1840 "", _( "Don't select curved brushes" ), "",
1841 new_pixmap( window, "dontselectcurve.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1842 GINT_TO_POINTER( ID_DONTSELECTCURVE ) );
1843 g_object_set_data( G_OBJECT( window ), "tb_dontselectcurve", w );
1847 // bug #292, patch toolbar option
1848 if ( g_PrefsDlg.m_bPatchToolbar ) {
1849 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1850 "", _( "Show patch bounding box" ), "",
1851 new_pixmap( window, "patch_showboundingbox.bmp" ),
1852 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_PATCH_SHOWBOUNDINGBOX ) );
1853 g_object_set_data( G_OBJECT( window ), "tb_patch_showboundingbox", w );
1854 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855 "", _( "Show patches as wireframes" ), "",
1856 new_pixmap( window, "patch_wireframe.bmp" ),
1857 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_PATCH_WIREFRAME ) );
1858 g_object_set_data( G_OBJECT( window ), "tb_patch_wireframe", w );
1859 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860 "", _( "Patch Bend mode" ), "",
1861 new_pixmap( window, "patch_bend.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1862 GINT_TO_POINTER( ID_PATCH_BEND ) );
1863 g_object_set_data( G_OBJECT( window ), "tb_patch_bend", w );
1864 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Put caps on the current patch" ), "",
1865 new_pixmap( window, "curve_cap.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1866 GINT_TO_POINTER( ID_CURVE_CAP ) );
1867 g_object_set_data( G_OBJECT( window ), "tb_curve_cap", w );
1868 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1869 "", _( "Welds equal patch points during moves" ), "",
1870 new_pixmap( window, "patch_weld.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1871 GINT_TO_POINTER( ID_PATCH_WELD ) );
1872 g_object_set_data( G_OBJECT( window ), "tb_patch_weld", w );
1873 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874 "", _( "Selects drill down rows and columns" ), "",
1875 new_pixmap( window, "patch_drilldown.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1876 GINT_TO_POINTER( ID_PATCH_DRILLDOWN ) );
1877 g_object_set_data( G_OBJECT( window ), "tb_patch_drilldown", w );
1880 if ( g_PrefsDlg.m_bWideToolbar ) {
1881 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1882 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Show Entities as" ), "",
1883 new_pixmap( window, "show_entities.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1884 GINT_TO_POINTER( ID_SHOW_ENTITIES ) );
1885 g_object_set_data( G_OBJECT( window ), "tb_show_entities", w );
1891 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1892 gtk_widget_hide (w);
1893 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1894 gtk_widget_hide (w);
1895 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1896 gtk_widget_hide (w);
1897 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1898 gtk_widget_hide (w);
1902 m_bCamPreview = true;
1903 g_nScaleHow = ( SCALE_X | SCALE_Y | SCALE_Z );
1906 void MainFrame::create_plugin_toolbar( GtkWidget *window, GtkWidget *vbox ){
1907 GtkWidget *handle_box, *toolbar;
1909 handle_box = gtk_handle_box_new();
1910 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
1911 if ( g_PrefsDlg.m_bPluginToolbar ) {
1912 gtk_widget_show( handle_box );
1914 g_object_set_data( G_OBJECT( window ), "tb_handle_box", handle_box );
1916 toolbar = gtk_toolbar_new();
1917 gtk_toolbar_set_orientation( GTK_TOOLBAR( toolbar ), GTK_ORIENTATION_HORIZONTAL );
1918 gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
1919 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1920 gtk_container_add( GTK_CONTAINER( handle_box ), toolbar );
1921 g_object_set_data( G_OBJECT( window ), "toolbar_plugin", toolbar );
1922 gtk_widget_show( toolbar );
1925 void MainFrame::create_main_statusbar( GtkWidget *window, GtkWidget *vbox ){
1926 GtkWidget *hbox, *hbox1;
1930 hbox = gtk_hbox_new( FALSE, 0 );
1931 gtk_widget_show( hbox );
1932 gtk_widget_set_usize( hbox, -1, 24 );
1933 gtk_container_border_width( GTK_CONTAINER( hbox ), 1 );
1934 gtk_box_pack_end( GTK_BOX( vbox ), hbox, FALSE, TRUE, 2 );
1936 frame = gtk_frame_new( (char*)NULL );
1937 gtk_widget_show( frame );
1938 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
1939 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
1941 hbox1 = gtk_hbox_new( FALSE, 0 );
1942 gtk_container_add( GTK_CONTAINER( frame ), hbox1 );
1943 gtk_container_border_width( GTK_CONTAINER( hbox1 ), 0 );
1944 gtk_widget_show( hbox1 );
1946 label = gtk_label_new( _( " Label " ) );
1947 gtk_widget_show( label );
1948 gtk_box_pack_start( GTK_BOX( hbox1 ), label, FALSE, TRUE, 0 );
1949 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1950 gtk_misc_set_padding( GTK_MISC( label ), 3, 0 );
1951 m_pStatusLabel[0] = label;
1953 for ( int i = 1; i < 6; i++ )
1955 frame = gtk_frame_new( (char*)NULL );
1956 gtk_widget_show( frame );
1957 gtk_box_pack_start( GTK_BOX( hbox ), frame, FALSE, TRUE, 0 );
1958 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
1960 label = gtk_label_new( _( " Label " ) );
1961 gtk_widget_show( label );
1962 gtk_container_add( GTK_CONTAINER( frame ), label );
1963 m_pStatusLabel[i] = label;
1968 static gint mainframe_idle( gpointer user_data ){
1969 g_pParentWnd->RoutineProcessing();
1973 static void Sys_Iconify( GtkWidget *w );
1974 static void Sys_Restore( GtkWidget *w );
1976 inline void CHECK_RESTORE( GtkWidget* w ){
1977 if ( g_object_get_data( G_OBJECT( w ), "was_mapped" ) != NULL ) {
1978 gtk_widget_show( w );
1983 // this is called when the window is restored from the iconified state
1984 static void mainframe_map( GtkWidget *widget ){
1985 if ( g_pParentWnd->IsSleeping() ) {
1986 g_pParentWnd->OnSleep();
1989 if ( ( g_pParentWnd->CurrentStyle() == MainFrame::eFloating ) && ( widget == g_pParentWnd->m_pWidget ) ) {
1990 // restore previously visible windows
1991 CHECK_RESTORE( g_pParentWnd->GetCamWnd()->m_pParent );
1992 if ( g_PrefsDlg.m_bFloatingZ ) {
1993 CHECK_RESTORE( g_pParentWnd->GetZWnd()->m_pParent );
1995 CHECK_RESTORE( g_pParentWnd->GetXYWnd()->m_pParent );
1996 CHECK_RESTORE( g_pParentWnd->GetXZWnd()->m_pParent );
1997 CHECK_RESTORE( g_pParentWnd->GetYZWnd()->m_pParent );
1998 CHECK_RESTORE( g_pGroupDlg->m_pWidget );
2002 inline void CHECK_MINIMIZE( GtkWidget* w ){
2003 g_object_set_data( G_OBJECT( w ), "was_mapped", (void*)( GTK_WIDGET_VISIBLE( w ) != 0 ) );
2004 gtk_widget_hide( w );
2007 static void mainframe_unmap( GtkWidget *widget ){
2009 if ( ( g_pParentWnd->CurrentStyle() == MainFrame::eFloating ) && ( widget == g_pParentWnd->m_pWidget ) ) {
2010 // minimize all other windows when the main window is minimized
2011 CHECK_MINIMIZE( g_pParentWnd->GetCamWnd()->m_pParent );
2012 if ( g_PrefsDlg.m_bFloatingZ ) {
2013 CHECK_MINIMIZE( g_pParentWnd->GetZWnd()->m_pParent );
2015 CHECK_MINIMIZE( g_pParentWnd->GetXYWnd()->m_pParent );
2016 CHECK_MINIMIZE( g_pParentWnd->GetXZWnd()->m_pParent );
2017 CHECK_MINIMIZE( g_pParentWnd->GetYZWnd()->m_pParent );
2018 CHECK_MINIMIZE( g_pGroupDlg->m_pWidget );
2022 static GtkWidget* create_floating( MainFrame* mainframe ){
2023 GtkWidget *wnd = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2024 //workaround for a bug with set_transient_for in GTK - resulting behaviour is not perfect but better than the bug.
2025 //(see https://bugzilla.gnome.org/show_bug.cgi?id=658975 regarding the bug)
2026 if (mainframe->CurrentStyle() != MainFrame::eFloating)
2027 gtk_window_set_transient_for( GTK_WINDOW( wnd ), GTK_WINDOW( mainframe->m_pWidget ) );
2028 gtk_widget_set_events( wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2029 gtk_signal_connect( GTK_OBJECT( wnd ), "delete_event", GTK_SIGNAL_FUNC( widget_delete_hide ), NULL );
2030 gtk_signal_connect( GTK_OBJECT( wnd ), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
2031 gtk_signal_connect( GTK_OBJECT( wnd ), "key_press_event",
2032 GTK_SIGNAL_FUNC( mainframe_keypress ), mainframe );
2033 gtk_signal_connect( GTK_OBJECT( wnd ), "key_release_event",
2034 GTK_SIGNAL_FUNC( mainframe_keyrelease ), mainframe );
2035 gtk_signal_connect( GTK_OBJECT( wnd ), "map_event",
2036 GTK_SIGNAL_FUNC( mainframe_map ), mainframe );
2038 gtk_window_set_default_size( GTK_WINDOW( wnd ), 100, 100 );
2040 #ifdef DBG_WINDOWPOS
2041 Sys_Printf( "create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd );
2047 void console_populate_popup( GtkTextView* textview, GtkMenu* menu, gpointer user_data ){
2048 menu_separator( GTK_WIDGET( menu ) );
2050 GtkWidget* item = gtk_menu_item_new_with_label( _( "Clear" ) );
2051 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( Sys_ClearPrintf ), NULL );
2052 gtk_widget_show( item );
2053 gtk_menu_append( GTK_MENU( menu ), item );
2056 void console_construct( GtkWidget* textview ){
2057 g_signal_connect( G_OBJECT( textview ), "populate-popup", G_CALLBACK( console_populate_popup ), NULL );
2060 extern MemStream g_Clipboard;
2062 void Clipboard_CopyMap(){
2063 g_Clipboard.SetLength( 0 );
2064 Map_Export( &g_Clipboard, "xmap", false, true );
2067 void Clipboard_PasteMap(){
2068 if ( g_Clipboard.GetLength() > 0 ) {
2069 g_Clipboard.Seek( 0, SEEK_SET );
2070 Map_Import( &g_Clipboard, "xmap", true );
2075 Platform-independent GTK clipboard support.
2076 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2078 #if defined ( __linux__ ) || defined ( __APPLE__ )
2082 RADIANT_CLIPPINGS = 23,
2085 static const GtkTargetEntry clipboard_targets[] = {
2086 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2089 static void clipboard_get( GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner ){
2092 GdkAtom type = GDK_NONE;
2094 len = g_Clipboard.GetLength();
2101 buffer = g_Clipboard.GetBuffer();
2104 if ( info == clipboard_targets[0].info ) {
2105 type = gdk_atom_intern( clipboard_targets[0].target, FALSE );
2108 gtk_selection_data_set( selection_data, type, 8, buffer, len );
2111 static void clipboard_clear( GtkClipboard *clipboard, gpointer user_data_or_owner ){
2114 static void clipboard_received( GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data ){
2115 g_Clipboard.SetLength( 0 );
2117 if ( data->length < 0 ) {
2118 Sys_FPrintf( SYS_ERR, "Error retrieving selection\n" );
2120 else if ( strcmp( gdk_atom_name( data->type ), clipboard_targets[0].target ) == 0 ) {
2121 g_Clipboard.Write( data->data, data->length );
2124 Clipboard_PasteMap();
2127 void clipboard_copy(){
2128 Clipboard_CopyMap();
2130 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2132 gtk_clipboard_set_with_data( clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL );
2135 void clipboard_paste(){
2136 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2138 gtk_clipboard_request_contents( clipboard, gdk_atom_intern( clipboard_targets[0].target, FALSE ), clipboard_received, NULL );
2142 #elif defined( WIN32 )
2144 void clipboard_copy(){
2145 Clipboard_CopyMap();
2147 bool bClipped = false;
2148 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2149 if ( nClipboard > 0 ) {
2150 if ( ::OpenClipboard( NULL ) ) {
2152 long lSize = g_Clipboard.GetLength();
2153 HANDLE h = ::GlobalAlloc( GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof( long ) );
2155 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2156 memcpy( cp, &lSize, sizeof( long ) );
2157 cp += sizeof( long );
2158 g_Clipboard.Seek( 0, SEEK_SET );
2159 g_Clipboard.Read( cp, lSize );
2160 ::GlobalUnlock( h );
2161 ::SetClipboardData( nClipboard, h );
2169 Sys_Printf( "Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n" );
2173 void clipboard_paste(){
2174 bool bPasted = false;
2175 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2176 if ( nClipboard > 0 && ::OpenClipboard( NULL ) ) {
2177 if ( IsClipboardFormatAvailable( nClipboard ) ) {
2178 HANDLE h = ::GetClipboardData( nClipboard );
2180 g_Clipboard.SetLength( 0 );
2181 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2183 memcpy( &lSize, cp, sizeof( long ) );
2184 cp += sizeof( long );
2185 g_Clipboard.Write( cp, lSize );
2186 ::GlobalUnlock( h );
2192 Clipboard_PasteMap();
2197 void MainFrame::Copy(){
2201 void MainFrame::Paste(){
2203 UpdateSurfaceDialog();
2207 #ifdef DBG_WINDOWPOS
2208 GtkWidget *watchit = NULL;
2210 void CheckWatchit( char *msg ){
2211 static int width = 0;
2212 if ( ( watchit != NULL ) && ( watchit->allocation.width != width ) ) {
2213 Sys_Printf( "CheckWatchit %s: %d\n", msg, watchit->allocation.width );
2214 width = watchit->allocation.width;
2220 BOOL CALLBACK m_pCountMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2221 int *n = (int *) dwData;
2228 struct monitorInfo_s {
2229 GdkRectangle *win_monitors;
2233 BOOL CALLBACK m_pEnumMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2234 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2235 GdkRectangle *monitor;
2238 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2240 memset( &lpmi, 0, sizeof( MONITORINFOEX ) );
2241 lpmi.cbSize = sizeof( MONITORINFOEX );
2243 GetMonitorInfo( hMonitor, &lpmi );
2245 if ( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2248 SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0 );
2249 monitor->x = rect.left;
2250 monitor->y = rect.top;
2251 monitor->width = rect.right - rect.left;
2252 monitor->height = rect.bottom - rect.top;
2254 if ( monitorInfo->i_win_mon != 0 ) {
2255 GdkRectangle temp = *monitor;
2256 *monitor = monitorInfo->win_monitors[0];
2257 monitorInfo->win_monitors[0] = temp;
2261 monitor->x = lpmi.rcMonitor.left;
2262 monitor->y = lpmi.rcMonitor.top;
2263 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2264 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2267 monitorInfo->i_win_mon++;
2272 void PositionWindowOnPrimaryScreen( window_position_t& position ){
2273 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2275 if ( position.x <= primaryMonitorRect.x + 6 ) {
2276 position.x = primaryMonitorRect.x + 6;
2278 else if ( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 ) {
2279 position.x = primaryMonitorRect.x + 6;
2282 if ( position.y <= primaryMonitorRect.y + 6 ) {
2283 position.y = primaryMonitorRect.y + 6;
2285 else if ( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 ) {
2286 position.y = primaryMonitorRect.y + 6;
2289 if ( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 ) {
2290 position.w = primaryMonitorRect.width - 18;
2292 if ( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 ) {
2293 position.h = primaryMonitorRect.height - 18;
2298 GtkWidget* create_framed_widget( GtkWidget* widget ){
2299 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2300 gtk_widget_show( frame );
2301 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2302 gtk_container_add( GTK_CONTAINER( frame ), widget );
2303 gtk_widget_show( widget );
2307 gboolean entry_focus_in( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2308 gtk_window_remove_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2312 gboolean entry_focus_out( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2313 gtk_window_add_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2317 GtkWidget* create_framed_texwnd( TexWnd* texwnd ){
2318 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2319 gtk_widget_show( frame );
2320 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2322 GtkWidget* hbox = gtk_hbox_new( FALSE, 0 );
2323 gtk_widget_show( hbox );
2324 gtk_container_add( GTK_CONTAINER( frame ), hbox );
2326 GtkWidget* w = gtk_vscrollbar_new( GTK_ADJUSTMENT( gtk_adjustment_new( 0,0,0,1,1,1 ) ) );
2327 gtk_widget_show( w );
2328 gtk_box_pack_end( GTK_BOX( hbox ), w, FALSE, TRUE, 0 );
2329 g_qeglobals_gui.d_texture_scroll = w;
2331 GtkWidget* texbox = gtk_vbox_new( FALSE, 0 );
2332 gtk_widget_show( texbox );
2333 gtk_box_pack_start( GTK_BOX( hbox ), texbox, TRUE, TRUE, 0 );
2335 w = gtk_entry_new();
2336 gtk_box_pack_start( GTK_BOX( texbox ), w, FALSE, FALSE, 0 );
2337 texwnd->m_pFilter = w;
2338 g_signal_connect( G_OBJECT( w ), "focus_in_event", G_CALLBACK( entry_focus_in ), NULL );
2339 g_signal_connect( G_OBJECT( w ), "focus_out_event", G_CALLBACK( entry_focus_out ), NULL );
2341 w = texwnd->GetWidget();
2342 gtk_box_pack_start( GTK_BOX( texbox ), w, TRUE, TRUE, 0 );
2343 gtk_widget_show( w );
2348 static ZWnd *create_floating_zwnd( MainFrame *mainframe ){
2349 ZWnd *pZWnd = new ZWnd();
2350 GtkWidget* wnd = create_floating( mainframe );
2352 gtk_window_set_title( GTK_WINDOW( wnd ), "Z" );
2354 pZWnd->m_pParent = wnd;
2357 GtkWidget* frame = create_framed_widget( pZWnd->GetWidget() );
2358 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2361 gtk_widget_realize( wnd );
2363 // turn OFF minimize and maximize boxes.
2364 // Must be *after* realize, or wnd->window is NULL
2365 // should do the right thing on *nix, need to verify.
2366 gdk_window_set_decorations( wnd->window,
2367 GdkWMDecoration( GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2368 //TODO 50 by observation, will vary depending on decoration sizes
2370 GdkGeometry geometry;
2371 geometry.min_width = 50;
2372 //we only care about width, but have to set this too, or get nasty bugs
2373 geometry.min_height = 10;
2374 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE );
2378 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2379 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2382 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posZWnd );
2384 if ( g_PrefsDlg.m_bZVis ) {
2385 gtk_widget_show( wnd );
2391 static const int gutter = 12;
2393 void MainFrame::Create(){
2394 GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2396 gtk_widget_set_events( window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2397 gtk_signal_connect( GTK_OBJECT( window ), "delete_event",
2398 GTK_SIGNAL_FUNC( mainframe_delete ), this );
2399 gtk_signal_connect( GTK_OBJECT( window ), "destroy",
2400 GTK_SIGNAL_FUNC( mainframe_destroy ), this );
2401 gtk_signal_connect( GTK_OBJECT( window ), "key_press_event",
2402 GTK_SIGNAL_FUNC( mainframe_keypress ), this );
2403 gtk_signal_connect( GTK_OBJECT( window ), "key_release_event",
2404 GTK_SIGNAL_FUNC( mainframe_keyrelease ), this );
2405 gtk_signal_connect( GTK_OBJECT( window ), "map_event",
2406 GTK_SIGNAL_FUNC( mainframe_map ), this );
2407 gtk_signal_connect( GTK_OBJECT( window ), "unmap_event",
2408 GTK_SIGNAL_FUNC( mainframe_unmap ), this );
2410 g_qeglobals_gui.d_main_window = window;
2413 // calculate gdk offset
2414 int n_win_monitors = 0;
2416 monitorInfo_s monitorInfo;
2418 // detect multiple monitors
2419 EnumDisplayMonitors( NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>( &n_win_monitors ) );
2421 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2422 monitorInfo.i_win_mon = 0;
2423 EnumDisplayMonitors( NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>( &monitorInfo ) );
2425 gdk_offset_x = G_MININT;
2426 gdk_offset_y = G_MININT;
2429 for ( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2430 gdk_offset_x = MAX( gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x );
2431 gdk_offset_y = MAX( gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y );
2434 Sys_Printf( "GDK's coordinate system is offset by %d over the x-axis and %d over the y-axis from Windows' coordinate system.\n", gdk_offset_x, gdk_offset_y );
2436 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2438 GdkDisplay *display;
2440 gint n_gdk_monitors = 0;
2444 // detect multiple monitors
2445 display = gdk_display_get_default();
2446 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name( display ), gdk_display_get_n_screens( display ) );
2448 screen = gdk_display_get_screen( display, 1 );
2449 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2451 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2453 for ( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2454 memset( &rect, 0, sizeof( rect ) );
2455 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2456 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2459 memcpy( &primaryMonitorRect, &rect, sizeof( primaryMonitorRect ) );
2463 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2466 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2467 primaryMonitorRect.width = gdk_screen_width();
2468 primaryMonitorRect.height = gdk_screen_height();
2473 load_window_pos( window, g_PrefsDlg.mWindowInfo.position );
2475 GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
2476 gtk_container_add( GTK_CONTAINER( window ), vbox );
2477 gtk_widget_show( vbox );
2479 create_main_menu( window, vbox );
2481 create_main_toolbar( window, vbox );
2482 create_plugin_toolbar( window,vbox );
2484 m_nCurrentStyle = g_PrefsDlg.m_nView;
2486 g_pGroupDlg->Create();
2491 gtk_widget_show( window );
2493 // not needed on win32, it's in the .rc
2498 load_pixmap( "icon.bmp", window, &pixmap, &mask );
2499 gdk_window_set_icon( window->window, NULL, pixmap, mask );
2503 if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) {
2505 GtkWidget* vsplit = gtk_vpaned_new();
2506 m_pSplits[0] = vsplit;
2507 gtk_box_pack_start( GTK_BOX( vbox ), vsplit, TRUE, TRUE, 0 );
2508 gtk_widget_show( vsplit );
2511 GtkWidget* hsplit = gtk_hpaned_new();
2512 m_pSplits[2] = hsplit;
2513 gtk_paned_add1( GTK_PANED( vsplit ), hsplit );
2514 gtk_widget_show( hsplit );
2517 GtkWidget* hsplit2 = gtk_hpaned_new();
2518 m_pSplits[3] = hsplit2;
2519 gtk_paned_add2( GTK_PANED( hsplit ), hsplit2 );
2520 gtk_widget_show( hsplit2 );
2523 GtkWidget* vsplit2 = gtk_vpaned_new();
2524 m_pSplits[1] = vsplit2;
2525 if ( CurrentStyle() == eRegular ) {
2526 gtk_paned_add2( GTK_PANED( hsplit2 ), vsplit2 );
2529 gtk_paned_add1( GTK_PANED( hsplit ), vsplit2 );
2531 gtk_widget_show( vsplit2 );
2534 m_pCamWnd = new CamWnd();
2536 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2537 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2541 m_pXYWnd = new XYWnd();
2542 m_pXYWnd->SetViewType( XY );
2544 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2545 gtk_paned_add1( GTK_PANED( hsplit2 ), frame );
2549 m_pZWnd = new ZWnd();
2551 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2552 if ( CurrentStyle() == eRegular ) {
2553 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2556 gtk_paned_add2( GTK_PANED( hsplit2 ), frame );
2561 m_pTexWnd = new TexWnd();
2563 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2564 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2569 GtkWidget* scr = gtk_scrolled_window_new( NULL, NULL );
2570 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
2571 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
2572 gtk_widget_show( scr );
2573 gtk_paned_pack2( GTK_PANED( vsplit ), scr, FALSE, TRUE );
2576 GtkWidget* text = gtk_text_view_new();
2577 gtk_widget_set_size_request( text, 0, -1 ); // allow shrinking
2578 gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( text ), GTK_WRAP_WORD );
2579 gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
2580 gtk_container_add( GTK_CONTAINER( scr ), text );
2581 gtk_widget_show( text );
2582 g_qeglobals_gui.d_edit = text;
2590 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nXYHeight + 28 );
2592 if ( CurrentStyle() == eRegular ) {
2593 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nZWidth );
2594 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2598 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nCamWidth );
2599 while ( gtk_events_pending() ) gtk_main_iteration();
2600 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2603 while ( gtk_events_pending() ) gtk_main_iteration();
2605 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), g_PrefsDlg.mWindowInfo.nCamHeight );
2607 else if ( CurrentStyle() == eFloating ) {
2609 GtkWidget* wnd = create_floating( this );
2610 gtk_window_set_title( GTK_WINDOW( wnd ), "Camera" );
2613 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2614 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2617 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posCamWnd );
2619 gtk_widget_show( wnd );
2621 m_pCamWnd = new CamWnd();
2624 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2625 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2628 m_pCamWnd->m_pParent = wnd;
2631 if ( g_PrefsDlg.m_bFloatingZ ) {
2632 m_pZWnd = create_floating_zwnd( this );
2635 GtkWidget* wnd = create_floating( this );
2636 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2639 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2640 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2643 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2645 m_pXYWnd = new XYWnd();
2646 m_pXYWnd->SetViewType( XY );
2649 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2650 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2653 m_pXYWnd->m_pParent = wnd;
2655 gtk_widget_show( wnd );
2660 GtkWidget* wnd = create_floating( this );
2661 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2664 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2665 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2668 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2670 m_pZWnd = new ZWnd();
2671 m_pZWnd->m_pParent = wnd;
2673 m_pXYWnd = new XYWnd();
2674 m_pXYWnd->SetViewType( XY );
2675 m_pXYWnd->m_pParent = wnd;
2679 GtkWidget* hsplit = gtk_hpaned_new();
2680 m_pSplits[0] = hsplit;
2681 gtk_container_add( GTK_CONTAINER( wnd ), hsplit );
2682 gtk_widget_show( hsplit );
2685 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2686 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2689 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2690 gtk_paned_add2( GTK_PANED( hsplit ), frame );
2694 gtk_widget_show( wnd );
2696 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nZFloatWidth );
2700 GtkWidget* wnd = create_floating( this );
2701 gtk_window_set_title( GTK_WINDOW( wnd ), _( "XZ View" ) );
2704 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2705 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2708 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXZWnd );
2710 m_pXZWnd = new XYWnd();
2711 m_pXZWnd->m_pParent = wnd;
2712 m_pXZWnd->SetViewType( XZ );
2715 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2716 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2719 if ( g_PrefsDlg.m_bXZVis ) {
2720 gtk_widget_show( wnd );
2725 GtkWidget* wnd = create_floating( this );
2726 gtk_window_set_title( GTK_WINDOW( wnd ), _( "YZ View" ) );
2729 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2730 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2733 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posYZWnd );
2735 m_pYZWnd = new XYWnd();
2736 m_pYZWnd->m_pParent = wnd;
2737 m_pYZWnd->SetViewType( YZ );
2740 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2741 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2744 if ( g_PrefsDlg.m_bYZVis ) {
2745 gtk_widget_show( wnd );
2749 m_pTexWnd = new TexWnd();
2751 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2752 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2755 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2756 gtk_widget_show( w );
2757 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2761 g_pGroupDlg->Show();
2766 GtkWidget* hsplit = gtk_hpaned_new();
2767 m_pSplits[0] = hsplit;
2768 gtk_box_pack_start( GTK_BOX( vbox ), hsplit, TRUE, TRUE, 0 );
2769 gtk_widget_show( hsplit );
2772 GtkWidget* vsplit1 = gtk_vpaned_new();
2773 m_pSplits[1] = vsplit1;
2774 gtk_paned_add1( GTK_PANED( hsplit ), vsplit1 );
2775 gtk_widget_show( vsplit1 );
2778 GtkWidget* vsplit2 = gtk_vpaned_new();
2779 m_pSplits[2] = vsplit2;
2780 gtk_paned_add2( GTK_PANED( hsplit ), vsplit2 );
2781 gtk_widget_show( vsplit2 );
2783 m_pCamWnd = new CamWnd();
2785 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2786 gtk_paned_add1( GTK_PANED( vsplit1 ), frame );
2789 m_pXYWnd = new XYWnd();
2790 m_pXYWnd->SetViewType( XY );
2792 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2793 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2796 m_pYZWnd = new XYWnd();
2797 m_pYZWnd->SetViewType( YZ );
2799 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2800 gtk_paned_add2( GTK_PANED( vsplit1 ), frame );
2803 m_pXZWnd = new XYWnd();
2804 m_pXZWnd->SetViewType( XZ );
2806 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2807 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2813 // g_qeglobals_gui.d_edit = NULL;
2816 m_pTexWnd = new TexWnd();
2817 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2820 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2821 gtk_widget_show( w );
2822 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2826 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2827 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2828 m_pZWnd = create_floating_zwnd( this );
2830 while ( gtk_events_pending() )
2831 gtk_main_iteration();
2834 int x = GTK_PANED( m_pSplits[0] )->max_position / 2 - gutter;
2835 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), x );
2839 int y = GTK_PANED( m_pSplits[1] )->max_position / 2 - gutter;
2840 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), y );
2841 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), y );
2845 if ( g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED ) {
2846 gtk_window_maximize( GTK_WINDOW( window ) );
2849 gtk_widget_show( window );
2853 if ( m_pXYWnd ) { // this is always true?
2854 m_pXYWnd->SetActive( true );
2856 m_bSplittersOK = true;
2857 Texture_SetMode( g_qeglobals.d_savedinfo.iTexMenu );
2859 g_pParentWnd->OnEntitiesSetViewAs( 0 );
2861 // m_wndTextureBar.Create (vbox);
2862 create_main_statusbar( window, vbox );
2865 ShowMenuItemKeyBindings( window );
2867 if ( g_qeglobals_gui.d_edit != NULL ) {
2868 console_construct( g_qeglobals_gui.d_edit );
2871 // bool load_last = FALSE;
2874 SetButtonMenuStates();
2876 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2878 g_bIgnoreCommands++;
2879 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
2880 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
2881 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaderlistonly" ) );
2882 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
2883 g_bIgnoreCommands--;
2885 // if (g_PrefsDlg.m_bTextureBar)
2886 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2888 SetActiveXY( m_pXYWnd );
2890 s_idle_id = gtk_timeout_add( 25, mainframe_idle, this );
2892 QGL_InitExtensions();
2894 if ( g_PrefsDlg.mLocalPrefs.mbEmpty ) {
2895 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2896 g_PrefsDlg.SavePrefs();
2899 // remove the pid file
2900 remove( g_pidGameFile.GetBuffer() );
2902 Sys_Printf( "Entering message loop\n" );
2906 m_nTimer = gtk_timeout_add( 1000, timer, this );
2909 // =============================================================================
2912 MainFrame::MainFrame(){
2914 m_bSplittersOK = false;
2915 g_pParentWnd = this;
2916 m_pXYWnd = (XYWnd*)NULL;
2918 m_pTexWnd = (TexWnd*)NULL;
2919 m_pZWnd = (ZWnd*)NULL;
2920 m_pYZWnd = (XYWnd*)NULL;
2921 m_pXZWnd = (XYWnd*)NULL;
2922 m_pActiveXY = (XYWnd*)NULL;
2923 m_bCamPreview = true;
2925 for ( int n = 0; n < 6; n++ )
2926 m_pStatusLabel[n] = NULL;
2927 m_bNeedStatusUpdate = false;
2929 m_bSleeping = false;
2933 MainFrame::~MainFrame(){
2934 while ( g_BSPFrontendCommands )
2936 free( g_BSPFrontendCommands->data );
2937 g_BSPFrontendCommands = g_slist_remove( g_BSPFrontendCommands, g_BSPFrontendCommands->data );
2941 void MainFrame::ReleaseContexts(){
2943 m_pXYWnd->DestroyContext();
2946 m_pYZWnd->DestroyContext();
2949 m_pXZWnd->DestroyContext();
2952 m_pCamWnd->DestroyContext();
2955 m_pTexWnd->DestroyContext();
2958 m_pZWnd->DestroyContext();
2962 void MainFrame::CreateContexts(){
2964 m_pCamWnd->CreateContext();
2967 m_pXYWnd->CreateContext();
2970 m_pYZWnd->CreateContext();
2973 m_pXZWnd->CreateContext();
2976 m_pTexWnd->CreateContext();
2979 m_pZWnd->CreateContext();
2983 static void Sys_Iconify( GtkWidget *w ){
2984 // we might not have been realized yet
2985 if ( w->window == NULL ) {
2989 if ( !GTK_WIDGET_MAPPED( w ) ) {
2993 #if defined ( __linux__ ) || defined ( __APPLE__ )
2994 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Iconify\n" );
2996 XWindowAttributes xattr;
2997 GdkWindowPrivate *Private;
2999 Private = (GdkWindowPrivate*)w->window;
3000 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 0 ) );
3002 if ( !Private->destroyed ) {
3003 xattr.map_state = IsUnmapped;
3004 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3006 if ( xattr.map_state != IsUnmapped ) {
3007 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 1 ) );
3010 XIconifyWindow( Private->xdisplay, Private->xwindow, 0 );
3016 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_MINIMIZE );
3020 static void Sys_Restore( GtkWidget *w ){
3021 // we might not have been realized yet
3022 if ( w->window == NULL ) {
3026 if ( !GTK_WIDGET_VISIBLE( w ) ) {
3030 #if defined ( __linux__ ) || defined ( __APPLE__ )
3031 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Restore\n" );
3033 XWindowAttributes xattr;
3034 GdkWindowPrivate *Private;
3036 Private = (GdkWindowPrivate*)w->window;
3038 xattr.map_state = IsUnmapped;
3039 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3041 if ( xattr.map_state == IsUnmapped ) {
3042 XMapRaised( Private->xdisplay, Private->xwindow );
3048 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_RESTORE );
3056 void RefreshModelSkin( GSList **pModels, entitymodel_t *model ){
3057 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3058 // so we avoid the fucked up ones, assuming they are at the end
3059 if ( !model->strSkin ) {
3061 Sys_Printf( "Dropping model %p with empty skin in RefreshModelSkin\n", model );
3064 // and also keeping it so we have an actual count of empty models
3065 g_slist_append( *pModels, model );
3068 // do we have this model already?
3069 if ( g_slist_find( *pModels, model ) ) {
3072 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3073 Sys_Printf( "Already processed model: %p %s\n", model, ( (GString *)model->strSkin )->str );
3077 model->nTextureBind = Texture_LoadSkin( ( (GString *)model->strSkin )->str, &model->nSkinWidth, &model->nSkinHeight );
3078 if ( model->nTextureBind != -1 ) {
3079 Sys_Printf( "LOADED SKIN: %s\n", ( (GString *)model->strSkin )->str );
3082 Sys_Printf( "Load skin failed: %s\n", ( (GString *)model->strSkin )->str );
3084 *pModels = g_slist_append( *pModels, model );
3086 Sys_Printf( "Processed model %p %s\n", model, ( (GString *)model->strSkin )->str );
3090 void MainFrame::OnSleep(){
3092 if ( m_bSleeping ) {
3093 // useful when trying to debug crashes in the sleep code
3094 Sys_Printf( "Going into sleep mode..\n" );
3096 Sys_Printf( "Dispatching sleep msg..." );
3097 DispatchRadiantMsg( RADIANT_SLEEP );
3098 Sys_Printf( "Done.\n" );
3100 if ( CurrentStyle() == eSplit ) {
3101 Sys_Iconify( m_pZWnd->m_pParent );
3104 Sys_Iconify( m_pWidget );
3106 QERApp_FreeShaders();
3107 g_bScreenUpdates = false;
3110 Sys_Printf( "Releasing contexts..." );
3112 Sys_Printf( "Done.\n" );
3114 // free all the skins in the caches
3115 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3116 g_lstSkinCache.RemoveAll();
3120 Sys_Printf( "Waking up\n" );
3121 if ( CurrentStyle() == eSplit ) {
3122 Sys_Restore( m_pZWnd->m_pParent );
3125 Sys_Restore( m_pWidget );
3128 Sys_Printf( "Creating contexts..." );
3130 Sys_Printf( "Done.\n" );
3132 Sys_Printf( "Making current on camera..." );
3133 m_pCamWnd->MakeCurrent();
3134 Sys_Printf( "Done.\n" );
3136 Sys_Printf( "Reloading shaders..." );
3137 // reload the shader scripts and textures
3138 QERApp_ReloadShaders();
3140 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3141 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
3142 Sys_Printf( "Done.\n" );
3144 // rebuild the patches by setting the bDirty flag on them
3145 for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next )
3147 if ( b->patchBrush ) {
3148 b->pPatch->bDirty = true;
3152 Sys_Printf( "Reloading skins..." );
3153 // we have purged all the skins before going to sleep
3154 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3155 // namely, all entitymodel_t
3156 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3157 // (a single eclass_t can reference several entitymodel_t)
3158 // FIXME: and what's up with md3Class then? what is it used for?
3162 GSList *Models = NULL;
3163 for (ent = entities.next; ent != &entities; ent = ent->next)
3165 // if it's a model with skin then the fixedsize flag must be on
3166 // only if there IS a model .. we are not trying to load
3167 if (ent->eclass->fixedsize)
3169 if (ent->eclass->model)
3173 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3175 entitymodel_t *model;
3176 for (model = ent->eclass->model; model; model=model->pNext)
3177 RefreshModelSkin (&Models, model);
3178 } else if (ent->md3Class)
3180 entitymodel_t *model;
3181 for (model = ent->md3Class->model; model; model=model->pNext)
3182 RefreshModelSkin (&Models, model);
3186 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3191 for (e = g_md3Cache; e ; e = e->next)
3193 entitymodel_t *model;
3194 for (model = e->model; model; model=model->pNext)
3195 if (!g_slist_find (Models, model))
3197 Sys_Printf("model %p ", model);
3199 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3201 Sys_Printf("not found in main loop (no skin)\n");
3205 // clean the model list
3206 g_slist_free (Models);
3208 Sys_Printf( "Done.\n" );
3210 g_bScreenUpdates = true;
3212 Sys_Printf( "Dispatching wake msg..." );
3213 DispatchRadiantMsg( RADIANT_WAKEUP );
3214 Sys_Printf( "Done\n" );
3218 void WINAPI QERApp_Sleep(){
3219 g_pParentWnd->OnSleep();
3224 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3225 and not in OnDestroy because the info may be lost already?
3226 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3228 void MainFrame::OnDelete(){
3229 save_window_pos( m_pWidget, g_PrefsDlg.mWindowInfo.position );
3231 // surface inspector and patch inspector
3232 save_window_pos( g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd );
3233 save_window_pos( g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd );
3235 // entity inspector / group dialog
3236 // NOTE TTimo do we have to save a different window depending on the view mode?
3237 save_window_pos( g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd );
3239 if ( g_PrefsDlg.m_bFloatingZ ) {
3240 save_window_pos( m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd );
3243 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED( m_pSplits[0] )->child1_size;
3246 if ( CurrentStyle() == eFloating ) {
3247 save_window_pos( m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd );
3248 save_window_pos( m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd );
3249 save_window_pos( m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd );
3250 save_window_pos( m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd );
3253 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state( g_pParentWnd->m_pWidget->window );
3256 void MainFrame::OnDestroy(){
3257 // shut down console output first
3258 // (we'll still get the info if we are running a log file anyway)
3259 g_qeglobals_gui.d_edit = NULL;
3262 Sys_Printf( "MainFrame::OnDestroy\n" );
3265 gtk_timeout_remove( s_idle_id );
3268 gtk_timeout_remove( m_nTimer );
3271 if ( !g_qeglobals.disable_ini ) {
3272 Sys_Printf( "Start writing prefs\n" );
3273 Sys_Printf( "MRU_Save... " );
3275 Sys_Printf( "OK\n" );
3279 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split1" );
3280 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED( w )->child1_size;
3281 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split2" );
3282 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED( w )->child1_size;
3284 if ( !FloatingGroupDialog() ) {
3285 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3287 vsplit = m_pSplits[0];
3288 vsplit2 = m_pSplits[1];
3289 hsplit = m_pSplits[2];
3290 hsplit2 = m_pSplits[3];
3292 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED( vsplit )->child1_size;
3293 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED( hsplit2 )->child1_size;
3295 if ( CurrentStyle() == eRegular ) {
3296 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED( hsplit )->child1_size;
3299 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED( hsplit )->child1_size;
3302 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED( vsplit2 )->child1_size;
3306 if ( g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit ) {
3307 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
3308 g_PrefsDlg.m_bZVis = TRUE;
3311 g_PrefsDlg.m_bZVis = FALSE;
3315 g_PrefsDlg.SavePrefs();
3316 Sys_Printf( "Done prefs\n" );
3319 // spog - this may be better in another place..
3320 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3321 g_qeglobals.d_savedinfo.filters = FilterListDelete( g_qeglobals.d_savedinfo.filters );
3323 delete m_pXYWnd; m_pXYWnd = NULL;
3324 delete m_pYZWnd; m_pYZWnd = NULL;
3325 delete m_pXZWnd; m_pXZWnd = NULL;
3326 delete m_pZWnd; m_pZWnd = NULL;
3327 delete m_pTexWnd; m_pTexWnd = NULL;
3328 delete m_pCamWnd; m_pCamWnd = NULL;
3330 if ( g_pGroupDlg->m_pWidget ) {
3331 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3332 gtk_widget_destroy( g_pGroupDlg->m_pWidget );
3333 g_pGroupDlg->m_pWidget = NULL;
3336 if ( strcmpi( currentmap, "unnamed.map" ) != 0 ) {
3337 g_PrefsDlg.m_strLastMap = currentmap;
3338 g_PrefsDlg.SavePrefs();
3340 Sys_Printf( "CleanUpEntities..." );
3342 Sys_Printf( "Done.\n" );
3344 Sys_Printf( "Releasing brushes..." );
3345 while ( active_brushes.next != &active_brushes )
3346 Brush_Free( active_brushes.next, false );
3347 while ( selected_brushes.next != &selected_brushes )
3348 Brush_Free( selected_brushes.next, false );
3349 while ( filtered_brushes.next != &filtered_brushes )
3350 Brush_Free( filtered_brushes.next, false );
3351 Sys_Printf( "Done.\n" );
3353 Sys_Printf( "Releasing entities..." );
3354 while ( entities.next != &entities )
3355 Entity_Free( entities.next );
3356 Sys_Printf( "Done.\n" );
3358 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3361 epair_t* pNextEPair = pEPair->next;
3362 free( pEPair->key );
3363 free( pEPair->value );
3365 pEPair = pNextEPair;
3368 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3369 while ( pEntity != NULL && pEntity != g_qeglobals.d_project_entity )
3371 entity_t* pNextEntity = pEntity->next;
3372 Entity_Free( pEntity );
3373 pEntity = pNextEntity;
3376 Sys_Printf( "Freeing world entity..." );
3377 if ( world_entity ) {
3378 Entity_Free( world_entity );
3380 Sys_Printf( "Done.\n" );
3382 Sys_Printf( "Shutdown VFS..." );
3384 Sys_Printf( "Done.\n" );
3386 Sys_Printf( "FreeShaders..." );
3387 QERApp_FreeShaders();
3388 Sys_Printf( "Done.\n" );
3391 // TTimo: now using profile.cpp code
3392 void MainFrame::LoadCommandMap(){
3395 bool bUserCmdList = false;
3397 // verbose a little: count of user commands we recognized
3399 int iOverrideCount = 0;
3403 #if defined ( __linux__ ) || defined ( __APPLE__ )
3404 strINI = g_PrefsDlg.m_rc_path->str;
3405 #elif defined( WIN32 )
3406 strINI = g_strGameToolsPath;
3408 #error "WTF are you compiling this on"
3411 strINI += "shortcuts.ini";
3413 f = fopen( strINI.GetBuffer(), "r" );
3416 // loop through all the commands
3417 for ( int i = 0; i < g_nCommandCount; i++ )
3420 if ( read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ) ) {
3421 if ( !bUserCmdList ) {
3422 Sys_Printf( "Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3423 bUserCmdList = true;
3428 strBuff.TrimRight();
3429 strBuff.MakeLower();
3430 int nSpecial = strBuff.Find( "+alt" );
3431 g_Commands[i].m_nModifiers = 0;
3432 if ( nSpecial >= 0 ) {
3433 g_Commands[i].m_nModifiers |= RAD_ALT;
3434 FindReplace( strBuff, "+alt", "" );
3436 nSpecial = strBuff.Find( "+ctrl" );
3437 if ( nSpecial >= 0 ) {
3438 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3439 FindReplace( strBuff, "+ctrl", "" );
3441 nSpecial = strBuff.Find( "+shift" );
3442 if ( nSpecial >= 0 ) {
3443 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3444 FindReplace( strBuff, "+shift", "" );
3447 strBuff.TrimRight();
3448 strBuff.MakeUpper();
3449 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3451 nLen = strBuff.GetLength();
3452 if ( nLen == 1 ) { // most often case.. deal with first
3453 g_Commands[i].m_nKey = __toascii( strBuff.GetAt( 0 ) );
3458 for ( j = 0; j < g_nKeyCount; j++ )
3460 if ( strBuff.CompareNoCase( g_Keys[j].m_strName ) == 0 ) {
3461 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3466 if ( j == g_nKeyCount ) {
3467 Sys_Printf( "WARNING: failed to parse user command %s\n", value );
3471 // maybe this new shortcut is overriding another one
3472 // then we need to disable the other binded key
3473 for ( j = 0; j < g_nCommandCount; j++ )
3478 if ( g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers ) {
3480 g_Commands[j].m_nKey = 0;
3483 // it's the only one
3489 if ( iOverrideCount ) {
3490 Sys_Printf( "User's command list overrides %d default commands\n", iOverrideCount );
3492 Sys_Printf( "Parsed %d custom shortcuts\n", iCount );
3495 Sys_Printf( "Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer() );
3499 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3500 // we also output the count of commands that are not binded .. dunno if it's much use ..
3501 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3502 void MainFrame::ShowMenuItemKeyBindings( GtkWidget* window ){
3503 //!\todo Find a better way to get the global accelerator group..
3504 GtkAccelGroup *accel = GTK_ACCEL_GROUP( gtk_accel_groups_from_object( G_OBJECT( window ) )->data );
3510 for ( i = 0; i < g_nCommandCount; i++ )
3512 if ( g_Commands[i].m_nKey == 0 ) {
3517 item = g_object_get_data( G_OBJECT( m_pWidget ), g_Commands[i].m_strMenu );
3518 if ( item == NULL ) {
3519 Sys_FPrintf( SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3520 g_Commands[i].m_strCommand );
3525 if ( g_Commands[i].m_nModifiers ) { // are there modifiers present?
3526 if ( g_Commands[i].m_nModifiers & RAD_SHIFT ) {
3527 mods |= GDK_SHIFT_MASK;
3529 if ( g_Commands[i].m_nModifiers & RAD_ALT ) {
3530 mods |= GDK_MOD1_MASK;
3532 if ( g_Commands[i].m_nModifiers & RAD_CONTROL ) {
3533 mods |= GDK_CONTROL_MASK;
3537 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3538 if ( gtk_accelerator_valid( g_Commands[i].m_nKey, (GdkModifierType)mods ) ) {
3540 // NOTE TTimo this is the important place where all the shortcuts are binded
3541 Sys_Printf( "Calling gtk_widget_add_accelerator on command: %s menu: %s key: %d mods: %d\n", g_Commands[i].m_strCommand, g_Commands[i].m_strMenu, g_Commands[i].m_nKey, mods );
3543 gtk_widget_add_accelerator( GTK_WIDGET( item ), "activate", accel, g_Commands[i].m_nKey,
3544 (GdkModifierType)mods, GTK_ACCEL_VISIBLE );
3548 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL( GTK_BIN( item )->child );
3552 g_free( accel_label->accel_string );
3553 accel_label->accel_string = NULL;
3555 gstring = g_string_new( accel_label->accel_string );
3556 g_string_append( gstring, " " );
3559 if ( mods & GDK_SHIFT_MASK ) {
3560 g_string_append( gstring, "Shft" );
3563 if ( mods & GDK_CONTROL_MASK ) {
3565 g_string_append( gstring, "+" );
3567 g_string_append( gstring, "Ctl" );
3570 if ( mods & GDK_MOD1_MASK ) {
3572 g_string_append( gstring, "+" );
3574 g_string_append( gstring, "Alt" );
3579 g_string_append( gstring, "+" );
3581 if ( g_Commands[i].m_nKey < 0x80 || ( g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff ) ) {
3582 switch ( g_Commands[i].m_nKey )
3585 g_string_append( gstring, "Space" );
3588 g_string_append( gstring, "Backslash" );
3591 g_string_append_c( gstring, toupper( g_Commands[i].m_nKey ) );
3599 tmp = gtk_accelerator_name( g_Commands[i].m_nKey, (GdkModifierType)0 );
3600 if ( tmp[0] != 0 && tmp[1] == 0 ) {
3601 tmp[0] = toupper( tmp[0] );
3603 g_string_append( gstring, tmp );
3607 g_free( accel_label->accel_string );
3608 accel_label->accel_string = gstring->str;
3609 g_string_free( gstring, FALSE );
3611 if ( !accel_label->accel_string ) {
3612 accel_label->accel_string = g_strdup( "" );
3615 gtk_widget_queue_resize( GTK_WIDGET( accel_label ) );
3620 Sys_Printf( "%d commands not bound to a key\n", iCount );
3624 void MainFrame::CreateQEChildren(){
3625 // load the project file
3627 Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
3628 if ( !QE_LoadProject( g_argv[1] ) ) {
3629 Error( "Unable to load project file %s\n", g_argv[1] );
3634 const char* filename = NULL;
3637 bool bTriedTemplate = false;
3639 if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
3640 // we need to regenerate from template
3641 Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
3642 g_PrefsDlg.m_strLastProject = "";
3645 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3647 while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
3649 if ( !bTriedTemplate ) {
3650 // try default project location
3651 bTriedTemplate = true;
3652 // for all OSes, we look for the template in the base installation (no homepath here)
3653 strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
3654 strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
3655 strcat( buf, "/scripts/" );
3656 strcat( buf, PROJECT_TEMPLATE_NAME );
3661 gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
3663 filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
3664 if ( filename != NULL ) {
3668 Error( "Cannot continue without loading a project..." );
3677 void MainFrame::OnTimer(){
3678 GdkModifierType mask;
3680 gdk_window_get_pointer( NULL, NULL, NULL, &mask );
3682 if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
3683 QE_CountBrushesAndUpdateStatusBar();
3687 // see MainFrame::UpdateStatusText below
3688 if ( m_bNeedStatusUpdate ) {
3689 for ( int n = 0; n < 6; n++ )
3691 if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
3692 gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
3695 m_bNeedStatusUpdate = false;
3699 void MainFrame::UpdateStatusText(){
3700 m_bNeedStatusUpdate = true;
3703 void MainFrame::SetStatusText( int nPane, const char* pText ){
3704 if ( pText && nPane <= 5 && nPane >= 0 ) {
3705 m_strStatus[nPane] = pText;
3709 void MainFrame::SetButtonMenuStates(){
3711 g_bIgnoreCommands++;
3713 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
3714 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
3715 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
3716 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
3717 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
3718 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
3719 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
3720 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
3721 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
3722 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
3723 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
3724 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
3725 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3726 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3727 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
3728 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3729 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3730 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3731 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3732 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3733 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3734 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
3735 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3736 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
3737 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
3738 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3739 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
3740 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
3741 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3742 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
3743 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
3744 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3745 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
3746 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
3747 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3748 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
3749 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
3750 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3751 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
3752 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
3753 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3754 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
3755 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
3756 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3757 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
3758 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
3759 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3760 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
3761 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
3762 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3763 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
3764 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3765 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3766 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3767 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3768 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3769 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3770 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
3771 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3772 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
3773 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
3774 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3775 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
3776 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
3777 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3778 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
3779 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
3780 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3781 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
3782 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
3783 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3784 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
3785 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
3786 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3787 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
3788 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
3789 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
3790 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
3791 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
3792 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
3793 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3794 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
3795 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
3796 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
3797 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
3799 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
3800 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3801 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
3802 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
3804 if ( !g_pGameDescription->mNoPatch ) {
3805 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
3806 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
3808 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
3809 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
3810 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
3811 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
3812 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
3813 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
3816 int id, n = g_PrefsDlg.m_nTextureScale;
3819 case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3820 case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3821 case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3822 case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3823 default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3825 SetTextureScale( id );
3827 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3829 if (g_qeglobals.d_project_entity)
3831 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3835 g_bIgnoreCommands--;
3838 void MainFrame::UpdateWindows( int nBits ){
3839 if ( !g_bScreenUpdates ) {
3842 #ifdef DBG_WINDOWPOS
3843 static int bean_count = 0;
3845 sprintf( bean_buf,"UpdateWindows %d",bean_count );
3846 CheckWatchit( bean_buf );
3850 if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
3852 m_pXYWnd->RedrawWindow();
3855 m_pXZWnd->RedrawWindow();
3858 m_pYZWnd->RedrawWindow();
3862 if ( nBits & W_CAMERA || ( ( nBits & W_CAMERA_IFON ) && m_bCamPreview ) ) {
3864 m_pCamWnd->RedrawWindow();
3868 if ( nBits & ( W_Z | W_Z_OVERLAY ) ) {
3870 m_pZWnd->RedrawWindow();
3874 if ( nBits & W_TEXTURE ) {
3876 m_pTexWnd->RedrawWindow();
3879 #ifdef DBG_WINDOWPOS
3880 sprintf( bean_buf,"%d (end UpdateWidows)",bean_count );
3881 CheckWatchit( bean_buf );
3885 void MainFrame::RoutineProcessing(){
3886 #ifdef DBG_WINDOWPOS
3887 static int bean_count = 0;
3889 sprintf( bean_buf,"RoutineProcessing %d",bean_count );
3890 CheckWatchit( bean_buf );
3896 double oldtime = 0.0;
3899 /* // checking KeyState works right
3901 a2 = GetKeyState(VK_MENU);
3904 Sys_Printf("VK_MENU: %d\n",a2);
3908 b2 = GetKeyState(VK_UP);
3911 Sys_Printf("VK_UP: %d\n",b2);
3915 time = Sys_DoubleTime();
3916 delta = time - oldtime;
3918 if ( delta > 0.2 ) {
3922 // update the BSP process watcher
3923 if ( m_pWatchBSP ) {
3924 m_pWatchBSP->RoutineProcessing();
3927 // run time dependant behavior
3929 m_pCamWnd->Cam_MouseControl( delta );
3932 if ( g_nUpdateBits ) {
3933 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3934 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3935 UpdateWindows( nBits ); // happens in rare cases but causes a stack overflow
3938 // Enable/disable the menu items
3941 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3942 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3943 if (!g_PrefsDlg.m_bWideToolbar)
3945 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3946 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3948 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3949 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3950 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3951 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3952 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3953 gtk_widget_set_sensitive (item, region_active);
3954 g_bIgnoreCommands++;
3955 // update the toolbar before displaying the menu:
3956 // show in use check box
3957 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3958 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3959 // show all check box
3960 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3961 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3962 g_bIgnoreCommands--;
3965 #ifdef DBG_WINDOWPOS
3966 sprintf( bean_buf,"%d (end RoutineProcessing)",bean_count );
3967 CheckWatchit( bean_buf );
3971 void MainFrame::DoWatchBSP(){
3972 // network monitoring of the BSP process
3973 if ( !m_pWatchBSP ) {
3974 m_pWatchBSP = new CWatchBSP();
3978 void MainFrame::CleanPlugInMenu(){
3979 GtkWidget *menu, *sep;
3982 // delete everything after the separator
3983 menu = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) );
3984 sep = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin_separator" ) );
3985 m_nNextPlugInID = ID_PLUGIN_START;
3987 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3990 gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( lst->next->data ) );
3991 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3995 void MainFrame::AddPlugInMenuItem( IPlugIn* pPlugIn ){
3996 GtkWidget *menu, *item, *parent;
3997 const char *menuText;
3999 parent = gtk_menu_item_new_with_label( pPlugIn->getMenuName() );
4000 gtk_widget_show( parent );
4001 gtk_container_add( GTK_CONTAINER( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) ), parent );
4003 int nCount = pPlugIn->getCommandCount();
4005 menu = gtk_menu_new();
4006 while ( nCount > 0 )
4008 menuText = pPlugIn->getCommand( --nCount );
4009 if ( menuText != NULL && strlen( menuText ) > 0 ) {
4010 if ( !strcmp( menuText, "-" ) ) {
4011 item = gtk_menu_item_new();
4012 gtk_widget_set_sensitive( item, FALSE );
4016 item = gtk_menu_item_new_with_label( menuText );
4017 gtk_signal_connect( GTK_OBJECT( item ), "activate",
4018 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( m_nNextPlugInID ) );
4020 gtk_widget_show( item );
4021 gtk_container_add( GTK_CONTAINER( menu ), item );
4022 pPlugIn->addMenuID( m_nNextPlugInID++ );
4025 gtk_menu_item_set_submenu( GTK_MENU_ITEM( parent ), menu );
4029 void MainFrame::OnPlugIn( unsigned int nID, char* str ){
4030 m_PlugInMgr.Dispatch( nID, str );
4033 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype( IToolbarButton::EType type ){
4036 case IToolbarButton::eSpace:
4037 return GTK_TOOLBAR_CHILD_SPACE;
4038 case IToolbarButton::eButton:
4039 return GTK_TOOLBAR_CHILD_BUTTON;
4040 case IToolbarButton::eToggleButton:
4041 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4042 case IToolbarButton::eRadioButton:
4043 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4045 Error( "invalid toolbar button type" );
4046 return (GtkToolbarChildType)0;
4049 void toolbar_insert( GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data ){
4050 GtkWidget *w, *pixmap;
4051 GdkPixmap *gdkpixmap;
4054 load_plugin_bitmap( image, (void **)&gdkpixmap, (void **)&mask );
4055 pixmap = gtk_pixmap_new( gdkpixmap, mask );
4056 gdk_pixmap_unref( gdkpixmap );
4057 gdk_pixmap_unref( mask );
4058 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), gtktoolbarchildtype_for_toolbarbuttontype( type ), NULL, text, tooltip, "", GTK_WIDGET( pixmap ), handler, data );
4061 void SignalToolbarButton( GtkWidget *widget, gpointer data ){
4062 const_cast<const IToolbarButton*>( reinterpret_cast<IToolbarButton*>( data ) )->activate();
4065 void MainFrame::AddPlugInToolbarButton( const IToolbarButton* button ){
4066 GtkWidget*const toolbar = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "toolbar_plugin" ) );
4067 toolbar_insert( toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC( SignalToolbarButton ), reinterpret_cast<gpointer>( const_cast<IToolbarButton*>( button ) ) );
4070 void MainFrame::OnSelectionSelectNudgedown(){
4071 NudgeSelection( 3, g_qeglobals.d_gridsize );
4074 void MainFrame::OnSelectionSelectNudgeleft(){
4075 NudgeSelection( 0, g_qeglobals.d_gridsize );
4078 void MainFrame::OnSelectionSelectNudgeright(){
4079 NudgeSelection( 2, g_qeglobals.d_gridsize );
4082 void MainFrame::OnSelectionSelectNudgeup(){
4083 NudgeSelection( 1, g_qeglobals.d_gridsize );
4086 void MainFrame::NudgeSelection( int nDirection, float fAmount ){
4087 if ( ActiveXY()->RotateMode() ) {
4089 if ( ActiveXY()->GetViewType() == XY ) {
4093 if ( g_pParentWnd->ActiveXY()->GetViewType() == XZ ) {
4098 if ( nDirection == 2 || nDirection == 3 ) {
4102 float fDeg = -fAmount;
4103 float fAdj = fAmount;
4105 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4107 strStatus.Format( "Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4108 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2] );
4109 g_pParentWnd->SetStatusText( 2, strStatus );
4110 Select_RotateAxis( nAxis, fDeg, false, true );
4111 Sys_UpdateWindows( W_ALL );
4114 if ( ActiveXY()->ScaleMode() ) {
4115 if ( nDirection == 0 || nDirection == 3 ) {
4119 v[0] = v[1] = v[2] = 1.0;
4120 if ( fAmount > 0 ) {
4132 Select_Scale( ( g_nScaleHow & SCALE_X ) ? v[0] : 1.0,
4133 ( g_nScaleHow & SCALE_Y ) ? v[1] : 1.0,
4134 ( g_nScaleHow & SCALE_Z ) ? v[2] : 1.0 );
4135 Sys_UpdateWindows( W_ALL );
4139 // 0 - left, 1 - up, 2 - right, 3 - down
4141 if ( nDirection == 0 ) {
4142 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4145 else if ( nDirection == 1 ) {
4146 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4148 else if ( nDirection == 2 ) {
4149 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4153 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4156 Nudge( nDim, fAmount );
4160 void MainFrame::Nudge( int nDim, float fNudge ){
4162 vMove[0] = vMove[1] = vMove[2] = 0;
4163 vMove[nDim] = fNudge;
4165 if ( ( g_qeglobals.d_select_mode == sel_vertex ||
4166 g_qeglobals.d_select_mode == sel_curvepoint )
4167 && g_qeglobals.d_num_move_points ) {
4168 Select_NudgePoint( vMove, true );
4171 Select_Move( vMove, true );
4173 Sys_UpdateWindows( W_ALL );
4176 void MainFrame::SetGridStatus(){
4180 c1 = ( g_PrefsDlg.m_bTextureLock ) ? 'M' : ' ';
4181 c2 = ( g_PrefsDlg.m_bRotateLock ) ? 'R' : ' ';
4182 strStatus.Format( "G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4183 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2 );
4184 SetStatusText( 4, strStatus );
4187 void MainFrame::UpdatePatchToolbarButtons(){
4189 g_bIgnoreCommands++;
4190 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
4191 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
4192 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4193 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4194 g_bIgnoreCommands--;
4197 // =============================================================================
4200 void MainFrame::OnFileNew(){
4201 if ( ConfirmModified() ) {
4206 void MainFrame::OnFileOpen(){
4207 if ( !ConfirmModified() ) {
4214 if ( !g_pGameDescription->noMapsInHome ) {
4215 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4216 strcat( buf, "maps/" );
4222 str = file_dialog( m_pWidget, TRUE, _( "Open Map" ), buf, MAP_MAJOR, "maps/" );
4224 if ( str != NULL ) {
4225 strcpy( currentmap,str );
4227 Map_LoadFile( str );
4231 void MainFrame::OnFileImportmap(){
4235 if ( !g_pGameDescription->noMapsInHome ) {
4236 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4237 strcat( buf, "maps/" );
4243 str = file_dialog( m_pWidget, TRUE, _( "Import Map" ), buf, MAP_MAJOR, "maps/" );
4245 if ( str != NULL ) {
4246 Map_ImportFile( str );
4250 void MainFrame::OnFileSave(){
4251 if ( !strcmp( currentmap, "unnamed.map" ) ) {
4255 Map_SaveFile( currentmap, false );
4259 void MainFrame::OnFileSaveas(){
4263 if ( !g_pGameDescription->noMapsInHome ) {
4264 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4265 strcat( buf, "maps/" );
4271 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Save Map" ), buf, MAP_MAJOR, "maps/" );
4273 if ( str != NULL ) {
4274 strcpy( currentmap, str );
4276 Map_SaveFile( str, false ); // ignore region
4280 void MainFrame::OnFileExportmap(){
4284 if ( !g_pGameDescription->noMapsInHome ) {
4285 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4286 strcat( buf, "maps/" );
4292 str = file_dialog( m_pWidget, FALSE, _( "Export Selection" ), buf, MAP_MAJOR, "maps/" );
4294 if ( str != NULL ) {
4295 Map_SaveSelected( str );
4299 void MainFrame::OnFileSaveregion(){
4303 if ( !g_pGameDescription->noMapsInHome ) {
4304 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4305 strcat( buf, "maps/" );
4311 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Export Region" ), buf, MAP_MAJOR, "maps/" );
4313 if ( str != NULL ) {
4314 Map_SaveFile( str, true ); // ignore region
4318 void MainFrame::OnFileNewproject(){
4319 char* name = DoNewProjectDlg();
4321 // create a new project:
4322 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4323 // on linux we create under ~/.q3a, on win32 under strEnginePath
4324 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4325 if ( ( name != NULL ) && ( strlen( name ) > 0 ) ) {
4326 CString strNewBasePath;
4328 // NOTE TTimo this would probably not work right on *nix
4329 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4330 strNewBasePath += name;
4331 strNewBasePath += "/";
4333 CString strProjToLoad;
4334 CString strMapToLoad;
4336 // if the dir exists, ask the user if they want to continue anyway
4337 if ( Q_mkdir( strNewBasePath.GetBuffer(), 0755 ) != 0 ) {
4339 strMsg.Format( "The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer() );
4340 Sys_Printf( strMsg );
4341 if ( gtk_MessageBox( m_pWidget, _( strMsg ), _( "Error" ), MB_YESNO ) != IDYES ) {
4342 Sys_Printf( "New Project cancelled, directory already exists for project\n" );
4349 strDir = strNewBasePath;
4351 Q_mkdir( strDir.GetBuffer(), 0755 );
4353 strDir = strNewBasePath;
4354 strDir += "textures/";
4355 Q_mkdir( strDir.GetBuffer(), 0755 );
4357 strDir = strNewBasePath;
4358 strDir += "scripts/";
4359 Q_mkdir( strDir.GetBuffer(), 0755 );
4361 // print a warning for total conversions, since setting the basepath when required files are
4362 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4363 Sys_FPrintf( SYS_WRN, "*** Note: basepath unchanged\n" );
4365 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name );
4367 strDir = strNewBasePath;
4368 strDir += "maps/autosave.map";
4369 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4371 // state that this is a user project file, no templating
4372 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4373 // create the project file
4374 strProjToLoad = strNewBasePath;
4375 strProjToLoad += "scripts/";
4376 strProjToLoad += name;
4377 strProjToLoad += ".";
4378 strProjToLoad += PROJECT_FILETYPE;
4379 QE_SaveProject( strProjToLoad.GetBuffer() );
4384 void MainFrame::OnFileLoadproject(){
4385 if ( ConfirmModified() ) {
4390 void MainFrame::OnFileProjectsettings(){
4391 DoProjectSettings();
4394 void MainFrame::OnFilePointfile(){
4395 if ( g_qeglobals.d_pointfile_display_list ) {
4403 void MainFrame::OnMru( unsigned int nID ){
4404 if ( ConfirmModified() ) {
4405 MRU_Activate( nID - ID_FILE_RECENT1 );
4409 void MainFrame::OnFileExit(){
4410 if ( ConfirmModified() ) {
4411 // stop printing during shutdown
4412 // NOTE: we should cleanly release GL contexts and stuff when exiting
4416 g_qeglobals_gui.d_edit = NULL;
4417 gtk_widget_destroy( m_pWidget );
4421 void MainFrame::OnFileCheckUpdate(){
4424 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4426 URL += "&OS_dlup=1";
4428 URL += "&OS_dlup=2";
4430 URL += "&Version_dlup=" RADIANT_VERSION;
4431 g_PrefsDlg.mGamesDialog.AddPacksURL( URL );
4432 OpenURL( URL.GetBuffer() );
4435 void MainFrame::OnEditUndo(){
4439 void MainFrame::OnEditRedo(){
4443 void MainFrame::OnEditCopybrush(){
4447 void MainFrame::OnEditPastebrush(){
4450 Undo_Start( "paste" );
4454 Undo_EndBrushList( &selected_brushes );
4458 void MainFrame::OnEditPastebrushToCamera(){
4461 vec3_t mid, camorigin, delta;
4463 ActiveXY()->Paste();
4465 // Work out the delta
4466 Select_GetMid( mid );
4468 // Snap camera origin to grid
4469 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4470 camorigin[0] = floor( camorigin[0] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4471 camorigin[1] = floor( camorigin[1] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4472 camorigin[2] = floor( camorigin[2] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4474 VectorSubtract( camorigin, mid, delta );
4477 Select_Move( delta, false );
4479 Undo_Start( "paste to camera" );
4480 Undo_EndBrushList( &selected_brushes );
4485 void MainFrame::OnSelectionDelete(){
4488 // ActiveXY()->UndoCopy();
4489 Undo_Start( "delete" );
4490 Undo_AddBrushList( &selected_brushes );
4491 //add all deleted entities to the undo
4492 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
4494 Undo_AddEntity( brush->owner );
4496 // NOTE: Select_Delete does NOT delete entities
4498 Undo_EndBrushList( &selected_brushes );
4502 void MainFrame::OnEditMapinfo(){
4506 void MainFrame::OnEditEntityinfo(){
4510 void MainFrame::OnBrushScripts(){
4514 void MainFrame::OnEditLoadprefab(){
4515 const char *filename;
4518 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4519 CurPath = g_PrefsDlg.m_strPrefabPath;
4520 AddSlash( CurPath );
4523 filename = file_dialog( m_pWidget, TRUE, _( "Import Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4525 if ( filename != NULL ) {
4526 Map_ImportFile( filename );
4530 void MainFrame::OnEditSaveprefab(){
4531 const char *filename;
4534 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4535 CurPath = g_PrefsDlg.m_strPrefabPath;
4540 getcwd( tmp, PATH_MAX );
4543 AddSlash( CurPath );
4545 filename = file_dialog( m_pWidget, FALSE, _( "Export Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4546 if ( filename != NULL ) {
4547 Map_SaveSelected( filename );
4551 void MainFrame::OnPrefs(){
4552 int nView = g_PrefsDlg.m_nView;
4553 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4554 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4555 int nShader = g_PrefsDlg.m_nShader;
4556 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4557 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4558 g_PrefsDlg.LoadPrefs();
4560 if ( g_PrefsDlg.DoModal() == IDOK ) {
4561 if ( ( g_PrefsDlg.m_nLatchedView != nView ) ||
4562 ( g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus ) ||
4563 ( g_PrefsDlg.m_bLatchedWideToolbar != bToolbar ) ||
4564 ( g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar ) ||
4565 ( g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar ) ||
4566 ( g_PrefsDlg.m_nLatchedShader != nShader ) ||
4567 ( g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality )
4568 || ( g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ )
4570 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for the changes to take effect." ) );
4573 // if the view mode was switched to floating, set the Z window on by default
4574 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4575 // (and we simply hope there will be a SavePrefs before we die)
4576 if ( ( g_PrefsDlg.m_nView != nView ) && ( (EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating ) ) {
4577 g_PrefsDlg.m_bZVis = true;
4581 m_pTexWnd->UpdatePrefs();
4584 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
4585 g_bIgnoreCommands++;
4586 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4587 ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
4588 g_bIgnoreCommands--;
4592 void MainFrame::OnTogglecamera(){
4593 if ( CurrentStyle() == eFloating ) { // floating views
4594 if ( m_pCamWnd && m_pCamWnd->m_pParent ) {
4595 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->m_pParent ) ) {
4596 widget_delete_hide( m_pCamWnd->m_pParent );
4599 gtk_widget_show( m_pCamWnd->m_pParent );
4605 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->GetWidget() ) ) {
4606 gtk_widget_hide( m_pCamWnd->GetWidget() );
4609 gtk_widget_show( m_pCamWnd->GetWidget() );
4614 void MainFrame::OnToggleconsole(){
4615 if ( FloatingGroupDialog() ) { // QE4 style
4616 if ( inspector_mode == W_CONSOLE ) {
4617 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4618 widget_delete_hide( g_qeglobals_gui.d_entity );
4621 gtk_widget_show( g_qeglobals_gui.d_entity );
4626 gtk_widget_show( g_qeglobals_gui.d_entity );
4627 SetInspectorMode( W_CONSOLE );
4632 // trigger the entity inspector on/off
4633 void MainFrame::OnViewEntity(){
4634 // make sure we're working with the current selection (bugzilla #436)
4635 if ( !GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4639 if ( !FloatingGroupDialog() ) {
4640 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_ENTITY ) {
4641 widget_delete_hide( g_qeglobals_gui.d_entity );
4645 gtk_widget_show( g_qeglobals_gui.d_entity );
4646 SetInspectorMode( W_ENTITY );
4651 if ( inspector_mode == W_ENTITY ) {
4652 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4653 widget_delete_hide( g_qeglobals_gui.d_entity );
4656 gtk_widget_show( g_qeglobals_gui.d_entity );
4661 gtk_widget_show( g_qeglobals_gui.d_entity );
4662 SetInspectorMode( W_ENTITY );
4667 void MainFrame::OnViewGroups(){
4668 if ( !FloatingGroupDialog() ) {
4669 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_GROUP ) {
4670 widget_delete_hide( g_qeglobals_gui.d_entity );
4674 gtk_widget_show( g_qeglobals_gui.d_entity );
4675 SetInspectorMode( W_GROUP );
4680 if ( inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating ) {
4681 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4682 widget_delete_hide( g_qeglobals_gui.d_entity );
4685 gtk_widget_show( g_qeglobals_gui.d_entity );
4690 gtk_widget_show( g_qeglobals_gui.d_entity );
4691 SetInspectorMode( W_GROUP );
4696 void MainFrame::OnToggleview(){
4697 if ( CurrentStyle() == eFloating ) { // QE4 style
4698 if ( m_pXYWnd && m_pXYWnd->m_pParent ) {
4699 if ( GTK_WIDGET_VISIBLE( m_pXYWnd->m_pParent ) ) {
4700 widget_delete_hide( m_pXYWnd->m_pParent );
4703 gtk_widget_show( m_pXYWnd->m_pParent );
4709 void MainFrame::OnToggleviewXz(){
4710 if ( CurrentStyle() == eFloating ) { // QE4 style
4711 if ( m_pXZWnd && m_pXZWnd->m_pParent ) {
4712 // get windowplacement doesn't actually save this so we will here
4713 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE( m_pXZWnd->m_pParent );
4714 if ( g_PrefsDlg.m_bXZVis ) {
4715 widget_delete_hide( m_pXZWnd->m_pParent );
4718 gtk_widget_show( m_pXZWnd->m_pParent );
4720 g_PrefsDlg.m_bXZVis ^= 1;
4721 g_PrefsDlg.SavePrefs();
4726 void MainFrame::OnToggleviewYz(){
4727 if ( CurrentStyle() == eFloating ) { // QE4 style
4728 if ( m_pYZWnd && m_pYZWnd->m_pParent ) {
4729 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE( m_pYZWnd->m_pParent );
4730 if ( g_PrefsDlg.m_bYZVis ) {
4731 widget_delete_hide( m_pYZWnd->m_pParent );
4734 gtk_widget_show( m_pYZWnd->m_pParent );
4736 g_PrefsDlg.m_bYZVis ^= 1;
4737 g_PrefsDlg.SavePrefs();
4742 void MainFrame::OnTogglez(){
4743 if ( g_pParentWnd->FloatingGroupDialog() ) { // QE4 style
4744 if ( m_pZWnd && m_pZWnd->m_pParent ) {
4745 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
4746 widget_delete_hide( m_pZWnd->m_pParent );
4749 gtk_widget_show( m_pZWnd->m_pParent );
4751 g_PrefsDlg.m_bZVis ^= 1;
4752 g_PrefsDlg.SavePrefs();
4756 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4760 void MainFrame::OnViewCenter(){
4761 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4762 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor( ( m_pCamWnd->Camera()->angles[YAW] + 11 ) / 22.5 );
4763 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
4766 void MainFrame::OnViewUpfloor(){
4767 m_pCamWnd->Cam_ChangeFloor( true );
4770 void MainFrame::OnViewDownfloor(){
4771 m_pCamWnd->Cam_ChangeFloor( false );
4774 void MainFrame::OnViewCenterview(){
4775 if ( CurrentStyle() == eSplit ) {
4776 GetXYWnd()->PositionView();
4777 GetXZWnd()->PositionView();
4778 GetYZWnd()->PositionView();
4779 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4782 m_pXYWnd->PositionView();
4783 Sys_UpdateWindows( W_XY );
4787 void MainFrame::OnViewNextview(){
4788 if ( CurrentStyle() == eSplit ) {
4789 GetXYWnd()->PositionView();
4790 GetXZWnd()->PositionView();
4791 GetYZWnd()->PositionView();
4792 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4795 if ( m_pXYWnd->GetViewType() == XY ) {
4796 m_pXYWnd->SetViewType( XZ );
4799 if ( m_pXYWnd->GetViewType() == XZ ) {
4800 m_pXYWnd->SetViewType( YZ );
4803 m_pXYWnd->SetViewType( XY );
4805 m_pXYWnd->PositionView();
4806 Sys_UpdateWindows( W_XY );
4810 void MainFrame::OnViewXy(){
4811 if ( !FloatingGroupDialog() ) {
4812 m_pXYWnd->SetViewType( XY );
4813 m_pXYWnd->PositionView();
4815 Sys_UpdateWindows( W_XY );
4818 void MainFrame::OnViewSide(){
4819 if ( !FloatingGroupDialog() ) {
4820 m_pXYWnd->SetViewType( XZ );
4821 m_pXYWnd->PositionView();
4823 Sys_UpdateWindows( W_XY );
4826 void MainFrame::OnViewFront(){
4827 if ( !FloatingGroupDialog() ) {
4828 m_pXYWnd->SetViewType( YZ );
4829 m_pXYWnd->PositionView();
4831 Sys_UpdateWindows( W_XY );
4834 void MainFrame::OnView100(){
4836 m_pXYWnd->SetScale( 1 );
4839 m_pXZWnd->SetScale( 1 );
4842 m_pYZWnd->SetScale( 1 );
4844 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4847 void MainFrame::OnViewZoomin(){
4848 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4849 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0 / 4 );
4850 if ( m_pXYWnd->Scale() > 30 ) {
4851 m_pXYWnd->SetScale( 30 );
4855 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4856 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0 / 4 );
4857 if ( m_pXZWnd->Scale() > 30 ) {
4858 m_pXZWnd->SetScale( 30 );
4862 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4863 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0 / 4 );
4864 if ( m_pYZWnd->Scale() > 30 ) {
4865 m_pYZWnd->SetScale( 30 );
4869 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4872 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4873 // we don't go below a zoom factor corresponding to 10% of the max world size
4874 // (this has to be computed against the window size)
4875 void MainFrame::OnViewZoomout(){
4877 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4878 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0 / 5 );
4879 min_scale = MIN( m_pXYWnd->Width(),m_pXYWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4880 if ( m_pXYWnd->Scale() < min_scale ) {
4881 m_pXYWnd->SetScale( min_scale );
4885 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4886 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0 / 5 );
4887 min_scale = MIN( m_pXZWnd->Width(),m_pXZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4888 if ( m_pXZWnd->Scale() < min_scale ) {
4889 m_pXZWnd->SetScale( min_scale );
4893 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4894 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0 / 5 );
4895 min_scale = MIN( m_pYZWnd->Width(),m_pYZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4896 if ( m_pYZWnd->Scale() < min_scale ) {
4897 m_pYZWnd->SetScale( min_scale );
4900 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4903 void MainFrame::OnViewZ100(){
4905 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4908 void MainFrame::OnViewZzoomin(){
4910 if ( z.scale > 4 ) {
4913 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4916 void MainFrame::OnViewZzoomout(){
4917 z.scale *= 4.0f / 5;
4918 if ( z.scale < 0.125 ) {
4921 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4924 void MainFrame::OnViewCubein(){
4925 g_PrefsDlg.m_nCubicScale--;
4926 if ( g_PrefsDlg.m_nCubicScale < 1 ) {
4927 g_PrefsDlg.m_nCubicScale = 1;
4929 g_PrefsDlg.SavePrefs();
4930 Sys_UpdateWindows( W_CAMERA );
4934 void MainFrame::OnViewCubeout(){
4935 g_PrefsDlg.m_nCubicScale++;
4936 if ( g_PrefsDlg.m_nCubicScale > 22 ) {
4937 g_PrefsDlg.m_nCubicScale = 22;
4939 g_PrefsDlg.SavePrefs();
4940 Sys_UpdateWindows( W_CAMERA );
4944 void MainFrame::OnViewShownames(){
4945 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
4946 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
4947 g_bIgnoreCommands++;
4948 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4949 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE );
4950 g_bIgnoreCommands--;
4951 Sys_UpdateWindows( W_XY );
4954 void MainFrame::OnViewShowAngles(){
4955 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
4956 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
4957 g_bIgnoreCommands++;
4958 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4959 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE );
4960 g_bIgnoreCommands--;
4961 Sys_UpdateWindows( W_XY );
4964 void MainFrame::OnViewShowblocks(){
4965 g_qeglobals.show_blocks ^= 1;
4966 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showblocks" ) );
4967 g_bIgnoreCommands++;
4968 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.show_blocks ? TRUE : FALSE );
4969 g_bIgnoreCommands--;
4970 Sys_UpdateWindows( W_XY );
4973 void MainFrame::OnViewShowcoordinates(){
4974 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
4975 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
4976 g_bIgnoreCommands++;
4977 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4978 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE );
4979 g_bIgnoreCommands--;
4980 Sys_UpdateWindows( W_XY | W_Z );
4983 void MainFrame::OnViewShowOutline(){
4984 g_qeglobals.d_savedinfo.show_outline ^= 1;
4985 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
4986 g_bIgnoreCommands++;
4987 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4988 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE );
4989 g_bIgnoreCommands--;
4990 Sys_UpdateWindows( W_XY );
4993 void MainFrame::OnViewShowAxes(){
4994 g_qeglobals.d_savedinfo.show_axis ^= 1;
4995 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
4996 g_bIgnoreCommands++;
4997 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4998 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE );
4999 g_bIgnoreCommands--;
5000 Sys_UpdateWindows( W_XY );
5003 void MainFrame::OnViewShowWorkzone(){
5004 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showworkzone" ) );
5005 g_bIgnoreCommands++;
5006 if ( g_qeglobals.d_show_work ) {
5007 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
5008 g_qeglobals.d_show_work = false;
5012 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5013 g_qeglobals.d_show_work = true;
5015 g_bIgnoreCommands--;
5016 Sys_UpdateWindows( W_XY );
5019 void MainFrame::OnViewHideshowHideselected(){
5024 void MainFrame::OnViewHideshowShowhidden(){
5025 Select_ShowAllHidden();
5029 sets the view mode for the entities
5030 called upon LoadPrefs too
5031 NOTE TTimo previous implementation had a SavePrefs call
5032 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5033 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5034 (otherwise we are always called following user action on the widget)
5036 void MainFrame::OnEntitiesSetViewAs( int mode ){
5037 gpointer item = NULL;
5039 switch ( g_PrefsDlg.m_nEntityShowState )
5042 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5045 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5047 case ENTITY_SELECTED:
5048 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5050 case ENTITY_SELECTED_SKIN:
5051 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5053 case ENTITY_SKINNED:
5054 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5056 case ENTITY_SKINNED_BOXED:
5057 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5060 g_bIgnoreCommands++;
5061 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5062 g_bIgnoreCommands--;
5068 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5069 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5070 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5072 case ID_VIEW_ENTITIESAS_WIREFRAME:
5073 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5074 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5076 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5077 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5078 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5080 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5081 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5082 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5084 case ID_VIEW_ENTITIESAS_SKINNED:
5085 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5086 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5088 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5089 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5090 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5093 Sys_FPrintf( SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n" );
5098 Sys_FPrintf( SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n" );
5102 g_bIgnoreCommands++;
5103 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5104 g_bIgnoreCommands--;
5106 Sys_UpdateWindows( W_ALL );
5109 void MainFrame::OnViewCubicclipping(){
5112 g_PrefsDlg.m_bCubicClipping ^= 1;
5113 g_bIgnoreCommands++;
5114 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
5115 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5116 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
5117 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5118 g_bIgnoreCommands--;
5119 g_PrefsDlg.SavePrefs();
5120 //Map_BuildBrushData ();
5121 Sys_UpdateWindows( W_CAMERA );
5124 void MainFrame::OnViewOpengllighting(){
5125 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
5126 g_PrefsDlg.m_bGLLighting ^= 1;
5127 g_PrefsDlg.SavePrefs();
5128 g_bIgnoreCommands++;
5129 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE );
5130 Sys_UpdateWindows( W_XY | W_CAMERA );
5131 g_bIgnoreCommands--;
5134 void MainFrame::OnSelectionDragedges(){
5135 if ( g_qeglobals.d_select_mode == sel_edge ) {
5136 g_qeglobals.d_select_mode = sel_brush;
5137 Sys_UpdateWindows( W_ALL );
5141 SetupVertexSelection();
5142 if ( g_qeglobals.d_numpoints ) {
5143 g_qeglobals.d_select_mode = sel_edge;
5145 Sys_UpdateWindows( W_ALL );
5149 void MainFrame::OnSelectionDragvertecies(){
5150 if ( g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint ) {
5151 g_qeglobals.d_select_mode = sel_brush;
5152 Sys_UpdateWindows( W_ALL );
5156 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5157 if ( OnlyPatchesSelected() ) {
5160 else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5162 SetupVertexSelection();
5163 if ( g_qeglobals.d_numpoints ) {
5164 g_qeglobals.d_select_mode = sel_vertex;
5167 Sys_UpdateWindows( W_ALL );
5171 void MainFrame::OnSelectionClone(){
5175 // called when the escape key is used (either on the main window or on an inspector)
5176 void MainFrame::OnSelectionDeselect(){
5177 if ( g_bClipMode ) {
5181 if ( g_bRotateMode ) {
5182 OnSelectMouserotate();
5185 if ( g_bScaleMode ) {
5186 OnSelectMousescale();
5189 if ( g_bPathMode ) {
5191 ActiveXY()->KillPathMode();
5196 if ( g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0 ) {
5197 g_qeglobals.d_num_move_points = 0;
5198 Sys_UpdateWindows( W_ALL );
5203 SetStatusText( 2, " " );
5208 void MainFrame::OnBrushFlipx(){
5209 Undo_Start( "flip X" );
5210 Undo_AddBrushList( &selected_brushes );
5212 Select_FlipAxis( 0 );
5213 // spog - this does not work - it's a rotate not a flip
5215 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5217 if(b->owner->eclass->fixedsize)
5220 float a = FloatForKey(b->owner, "angle");
5221 a = div ((int)(180 - a), 180).rem;
5222 sprintf (buf, "%d", (int)a);
5223 SetKeyValue(b->owner, "angle", buf);
5224 Brush_Build(b,true,true,false,false); // don't filter
5228 Undo_EndBrushList( &selected_brushes );
5232 void MainFrame::OnBrushFlipy(){
5233 Undo_Start( "flip Y" );
5234 Undo_AddBrushList( &selected_brushes );
5236 Select_FlipAxis( 1 );
5237 // spog - this does not work - it's a rotate not a flip
5239 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5241 if(b->owner->eclass->fixedsize)
5243 float a = FloatForKey(b->owner, "angle");
5244 if (a == 0 || a == 180 || a == 360)
5246 if ( a == 90 || a == 270)
5260 sprintf (buf, "%d", (int)a);
5261 SetKeyValue(b->owner, "angle", buf);
5262 Brush_Build(b,true,true,false,false); // don't filter
5267 Undo_EndBrushList( &selected_brushes );
5271 void MainFrame::OnBrushFlipz(){
5272 Undo_Start( "flip Z" );
5273 Undo_AddBrushList( &selected_brushes );
5274 Select_FlipAxis( 2 );
5275 Undo_EndBrushList( &selected_brushes );
5279 void MainFrame::OnBrushRotatex(){
5280 Undo_Start( "rotate X" );
5281 Undo_AddBrushList( &selected_brushes );
5282 Select_RotateAxis( 0, 90 );
5283 Undo_EndBrushList( &selected_brushes );
5287 void MainFrame::OnBrushRotatey(){
5288 Undo_Start( "rotate Y" );
5289 Undo_AddBrushList( &selected_brushes );
5290 Select_RotateAxis( 1, 90 );
5291 Undo_EndBrushList( &selected_brushes );
5295 void MainFrame::OnBrushRotatez(){
5296 Undo_Start( "rotate Z" );
5297 Undo_AddBrushList( &selected_brushes );
5298 Select_RotateAxis( 2, 90 );
5299 Undo_EndBrushList( &selected_brushes );
5303 void MainFrame::OnSelectionArbitraryrotation(){
5304 Undo_Start( "arbitrary rotation" );
5305 Undo_AddBrushList( &selected_brushes );
5309 Undo_EndBrushList( &selected_brushes );
5313 void MainFrame::OnSelectScale(){
5314 Undo_Start( "scale" );
5315 Undo_AddBrushList( &selected_brushes );
5317 Undo_EndBrushList( &selected_brushes );
5321 void MainFrame::OnSelectionMakehollow(){
5323 // ActiveXY()->UndoCopy();
5324 Undo_Start( "hollow" );
5325 Undo_AddBrushList( &selected_brushes );
5327 Undo_EndBrushList( &selected_brushes );
5331 void MainFrame::OnSelectionCsgsubtract(){
5332 Undo_Start( "CSG subtract" );
5337 void MainFrame::OnSelectionCsgmerge(){
5338 Undo_Start( "CSG merge" );
5339 Undo_AddBrushList( &selected_brushes );
5341 Undo_EndBrushList( &selected_brushes );
5345 void MainFrame::OnSelectionNoOutline(){
5346 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5347 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) ^ OUTLINE_ZBUF;
5348 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5349 g_bIgnoreCommands++;
5350 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5351 g_bIgnoreCommands--;
5352 Sys_UpdateWindows( W_CAMERA );
5355 void MainFrame::OnSelectionOutlineStyle(){
5356 if ( ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) && ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) ) {
5357 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5359 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) {
5360 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5362 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) {
5363 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5366 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5368 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5369 g_bIgnoreCommands++;
5370 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5371 g_bIgnoreCommands--;
5372 Sys_UpdateWindows( W_CAMERA );
5375 void MainFrame::OnSelectionSelectcompletetall(){
5377 ActiveXY()->UndoCopy();
5379 Select_CompleteTall();
5382 void MainFrame::OnSelectionSelecttouching(){
5386 void MainFrame::OnSelectionSelectpartialtall(){
5387 Select_PartialTall();
5390 void MainFrame::OnSelectionSelectinside(){
5394 void MainFrame::OnViewClipper(){
5395 GtkWidget *w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_clipper" ) );
5396 g_bIgnoreCommands++;
5399 if ( ActiveXY()->ClipMode() ) {
5400 ActiveXY()->SetClipMode( false );
5401 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), FALSE );
5405 if ( ActiveXY()->RotateMode() ) {
5406 OnSelectMouserotate();
5408 ActiveXY()->SetClipMode( true );
5409 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), TRUE );
5412 g_bIgnoreCommands--;
5415 void MainFrame::OnClipSelected(){
5416 if ( m_pActiveXY && m_pActiveXY->ClipMode() ) {
5417 Undo_Start( "clip selected" );
5418 Undo_AddBrushList( &selected_brushes );
5419 m_pActiveXY->Clip();
5420 Undo_EndBrushList( &selected_brushes );
5425 if ( g_bPatchBendMode ) {
5426 Patch_BendHandleENTER();
5428 // else if (g_bPatchBendMode)
5429 // Patch_InsDelHandleENTER();
5433 void MainFrame::OnSplitSelected(){
5434 if ( m_pActiveXY ) {
5435 Undo_Start( "split selected" );
5436 Undo_AddBrushList( &selected_brushes );
5437 m_pActiveXY->SplitClip();
5438 Undo_EndBrushList( &selected_brushes );
5443 void MainFrame::OnFlipClip(){
5444 if ( m_pActiveXY ) {
5445 m_pActiveXY->FlipClip();
5449 void MainFrame::OnSelectionConnect(){
5450 Undo_Start( "connect selected entities" );
5451 Undo_AddBrushList( &selected_brushes );
5453 Undo_EndBrushList( &selected_brushes );
5457 void MainFrame::OnSelectionUngroupentity(){
5458 Undo_Start( "ungroup selected entities" );
5459 Undo_AddBrushList( &selected_brushes );
5461 Undo_EndBrushList( &selected_brushes );
5465 void MainFrame::OnSelectionMergeentity(){
5466 Undo_Start( "merge entity" );
5467 Undo_AddBrushList( &selected_brushes );
5468 Select_MergeEntity();
5469 Undo_EndBrushList( &selected_brushes );
5473 void MainFrame::OnSelectionGroupworld(){
5474 Undo_Start( "group world" );
5475 Undo_AddBrushList( &selected_brushes );
5476 Select_GroupEntity( world_entity );
5477 Undo_EndBrushList( &selected_brushes );
5481 void MainFrame::OnSelectionMakeDetail(){
5482 Undo_Start( "make detail" );
5483 Undo_AddBrushList( &selected_brushes );
5484 Select_MakeDetail();
5485 Undo_EndBrushList( &selected_brushes );
5489 void MainFrame::OnSelectionMakeStructural(){
5490 Undo_Start( "make structural" );
5491 Undo_AddBrushList( &selected_brushes );
5492 Select_MakeStructural();
5493 Undo_EndBrushList( &selected_brushes );
5497 void MainFrame::OnBspCommand( unsigned int nID ){
5498 // make sure we don't attempt to region compile a map with the camera outside the region
5499 if ( region_active ) {
5502 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5503 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5504 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2] );
5507 for ( i = 0 ; i < 3 ; i++ )
5509 if ( vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i] ) {
5510 Sys_FPrintf( SYS_ERR, "The camera must be in the region to start a region compile.\n" );
5516 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5517 if ( stricmp( currentmap, "unnamed.map" ) == 0 ) {
5521 if ( g_PrefsDlg.m_bSnapShots && ( stricmp( currentmap, "unnamed.map" ) != 0 ) ) {
5525 if ( g_qeglobals.bBSPFrontendPlugin ) {
5526 char *cmd = (char*)g_slist_nth_data( g_BSPFrontendCommands, nID - CMD_BSPCOMMAND );
5527 g_BSPFrontendTable.m_pfnDispatchBSPCommand( cmd );
5531 RunBsp( bsp_commands[nID - CMD_BSPCOMMAND] );
5535 void MainFrame::OnGrid( unsigned int nID ){
5536 if ( nID == ID_GRID_025 ) {
5537 g_qeglobals.d_gridsize = 0.25f;
5538 g_qeglobals.d_bSmallGrid = true;
5540 else if ( nID == ID_GRID_05 ) {
5541 g_qeglobals.d_gridsize = 0.5f;
5542 g_qeglobals.d_bSmallGrid = true;
5548 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5549 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5550 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5551 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5552 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5553 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5554 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5555 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5556 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5558 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5559 g_qeglobals.d_bSmallGrid = false;
5564 // SnapTToGrid option: need to check everywhere the grid size is changed
5565 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5566 if ( g_PrefsDlg.m_bSnapTToGrid ) {
5570 Sys_UpdateWindows( W_XY | W_Z );
5573 void MainFrame::OnSnaptogrid(){
5574 g_PrefsDlg.m_bSnap ^= 1;
5575 g_PrefsDlg.SavePrefs();
5577 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
5578 g_bIgnoreCommands++;
5579 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bSnap ? TRUE : FALSE );
5580 g_bIgnoreCommands--;
5583 void MainFrame::OnTexturesShowinuse(){
5585 Texture_ShowInuse();
5587 if ( !g_bShowAllShaders ) {
5588 Sys_Printf( "Already showing only in-use textures.\n" );
5591 Sys_UpdateWindows( W_TEXTURE );
5595 void MainFrame::OnTexturesShowall(){
5599 // do some triggering on/off, if the inspector is already up then hide it
5600 void MainFrame::OnTexturesInspector(){
5604 void MainFrame::OnViewNearest( unsigned int nID ){
5605 Texture_SetMode( nID );
5608 void MainFrame::OnTextureReplaceall(){
5609 FindTextureDialog::show();
5612 void MainFrame::OnToggleLock(){
5613 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5615 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
5616 g_bIgnoreCommands++;
5617 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE );
5618 g_bIgnoreCommands--;
5619 g_PrefsDlg.SavePrefs();
5623 void MainFrame::OnToggleRotatelock(){
5624 g_PrefsDlg.m_bRotateLock ^= 1;
5626 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
5627 g_bIgnoreCommands++;
5628 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE );
5629 g_bIgnoreCommands--;
5630 g_PrefsDlg.SavePrefs();
5634 // use a dialog for direct selection of a texture menu
5635 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5636 void MainFrame::OnTexturesLoad(){
5637 char def_path[NAME_MAX];
5640 // check if that works with fs_game (I suspect some more design is needed)
5641 // see how this is done in 1.2?
5642 strcpy( def_path, g_pGameDescription->mEnginePath.GetBuffer() );
5643 strcat( def_path, g_pGameDescription->mBaseGame.GetBuffer() );
5644 strcat( def_path, "/" );
5646 char *dir = dir_dialog( m_pWidget, _( "Load textures from path" ), def_path );
5648 if ( dir != NULL ) {
5649 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5650 Sys_Printf( "user select: '%s'\n", dir );
5651 // remove a potential trailing slash?
5652 if ( dir[strlen( dir ) - 1] == '/' || dir[strlen( dir ) - 1] == '\\' ) {
5653 dir[strlen( dir ) - 1] = '\0';
5655 char *pouic = MAX( strrchr( dir, '/' ),strrchr( dir, '\\' ) );
5657 strcpy( texture_directory, pouic + 1 );
5658 Sys_Printf( "Loading '%s'\n", texture_directory );
5659 Texture_ShowDirectory();
5662 Sys_FPrintf( SYS_WRN, "Failed to extract the directory\n" );
5667 Sys_FPrintf( SYS_WRN, "texture load dialog cancelled\n" );
5671 void MainFrame::OnTexturesReloadshaders(){
5673 QERApp_ReloadShaders();
5675 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5676 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
5677 Sys_UpdateWindows( W_ALL );
5681 void MainFrame::OnTexturesShadersShow(){
5682 g_PrefsDlg.m_bShowShaders ^= 1;
5683 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
5684 g_bIgnoreCommands++;
5685 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
5686 g_bIgnoreCommands--;
5687 Sys_UpdateWindows( W_TEXTURE );
5690 void MainFrame::SetTextureScale( int id ){
5695 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5696 g_PrefsDlg.m_nTextureScale = 10;
5697 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_10" ) );
5699 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5700 g_PrefsDlg.m_nTextureScale = 25;
5701 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_25" ) );
5703 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5704 g_PrefsDlg.m_nTextureScale = 50;
5705 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_50" ) );
5707 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5708 g_PrefsDlg.m_nTextureScale = 200;
5709 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_200" ) );
5712 g_PrefsDlg.m_nTextureScale = 100;
5713 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_100" ) );
5717 g_bIgnoreCommands++;
5718 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5719 g_bIgnoreCommands--;
5721 Texture_ResetPosition();
5724 void MainFrame::OnTexturewindowScaleup(){
5725 switch ( g_PrefsDlg.m_nTextureScale ) {
5726 // 200, all the way in, don't do anything
5728 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_200 );
5731 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5734 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5737 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5742 void MainFrame::OnTexturewindowScaledown(){
5743 switch ( g_PrefsDlg.m_nTextureScale ) {
5745 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5748 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5751 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5754 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_10 );
5756 // 10, all the way out, don't do anything
5760 void MainFrame::OnTexturesLoadlist(){
5764 void MainFrame::OnTexturesShaderlistonly(){
5765 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5766 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ),"menu_textures_shaderlistonly" ) );
5767 g_bIgnoreCommands++;
5768 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
5769 g_bIgnoreCommands--;
5773 void MainFrame::OnTextureWad( unsigned int nID ){
5775 Texture_ShowDirectory( nID );
5776 Sys_UpdateWindows( W_ALL );
5780 void MainFrame::OnMiscBenchmark(){
5781 m_pCamWnd->BenchMark();
5784 void MainFrame::OnColorSetoriginal(){
5785 for ( int i = 0 ; i < 3 ; i++ )
5787 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5788 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5789 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5790 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5791 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5795 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5796 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5797 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5799 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5800 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5801 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5804 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5805 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5806 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5808 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5809 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5810 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5812 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5813 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5814 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5816 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5817 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5818 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5820 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5821 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5822 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5824 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5825 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5826 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5828 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5829 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5830 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5832 g_PrefsDlg.SavePrefs();
5833 Sys_UpdateWindows( W_ALL );
5836 void MainFrame::OnColorSetqer(){
5837 for ( int i = 0 ; i < 3 ; i++ )
5839 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5840 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5841 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5842 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5843 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5846 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5847 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5848 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5850 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5851 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5852 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5854 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5855 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5856 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5858 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5859 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5860 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5862 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5863 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5864 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5866 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5867 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5868 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5870 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5871 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5872 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5874 g_PrefsDlg.SavePrefs();
5875 Sys_UpdateWindows( W_ALL );
5878 void MainFrame::OnColorSetblack(){
5879 for ( int i = 0 ; i < 3 ; i++ )
5881 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5882 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5883 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
5884 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5887 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
5888 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
5889 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
5891 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5892 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5893 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5895 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
5896 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
5897 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
5899 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5900 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5901 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5903 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5904 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5905 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5907 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
5908 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
5909 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
5911 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
5912 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
5913 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
5915 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5916 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5917 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5919 g_PrefsDlg.SavePrefs();
5920 Sys_UpdateWindows( W_ALL );
5923 /* ydnar: to emulate maya/max/lightwave color schemes */
5924 void MainFrame::OnColorSetydnar(){
5925 for ( int i = 0 ; i < 3 ; i++ )
5927 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5928 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
5929 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
5930 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
5931 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
5935 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
5936 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5938 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5939 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5940 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5942 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5943 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5944 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5946 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5947 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5948 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5950 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5951 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5952 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5954 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5955 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5956 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5958 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5960 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5962 g_PrefsDlg.SavePrefs();
5963 Sys_UpdateWindows( W_ALL );
5966 void MainFrame::OnTexturebk(){
5967 DoColor( COLOR_TEXTUREBACK );
5968 Sys_UpdateWindows( W_ALL );
5971 void MainFrame::OnColorsXybk(){
5972 DoColor( COLOR_GRIDBACK );
5973 Sys_UpdateWindows( W_ALL );
5976 void MainFrame::OnColorsMajor(){
5977 DoColor( COLOR_GRIDMAJOR );
5978 Sys_UpdateWindows( W_ALL );
5981 void MainFrame::OnColorsMinor(){
5982 DoColor( COLOR_GRIDMINOR );
5983 Sys_UpdateWindows( W_ALL );
5986 void MainFrame::OnColorsMajor_Alt(){
5987 DoColor( COLOR_GRIDMAJOR_ALT );
5988 Sys_UpdateWindows( W_ALL );
5991 void MainFrame::OnColorsMinor_Alt(){
5992 DoColor( COLOR_GRIDMINOR_ALT );
5993 Sys_UpdateWindows( W_ALL );
5996 void MainFrame::OnColorsGridtext(){
5997 DoColor( COLOR_GRIDTEXT );
5998 Sys_UpdateWindows( W_ALL );
6001 void MainFrame::OnColorsGridblock(){
6002 DoColor( COLOR_GRIDBLOCK );
6003 Sys_UpdateWindows( W_ALL );
6006 void MainFrame::OnColorsCameraBack(){
6007 DoColor( COLOR_CAMERABACK );
6008 Sys_UpdateWindows( W_ALL );
6011 void MainFrame::OnColorsBrush(){
6012 DoColor( COLOR_BRUSHES );
6013 Sys_UpdateWindows( W_ALL );
6016 void MainFrame::OnColorsSelectedbrush(){
6017 DoColor( COLOR_SELBRUSHES );
6018 Sys_UpdateWindows( W_ALL );
6021 void MainFrame::OnColorsSelectedbrush3D(){
6022 DoColor( COLOR_SELBRUSHES3D );
6023 Sys_UpdateWindows( W_ALL );
6026 void MainFrame::OnColorsClipper(){
6027 DoColor( COLOR_CLIPPER );
6028 Sys_UpdateWindows( W_ALL );
6031 void MainFrame::OnColorsViewname(){
6032 DoColor( COLOR_VIEWNAME );
6033 Sys_UpdateWindows( W_ALL );
6036 void MainFrame::OnMiscGamma(){
6037 float fSave = g_qeglobals.d_savedinfo.fGamma;
6039 if ( fSave != g_qeglobals.d_savedinfo.fGamma ) {
6040 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for Gamma settings to take effect." ) );
6043 void MainFrame::OnMiscFindbrush(){
6047 void MainFrame::OnMiscNextleakspot(){
6051 void MainFrame::OnMiscPreviousleakspot(){
6055 void MainFrame::OnMiscPrintxy(){
6059 void MainFrame::OnMiscSelectentitycolor(){
6060 if ( edit_entity ) {
6061 CString strColor = ValueForKey( edit_entity, "_color" );
6062 if ( strColor.GetLength() > 0 ) {
6064 int n = sscanf( strColor,"%f %f %f", &fR, &fG, &fB );
6066 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6067 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6068 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6072 if ( inspector_mode == W_ENTITY && ( DoColor( COLOR_ENTITY ) ) ) {
6074 sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6075 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6076 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
6078 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntValueField] ), buffer );
6079 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntKeyField] ), "_color" );
6081 //DK - SOF change to get color to entity quickly
6082 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6083 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6086 Sys_UpdateWindows( W_ALL );
6090 void MainFrame::OnConvertcurves(){
6093 for ( brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next )
6095 if ( pb->curveBrush ) {
6096 for ( face_t* f = pb->brush_faces ; f ; f = f->next )
6098 if ( f->texdef.contents & CONTENTS_LADDER ) {
6099 f->texdef.contents &= ~CONTENTS_LADDER;
6100 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6105 Map_BuildBrushData();
6109 void MainFrame::OnRegionOff(){
6113 void MainFrame::OnRegionSetxy(){
6117 void MainFrame::OnRegionSettallbrush(){
6118 Map_RegionTallBrush();
6121 void MainFrame::OnRegionSetbrush(){
6125 void MainFrame::OnRegionSetselection(){
6126 Map_RegionSelectedBrushes();
6129 void MainFrame::OnBrush3sided(){
6130 Undo_Start( "3 sided" );
6131 Undo_AddBrushList( &selected_brushes );
6132 Brush_MakeSided( 3 );
6133 Undo_EndBrushList( &selected_brushes );
6137 void MainFrame::OnBrush4sided(){
6138 Undo_Start( "4 sided" );
6139 Undo_AddBrushList( &selected_brushes );
6140 Brush_MakeSided( 4 );
6141 Undo_EndBrushList( &selected_brushes );
6145 void MainFrame::OnBrush5sided(){
6146 Undo_Start( "5 sided" );
6147 Undo_AddBrushList( &selected_brushes );
6148 Brush_MakeSided( 5 );
6149 Undo_EndBrushList( &selected_brushes );
6153 void MainFrame::OnBrush6sided(){
6154 Undo_Start( "6 sided" );
6155 Undo_AddBrushList( &selected_brushes );
6156 Brush_MakeSided( 6 );
6157 Undo_EndBrushList( &selected_brushes );
6161 void MainFrame::OnBrush7sided(){
6162 Undo_Start( "7 sided" );
6163 Undo_AddBrushList( &selected_brushes );
6164 Brush_MakeSided( 7 );
6165 Undo_EndBrushList( &selected_brushes );
6169 void MainFrame::OnBrush8sided(){
6170 Undo_Start( "8 sided" );
6171 Undo_AddBrushList( &selected_brushes );
6172 Brush_MakeSided( 8 );
6173 Undo_EndBrushList( &selected_brushes );
6177 void MainFrame::OnBrush9sided(){
6178 Undo_Start( "9 sided" );
6179 Undo_AddBrushList( &selected_brushes );
6180 Brush_MakeSided( 9 );
6181 Undo_EndBrushList( &selected_brushes );
6185 void MainFrame::OnBrushArbitrarysided(){
6186 Undo_Start( "arbitrary sided" );
6187 Undo_AddBrushList( &selected_brushes );
6189 Undo_EndBrushList( &selected_brushes );
6193 void MainFrame::OnBrushMakecone(){
6194 Undo_Start( "make cone" );
6195 Undo_AddBrushList( &selected_brushes );
6197 Undo_EndBrushList( &selected_brushes );
6201 void MainFrame::OnBrushPrimitivesSphere(){
6202 Undo_Start( "make sphere" );
6203 Undo_AddBrushList( &selected_brushes );
6205 DoSides( false, true );
6207 Undo_EndBrushList( &selected_brushes );
6211 void MainFrame::OnCurvePatchtube(){
6212 Undo_Start( "make curve cylinder" );
6213 Undo_AddBrushList( &selected_brushes );
6214 Patch_BrushToMesh( false );
6215 Sys_UpdateWindows( W_ALL );
6216 Undo_EndBrushList( &selected_brushes );
6220 void MainFrame::OnCurvePatchdensetube(){
6221 Undo_Start( "dense cylinder" );
6222 Undo_AddBrushList( &selected_brushes );
6224 Patch_BrushToMesh( false );
6225 OnCurveInsertAddrow();
6226 Sys_UpdateWindows( W_ALL );
6228 Undo_EndBrushList( &selected_brushes );
6232 void MainFrame::OnCurvePatchverydensetube(){
6233 Undo_Start( "very dense cylinder" );
6234 Undo_AddBrushList( &selected_brushes );
6236 Patch_BrushToMesh( false );
6237 OnCurveInsertAddrow();
6238 OnCurveInsertInsertrow();
6239 OnCurveInsertAddrow();
6240 Sys_UpdateWindows( W_ALL );
6242 Undo_EndBrushList( &selected_brushes );
6246 void MainFrame::OnCurvePatchsquare(){
6247 Undo_Start( "square cylinder" );
6248 Undo_AddBrushList( &selected_brushes );
6250 Patch_BrushToMesh( false, false, false, true );
6251 Sys_UpdateWindows( W_ALL );
6253 Undo_EndBrushList( &selected_brushes );
6257 void MainFrame::OnCurvePatchendcap(){
6258 Undo_Start( "make end cap" );
6259 Undo_AddBrushList( &selected_brushes );
6260 Patch_BrushToMesh( false, false, true );
6261 Sys_UpdateWindows( W_ALL );
6262 Undo_EndBrushList( &selected_brushes );
6266 void MainFrame::OnCurvePatchbevel(){
6267 Undo_Start( "make bevel" );
6268 Undo_AddBrushList( &selected_brushes );
6269 Patch_BrushToMesh( false, true, false );
6270 Sys_UpdateWindows( W_ALL );
6271 Undo_EndBrushList( &selected_brushes );
6275 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel(){
6276 Undo_Start( "square bevel" );
6277 Undo_AddBrushList( &selected_brushes );
6279 Patch_BrushToMesh( false, true, false, true );
6280 Sys_UpdateWindows( W_ALL );
6282 Undo_EndBrushList( &selected_brushes );
6286 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap(){
6287 Undo_Start( "square endcap" );
6288 Undo_AddBrushList( &selected_brushes );
6290 Patch_BrushToMesh( false, false, true, true );
6291 Sys_UpdateWindows( W_ALL );
6293 Undo_EndBrushList( &selected_brushes );
6297 void MainFrame::OnCurvePatchcone(){
6298 Undo_Start( "make curve cone" );
6299 Undo_AddBrushList( &selected_brushes );
6300 Patch_BrushToMesh( true );
6301 Sys_UpdateWindows( W_ALL );
6302 Undo_EndBrushList( &selected_brushes );
6306 void MainFrame::OnCurveSimplepatchmesh(){
6307 Undo_Start( "make simpe patch mesh" );
6308 Undo_AddBrushList( &selected_brushes );
6310 Undo_EndBrushList( &selected_brushes );
6314 void MainFrame::OnCurveInsertInsertcolumn(){
6315 Undo_Start( "insert (2) columns" );
6316 Undo_AddBrushList( &selected_brushes );
6317 Patch_AdjustSelected( true, true, false );
6318 Sys_UpdateWindows( W_ALL );
6319 Undo_EndBrushList( &selected_brushes );
6323 void MainFrame::OnCurveInsertAddcolumn(){
6324 Undo_Start( "add (2) columns" );
6325 Undo_AddBrushList( &selected_brushes );
6326 Patch_AdjustSelected( true, true, true );
6327 Sys_UpdateWindows( W_ALL );
6328 Undo_EndBrushList( &selected_brushes );
6332 void MainFrame::OnCurveInsertInsertrow(){
6333 Undo_Start( "insert (2) rows" );
6334 Undo_AddBrushList( &selected_brushes );
6335 Patch_AdjustSelected( true, false, false );
6336 Sys_UpdateWindows( W_ALL );
6337 Undo_EndBrushList( &selected_brushes );
6341 void MainFrame::OnCurveInsertAddrow(){
6342 Undo_Start( "add (2) rows" );
6343 Undo_AddBrushList( &selected_brushes );
6344 Patch_AdjustSelected( true, false, true );
6345 Sys_UpdateWindows( W_ALL );
6346 Undo_EndBrushList( &selected_brushes );
6350 void MainFrame::OnCurveDeleteFirstcolumn(){
6351 Undo_Start( "delete first (2) columns" );
6352 Undo_AddBrushList( &selected_brushes );
6353 Patch_AdjustSelected( false, true, true );
6354 Sys_UpdateWindows( W_ALL );
6355 Undo_EndBrushList( &selected_brushes );
6359 void MainFrame::OnCurveDeleteLastcolumn(){
6360 Undo_Start( "delete last (2) columns" );
6361 Undo_AddBrushList( &selected_brushes );
6362 Patch_AdjustSelected( false, true, false );
6363 Sys_UpdateWindows( W_ALL );
6364 Undo_EndBrushList( &selected_brushes );
6368 void MainFrame::OnCurveDeleteFirstrow(){
6369 Undo_Start( "delete first (2) rows" );
6370 Undo_AddBrushList( &selected_brushes );
6371 Patch_AdjustSelected( false, false, true );
6372 Sys_UpdateWindows( W_ALL );
6373 Undo_EndBrushList( &selected_brushes );
6377 void MainFrame::OnCurveDeleteLastrow(){
6378 Undo_Start( "delete last (2) rows" );
6379 Undo_AddBrushList( &selected_brushes );
6380 Patch_AdjustSelected( false, false, false );
6381 Sys_UpdateWindows( W_ALL );
6382 Undo_EndBrushList( &selected_brushes );
6386 void MainFrame::OnCurveNegative(){
6387 Patch_ToggleInverted();
6388 //Sys_UpdateWindows(W_ALL);
6391 void MainFrame::OnCurveRedisperseRows(){
6392 Undo_Start( "redisperse rows" );
6393 Undo_AddBrushList( &selected_brushes );
6394 Patch_DisperseRows();
6395 Sys_UpdateWindows( W_ALL );
6396 Undo_EndBrushList( &selected_brushes );
6400 void MainFrame::OnCurveRedisperseIntermediateCols(){
6401 Undo_Start( "redisperse im cols" );
6402 Undo_AddBrushList( &selected_brushes );
6403 Patch_DisperseIntermediateColumns();
6404 Sys_UpdateWindows( W_ALL );
6405 Undo_EndBrushList( &selected_brushes );
6409 void MainFrame::OnCurveRedisperseIntermediateRows(){
6410 Undo_Start( "redisperse im rows" );
6411 Undo_AddBrushList( &selected_brushes );
6412 Patch_DisperseIntermediateRows();
6413 Sys_UpdateWindows( W_ALL );
6414 Undo_EndBrushList( &selected_brushes );
6418 void MainFrame::OnCurveMatrixTranspose(){
6420 Sys_UpdateWindows( W_ALL );
6423 void MainFrame::OnCurveCap(){
6425 Sys_UpdateWindows( W_ALL );
6428 void MainFrame::OnCurveCyclecap(){
6429 Patch_CycleCapSelected();
6430 Sys_UpdateWindows( W_ALL );
6433 void MainFrame::OnCurveOverlaySet(){
6434 Patch_SetOverlays();
6435 Sys_UpdateWindows( W_ALL );
6438 void MainFrame::OnCurveOverlayClear(){
6439 Patch_ClearOverlays();
6440 Sys_UpdateWindows( W_ALL );
6443 void MainFrame::OnCurveThicken(){
6444 Undo_Start( "curve thicken" );
6445 Undo_AddBrushList( &selected_brushes );
6447 Undo_EndBrushList( &selected_brushes );
6452 this can no longer be trigger manually from the menu
6453 happens only once at startup
6455 void MainFrame::OnPluginsRefresh(){
6460 // open the Q3Rad manual
6461 void MainFrame::OnHelp(){
6462 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6464 help = g_strAppPath;
6465 help += "Q3Rad_Manual/index.htm";
6466 OpenURL( help.GetBuffer() );
6469 // FIXME: we'll go towards a unified help thing soon
6470 void MainFrame::OnHelpLinks(){
6472 link = g_strAppPath;
6473 link += "links.htm";
6474 OpenURL( link.GetBuffer() );
6477 void MainFrame::OnHelpBugreport(){
6478 OpenURL( "http://www.qeradiant.com/faq/fom-serve/cache/138.html" );
6481 void MainFrame::OnHelpCommandlist(){
6485 void MainFrame::OnHelpAbout(){
6489 void MainFrame::OnPopupSelection(){
6490 GtkWidget *menu, *item;
6491 const gchar *labels[] = { _( "Select Complete Tall" ), _( "Select Touching" ), _( "Select Partial Tall" ), _( "Select Inside" )};
6492 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6493 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6495 menu = gtk_menu_new();
6497 for ( int i = 0; i < 4; i++ )
6499 item = gtk_menu_item_new_with_label( labels[i] );
6500 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( HandleCommand ),
6501 GINT_TO_POINTER( ids[i] ) );
6502 gtk_widget_show( item );
6503 gtk_menu_append( GTK_MENU( menu ), item );
6506 gtk_menu_popup( GTK_MENU( menu ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6509 void MainFrame::OnViewChange(){
6511 //HandlePopup(this, IDR_POPUP_VIEW);
6514 void MainFrame::OnTexturesPopup(){
6515 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "render_quality_menu" );
6516 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6519 void MainFrame::ToggleCamera(){
6520 if ( m_bCamPreview ) {
6521 m_bCamPreview = false;
6524 m_bCamPreview = true;
6528 void MainFrame::OnViewCameraupdate(){
6529 Sys_UpdateWindows( W_CAMERA );
6532 void MainFrame::OnSelectMouserotate(){
6533 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mouserotate" ) );
6534 g_bIgnoreCommands++;
6537 if ( ActiveXY()->ClipMode() ) {
6540 if ( ActiveXY()->RotateMode() ) {
6541 // SetRotateMode(false) always works
6542 ActiveXY()->SetRotateMode( false );
6543 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6547 // may not work if no brush selected, see return value
6548 if ( ActiveXY()->SetRotateMode( true ) ) {
6549 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6552 // if MFC called, we need to set back to FALSE ourselves
6553 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6557 g_bIgnoreCommands--;
6560 void MainFrame::OnSelectMousescale(){
6561 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mousescale" ) );
6562 g_bIgnoreCommands++;
6565 if ( ActiveXY()->ClipMode() ) {
6568 if ( ActiveXY()->RotateMode() ) {
6569 // SetRotateMode(false) always works
6570 ActiveXY()->SetRotateMode( false );
6571 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6573 if ( ActiveXY()->ScaleMode() ) {
6574 ActiveXY()->SetScaleMode( false );
6575 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6579 ActiveXY()->SetScaleMode( true );
6580 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6583 g_bIgnoreCommands--;
6586 void MainFrame::OnScalelockx(){
6587 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockx" ) );
6588 g_bIgnoreCommands++;
6590 if ( g_nScaleHow & SCALE_X ) {
6591 g_nScaleHow ^= SCALE_X;
6592 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6596 g_nScaleHow |= SCALE_X;
6597 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6599 g_bIgnoreCommands--;
6602 void MainFrame::OnScalelocky(){
6603 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelocky" ) );
6604 g_bIgnoreCommands++;
6606 if ( g_nScaleHow & SCALE_Y ) {
6607 g_nScaleHow ^= SCALE_Y;
6608 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6612 g_nScaleHow |= SCALE_Y;
6613 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6615 g_bIgnoreCommands--;
6618 void MainFrame::OnScalelockz(){
6619 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockz" ) );
6620 g_bIgnoreCommands++;
6622 if ( g_nScaleHow & SCALE_Z ) {
6623 g_nScaleHow ^= SCALE_Z;
6624 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6628 g_nScaleHow |= SCALE_Z;
6629 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6631 g_bIgnoreCommands--;
6634 void MainFrame::OnDontselectcurve(){
6635 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
6636 g_bIgnoreCommands++;
6637 g_PrefsDlg.m_bSelectCurves ^= 1;
6638 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
6639 g_bIgnoreCommands--;
6642 void MainFrame::OnPatchToggleBox(){
6643 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
6644 g_bIgnoreCommands++;
6645 g_bPatchShowBounds ^= 1;
6646 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
6647 g_bIgnoreCommands--;
6648 Sys_UpdateWindows( W_ALL );
6651 void MainFrame::OnPatchWireframe(){
6652 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_wireframe" ) );
6653 g_bIgnoreCommands++;
6654 g_bPatchWireFrame ^= 1;
6655 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWireFrame ) ? TRUE : FALSE );
6656 g_bIgnoreCommands--;
6657 Sys_UpdateWindows( W_ALL );
6660 void MainFrame::OnPatchBend(){
6661 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
6662 g_bIgnoreCommands++;
6664 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
6665 g_bIgnoreCommands--;
6666 Sys_UpdateWindows( W_ALL );
6669 void MainFrame::OnPatchWeld(){
6670 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
6671 g_bIgnoreCommands++;
6673 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
6674 g_bIgnoreCommands--;
6675 Sys_UpdateWindows( W_ALL );
6678 void MainFrame::OnPatchDrilldown(){
6679 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
6680 g_bIgnoreCommands++;
6681 g_bPatchDrillDown ^= 1;
6682 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
6683 g_bIgnoreCommands--;
6684 Sys_UpdateWindows( W_ALL );
6687 void MainFrame::OnShowEntities(){
6688 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "view_entitiesas_menu" ); // use pointer to existing menu object
6689 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6692 void MainFrame::OnDropGroupName(){
6694 char* name = DoNameDlg ("Name Selection");
6699 Sys_UpdateWindows (W_ALL);
6705 void MainFrame::OnDropGroupNewgroup(){
6709 void MainFrame::OnDropGroupRemove(){
6711 Select_AddToGroup("World");
6712 Sys_UpdateWindows (W_ALL);
6716 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6717 void MainFrame::OnFaceFit(){
6721 void MainFrame::OnDontselectmodel(){
6722 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
6723 g_bIgnoreCommands++;
6724 g_PrefsDlg.m_bSelectModels ^= 1;
6725 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
6726 g_bIgnoreCommands--;
6729 void MainFrame::OnViewTexture(){
6730 if ( FloatingGroupDialog() ) { // QE4 style
6731 if ( inspector_mode == W_TEXTURE ) {
6732 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
6733 widget_delete_hide( g_qeglobals_gui.d_entity );
6736 gtk_widget_show( g_qeglobals_gui.d_entity );
6741 gtk_widget_show( g_qeglobals_gui.d_entity );
6742 SetInspectorMode( W_TEXTURE );
6747 void MainFrame::OnPatchInspector(){
6748 TogglePatchInspector();
6751 void MainFrame::OnCurveNegativeTextureX(){
6752 Patch_InvertTexture( false );
6753 //Sys_UpdateWindows(W_ALL);
6756 void MainFrame::OnCurveNegativeTextureY(){
6757 Patch_InvertTexture( true );
6758 //Sys_UpdateWindows(W_ALL);
6761 void MainFrame::OnCurveInsertcolumn(){
6762 if ( &selected_brushes == selected_brushes.next ) {
6765 Undo_Start( "insert colum" );
6766 Undo_AddBrushList( &selected_brushes );
6767 //Patch_AdjustSelectedRowCols(0, 2);
6768 Patch_AdjustSelected( true, true, true );
6769 Sys_UpdateWindows( W_ALL );
6770 Undo_EndBrushList( &selected_brushes );
6774 void MainFrame::OnCurveInsertrow(){
6775 if ( &selected_brushes == selected_brushes.next ) {
6778 Undo_Start( "insert row" );
6779 Undo_AddBrushList( &selected_brushes );
6780 //Patch_AdjustSelectedRowCols(2, 0);
6781 Patch_AdjustSelected( true, false, true );
6782 Sys_UpdateWindows( W_ALL );
6783 Undo_EndBrushList( &selected_brushes );
6787 void MainFrame::OnCurveDeletecolumn(){
6788 if ( &selected_brushes == selected_brushes.next ) {
6791 Undo_Start( "delete column" );
6792 Undo_AddBrushList( &selected_brushes );
6793 Patch_AdjustSelected( false, true, true );
6794 Sys_UpdateWindows( W_ALL );
6795 Undo_EndBrushList( &selected_brushes );
6799 void MainFrame::OnCurveDeleterow(){
6800 if ( &selected_brushes == selected_brushes.next ) {
6803 Undo_Start( "delete row" );
6804 Undo_AddBrushList( &selected_brushes );
6805 Patch_AdjustSelected( false, false, true );
6806 Sys_UpdateWindows( W_ALL );
6807 Undo_EndBrushList( &selected_brushes );
6811 void MainFrame::OnPatchTab(){
6812 if ( g_bPatchBendMode ) {
6813 Patch_BendHandleTAB();
6815 // else if (g_bPatchInsertMode)
6816 // Patch_InsDelHandleTAB();
6819 // check to see if the selected brush is part of a func group
6820 // if it is, deselect everything and reselect the next brush
6822 brush_t *b2, *b = selected_brushes.next;
6824 if ( b != &selected_brushes ) {
6825 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6828 for ( b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext )
6835 if ( b2 == &e->brushes ) {
6839 Select_Brush( b2, false );
6840 Sys_UpdateWindows( W_ALL );
6846 void MainFrame::OnSelectFuncGroup(){
6847 // check to see if the selected brush is part of a func group
6848 // if it is, deselect everything and reselect the next brush
6850 brush_t *b = selected_brushes.next;
6852 if ( b != &selected_brushes ) {
6853 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6855 Select_SelectGroup( e );
6860 void MainFrame::OnCameraForward( bool keydown ){
6861 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6863 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6864 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6865 Sys_UpdateWindows( nUpdate );
6870 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
6873 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
6878 void MainFrame::OnCameraBack( bool keydown ){
6879 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6881 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6882 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6883 Sys_UpdateWindows( nUpdate );
6888 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
6891 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
6896 void MainFrame::OnCameraLeft( bool keydown ){
6898 if ( m_pCamWnd->m_bFreeMove ) {
6899 OnCameraStrafeleft( keydown );
6904 if ( g_PrefsDlg.m_bCamDiscrete ) {
6906 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
6907 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6908 Sys_UpdateWindows( nUpdate );
6913 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
6916 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
6921 void MainFrame::OnCameraRight( bool keydown ){
6923 if ( m_pCamWnd->m_bFreeMove ) {
6924 OnCameraStraferight( keydown );
6929 if ( g_PrefsDlg.m_bCamDiscrete ) {
6931 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
6932 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6933 Sys_UpdateWindows( nUpdate );
6938 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
6941 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
6946 void MainFrame::OnCameraUp(){
6947 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
6948 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6949 Sys_UpdateWindows( nUpdate );
6952 void MainFrame::OnCameraDown(){
6953 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
6954 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6955 Sys_UpdateWindows( nUpdate );
6958 void MainFrame::OnCameraAngleup(){
6959 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
6960 if ( m_pCamWnd->Camera()->angles[0] > 85 ) {
6961 m_pCamWnd->Camera()->angles[0] = 85;
6963 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6966 void MainFrame::OnCameraAngledown(){
6967 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
6968 if ( m_pCamWnd->Camera()->angles[0] < -85 ) {
6969 m_pCamWnd->Camera()->angles[0] = -85;
6971 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6974 void MainFrame::OnCameraStrafeleft( bool keydown ){
6975 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6977 if ( !m_pCamWnd->m_bFreeMove ) {
6979 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6980 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6981 Sys_UpdateWindows( nUpdate );
6988 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
6991 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
6995 void MainFrame::OnCameraStraferight( bool keydown ){
6996 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6998 if ( !m_pCamWnd->m_bFreeMove ) {
7000 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
7001 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
7002 Sys_UpdateWindows( nUpdate );
7009 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7012 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7016 void MainFrame::OnGridToggle(){
7017 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7018 Sys_UpdateWindows( W_XY | W_Z );
7021 void MainFrame::OnViewCrosshair(){
7023 Sys_UpdateWindows( W_XY );
7026 void MainFrame::OnSelectionTextureRotateclock(){
7027 Select_RotateTexture( abs( g_PrefsDlg.m_nRotation ) );
7030 void MainFrame::OnSelectionTextureRotatecounter(){
7031 Select_RotateTexture( -abs( g_PrefsDlg.m_nRotation ) );
7034 void MainFrame::OnSelectionTextureScaleup(){
7035 Select_ScaleTexture( 0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7038 void MainFrame::OnSelectionTextureScaledown(){
7039 Select_ScaleTexture( 0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7042 void MainFrame::OnSelectionTextureScaleLeft(){
7043 Select_ScaleTexture( -g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7046 void MainFrame::OnSelectionTextureScaleRight(){
7047 Select_ScaleTexture( g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7050 void MainFrame::OnSelectionTextureShiftleft(){
7051 Select_ShiftTexture( (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7054 void MainFrame::OnSelectionTextureShiftright(){
7055 Select_ShiftTexture( (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7058 void MainFrame::OnSelectionTextureShiftup(){
7059 Select_ShiftTexture( 0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7062 void MainFrame::OnSelectionTextureShiftdown(){
7063 Select_ShiftTexture( 0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7066 void MainFrame::OnGridPrev(){
7068 if ( g_qeglobals.d_gridsize == 1 ) {
7069 g_qeglobals.d_gridsize = 0.5;
7070 g_qeglobals.d_bSmallGrid = true;
7071 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7073 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7074 g_qeglobals.d_gridsize = 0.25;
7075 g_qeglobals.d_bSmallGrid = true;
7076 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_025" ) );
7078 else if ( g_qeglobals.d_gridsize > 1 ) {
7079 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7080 g_qeglobals.d_bSmallGrid = false;
7082 switch ( (int)g_qeglobals.d_gridsize )
7084 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7085 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7086 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7087 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7088 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7089 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7090 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7091 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7092 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7100 // SnapTToGrid option: need to check everywhere the grid size is changed
7101 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7102 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7107 g_bIgnoreCommands++;
7108 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7109 g_bIgnoreCommands--;
7111 Sys_UpdateWindows( W_XY | W_Z );
7114 void MainFrame::OnGridNext(){
7116 if ( g_qeglobals.d_gridsize == 0.25 ) {
7117 g_qeglobals.d_gridsize = 0.5;
7118 g_qeglobals.d_bSmallGrid = true;
7119 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7121 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7122 g_qeglobals.d_gridsize = 1;
7123 g_qeglobals.d_bSmallGrid = false;
7124 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) );
7126 else if ( g_qeglobals.d_gridsize < 256 ) {
7127 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7128 g_qeglobals.d_bSmallGrid = false;
7130 switch ( (int)g_qeglobals.d_gridsize )
7132 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7133 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7134 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7135 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7136 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7137 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7138 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7139 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7140 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7141 default: item = NULL;
7149 // SnapTToGrid option: need to check everywhere the grid size is changed
7150 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7151 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7156 g_bIgnoreCommands++;
7157 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7158 g_bIgnoreCommands--;
7160 Sys_UpdateWindows( W_XY | W_Z );
7163 void MainFrame::OnSelectionMovedown(){
7164 if ( &selected_brushes == selected_brushes.next ) {
7167 Undo_Start( "move down" );
7168 Undo_AddBrushList( &selected_brushes );
7171 vAmt[0] = vAmt[1] = 0.0;
7172 vAmt[2] = -g_qeglobals.d_gridsize;
7173 Select_Move( vAmt );
7174 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7176 Undo_EndBrushList( &selected_brushes );
7180 void MainFrame::OnSelectionMoveup(){
7181 if ( &selected_brushes == selected_brushes.next ) {
7184 Undo_Start( "move up" );
7185 Undo_AddBrushList( &selected_brushes );
7188 vAmt[0] = vAmt[1] = 0.0;
7189 vAmt[2] = g_qeglobals.d_gridsize;
7190 Select_Move( vAmt );
7191 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7193 Undo_EndBrushList( &selected_brushes );
7197 void MainFrame::OnSelectionPrint(){
7198 for ( brush_t* b = selected_brushes.next ; b != &selected_brushes ; b = b->next )
7202 void MainFrame::OnSelectionTogglesizepaint(){
7203 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7204 Sys_UpdateWindows( W_XY );
7207 void MainFrame::OnPatchNaturalize(){
7208 Patch_NaturalizeSelected();
7209 Sys_UpdateWindows( W_ALL );
7212 void MainFrame::OnSnapToGrid(){
7213 if ( &selected_brushes == selected_brushes.next ) {
7216 Undo_Start( "snap selection to grid" );
7217 Undo_AddBrushList( &selected_brushes );
7218 //Select_SnapToGrid();
7219 for ( brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next )
7221 if ( pb->patchBrush ) {
7222 Patch_SnapToGrid( pb->pPatch );
7225 Brush_SnapToGrid( pb );
7228 Sys_UpdateWindows( W_ALL );
7229 Undo_EndBrushList( &selected_brushes );
7233 void MainFrame::OnSelectAll(){
7237 void MainFrame::OnSelectionInvert(){
7239 Sys_UpdateWindows( W_XY | W_Z | W_CAMERA );
7243 void PerformFiltering(){
7248 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7249 brush->bFiltered = FilterBrush( brush );
7251 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7252 brush->bFiltered = FilterBrush( brush );
7255 void MainFrame::OnFilterAreaportals(){
7256 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
7257 g_bIgnoreCommands++;
7258 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS ) & EXCLUDE_AREAPORTALS ) {
7259 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7262 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7264 g_bIgnoreCommands--;
7266 Sys_UpdateWindows( W_XY | W_CAMERA );
7269 void MainFrame::OnFilterCaulk(){
7270 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
7271 g_bIgnoreCommands++;
7272 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK ) & EXCLUDE_CAULK ) {
7273 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7276 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7278 g_bIgnoreCommands--;
7280 Sys_UpdateWindows( W_XY | W_CAMERA );
7283 void MainFrame::OnFilterClips(){
7284 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
7285 g_bIgnoreCommands++;
7286 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) {
7287 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7290 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7292 g_bIgnoreCommands--;
7294 Sys_UpdateWindows( W_XY | W_CAMERA );
7297 void MainFrame::OnFilterBotClips(){
7298 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
7299 g_bIgnoreCommands++;
7300 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP ) & EXCLUDE_BOTCLIP ) {
7301 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7304 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7306 g_bIgnoreCommands--;
7308 Sys_UpdateWindows( W_XY | W_CAMERA );
7311 void MainFrame::OnFilterStructural(){
7312 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
7313 g_bIgnoreCommands++;
7314 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL ) & EXCLUDE_STRUCTURAL ) {
7315 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7318 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7320 g_bIgnoreCommands--;
7322 Sys_UpdateWindows( W_XY | W_CAMERA );
7325 void MainFrame::OnFilterDetails(){
7326 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
7327 g_bIgnoreCommands++;
7328 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS ) & EXCLUDE_DETAILS ) {
7329 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7332 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7334 g_bIgnoreCommands--;
7336 Sys_UpdateWindows( W_XY | W_CAMERA );
7339 void MainFrame::OnFilterEntities(){
7340 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
7341 g_bIgnoreCommands++;
7342 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) {
7343 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7346 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7348 g_bIgnoreCommands--;
7350 Sys_UpdateWindows( W_XY | W_CAMERA );
7353 void MainFrame::OnFilterHintsskips(){
7354 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
7355 g_bIgnoreCommands++;
7356 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS ) & EXCLUDE_HINTSSKIPS ) {
7357 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7360 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7362 g_bIgnoreCommands--;
7364 Sys_UpdateWindows( W_XY | W_CAMERA );
7367 void MainFrame::OnFilterLights(){
7368 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
7369 g_bIgnoreCommands++;
7370 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) {
7371 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7374 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7376 g_bIgnoreCommands--;
7378 Sys_UpdateWindows( W_XY | W_CAMERA );
7381 void MainFrame::OnFilterLiquids(){
7382 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
7383 g_bIgnoreCommands++;
7384 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS ) & EXCLUDE_LIQUIDS ) {
7385 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7388 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7390 g_bIgnoreCommands--;
7392 Sys_UpdateWindows( W_XY | W_CAMERA );
7395 void MainFrame::OnFilterModels(){
7396 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
7397 g_bIgnoreCommands++;
7398 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS ) & EXCLUDE_MODELS ) {
7399 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7402 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7404 g_bIgnoreCommands--;
7406 Sys_UpdateWindows( W_XY | W_CAMERA );
7409 void MainFrame::OnFilterPatches(){
7410 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
7411 g_bIgnoreCommands++;
7412 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES ) & EXCLUDE_CURVES ) {
7413 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7416 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7418 g_bIgnoreCommands--;
7420 Sys_UpdateWindows( W_XY | W_CAMERA );
7423 void MainFrame::OnFilterPaths(){
7424 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
7425 g_bIgnoreCommands++;
7426 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) {
7427 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7430 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7432 g_bIgnoreCommands--;
7434 Sys_UpdateWindows( W_XY | W_CAMERA );
7437 void MainFrame::OnFilterClusterportals(){
7438 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
7439 g_bIgnoreCommands++;
7440 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS ) & EXCLUDE_CLUSTERPORTALS ) {
7441 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7444 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7446 g_bIgnoreCommands--;
7448 Sys_UpdateWindows( W_XY | W_CAMERA );
7451 void MainFrame::OnFilterLightgrid(){
7452 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
7453 g_bIgnoreCommands++;
7454 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID ) & EXCLUDE_LIGHTGRID ) {
7455 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7458 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7460 g_bIgnoreCommands--;
7462 Sys_UpdateWindows( W_XY | W_CAMERA );
7465 void MainFrame::OnFilterTranslucent(){
7466 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
7467 g_bIgnoreCommands++;
7468 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT ) & EXCLUDE_TRANSLUCENT ) {
7469 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7472 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7474 g_bIgnoreCommands--;
7476 Sys_UpdateWindows( W_XY | W_CAMERA );
7479 void MainFrame::OnFilterTriggers(){
7480 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
7481 g_bIgnoreCommands++;
7482 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS ) & EXCLUDE_TRIGGERS ) {
7483 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7486 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7488 g_bIgnoreCommands--;
7490 Sys_UpdateWindows( W_XY | W_CAMERA );
7493 void MainFrame::OnFilterWorld(){
7494 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
7495 g_bIgnoreCommands++;
7496 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) {
7497 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7500 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7502 g_bIgnoreCommands--;
7504 Sys_UpdateWindows( W_XY | W_CAMERA );
7514 // =============================================================================
7515 // leo: Unused functions, not called anywhere from the code (need to check)
7517 void MainFrame::OnViewConsole(){
7518 if ( FloatingGroupDialog() ) { // QE4 style
7519 if ( inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating ) { // are we in console mode already?
7520 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
7521 widget_delete_hide( g_qeglobals_gui.d_entity );
7524 gtk_widget_show( g_qeglobals_gui.d_entity );
7529 gtk_widget_show( g_qeglobals_gui.d_entity );
7530 SetInspectorMode( W_CONSOLE );
7535 void MainFrame::OnCurveFreeze(){
7539 void MainFrame::OnCurveUnFreeze(){
7540 Patch_UnFreeze( false );
7543 void MainFrame::OnCurveUnFreezeAll(){
7544 Patch_UnFreeze( true );
7547 void MainFrame::OnSelectReselect(){
7551 void MainFrame::OnSelectionTextureFit(){
7552 // TODO: Add your command handler code here
7555 void MainFrame::OnPatchEnter(){
7559 void MainFrame::OnDropGroupAddtoWorld(){
7561 Select_AddToGroup("World");
7562 Sys_UpdateWindows (W_ALL);