2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 // Main Window for Q3Radiant
25 // Leonardo Zide (leo@lokigames.com)
31 #include <gdk/gdkwin32.h>
32 #define COMPILE_MULTIMON_STUBS
37 #include <glib/gi18n.h>
38 #include <gdk/gdkkeysyms.h>
39 #include <gdk/gdkprivate.h>
41 #if defined ( __linux__ ) || defined ( __APPLE__ )
45 #include "groupdialog.h"
46 #include "patchdialog.h"
49 // use this to verbose what happens with the beyboard
55 CString g_strAppPath; ///< holds the full path of the executable
56 CString g_strDTDPath; ///< path to the DTD files
57 CString g_pidFile; ///< the global .pid file (only for global part of the startup)
58 CString g_pidGameFile; ///< the game-specific .pid file
59 CString g_strBitmapsPath; // directory where the bitmaps are stored
62 points to the game tools directory, for instance
63 C:\Program Files\Quake III Arena\GtkRadiant
65 this is one of the main variables that are configured by the game selection on startup
66 <g_strGameToolsPath>/plugins
67 <g_strGameToolsPath>/modules
70 CString g_strGameToolsPath; ///< this is set by g_PrefsDlg.mGamesDialog
71 CGameDescription *g_pGameDescription; ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
72 CString g_strPluginsDir; ///< name of plugins directory, always sub-directory of toolspath
73 CString g_strModulesDir; ///< name of modules directory, always sub-directory of toolspath
76 directory for temp files
77 NOTE: on *nix this is were we check for .pid
79 CString g_strTempPath;
80 MainFrame* g_pParentWnd = NULL; // used to precast to CMainFrame
81 PrefsDlg g_Preferences; // global prefs instance
82 PrefsDlg& g_PrefsDlg = g_Preferences; // reference used throughout
83 int g_nUpdateBits = 0; // window update flags
84 bool g_bScreenUpdates = true; // whether window painting is active, used in a few places
85 // to disable updates for speed reasons
86 // both of the above should be made members of CMainFrame
87 int g_bIgnoreCommands; // Used to ignore commands when checking menus/toolbars
88 GSList *g_BSPFrontendCommands; // List of commands in the BSP menu
90 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
91 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
93 extern bool g_bCrossHairs;
96 extern PatchDialog g_PatchDialog;
98 GtkAccelGroup* global_accel;
100 void Select_Ungroup();
102 // command mapping stuff
104 // m_strCommand is the command string
105 // m_nKey is the GDK_??? equivelant
106 // m_nModifiers are key states as follows
113 #define SPEED_MOVE 32
114 #define SPEED_TURN 22.5
116 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
117 // - if you add a command here and you don't want a menu item, use the "hidden" menu
118 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
119 SCommandInfo g_Commands[] =
121 {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
122 {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
123 {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
124 // {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
125 {"SelectFuncGroup", 'G', 0x00, ID_SELECT_FUNC_GROUP, "menu_select_func_group"},
126 {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
127 {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
128 {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
129 {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
130 {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
131 {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
132 {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
133 {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
134 {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
135 {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
136 {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
137 {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
138 {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
139 {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
140 {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
141 {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
142 {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
143 {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
144 {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
145 {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
146 {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
147 {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
148 {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
149 {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
150 {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
151 {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
152 {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
153 {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
154 {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
155 {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
156 {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
157 {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
158 {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
159 {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
160 {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
161 {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
162 {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
163 {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
164 {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
165 {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
166 {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
167 {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
168 {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
169 {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
170 {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
171 {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
172 // {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
173 {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
174 {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
175 {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
176 {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
177 {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
178 {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
179 {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
180 {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
181 {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
182 {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
183 {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
184 {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
185 {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
186 {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
187 {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
188 {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
189 {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
190 {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
191 {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
192 {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
193 {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
194 {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
195 {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
196 {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
197 {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
198 {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
199 {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
200 {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
201 {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
202 {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
203 {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
204 {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
205 {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
206 {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
207 //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
208 {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
209 {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
210 {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
211 {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
212 {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
213 {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
214 {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
215 {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
216 {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
217 {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
218 {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
219 {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
220 {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
221 {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
222 {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
223 {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
224 {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
225 {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
226 {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
227 {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
228 {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
229 {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
230 {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
231 {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
232 {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
233 {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
234 {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
235 {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
236 {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
237 {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
238 {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
239 {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
240 {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
241 {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
242 {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
243 {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
244 {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
245 {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
246 {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
247 {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
248 {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
249 {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
250 {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
251 {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
252 {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
253 {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
254 {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
255 {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
256 {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
257 {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
258 {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
259 {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
260 {"FilterCaulk", '6', RAD_ALT, ID_FILTER_CAULK, "menu_filter_caulk"},
261 {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
262 {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
263 {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
264 {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
265 {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
266 {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
267 {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
268 {"FilterStructural", 'D', RAD_CONTROL | RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
269 {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
270 {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
271 {"FilterTriggers", 'T', RAD_CONTROL | RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
272 {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
273 {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
274 {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
277 int g_nCommandCount = sizeof( g_Commands ) / sizeof( SCommandInfo );
281 {"Space", GDK_space},
282 {"Backspace", GDK_BackSpace},
283 {"Escape", GDK_Escape},
285 {"Insert", GDK_Insert},
286 {"Delete", GDK_Delete},
287 {"PageUp", GDK_Prior},
288 {"PageDown", GDK_Next},
292 {"Right", GDK_Right},
306 {"Return", GDK_Return},
307 {"Comma", GDK_comma},
308 {"Period", GDK_period},
309 {"Plus", GDK_KP_Add},
310 {"Multiply", GDK_multiply},
311 {"Subtract", GDK_KP_Subtract},
312 {"NumPad0", GDK_KP_0},
313 {"NumPad1", GDK_KP_1},
314 {"NumPad2", GDK_KP_2},
315 {"NumPad3", GDK_KP_3},
316 {"NumPad4", GDK_KP_4},
317 {"NumPad5", GDK_KP_5},
318 {"NumPad6", GDK_KP_6},
319 {"NumPad7", GDK_KP_7},
320 {"NumPad8", GDK_KP_8},
321 {"NumPad9", GDK_KP_9},
328 int g_nKeyCount = sizeof( g_Keys ) / sizeof( SKeyInfo );
330 // =============================================================================
333 void WINAPI Sys_UpdateWindows( int nBits ){
334 g_nUpdateBits |= nBits;
337 // =============================================================================
340 // Gef: Separate handling for keyup events
341 void HandleKeyUp( GtkWidget *widget, gpointer data ){
342 int id = GPOINTER_TO_INT( data );
344 Sys_Printf( "HandleKeyUp: %d\n", id );
347 if ( g_bIgnoreCommands ) {
353 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward( FALSE ); break;
354 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack( FALSE ); break;
355 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft( FALSE ); break;
356 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight( FALSE ); break;
357 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft( FALSE ); break;
358 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight( FALSE ); break;
362 gint HandleCommand( GtkWidget *widget, gpointer data ){
363 int id = GPOINTER_TO_INT( data );
365 Sys_Printf( "HandleCommand %d\n", id );
368 if ( g_bIgnoreCommands ) {
370 Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
375 if ( id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END ) {
376 g_pParentWnd->OnTextureWad( id );
378 else if ( id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END ) {
379 g_pParentWnd->OnBspCommand( id );
381 else if ( id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4 ) {
382 g_pParentWnd->OnMru( id );
384 else if ( id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE ) {
385 if ( GTK_CHECK_MENU_ITEM( widget )->active ) {
386 g_pParentWnd->OnViewNearest( id );
389 else if ( id >= ID_GRID_025 && id <= ID_GRID_256 ) {
390 g_pParentWnd->OnGrid( id );
392 else if ( id >= ID_PLUGIN_START && id <= ID_PLUGIN_END ) {
394 gtk_label_get( GTK_LABEL( GTK_BIN( widget )->child ), &str );
395 g_pParentWnd->OnPlugIn( id, str );
397 else if ( id >= ID_ENTITY_START && id <= ID_ENTITY_END ) {
399 gtk_label_get( GTK_LABEL( GTK_BIN( widget )->child ), &str );
400 g_pParentWnd->ActiveXY()->OnEntityCreate( str );
404 case ID_FILE_NEW: g_pParentWnd->OnFileNew(); break;
405 case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
406 case ID_FILE_OPEN: g_pParentWnd->OnFileOpen(); break;
407 case ID_FILE_SAVE: g_pParentWnd->OnFileSave(); break;
408 case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas(); break;
409 case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap(); break;
410 case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion(); break;
411 case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject(); break;
412 case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject(); break;
413 case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings(); break;
414 case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile(); break;
415 case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate(); break;
416 case ID_FILE_EXIT: g_pParentWnd->OnFileExit(); break;
417 case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap(); break;
418 case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo(); break;
419 case ID_EDIT_REDO: g_pParentWnd->OnEditRedo(); break;
420 case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush(); break;
421 case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush(); break;
422 case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera(); break;
423 case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete(); break;
424 case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo(); break;
425 case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo(); break;
426 case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts(); break;
427 case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab(); break;
428 case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab(); break;
429 case ID_PREFS: g_pParentWnd->OnPrefs(); break;
430 case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera(); break;
431 case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole(); break;
432 case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity(); break;
433 case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups(); break;
434 case ID_SELECT_FUNC_GROUP: g_pParentWnd->OnSelectFuncGroup(); break;
435 case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview(); break;
436 case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz(); break;
437 case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz(); break;
438 case ID_TOGGLEZ: g_pParentWnd->OnTogglez(); break;
439 case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter(); break;
440 case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor(); break;
441 case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor(); break;
442 case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview(); break;
443 case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview(); break;
444 case ID_VIEW_XY: g_pParentWnd->OnViewXy(); break;
445 case ID_VIEW_SIDE: g_pParentWnd->OnViewSide(); break;
446 case ID_VIEW_FRONT: g_pParentWnd->OnViewFront(); break;
447 case ID_VIEW_100: g_pParentWnd->OnView100(); break;
448 case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin(); break;
449 case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout(); break;
450 case ID_VIEW_Z100: g_pParentWnd->OnViewZ100(); break;
451 case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin(); break;
452 case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout(); break;
453 case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein(); break;
454 case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout(); break;
455 case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames(); break;
456 case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks(); break;
457 case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates(); break;
458 case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline(); break;
459 case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes(); break;
460 case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone(); break;
461 case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles(); break;
462 case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected(); break;
463 case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden(); break;
464 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
465 case ID_VIEW_ENTITIESAS_WIREFRAME:
466 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
467 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
468 case ID_VIEW_ENTITIESAS_SKINNED:
469 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
470 g_pParentWnd->OnEntitiesSetViewAs( id );
472 case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping(); break;
473 case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting(); break;
474 case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges(); break;
475 case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies(); break;
476 case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone(); break;
477 case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect(); break;
478 case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx(); break;
479 case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy(); break;
480 case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz(); break;
481 case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex(); break;
482 case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey(); break;
483 case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez(); break;
484 case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation(); break;
485 case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale(); break;
486 case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow(); break;
487 case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract(); break;
488 case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge(); break;
489 case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline(); break;
490 case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle(); break;
491 case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall(); break;
492 case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching(); break;
493 case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall(); break;
494 case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside(); break;
495 case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft(); break;
496 case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright(); break;
497 case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup(); break;
498 case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown(); break;
499 case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper(); break;
500 case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected(); break;
501 case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected(); break;
502 case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip(); break;
503 case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect(); break;
504 case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity(); break;
505 case ID_SELECTION_MERGE: Select_MergeEntity(); break;
506 case ID_SELECTION_SEPERATE: Select_Seperate(); break;
507 case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail(); break;
508 case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural(); break;
509 case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid(); break;
510 case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse(); break;
511 case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall(); break;
512 case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector(); break;
513 case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall(); break;
514 case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock(); break;
515 case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock(); break;
516 case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad(); break;
517 case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders(); break;
518 case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow(); break;
519 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
520 case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
521 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
522 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
523 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
524 g_pParentWnd->SetTextureScale( id );
526 case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist(); break;
527 case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly(); break;
528 case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup(); break;
529 case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown(); break;
530 case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark(); break;
531 case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal(); break;
532 case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer(); break;
533 case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack(); break;
534 case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar(); break; /* ydnar */
535 case ID_TEXTUREBK: g_pParentWnd->OnTexturebk(); break;
536 case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk(); break;
537 case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor(); break;
538 case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor(); break;
539 case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext(); break;
540 case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock(); break;
541 case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack(); break;
542 case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush(); break;
543 case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush(); break;
544 case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D(); break;
545 case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper(); break;
546 case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname(); break;
547 case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma(); break;
548 case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush(); break;
549 case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot(); break;
550 case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot(); break;
551 case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy(); break;
552 case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor(); break;
553 case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves(); break;
554 case ID_REGION_OFF: g_pParentWnd->OnRegionOff(); break;
555 case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy(); break;
556 case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush(); break;
557 case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush(); break;
558 case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection(); break;
559 case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided(); break;
560 case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided(); break;
561 case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided(); break;
562 case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided(); break;
563 case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided(); break;
564 case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided(); break;
565 case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided(); break;
566 case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided(); break;
567 case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone(); break;
568 case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere(); break;
569 case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube(); break;
570 case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube(); break;
571 case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube(); break;
572 case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare(); break;
573 case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap(); break;
574 case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel(); break;
575 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel(); break;
576 case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap(); break;
577 case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone(); break;
578 case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh(); break;
579 case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn(); break;
580 case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn(); break;
581 case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow(); break;
582 case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow(); break;
583 case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn(); break;
584 case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn(); break;
585 case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow(); break;
586 case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow(); break;
587 case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative(); break;
588 case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows(); break;
589 case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols(); break;
590 case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows(); break;
591 case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose(); break;
592 case ID_CURVE_CAP: g_pParentWnd->OnCurveCap(); break;
593 case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap(); break;
594 case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet(); break;
595 case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear(); break;
596 case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken(); break;
597 case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh(); break;
598 case ID_HELP: g_pParentWnd->OnHelp(); break;
599 case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
600 case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
601 case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist(); break;
602 case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout(); break;
603 case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel(); break;
604 case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals(); break;
605 case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk(); break;
606 case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural(); break;
607 case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips(); break;
608 case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips(); break;
609 case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails(); break;
610 case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities(); break;
611 case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips(); break;
612 case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights(); break;
613 case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids(); break;
614 case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels(); break;
615 case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches(); break;
616 case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent(); break;
617 case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers(); break;
618 case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld(); break;
619 case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths(); break;
620 case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals(); break;
621 case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid(); break;
623 case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection(); break;
624 case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange(); break;
625 case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup(); break;
626 case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera(); break;
627 case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate(); break;
628 case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate(); break;
629 case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale(); break;
630 case ID_SCALELOCKX: g_pParentWnd->OnScalelockx(); break;
631 case ID_SCALELOCKY: g_pParentWnd->OnScalelocky(); break;
632 case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz(); break;
633 case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve(); break;
634 case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox(); break;
635 case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe(); break;
636 case ID_PATCH_BEND: g_pParentWnd->OnPatchBend(); break;
637 case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld(); break;
638 case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown(); break;
639 case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName(); break;
640 case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup(); break;
641 case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove(); break;
642 case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities(); break;
644 case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit(); break;
645 case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture(); break;
646 case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector(); break;
647 case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX(); break;
648 case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY(); break;
649 case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn(); break;
650 case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow(); break;
651 case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn(); break;
652 case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow(); break;
653 case ID_PATCH_TAB: g_pParentWnd->OnPatchTab(); break;
654 case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward( TRUE ); break;
655 case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack( TRUE ); break;
656 case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft( TRUE ); break;
657 case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight( TRUE ); break;
658 case ID_CAMERA_UP: g_pParentWnd->OnCameraUp(); break;
659 case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown(); break;
660 case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup(); break;
661 case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown(); break;
662 case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft( TRUE ); break;
663 case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight( TRUE ); break;
664 case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle(); break;
665 case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole(); break;
666 case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair(); break;
667 case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit(); break;
668 case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock(); break;
669 case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter(); break;
670 case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup(); break;
671 case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown(); break;
672 case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft(); break;
673 case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright(); break;
674 case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup(); break;
675 case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown(); break;
676 case ID_GRID_PREV: g_pParentWnd->OnGridPrev(); break;
677 case ID_GRID_NEXT: g_pParentWnd->OnGridNext(); break;
678 case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft(); break;
679 case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight(); break;
680 case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown(); break;
681 case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup(); break;
682 case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint(); break;
683 case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint(); break;
684 case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize(); break;
685 case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid(); break;
686 case ID_SELECT_ALL: g_pParentWnd->OnSelectAll(); break;
687 case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert(); break;
693 static gint timer( gpointer data ){
694 MainFrame *wnd = (MainFrame*)data;
699 static gint mainframe_delete( GtkWidget *widget, GdkEvent *event, gpointer data ){
700 MainFrame *wnd = (MainFrame*)data;
704 if ( ConfirmModified() ) {
708 g_qeglobals_gui.d_edit = NULL;
713 static void mainframe_destroy( GtkWidget *widget, gpointer data ){
714 MainFrame *wnd = (MainFrame*)data;
716 // avoid saving prefs when the app is minimized
717 if ( g_pParentWnd->IsSleeping() ) {
718 Sys_Printf( "Shutdown while sleeping, not saving prefs\n" );
719 g_qeglobals.disable_ini = true;
722 // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
723 // we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
724 g_PrefsDlg.SavePrefs();
729 // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
730 // and modules / plugins decide to save some stuff
731 g_pParentWnd->GetPlugInMgr().Shutdown();
736 g_PrefsDlg.Destroy();
737 g_dlgSurface.Destroy();
739 g_PatchDialog.Destroy();
744 static gint mainframe_keypress( GtkWidget* widget, GdkEventKey* event, gpointer data ){
745 unsigned int code = gdk_keyval_to_upper( event->keyval );
747 if ( code == GDK_ISO_Left_Tab ) {
752 Sys_Printf( "key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK );
755 // return only if Texture Viewport is in main window, otherwise if Tex viewport is in it's own window
756 // the Filter GtkEntry won't release focus
757 if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus( GTK_WINDOW( widget ) ) ) {
758 if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) ) {
764 Sys_Printf( "mainframe_keypress processing into a command\n" );
766 for ( int i = 0; i < g_nCommandCount; i++ )
768 if ( g_Commands[i].m_nKey == code ) { // find a match?
770 unsigned int nState = 0;
771 if ( Sys_AltDown() ) {
774 if ( ( event->state & GDK_CONTROL_MASK ) != 0 ) {
775 nState |= RAD_CONTROL;
777 if ( ( event->state & GDK_SHIFT_MASK ) != 0 ) {
780 if ( ( g_Commands[i].m_nModifiers & 0x7 ) == nState ) {
781 HandleCommand( NULL, GINT_TO_POINTER( g_Commands[i].m_nCommand ) );
782 gtk_signal_emit_stop_by_name( GTK_OBJECT( widget ), "key_press_event" );
791 static gint mainframe_keyrelease( GtkWidget* widget, GdkEventKey* event, gpointer data ){
792 unsigned int code = gdk_keyval_to_upper( event->keyval );
794 if ( gtk_accelerator_valid( event->keyval, (GdkModifierType)0 ) ) {
798 for ( int i = 0; i < g_nCommandCount; i++ )
800 if ( g_Commands[i].m_nKey == code ) { // find a match?
801 if ( !g_Commands[i].m_nModifiers ) {
802 // Gef: Only call the handler if it's a key that needs keyup events
803 switch ( g_Commands[i].m_nCommand )
805 case ID_CAMERA_FORWARD:
808 case ID_CAMERA_RIGHT:
809 case ID_CAMERA_STRAFELEFT:
810 case ID_CAMERA_STRAFERIGHT:
812 HandleKeyUp( NULL, GINT_TO_POINTER( g_Commands[i].m_nCommand ) );
813 gtk_signal_emit_stop_by_name( GTK_OBJECT( widget ), "key_release_event" );
826 // =============================================================================
827 // Window creation functions
829 void AddMenuItem( GtkWidget* item, unsigned int id ){
830 for ( int i = 0; i < g_nCommandCount; i++ )
831 if ( g_Commands[i].m_nCommand == id ) {
832 g_object_set_data( G_OBJECT( g_pParentWnd->m_pWidget ), g_Commands[i].m_strMenu, item );
837 void MainFrame::handle_help_command( int id ){
838 OpenURL( mHelpURLs[id]->GetBuffer() );
842 needed for hooking in Gtk+
844 void HandleHelpCommand( GtkWidget *widget, gpointer data ){
845 int id = GPOINTER_TO_INT( data );
846 g_pParentWnd->handle_help_command( id );
849 void MainFrame::process_xlink( Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel ){
851 pDoc = xmlParseFile( FileName.GetBuffer() );
853 Sys_Printf( "Processing .xlink file '%s'\n", FileName.GetBuffer() );
855 GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic( menu, menu_name );
856 // start walking the nodes, find the 'links' one
857 xmlNodePtr pNode = pDoc->children;
858 while ( pNode && strcmp( (const char*)pNode->name, "links" ) )
861 pNode = pNode->children;
864 if ( !strcmp( (const char*)pNode->name, "item" ) ) {
867 if ( strstr( (char *)xmlGetProp( pNode, (xmlChar *)"url" ), "http://" ) ) {
870 *url = (char *)xmlGetProp( pNode, (xmlChar *)"url" );
877 *url += (char *)xmlGetProp( pNode, (xmlChar *)"url" );
879 mHelpURLs.push_back( url );
880 create_menu_item_with_mnemonic( menu_in_menu, (char *)xmlGetProp( pNode, (xmlChar *)"name" ), GTK_SIGNAL_FUNC( HandleHelpCommand ), mHelpURLs.size() - 1 );
889 Sys_Printf( "'%s' not found / parse failed\n", FileName.GetBuffer() );
893 void MainFrame::create_game_help_menu( GtkWidget *menu, GtkAccelGroup *accel ){
895 list<CGameDescription *>::iterator iGame;
897 // start in the global dir
898 FileName = g_strAppPath;
899 FileName += "global.xlink";
900 process_xlink( FileName, "General", g_strAppPath.GetBuffer(), menu, accel );
902 for ( iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++ )
904 FileName = ( *iGame )->mGameToolsPath;
905 FileName += "game.xlink";
906 process_xlink( FileName, ( *iGame )->mGameName, ( *iGame )->mGameToolsPath.GetBuffer(), menu, accel );
910 void MainFrame::create_main_menu( GtkWidget *window, GtkWidget *vbox ){
911 GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
912 GtkAccelGroup *accel;
915 accel = gtk_accel_group_new();
916 global_accel = accel;
917 gtk_window_add_accel_group( GTK_WINDOW( window ), accel );
919 handle_box = gtk_handle_box_new();
920 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
921 gtk_widget_show( handle_box );
923 menu_bar = gtk_menu_bar_new();
924 gtk_container_add( GTK_CONTAINER( handle_box ), menu_bar );
925 gtk_widget_show( menu_bar );
928 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_File" ) );
929 if ( g_PrefsDlg.m_bDetachableMenus ) {
930 menu_tearoff( menu );
933 create_menu_item_with_mnemonic( menu, _( "_New Map" ),
934 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_NEW );
935 menu_separator( menu );
937 //++timo temporary experimental stuff for sleep mode..
938 item = create_menu_item_with_mnemonic( menu, _( "_Sleep" ),
939 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SLEEP );
940 g_object_set_data( G_OBJECT( window ), "menu_file_sleep", item );
941 menu_separator( menu );
944 item = create_menu_item_with_mnemonic( menu, _( "_Open..." ),
945 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_OPEN );
946 g_object_set_data( G_OBJECT( window ), "menu_file_open", item );
947 create_menu_item_with_mnemonic( menu, _( "_Import..." ), // Hydra: give it it's proper name
948 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_IMPORTMAP );
949 item = create_menu_item_with_mnemonic( menu, _( "_Save" ),
950 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVE );
951 g_object_set_data( G_OBJECT( window ), "menu_file_save", item );
952 create_menu_item_with_mnemonic( menu, _( "Save _as..." ),
953 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVEAS );
954 create_menu_item_with_mnemonic( menu, _( "Save s_elected..." ),
955 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_EXPORTMAP );
956 menu_separator( menu );
957 item = create_menu_item_with_mnemonic( menu, _( "Save re_gion..." ),
958 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_SAVEREGION );
959 g_object_set_data( G_OBJECT( window ), "menu_file_saveregion", item );
960 menu_separator( menu );
961 create_menu_item_with_mnemonic( menu, _( "New p_roject..." ),
962 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_NEWPROJECT );
963 create_menu_item_with_mnemonic( menu, _( "Load _project..." ),
964 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_LOADPROJECT );
965 create_menu_item_with_mnemonic( menu, _( "Pro_ject settings..." ),
966 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_PROJECTSETTINGS );
967 menu_separator( menu );
968 create_menu_item_with_mnemonic( menu, _( "_Pointfile..." ),
969 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_POINTFILE );
970 menu_separator( menu );
971 item = create_menu_item_with_mnemonic( menu, _( "Recent Files" ),
972 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT1 );
973 g_object_set_data( G_OBJECT( item ), "accel", accel );
974 gtk_widget_set_sensitive( item, FALSE );
975 MRU_AddWidget( item, 0 );
976 item = create_menu_item_with_mnemonic( menu, "2",
977 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT2 );
978 gtk_widget_hide( item );
979 MRU_AddWidget( item, 1 );
980 item = create_menu_item_with_mnemonic( menu, "3",
981 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT3 );
982 gtk_widget_hide( item );
983 MRU_AddWidget( item, 2 );
984 item = create_menu_item_with_mnemonic( menu, "4",
985 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_RECENT4 );
986 gtk_widget_hide( item );
987 MRU_AddWidget( item, 3 );
988 menu_separator( menu );
989 item = create_menu_item_with_mnemonic( menu, _( "Check for GtkRadiant update (web)" ),
990 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_CHECKUPDATE );
991 // disable, the functionality is no longer available
992 gtk_widget_set_sensitive( item, FALSE );
994 create_menu_item_with_mnemonic( menu, _( "E_xit" ),
995 GTK_SIGNAL_FUNC( HandleCommand ), ID_FILE_EXIT );
998 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Edit" ) );
999 if ( g_PrefsDlg.m_bDetachableMenus ) {
1000 menu_tearoff( menu );
1002 item = create_menu_item_with_mnemonic( menu, _( "_Undo" ),
1003 GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_UNDO );
1004 g_object_set_data( G_OBJECT( window ), "menu_edit_undo", item );
1005 item = create_menu_item_with_mnemonic( menu, _( "_Redo" ),
1006 GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_REDO );
1007 g_object_set_data( G_OBJECT( window ), "menu_edit_redo", item );
1008 menu_separator( menu );
1009 item = create_menu_item_with_mnemonic( menu, _( "_Copy" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_COPYBRUSH );
1010 item = create_menu_item_with_mnemonic( menu, _( "_Paste" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_PASTEBRUSH );
1011 item = create_menu_item_with_mnemonic( menu, _( "P_aste To Camera" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_PASTEBRUSHTOCAMERA );
1012 item = create_menu_item_with_mnemonic( menu, _( "_Delete" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DELETE );
1013 g_object_set_data( G_OBJECT( window ), "menu_selection_delete", item );
1014 menu_separator( menu );
1015 create_menu_item_with_mnemonic( menu, _( "Map Info..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_MAPINFO );
1016 create_menu_item_with_mnemonic( menu, _( "Entity Info..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_ENTITYINFO );
1017 menu_separator( menu );
1018 create_menu_item_with_mnemonic( menu, _( "Brush Scripts..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_SCRIPTS );
1019 menu_separator( menu );
1020 create_menu_item_with_mnemonic( menu, _( "Load Pre_fab..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_LOADPREFAB );
1021 create_menu_item_with_mnemonic( menu, _( "Save Selection as Prefab..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_EDIT_SAVEPREFAB );
1022 menu_separator( menu );
1023 create_menu_item_with_mnemonic( menu, _( "Preferences..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_PREFS );
1026 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_View" ) );
1027 if ( g_PrefsDlg.m_bDetachableMenus ) {
1028 menu_tearoff( menu );
1031 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Toggle" ) );
1032 create_menu_item_with_mnemonic( menu_in_menu, _( "Camera View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLECAMERA );
1033 create_menu_item_with_mnemonic( menu_in_menu, _( "Console View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLECONSOLE );
1034 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Entity View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITY );
1035 g_object_set_data( G_OBJECT( window ), "menu_view_entity", item );
1036 // create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1037 create_menu_item_with_mnemonic( menu_in_menu, _( "XY (Top)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW );
1038 create_menu_item_with_mnemonic( menu_in_menu, _( "YZ (Side)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW_YZ );
1039 create_menu_item_with_mnemonic( menu_in_menu, _( "XZ (Front)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEVIEW_XZ );
1040 create_menu_item_with_mnemonic( menu_in_menu, _( "Z View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLEZ );
1041 menu_separator( menu );
1042 item = create_menu_item_with_mnemonic( menu, _( "_Center" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CENTER );
1043 item = create_menu_item_with_mnemonic( menu, _( "_Center 2d" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CENTERVIEW );
1044 item = create_menu_item_with_mnemonic( menu, _( "_Up Floor" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_UPFLOOR );
1045 item = create_menu_item_with_mnemonic( menu, _( "_Down Floor" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_DOWNFLOOR );
1046 menu_separator( menu );
1047 item = create_menu_item_with_mnemonic( menu, _( "_Next (XY, YZ, XY)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEXTVIEW );
1048 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Layout" ) );
1049 create_menu_item_with_mnemonic( menu_in_menu, _( "XY (Top)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_XY );
1050 create_menu_item_with_mnemonic( menu_in_menu, _( "YZ" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SIDE );
1051 create_menu_item_with_mnemonic( menu_in_menu, _( "XZ" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_FRONT );
1052 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Zoom" ) );
1053 create_menu_item_with_mnemonic( menu_in_menu, _( "_XY 100%" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_100 );
1054 item = create_menu_item_with_mnemonic( menu_in_menu, _( "XY Zoom _In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZOOMIN );
1055 item = create_menu_item_with_mnemonic( menu_in_menu, _( "XY Zoom _Out" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZOOMOUT );
1056 menu_separator( menu_in_menu );
1057 create_menu_item_with_mnemonic( menu_in_menu, _( "_Z 100%" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_Z100 );
1058 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Z Zoo_m In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZZOOMIN );
1059 g_object_set_data( G_OBJECT( window ), "menu_view_zzoomin", item );
1060 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Z Zoom O_ut" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ZZOOMOUT );
1061 g_object_set_data( G_OBJECT( window ), "menu_view_zzoomout", item );
1062 menu_separator( menu_in_menu );
1063 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Cubic Clip Zoom In" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBEIN );
1064 item = create_menu_item_with_mnemonic( menu_in_menu, _( "Cubic Clip Zoom Out" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBEOUT );
1065 menu_separator( menu );
1067 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Show" ) );
1068 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show _Angles" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWANGLES, FALSE );
1069 g_object_set_data( G_OBJECT( window ), "menu_view_showangles", item );
1070 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show _Names" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWNAMES, TRUE );
1071 g_object_set_data( G_OBJECT( window ), "menu_view_shownames", item );
1072 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Blocks" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWBLOCKS, FALSE );
1073 g_object_set_data( G_OBJECT( window ), "menu_view_showblocks", item );
1074 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show C_oordinates" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWCOORDINATES, TRUE );
1075 g_object_set_data( G_OBJECT( window ), "menu_view_showcoordinates", item );
1076 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Window Outline" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWOUTLINE, TRUE );
1077 g_object_set_data( G_OBJECT( window ), "menu_view_showoutline", item );
1078 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show ZBuffered Outline" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_NOOUTLINE, TRUE );
1079 g_object_set_data( G_OBJECT( window ), "menu_selection_nooutline", item );
1080 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Axes" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWAXES, TRUE );
1081 g_object_set_data( G_OBJECT( window ), "menu_view_showaxes", item );
1082 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Show Workzone" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_SHOWWORKZONE, FALSE );
1083 g_object_set_data( G_OBJECT( window ), "menu_view_showworkzone", item );
1085 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Filter" ) );
1086 create_check_menu_item_with_mnemonic( menu_in_menu, _( "World" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_WORLD, FALSE );
1087 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Entities" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_ENTITIES, FALSE );
1088 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Areaportals" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_AREAPORTALS, FALSE );
1089 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Translucent" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_TRANSLUCENT, FALSE );
1090 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Liquids" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIQUIDS, FALSE );
1091 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Caulk" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CAULK, FALSE );
1092 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Clips" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CLIPS, FALSE );
1093 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Paths" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_PATHS, FALSE );
1094 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Clusterportals" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_CLUSTERPORTALS, FALSE );
1095 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Lights" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIGHTS, FALSE );
1096 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Structural" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_STRUCTURAL, FALSE );
1097 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Lightgrid" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_LIGHTGRID, FALSE );
1098 g_object_set_data( G_OBJECT( window ), "menu_filter_lightgrid", item );
1099 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Patches" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_PATCHES, FALSE );
1100 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Details" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_DETAILS, FALSE );
1101 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Hints" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_HINTSSKIPS, FALSE );
1102 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Models" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_MODELS, FALSE );
1103 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Triggers" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_TRIGGERS, FALSE );
1104 create_check_menu_item_with_mnemonic( menu_in_menu, _( "Botclips" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_FILTER_BOTCLIPS, FALSE );
1106 menu_separator( menu );
1107 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Hide/Show" ) );
1108 create_menu_item_with_mnemonic( menu_in_menu, _( "Hide Selected" ),
1109 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_HIDESHOW_HIDESELECTED );
1110 create_menu_item_with_mnemonic( menu_in_menu, _( "Show Hidden" ),
1111 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_HIDESHOW_SHOWHIDDEN );
1112 menu_separator( menu );
1113 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Entities as" ) );
1114 g_object_set_data( G_OBJECT( window ), "view_entitiesas_menu", menu_in_menu );
1115 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "Bounding box" ),
1116 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE );
1117 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_boundingbox", item );
1118 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Wireframe" ),
1119 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE );
1120 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_wireframe", item );
1121 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Selected Wireframe" ),
1122 GTK_SIGNAL_FUNC( HandleCommand ),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE );
1123 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_selectedwireframe", item );
1124 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Selected Skinned" ),
1125 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE );
1126 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_selectedskinned", item );
1127 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Skinned" ),
1128 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SKINNED,FALSE );
1129 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_skinned", item );
1130 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Skinned and Boxed" ),
1131 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE );
1132 g_object_set_data( G_OBJECT( window ), "menu_view_entitiesas_skinnedandboxed", item );
1133 menu_separator( menu );
1134 item = create_check_menu_item_with_mnemonic( menu, _( "Cubic Clipping" ),
1135 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CUBICCLIPPING, TRUE );
1136 g_object_set_data( G_OBJECT( window ), "menu_view_cubicclipping", item );
1137 menu_separator( menu );
1138 item = create_check_menu_item_with_mnemonic( menu, _( "OpenGL Lighting" ),
1139 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_OPENGLLIGHTING, FALSE );
1140 g_object_set_data( G_OBJECT( window ), "menu_view_opengllighting", item );
1143 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Selection" ) );
1144 if ( g_PrefsDlg.m_bDetachableMenus ) {
1145 menu_tearoff( menu );
1148 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Drag" ) );
1149 create_menu_item_with_mnemonic( menu_in_menu, _( "Drag _Edges" ),
1150 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DRAGEDGES );
1151 create_menu_item_with_mnemonic( menu_in_menu, _( "Drag _Vertices" ),
1152 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DRAGVERTECIES );
1153 menu_separator( menu );
1154 create_menu_item_with_mnemonic( menu, _( "_Clone" ),
1155 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CLONE );
1156 item = create_menu_item_with_mnemonic( menu, _( "Deselect" ),
1157 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DESELECT );
1158 item = create_menu_item_with_mnemonic( menu, _( "Invert" ),
1159 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_INVERT );
1161 create_menu_item_with_mnemonic( menu, _( "_Delete" ),
1162 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_DELETE );
1164 menu_separator( menu );
1165 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Flip" ) );
1166 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _X" ),
1167 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPX );
1168 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _Y" ),
1169 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPY );
1170 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip _Z" ),
1171 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_FLIPZ );
1172 menu_separator( menu );
1173 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Rotate" ) );
1174 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate X" ),
1175 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEX );
1176 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate Y" ),
1177 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEY );
1178 create_menu_item_with_mnemonic( menu_in_menu, _( "Rotate Z" ),
1179 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ROTATEZ );
1180 create_menu_item_with_mnemonic( menu_in_menu, _( "Arbitrary rotation..." ),
1181 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_ARBITRARYROTATION );
1182 menu_separator( menu );
1183 create_menu_item_with_mnemonic( menu, _( "Scale..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_SCALE );
1184 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "CSG" ) );
1185 create_menu_item_with_mnemonic( menu_in_menu, _( "Make _Hollow" ),
1186 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKEHOLLOW );
1187 create_menu_item_with_mnemonic( menu_in_menu, _( "CSG _Subtract" ),
1188 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CSGSUBTRACT );
1189 create_menu_item_with_mnemonic( menu_in_menu, _( "CSG _Merge" ),
1190 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CSGMERGE );
1191 menu_separator( menu );
1192 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Select" ) );
1193 create_menu_item_with_mnemonic( menu_in_menu, _( "Select Complete _Tall" ),
1194 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTCOMPLETETALL );
1195 create_menu_item_with_mnemonic( menu_in_menu, _( "Select T_ouching" ),
1196 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTTOUCHING );
1197 create_menu_item_with_mnemonic( menu_in_menu, _( "Select _Partial Tall" ),
1198 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTPARTIALTALL );
1199 create_menu_item_with_mnemonic( menu_in_menu, _( "Select _Inside" ),
1200 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECTINSIDE );
1201 create_menu_item_with_mnemonic( menu_in_menu, "Select Func _Group", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_FUNC_GROUP );
1203 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Left" ),
1204 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGELEFT );
1205 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Right" ),
1206 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGERIGHT );
1207 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Up" ),
1208 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEUP );
1209 create_menu_item_with_mnemonic( menu_in_menu, _( "Nudge Down" ),
1210 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEDOWN );
1212 menu_separator( menu );
1213 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Clipper" ) );
1214 create_menu_item_with_mnemonic( menu_in_menu, _( "Toggle Clipper" ),
1215 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CLIPPER );
1216 menu_separator( menu_in_menu );
1217 create_menu_item_with_mnemonic( menu_in_menu, _( "Clip selection" ),
1218 GTK_SIGNAL_FUNC( HandleCommand ), ID_CLIP_SELECTED );
1219 create_menu_item_with_mnemonic( menu_in_menu, _( "Split selection" ),
1220 GTK_SIGNAL_FUNC( HandleCommand ), ID_SPLIT_SELECTED );
1221 create_menu_item_with_mnemonic( menu_in_menu, _( "Flip Clip orientation" ),
1222 GTK_SIGNAL_FUNC( HandleCommand ), ID_FLIP_CLIP );
1223 menu_separator( menu );
1224 create_menu_item_with_mnemonic( menu, _( "Connect entities" ),
1225 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_CONNECT );
1226 create_menu_item_with_mnemonic( menu, _( "Ungroup entity" ),
1227 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_UNGROUPENTITY );
1228 create_menu_item_with_mnemonic( menu, _( "Make detail" ),
1229 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKE_DETAIL );
1230 create_menu_item_with_mnemonic( menu, _( "Make structural" ),
1231 GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MAKE_STRUCTURAL );
1234 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Bsp" ) );
1236 menu_separator( menu );
1237 g_object_set_data( G_OBJECT( window ), "menu_bsp", menu );
1240 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Grid" ) );
1241 if ( g_PrefsDlg.m_bDetachableMenus ) {
1242 menu_tearoff( menu );
1245 item = create_radio_menu_item_with_mnemonic( menu, NULL, _( "Grid0.25" ),
1246 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_025, FALSE );
1247 g_object_set_data( G_OBJECT( window ), "menu_grid_025", item );
1248 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid0.5" ),
1249 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_05, FALSE );
1250 g_object_set_data( G_OBJECT( window ), "menu_grid_05", item );
1251 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid1" ),
1252 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_1, FALSE );
1253 g_object_set_data( G_OBJECT( window ), "menu_grid_1", item );
1254 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid2" ),
1255 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_2, FALSE );
1256 g_object_set_data( G_OBJECT( window ), "menu_grid_2", item );
1257 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid4" ),
1258 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_4, FALSE );
1259 g_object_set_data( G_OBJECT( window ), "menu_grid_4", item );
1260 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid8" ),
1261 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_8, TRUE );
1262 g_object_set_data( G_OBJECT( window ), "menu_grid_8", item );
1263 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid16" ),
1264 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_16, FALSE );
1265 g_object_set_data( G_OBJECT( window ), "menu_grid_16", item );
1266 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid32" ),
1267 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_32, FALSE );
1268 g_object_set_data( G_OBJECT( window ), "menu_grid_32", item );
1269 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid64" ),
1270 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_64, FALSE );
1271 g_object_set_data( G_OBJECT( window ), "menu_grid_64", item );
1272 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid128" ),
1273 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_128, FALSE );
1274 g_object_set_data( G_OBJECT( window ), "menu_grid_128", item );
1275 item = create_radio_menu_item_with_mnemonic( menu, item, _( "Grid256" ),
1276 GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_256, FALSE );
1277 g_object_set_data( G_OBJECT( window ), "menu_grid_256", item );
1278 menu_separator( menu );
1279 item = create_check_menu_item_with_mnemonic( menu, _( "Snap to grid" ),
1280 GTK_SIGNAL_FUNC( HandleCommand ), ID_SNAPTOGRID, TRUE );
1281 g_object_set_data( G_OBJECT( window ), "menu_snaptogrid", item );
1284 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Textures" ) );
1285 if ( g_PrefsDlg.m_bDetachableMenus ) {
1286 menu_tearoff( menu );
1289 item = create_check_menu_item_with_mnemonic( menu, _( "Show In _Use" ),
1290 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHOWINUSE, FALSE );
1291 g_object_set_data( G_OBJECT( window ), "menu_textures_showinuse", item );
1292 item = create_check_menu_item_with_mnemonic( menu, _( "Show _All" ),
1293 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHOWALL, FALSE );
1294 g_object_set_data( G_OBJECT( window ), "menu_textures_showall", item );
1295 menu_separator( menu );
1296 item = create_check_menu_item_with_mnemonic( menu, _( "Show shaders" ),
1297 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHADERS_SHOW, FALSE );
1298 g_object_set_data( G_OBJECT( window ), "menu_textures_shaders_show", item );
1299 item = create_menu_item_with_mnemonic( menu, _( "Flush & Reload Shaders" ),
1300 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_RELOADSHADERS );
1301 g_object_set_data( G_OBJECT( window ), "menu_textures_reloadshaders", item );
1302 item = create_menu_item_with_mnemonic( menu, _( "Load directory..." ),
1303 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_LOAD );
1304 g_object_set_data( G_OBJECT( window ), "menu_textures_load", item );
1305 item = create_menu_item_with_mnemonic( menu, _( "Directory list..." ),
1306 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_LOADLIST );
1307 menu_separator( menu );
1309 item = create_menu_item_with_mnemonic( menu, _( "_Surface Inspector" ),
1310 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_INSPECTOR );
1311 menu_separator( menu );
1312 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Render Quality" ) );
1313 g_object_set_data( G_OBJECT( window ), "render_quality_menu", menu_in_menu );
1314 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "_Wireframe" ),
1315 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_WIREFRAME, FALSE );
1316 g_object_set_data( G_OBJECT( window ), "menu_textures_wireframe", item );
1317 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Flat shade" ),
1318 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_FLATSHADE, FALSE );
1319 g_object_set_data( G_OBJECT( window ), "menu_textures_flatshade", item );
1320 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Nearest" ),
1321 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEAREST, FALSE );
1322 g_object_set_data( G_OBJECT( window ), "menu_view_nearest", item );
1323 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "Nearest _Mipmap" ),
1324 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_NEARESTMIPMAP, FALSE );
1325 g_object_set_data( G_OBJECT( window ), "menu_view_nearestmipmap", item );
1326 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Linear" ),
1327 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_LINEAR, FALSE );
1328 g_object_set_data( G_OBJECT( window ), "menu_view_linear", item );
1329 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "_Bilinear" ),
1330 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_BILINEAR, FALSE );
1331 g_object_set_data( G_OBJECT( window ), "menu_view_bilinear", item );
1332 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "B_ilinear Mipmap" ),
1333 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_BILINEARMIPMAP, FALSE );
1334 g_object_set_data( G_OBJECT( window ), "menu_view_bilinearmipmap", item );
1335 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "T_rilinear" ),
1336 GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_TRILINEAR, FALSE );
1337 g_object_set_data( G_OBJECT( window ), "menu_view_trilinear", item );
1338 create_menu_item_with_mnemonic( menu, _( "Find / Replace..." ),
1339 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURE_REPLACEALL );
1341 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Texture Lock" ) );
1342 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Moves" ),
1343 GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLE_LOCK, TRUE );
1344 g_object_set_data( G_OBJECT( window ), "menu_toggle_lock", item );
1345 item = create_check_menu_item_with_mnemonic( menu_in_menu, _( "Rotations" ),
1346 GTK_SIGNAL_FUNC( HandleCommand ), ID_TOGGLE_ROTATELOCK, TRUE );
1347 g_object_set_data( G_OBJECT( window ), "menu_toggle_rotatelock", item );
1348 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Texture Window Scale" ) );
1349 item = create_radio_menu_item_with_mnemonic( menu_in_menu, NULL, _( "200%" ),
1350 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE );
1351 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_200", item );
1352 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "100%" ),
1353 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE );
1354 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_100", item );
1355 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "50%" ),
1356 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE );
1357 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_50", item );
1358 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "25%" ),
1359 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE );
1360 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_25", item );
1361 item = create_radio_menu_item_with_mnemonic( menu_in_menu, item, _( "10%" ),
1362 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE );
1363 g_object_set_data( G_OBJECT( window ), "menu_textures_texturewindowscale_10", item );
1364 item = menu_separator( menu );
1365 item = create_check_menu_item_with_mnemonic( menu, _( "shaderlist.txt only" ),
1366 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTURES_SHADERLISTONLY, FALSE );
1367 g_object_set_data( G_OBJECT( window ), "menu_textures_shaderlistonly", item );
1368 item = menu_separator( menu );
1369 g_object_set_data( G_OBJECT( window ), "menu_textures_separator", item );
1370 g_object_set_data( G_OBJECT( window ), "menu_textures", menu );
1373 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Misc" ) );
1374 if ( g_PrefsDlg.m_bDetachableMenus ) {
1375 menu_tearoff( menu );
1378 create_menu_item_with_mnemonic( menu, _( "_Benchmark" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_BENCHMARK );
1379 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Colors" ) );
1380 menu_3 = create_menu_in_menu_with_mnemonic( menu_in_menu, _( "Themes" ) );
1381 create_menu_item_with_mnemonic( menu_3, _( "QE4 Original" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETORIGINAL );
1382 create_menu_item_with_mnemonic( menu_3, _( "Q3Radiant Original" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETQER );
1383 create_menu_item_with_mnemonic( menu_3, _( "Black and Green" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETBLACK );
1384 create_menu_item_with_mnemonic( menu_3, _( "Maya/Max/Lightwave Emulation" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_COLOR_SETYDNAR );
1386 menu_separator( menu_in_menu );
1387 create_menu_item_with_mnemonic( menu_in_menu, _( "_Texture Background..." ),
1388 GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREBK );
1389 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Background..." ),
1390 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_XYBK );
1391 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Major..." ),
1392 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MAJOR );
1393 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Minor..." ),
1394 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MINOR );
1395 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Major Small..." ),
1396 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MAJOR_ALT );
1397 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Minor Small..." ),
1398 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_MINOR_ALT );
1399 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Text..." ),
1400 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_GRIDTEXT );
1401 create_menu_item_with_mnemonic( menu_in_menu, _( "Grid Block..." ),
1402 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_GRIDBLOCK );
1403 create_menu_item_with_mnemonic( menu_in_menu, _( "Default Brush..." ),
1404 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_BRUSH );
1405 create_menu_item_with_mnemonic( menu_in_menu, _( "Camera Background..." ),
1406 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_CAMERABACK );
1407 create_menu_item_with_mnemonic( menu_in_menu, _( "Selected Brush..." ),
1408 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_SELECTEDBRUSH );
1409 create_menu_item_with_mnemonic( menu_in_menu, _( "Selected Brush (Camera)..." ),
1410 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_SELECTEDBRUSH3D );
1411 create_menu_item_with_mnemonic( menu_in_menu, _( "Clipper..." ),
1412 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_CLIPPER );
1413 create_menu_item_with_mnemonic( menu_in_menu, _( "Active View name..." ),
1414 GTK_SIGNAL_FUNC( HandleCommand ), ID_COLORS_VIEWNAME );
1416 create_menu_item_with_mnemonic( menu, _( "_Gamma..." ),
1417 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_GAMMA );
1418 create_menu_item_with_mnemonic( menu, _( "Find brush..." ),
1419 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_FINDBRUSH );
1420 item = create_menu_item_with_mnemonic( menu, _( "Next leak spot" ),
1421 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_NEXTLEAKSPOT );
1422 item = create_menu_item_with_mnemonic( menu, _( "Previous leak spot" ),
1423 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_PREVIOUSLEAKSPOT );
1424 create_menu_item_with_mnemonic( menu, _( "_Print XY View" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_PRINTXY );
1425 item = create_menu_item_with_mnemonic( menu, _( "_Select Entity Color..." ),
1426 GTK_SIGNAL_FUNC( HandleCommand ), ID_MISC_SELECTENTITYCOLOR );
1427 g_object_set_data( G_OBJECT( window ), "menu_misc_selectentitycolor", item );
1430 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Region" ) );
1431 if ( g_PrefsDlg.m_bDetachableMenus ) {
1432 menu_tearoff( menu );
1435 create_menu_item_with_mnemonic( menu, _( "_Off" ),
1436 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_OFF );
1437 create_menu_item_with_mnemonic( menu, _( "_Set XY" ),
1438 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETXY );
1439 create_menu_item_with_mnemonic( menu, _( "Set _Tall Brush" ),
1440 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETTALLBRUSH );
1441 create_menu_item_with_mnemonic( menu, _( "Set _Brush" ),
1442 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETBRUSH );
1443 create_menu_item_with_mnemonic( menu, _( "Set Se_lected Brushes" ),
1444 GTK_SIGNAL_FUNC( HandleCommand ), ID_REGION_SETSELECTION );
1447 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Brush" ) );
1448 if ( g_PrefsDlg.m_bDetachableMenus ) {
1449 menu_tearoff( menu );
1452 item = create_menu_item_with_mnemonic( menu, _( "3 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_3SIDED );
1453 item = create_menu_item_with_mnemonic( menu, _( "4 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_4SIDED );
1454 item = create_menu_item_with_mnemonic( menu, _( "5 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_5SIDED );
1455 item = create_menu_item_with_mnemonic( menu, _( "6 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_6SIDED );
1456 item = create_menu_item_with_mnemonic( menu, _( "7 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_7SIDED );
1457 item = create_menu_item_with_mnemonic( menu, _( "8 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_8SIDED );
1458 item = create_menu_item_with_mnemonic( menu, _( "9 sided" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_9SIDED );
1459 menu_separator( menu );
1460 create_menu_item_with_mnemonic( menu, _( "Arbitrary sided..." ),
1461 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_ARBITRARYSIDED );
1462 menu_separator( menu );
1463 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Primitives" ) );
1464 create_menu_item_with_mnemonic( menu_in_menu, _( "Cone..." ),
1465 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_MAKECONE );
1466 create_menu_item_with_mnemonic( menu_in_menu, _( "Sphere..." ),
1467 GTK_SIGNAL_FUNC( HandleCommand ), ID_BRUSH_PRIMITIVES_SPHERE );
1470 if ( !g_pGameDescription->mNoPatch ) {
1471 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Curve" ) );
1472 if ( g_PrefsDlg.m_bDetachableMenus ) {
1473 menu_tearoff( menu );
1476 create_menu_item_with_mnemonic( menu, _( "Cylinder" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHTUBE );
1477 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "More Cylinders" ) );
1478 create_menu_item_with_mnemonic( menu_in_menu, _( "Dense Cylinder" ),
1479 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHDENSETUBE );
1480 create_menu_item_with_mnemonic( menu_in_menu, _( "Very Dense Cylinder" ),
1481 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHVERYDENSETUBE );
1482 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Cylinder" ),
1483 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHSQUARE );
1484 menu_separator( menu );
1485 create_menu_item_with_mnemonic( menu, _( "End cap" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHENDCAP );
1486 create_menu_item_with_mnemonic( menu, _( "Bevel" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHBEVEL );
1487 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "More End caps, Bevels" ) );
1488 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Endcap" ),
1489 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL );
1490 create_menu_item_with_mnemonic( menu_in_menu, _( "Square Bevel" ),
1491 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP );
1492 menu_separator( menu );
1493 create_menu_item_with_mnemonic( menu, _( "Cone" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PATCHCONE );
1494 item = create_menu_item_with_mnemonic( menu, _( "Sphere" ),
1495 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_PRIMITIVES_SPHERE );
1496 gtk_widget_set_sensitive( item, FALSE );
1497 menu_separator( menu );
1498 item = create_menu_item_with_mnemonic( menu, _( "Simple Patch Mesh..." ),
1499 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_SIMPLEPATCHMESH );
1500 g_object_set_data( G_OBJECT( window ), "menu_simplepatchmesh", item );
1501 menu_separator( menu );
1502 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Insert" ) );
1503 create_menu_item_with_mnemonic( menu_in_menu, _( "Insert (2) Columns" ),
1504 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_INSERTCOLUMN );
1505 create_menu_item_with_mnemonic( menu_in_menu, _( "Add (2) Columns" ),
1506 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_ADDCOLUMN );
1507 menu_separator( menu_in_menu );
1508 create_menu_item_with_mnemonic( menu_in_menu, _( "Insert (2) Rows" ),
1509 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_INSERTROW );
1510 create_menu_item_with_mnemonic( menu_in_menu, _( "Add (2) Rows" ),
1511 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERT_ADDROW );
1512 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Delete" ) );
1513 create_menu_item_with_mnemonic( menu_in_menu, _( "First (2) Columns" ),
1514 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_FIRSTCOLUMN );
1515 create_menu_item_with_mnemonic( menu_in_menu, _( "Last (2) Columns" ),
1516 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_LASTCOLUMN );
1517 menu_separator( menu_in_menu );
1518 create_menu_item_with_mnemonic( menu_in_menu, _( "First (2) Rows" ),
1519 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_FIRSTROW );
1520 create_menu_item_with_mnemonic( menu_in_menu, _( "Last (2) Rows" ),
1521 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETE_LASTROW );
1522 menu_separator( menu );
1523 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Matrix" ) );
1524 create_menu_item_with_mnemonic( menu_in_menu, _( "Invert" ),
1525 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVE );
1526 menu_3 = create_menu_in_menu_with_mnemonic( menu_in_menu, _( "Re-disperse" ) );
1527 create_menu_item_with_mnemonic( menu_3, _( "Rows" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_ROWS );
1528 create_menu_item_with_mnemonic( menu_3, _( "Cols (Intermediate)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS );
1529 create_menu_item_with_mnemonic( menu_3, _( "Rows (Intermediate)" ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS );
1530 create_menu_item_with_mnemonic( menu_in_menu, _( "Transpose" ),
1531 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_MATRIX_TRANSPOSE );
1532 menu_separator( menu );
1533 create_menu_item_with_mnemonic( menu, _( "Cap Selection" ),
1534 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_CAP );
1535 create_menu_item_with_mnemonic( menu, _( "Cycle Cap Texture" ),
1536 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_CYCLECAP );
1537 menu_separator( menu );
1538 menu_in_menu = create_menu_in_menu_with_mnemonic( menu, _( "Overlay" ) );
1539 create_menu_item_with_mnemonic( menu_in_menu, _( "Set" ),
1540 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_OVERLAY_SET );
1541 create_menu_item_with_mnemonic( menu_in_menu, _( "Clear" ),
1542 GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_OVERLAY_CLEAR );
1543 menu_separator( menu );
1544 create_menu_item_with_mnemonic( menu, _( "Thicken..." ), GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_THICKEN );
1547 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Plugins" ) );
1548 if ( g_PrefsDlg.m_bDetachableMenus ) {
1549 menu_tearoff( menu );
1553 create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1555 // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1556 item = menu_separator( menu );
1557 g_object_set_data( G_OBJECT( window ), "menu_plugin_separator", item );
1558 g_object_set_data( G_OBJECT( window ), "menu_plugin", menu );
1561 menu = create_sub_menu_with_mnemonic( menu_bar, _( "_Help" ) );
1562 if ( g_PrefsDlg.m_bDetachableMenus ) {
1563 menu_tearoff( menu );
1566 item = create_menu_item_with_mnemonic( menu, _( "Manual" ),
1567 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP );
1568 gtk_widget_add_accelerator( item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
1570 // this creates all the per-game drop downs for the game pack helps
1571 // it will take care of hooking the Sys_OpenURL calls etc.
1572 create_game_help_menu( menu, accel );
1574 // TTimo: this is in global.xlink now
1575 //create_menu_item_with_mnemonic (menu, "Links",
1576 // GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1577 create_menu_item_with_mnemonic( menu, _( "Bug report" ),
1578 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_BUGREPORT );
1579 create_menu_item_with_mnemonic( menu, _( "Shortcuts list" ),
1580 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_COMMANDLIST );
1581 create_menu_item_with_mnemonic( menu, _( "_About" ),
1582 GTK_SIGNAL_FUNC( HandleCommand ), ID_HELP_ABOUT );
1585 // leo: Hidden menu to make the accelerators work,
1586 // this is a hack that needs to be changed later if someone has a better idea.
1588 // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1589 menu = create_sub_menu_with_mnemonic( menu_bar, "Hidden" );
1590 if ( g_PrefsDlg.m_bDetachableMenus ) {
1591 menu_tearoff( menu );
1594 gtk_widget_hide( gtk_menu_get_attach_widget( GTK_MENU( menu ) ) );
1596 create_menu_item_with_mnemonic( menu, "BendMode", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_BEND );
1597 create_menu_item_with_mnemonic( menu, "FitTexture", GTK_SIGNAL_FUNC( HandleCommand ), IDC_BTN_FACEFIT );
1598 create_menu_item_with_mnemonic( menu, "ViewTextures", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_TEXTURE );
1599 create_menu_item_with_mnemonic( menu, "PatchInspector", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_INSPECTOR );
1600 create_menu_item_with_mnemonic( menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVETEXTUREY );
1601 create_menu_item_with_mnemonic( menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_NEGATIVETEXTUREX );
1602 create_menu_item_with_mnemonic( menu, "IncPatchColumn", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERTCOLUMN );
1603 create_menu_item_with_mnemonic( menu, "IncPatchRow", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_INSERTROW );
1604 create_menu_item_with_mnemonic( menu, "DecPatchColumn", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETECOLUMN );
1605 create_menu_item_with_mnemonic( menu, "DecPatchRow", GTK_SIGNAL_FUNC( HandleCommand ), ID_CURVE_DELETEROW );
1606 create_menu_item_with_mnemonic( menu, "Patch TAB", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_TAB );
1607 create_menu_item_with_mnemonic( menu, "Patch TAB", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_TAB );
1608 create_menu_item_with_mnemonic( menu, "SelectNudgeDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEDOWN );
1609 create_menu_item_with_mnemonic( menu, "CameraForward", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_FORWARD );
1610 create_menu_item_with_mnemonic( menu, "CameraBack", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_BACK );
1611 create_menu_item_with_mnemonic( menu, "CameraLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_LEFT );
1612 create_menu_item_with_mnemonic( menu, "CameraRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_RIGHT );
1613 create_menu_item_with_mnemonic( menu, "CameraUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_UP );
1614 create_menu_item_with_mnemonic( menu, "CameraDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_DOWN );
1615 create_menu_item_with_mnemonic( menu, "CameraAngleUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_ANGLEUP );
1616 create_menu_item_with_mnemonic( menu, "CameraAngleDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_ANGLEDOWN );
1617 create_menu_item_with_mnemonic( menu, "CameraStrafeRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_STRAFERIGHT );
1618 create_menu_item_with_mnemonic( menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_CAMERA_STRAFELEFT );
1619 create_menu_item_with_mnemonic( menu, "ToggleGrid", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_TOGGLE );
1620 create_menu_item_with_mnemonic( menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CROSSHAIR );
1621 create_menu_item_with_mnemonic( menu, "ToggleRealtime", GTK_SIGNAL_FUNC( HandleCommand ), ID_VIEW_CAMERAUPDATE );
1622 create_menu_item_with_mnemonic( menu, "MouseRotate", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_MOUSEROTATE );
1623 create_menu_item_with_mnemonic( menu, "TexRotateClock", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_ROTATECLOCK );
1624 create_menu_item_with_mnemonic( menu, "TexRotateCounter", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_ROTATECOUNTER );
1625 create_menu_item_with_mnemonic( menu, "TexScaleUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALEUP );
1626 create_menu_item_with_mnemonic( menu, "TexScaleDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALEDOWN );
1627 create_menu_item_with_mnemonic( menu, "TexShiftLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTLEFT );
1628 create_menu_item_with_mnemonic( menu, "TexShiftRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTRIGHT );
1629 create_menu_item_with_mnemonic( menu, "TexShiftUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTUP );
1630 create_menu_item_with_mnemonic( menu, "TexShiftDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SHIFTDOWN );
1631 create_menu_item_with_mnemonic( menu, "GridDown", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_PREV );
1632 create_menu_item_with_mnemonic( menu, "GridUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_GRID_NEXT );
1633 create_menu_item_with_mnemonic( menu, "TexScaleLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALELEFT );
1634 create_menu_item_with_mnemonic( menu, "TexScaleRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TEXTURE_SCALERIGHT );
1635 create_menu_item_with_mnemonic( menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MOVEDOWN );
1636 create_menu_item_with_mnemonic( menu, "MoveSelectionUP", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_MOVEUP );
1637 create_menu_item_with_mnemonic( menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_PRINT );
1638 create_menu_item_with_mnemonic( menu, "ToggleSizePaint", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_TOGGLESIZEPAINT );
1639 create_menu_item_with_mnemonic( menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGELEFT );
1640 create_menu_item_with_mnemonic( menu, "SelectNudgeRight", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGERIGHT );
1641 create_menu_item_with_mnemonic( menu, "SelectNudgeUp", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_SELECT_NUDGEUP );
1642 create_menu_item_with_mnemonic( menu, "NaturalizePatch", GTK_SIGNAL_FUNC( HandleCommand ), ID_PATCH_NATURALIZE );
1643 create_menu_item_with_mnemonic( menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_SNAPTOGRID );
1644 create_menu_item_with_mnemonic( menu, "SelectAllOfType", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECT_ALL );
1645 create_menu_item_with_mnemonic( menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC( HandleCommand ), ID_SELECTION_OUTLINESTYLE );
1646 create_menu_item_with_mnemonic( menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREWINDOW_SCALEUP );
1647 create_menu_item_with_mnemonic( menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC( HandleCommand ), ID_TEXTUREWINDOW_SCALEDOWN );
1649 g_bIgnoreCommands--;
1652 void MainFrame::create_main_toolbar( GtkWidget *window, GtkWidget *vbox ){
1653 GtkWidget *handle_box, *toolbar, *w;
1655 handle_box = gtk_handle_box_new();
1656 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
1657 gtk_widget_show( handle_box );
1658 g_object_set_data( G_OBJECT( window ), "tb_handle_box", handle_box );
1660 toolbar = gtk_toolbar_new();
1661 gtk_toolbar_set_orientation( GTK_TOOLBAR( toolbar ), GTK_ORIENTATION_HORIZONTAL );
1662 gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
1663 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1664 gtk_container_add( GTK_CONTAINER( handle_box ), toolbar );
1666 gtk_widget_show( toolbar );
1668 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), _( "Open" ), _( "Open an existing map" ), "",
1669 new_pixmap( window, "file_open.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1670 GINT_TO_POINTER( ID_FILE_OPEN ) );
1671 g_object_set_data( G_OBJECT( window ), "tb_file_open", w );
1672 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), _( "Save" ), _( "Save the active map" ), "",
1673 new_pixmap( window, "file_save.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1674 GINT_TO_POINTER( ID_FILE_SAVE ) );
1675 g_object_set_data( G_OBJECT( window ), "tb_file_save", w );
1676 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1677 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "x-axis Flip" ), "",
1678 new_pixmap( window, "brush_flipx.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1679 GINT_TO_POINTER( ID_BRUSH_FLIPX ) );
1680 g_object_set_data( G_OBJECT( window ), "tb_brush_flipx", w );
1681 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "x-axis Rotate" ), "",
1682 new_pixmap( window, "brush_rotatex.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1683 GINT_TO_POINTER( ID_BRUSH_ROTATEX ) );
1684 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatex", w );
1685 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "y-axis Flip" ), "",
1686 new_pixmap( window, "brush_flipy.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1687 GINT_TO_POINTER( ID_BRUSH_FLIPY ) );
1688 g_object_set_data( G_OBJECT( window ), "tb_brush_flipy", w );
1689 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "y-axis Rotate" ), "",
1690 new_pixmap( window, "brush_rotatey.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1691 GINT_TO_POINTER( ID_BRUSH_ROTATEY ) );
1692 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatey", w );
1693 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "z-axis Flip" ), "",
1694 new_pixmap( window, "brush_flipz.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1695 GINT_TO_POINTER( ID_BRUSH_FLIPZ ) );
1696 g_object_set_data( G_OBJECT( window ), "tb_brush_flipz", w );
1697 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "z-axis Rotate" ), "",
1698 new_pixmap( window, "brush_rotatez.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1699 GINT_TO_POINTER( ID_BRUSH_ROTATEZ ) );
1700 g_object_set_data( G_OBJECT( window ), "tb_brush_rotatez", w );
1701 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1703 if ( g_PrefsDlg.m_bWideToolbar ) {
1704 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Complete Tall" ), "",
1705 new_pixmap( window, "selection_selectcompletetall.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1706 GINT_TO_POINTER( ID_SELECTION_SELECTCOMPLETETALL ) );
1707 g_object_set_data( G_OBJECT( window ), "tb_selection_selectcompletetall", w );
1708 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Touching" ), "",
1709 new_pixmap( window, "selection_selecttouching.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1710 GINT_TO_POINTER( ID_SELECTION_SELECTTOUCHING ) );
1711 g_object_set_data( G_OBJECT( window ), "tb_selection_selecttouching", w );
1712 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Partial Tall" ), "",
1713 new_pixmap( window, "selection_selectpartialtall.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1714 GINT_TO_POINTER( ID_SELECTION_SELECTPARTIALTALL ) );
1715 g_object_set_data( G_OBJECT( window ), "tb_selection_selectpartialtall", w );
1716 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Select Inside" ), "",
1717 new_pixmap( window, "selection_selectinside.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1718 GINT_TO_POINTER( ID_SELECTION_SELECTINSIDE ) );
1719 g_object_set_data( G_OBJECT( window ), "tb_selection_selectinside", w );
1723 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Selection" ), "",
1724 new_pixmap( window, "popup_selection.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1725 GINT_TO_POINTER( ID_POPUP_SELECTION ) );
1726 g_object_set_data( G_OBJECT( window ), "tb_popup_selection", w );
1728 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1730 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "CSG Subtract" ), "",
1731 new_pixmap( window, "selection_csgsubtract.bmp" ),
1732 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_CSGSUBTRACT ) );
1733 g_object_set_data( G_OBJECT( window ), "tb_selection_csgsubtract", w );
1735 if ( g_PrefsDlg.m_bWideToolbar ) {
1736 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "CSG Merge" ), "",
1737 new_pixmap( window, "selection_csgmerge.bmp" ),
1738 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_CSGMERGE ) );
1739 g_object_set_data( G_OBJECT( window ), "tb_selection_csgmerge", w );
1742 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Hollow" ), "",
1743 new_pixmap( window, "selection_makehollow.bmp" ),
1744 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECTION_MAKEHOLLOW ) );
1745 g_object_set_data( G_OBJECT( window ), "tb_selection_makehollow", w );
1747 if ( g_PrefsDlg.m_bWideToolbar ) {
1748 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1749 "", _( "Clipper" ), "", new_pixmap( window, "view_clipper.bmp" ),
1750 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CLIPPER ) );
1751 g_object_set_data( G_OBJECT( window ), "tb_view_clipper", w );
1754 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1756 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Change views" ), "",
1757 new_pixmap( window, "view_change.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1758 GINT_TO_POINTER( ID_VIEW_CHANGE ) );
1759 g_object_set_data( G_OBJECT( window ), "tb_view_change", w );
1761 if ( !g_PrefsDlg.m_bWideToolbar ) {
1762 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1765 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Texture view mode" ), "",
1766 new_pixmap( window, "textures_popup.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1767 GINT_TO_POINTER( ID_TEXTURES_POPUP ) );
1768 g_object_set_data( G_OBJECT( window ), "tb_textures_popup", w );
1770 if ( g_PrefsDlg.m_bWideToolbar ) {
1771 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1772 "", _( "Cubic clip the camera view" ), "",
1773 new_pixmap( window, "view_cubicclipping.bmp" ),
1774 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CUBICCLIPPING ) );
1775 g_object_set_data( G_OBJECT( window ), "tb_view_cubicclipping", w );
1778 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1780 if ( !g_PrefsDlg.m_bWideToolbar ) {
1781 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1782 "", _( "Camera preview" ), "", new_pixmap( window, "view_cameratoggle.bmp" ),
1783 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CAMERATOGGLE ) );
1784 g_object_set_data( G_OBJECT( window ), "tb_view_cameratoggle", w );
1785 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", "Update Camera", "",
1786 new_pixmap( window, "view_cameraupdate.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1787 GINT_TO_POINTER( ID_VIEW_CAMERAUPDATE ) );
1788 g_object_set_data( G_OBJECT( window ), "tb_view_cameraupdate", w );
1789 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1790 "", _( "Cubic clip the camera view" ), "",
1791 new_pixmap( window, "view_cubicclipping.bmp" ),
1792 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CUBICCLIPPING ) );
1793 g_object_set_data( G_OBJECT( window ), "tb_view_cubicclipping", w );
1794 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1795 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1796 "", _( "Entity inspector" ), "", new_pixmap( window, "view_entity.bmp" ),
1797 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_ENTITY ) );
1798 g_object_set_data( G_OBJECT( window ), "tb_view_entity", w );
1799 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1800 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1801 "", _( "Clipper" ), "", new_pixmap( window, "view_clipper.bmp" ),
1802 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_VIEW_CLIPPER ) );
1803 g_object_set_data( G_OBJECT( window ), "tb_view_clipper", w );
1804 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1807 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1808 "", _( "Free Rotation" ), "", new_pixmap( window, "select_mouserotate.bmp" ),
1809 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECT_MOUSEROTATE ) );
1810 g_object_set_data( G_OBJECT( window ), "tb_select_mouserotate", w );
1811 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1812 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1813 "", _( "Free Scaling" ), "", new_pixmap( window, "select_mousescale.bmp" ),
1814 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SELECT_MOUSESCALE ) );
1815 g_object_set_data( G_OBJECT( window ), "tb_select_mousescale", w );
1816 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1817 "", _( "Scale X" ), "", new_pixmap( window, "scalelockx.bmp" ),
1818 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKX ) );
1819 g_object_set_data( G_OBJECT( window ), "tb_scalelockx", w );
1820 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1821 "", _( "Scale Y" ), "", new_pixmap( window, "scalelocky.bmp" ),
1822 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKY ) );
1823 g_object_set_data( G_OBJECT( window ), "tb_scalelocky", w );
1824 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1825 "", _( "Scale Z" ), "", new_pixmap( window, "scalelockz.bmp" ),
1826 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_SCALELOCKZ ) );
1827 g_object_set_data( G_OBJECT( window ), "tb_scalelockz", w );
1829 if ( g_PrefsDlg.m_bWideToolbar ) {
1830 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1831 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1832 "", _( "Don't select model brushes" ), "",
1833 new_pixmap( window, "dontselectmodel.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1834 GINT_TO_POINTER( ID_DONTSELECTMODEL ) );
1835 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1836 g_object_set_data( G_OBJECT( window ), "tb_dontselectmodel", w );
1838 if ( !g_pGameDescription->mNoPatch ) {
1839 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1840 "", _( "Don't select curved brushes" ), "",
1841 new_pixmap( window, "dontselectcurve.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1842 GINT_TO_POINTER( ID_DONTSELECTCURVE ) );
1843 g_object_set_data( G_OBJECT( window ), "tb_dontselectcurve", w );
1847 // bug #292, patch toolbar option
1848 if ( g_PrefsDlg.m_bPatchToolbar ) {
1849 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1850 "", _( "Show patch bounding box" ), "",
1851 new_pixmap( window, "patch_showboundingbox.bmp" ),
1852 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_PATCH_SHOWBOUNDINGBOX ) );
1853 g_object_set_data( G_OBJECT( window ), "tb_patch_showboundingbox", w );
1854 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855 "", _( "Show patches as wireframes" ), "",
1856 new_pixmap( window, "patch_wireframe.bmp" ),
1857 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( ID_PATCH_WIREFRAME ) );
1858 g_object_set_data( G_OBJECT( window ), "tb_patch_wireframe", w );
1859 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860 "", _( "Patch Bend mode" ), "",
1861 new_pixmap( window, "patch_bend.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1862 GINT_TO_POINTER( ID_PATCH_BEND ) );
1863 g_object_set_data( G_OBJECT( window ), "tb_patch_bend", w );
1864 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Put caps on the current patch" ), "",
1865 new_pixmap( window, "curve_cap.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1866 GINT_TO_POINTER( ID_CURVE_CAP ) );
1867 g_object_set_data( G_OBJECT( window ), "tb_curve_cap", w );
1868 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1869 "", _( "Welds equal patch points during moves" ), "",
1870 new_pixmap( window, "patch_weld.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1871 GINT_TO_POINTER( ID_PATCH_WELD ) );
1872 g_object_set_data( G_OBJECT( window ), "tb_patch_weld", w );
1873 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874 "", _( "Selects drill down rows and columns" ), "",
1875 new_pixmap( window, "patch_drilldown.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1876 GINT_TO_POINTER( ID_PATCH_DRILLDOWN ) );
1877 g_object_set_data( G_OBJECT( window ), "tb_patch_drilldown", w );
1880 if ( g_PrefsDlg.m_bWideToolbar ) {
1881 gtk_toolbar_append_space( GTK_TOOLBAR( toolbar ) );
1882 w = gtk_toolbar_append_item( GTK_TOOLBAR( toolbar ), "", _( "Show Entities as" ), "",
1883 new_pixmap( window, "show_entities.bmp" ), GTK_SIGNAL_FUNC( HandleCommand ),
1884 GINT_TO_POINTER( ID_SHOW_ENTITIES ) );
1885 g_object_set_data( G_OBJECT( window ), "tb_show_entities", w );
1891 w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1892 gtk_widget_hide (w);
1893 w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1894 gtk_widget_hide (w);
1895 w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1896 gtk_widget_hide (w);
1897 w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1898 gtk_widget_hide (w);
1902 m_bCamPreview = true;
1903 g_nScaleHow = ( SCALE_X | SCALE_Y | SCALE_Z );
1906 void MainFrame::create_plugin_toolbar( GtkWidget *window, GtkWidget *vbox ){
1907 GtkWidget *handle_box, *toolbar;
1909 handle_box = gtk_handle_box_new();
1910 gtk_box_pack_start( GTK_BOX( vbox ), handle_box, FALSE, FALSE, 0 );
1911 if ( g_PrefsDlg.m_bPluginToolbar ) {
1912 gtk_widget_show( handle_box );
1914 g_object_set_data( G_OBJECT( window ), "tb_handle_box", handle_box );
1916 toolbar = gtk_toolbar_new();
1917 gtk_toolbar_set_orientation( GTK_TOOLBAR( toolbar ), GTK_ORIENTATION_HORIZONTAL );
1918 gtk_toolbar_set_style( GTK_TOOLBAR( toolbar ), GTK_TOOLBAR_ICONS );
1919 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1920 gtk_container_add( GTK_CONTAINER( handle_box ), toolbar );
1921 g_object_set_data( G_OBJECT( window ), "toolbar_plugin", toolbar );
1922 gtk_widget_show( toolbar );
1925 void MainFrame::create_main_statusbar( GtkWidget *window, GtkWidget *vbox ){
1926 GtkWidget *hbox, *hbox1;
1930 hbox = gtk_hbox_new( FALSE, 0 );
1931 gtk_widget_show( hbox );
1932 gtk_widget_set_usize( hbox, -1, 24 );
1933 gtk_container_border_width( GTK_CONTAINER( hbox ), 1 );
1934 gtk_box_pack_end( GTK_BOX( vbox ), hbox, FALSE, TRUE, 2 );
1936 frame = gtk_frame_new( (char*)NULL );
1937 gtk_widget_show( frame );
1938 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
1939 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
1941 hbox1 = gtk_hbox_new( FALSE, 0 );
1942 gtk_container_add( GTK_CONTAINER( frame ), hbox1 );
1943 gtk_container_border_width( GTK_CONTAINER( hbox1 ), 0 );
1944 gtk_widget_show( hbox1 );
1946 label = gtk_label_new( _( " Label " ) );
1947 gtk_widget_show( label );
1948 gtk_box_pack_start( GTK_BOX( hbox1 ), label, FALSE, TRUE, 0 );
1949 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1950 gtk_misc_set_padding( GTK_MISC( label ), 3, 0 );
1951 m_pStatusLabel[0] = label;
1953 for ( int i = 1; i < 6; i++ )
1955 frame = gtk_frame_new( (char*)NULL );
1956 gtk_widget_show( frame );
1957 gtk_box_pack_start( GTK_BOX( hbox ), frame, FALSE, TRUE, 0 );
1958 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
1960 label = gtk_label_new( _( " Label " ) );
1961 gtk_widget_show( label );
1962 gtk_container_add( GTK_CONTAINER( frame ), label );
1963 m_pStatusLabel[i] = label;
1968 static gint mainframe_idle( gpointer user_data ){
1969 g_pParentWnd->RoutineProcessing();
1973 static void Sys_Iconify( GtkWidget *w );
1974 static void Sys_Restore( GtkWidget *w );
1976 inline void CHECK_RESTORE( GtkWidget* w ){
1977 if ( g_object_get_data( G_OBJECT( w ), "was_mapped" ) != NULL ) {
1978 gtk_widget_show( w );
1983 // this is called when the window is restored from the iconified state
1984 static void mainframe_map( GtkWidget *widget ){
1985 if ( g_pParentWnd->IsSleeping() ) {
1986 g_pParentWnd->OnSleep();
1989 if ( ( g_pParentWnd->CurrentStyle() == MainFrame::eFloating ) && ( widget == g_pParentWnd->m_pWidget ) ) {
1990 // restore previously visible windows
1991 CHECK_RESTORE( g_pParentWnd->GetCamWnd()->m_pParent );
1992 if ( g_PrefsDlg.m_bFloatingZ ) {
1993 CHECK_RESTORE( g_pParentWnd->GetZWnd()->m_pParent );
1995 CHECK_RESTORE( g_pParentWnd->GetXYWnd()->m_pParent );
1996 CHECK_RESTORE( g_pParentWnd->GetXZWnd()->m_pParent );
1997 CHECK_RESTORE( g_pParentWnd->GetYZWnd()->m_pParent );
1998 CHECK_RESTORE( g_pGroupDlg->m_pWidget );
2002 inline void CHECK_MINIMIZE( GtkWidget* w ){
2003 g_object_set_data( G_OBJECT( w ), "was_mapped", (void*)( GTK_WIDGET_VISIBLE( w ) != 0 ) );
2004 gtk_widget_hide( w );
2007 static void mainframe_unmap( GtkWidget *widget ){
2009 if ( ( g_pParentWnd->CurrentStyle() == MainFrame::eFloating ) && ( widget == g_pParentWnd->m_pWidget ) ) {
2010 // minimize all other windows when the main window is minimized
2011 CHECK_MINIMIZE( g_pParentWnd->GetCamWnd()->m_pParent );
2012 if ( g_PrefsDlg.m_bFloatingZ ) {
2013 CHECK_MINIMIZE( g_pParentWnd->GetZWnd()->m_pParent );
2015 CHECK_MINIMIZE( g_pParentWnd->GetXYWnd()->m_pParent );
2016 CHECK_MINIMIZE( g_pParentWnd->GetXZWnd()->m_pParent );
2017 CHECK_MINIMIZE( g_pParentWnd->GetYZWnd()->m_pParent );
2018 CHECK_MINIMIZE( g_pGroupDlg->m_pWidget );
2022 static GtkWidget* create_floating( MainFrame* mainframe ){
2023 GtkWidget *wnd = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2024 //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2025 gtk_window_set_transient_for( GTK_WINDOW( wnd ), GTK_WINDOW( mainframe->m_pWidget ) );
2026 gtk_widget_set_events( wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2027 gtk_signal_connect( GTK_OBJECT( wnd ), "delete_event", GTK_SIGNAL_FUNC( widget_delete_hide ), NULL );
2028 gtk_signal_connect( GTK_OBJECT( wnd ), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
2029 gtk_signal_connect( GTK_OBJECT( wnd ), "key_press_event",
2030 GTK_SIGNAL_FUNC( mainframe_keypress ), mainframe );
2031 gtk_signal_connect( GTK_OBJECT( wnd ), "key_release_event",
2032 GTK_SIGNAL_FUNC( mainframe_keyrelease ), mainframe );
2033 gtk_signal_connect( GTK_OBJECT( wnd ), "map_event",
2034 GTK_SIGNAL_FUNC( mainframe_map ), mainframe );
2036 gtk_window_set_default_size( GTK_WINDOW( wnd ), 100, 100 );
2038 #ifdef DBG_WINDOWPOS
2039 Sys_Printf( "create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd );
2045 void console_populate_popup( GtkTextView* textview, GtkMenu* menu, gpointer user_data ){
2046 menu_separator( GTK_WIDGET( menu ) );
2048 GtkWidget* item = gtk_menu_item_new_with_label( _( "Clear" ) );
2049 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( Sys_ClearPrintf ), NULL );
2050 gtk_widget_show( item );
2051 gtk_menu_append( GTK_MENU( menu ), item );
2054 void console_construct( GtkWidget* textview ){
2055 g_signal_connect( G_OBJECT( textview ), "populate-popup", G_CALLBACK( console_populate_popup ), NULL );
2058 extern MemStream g_Clipboard;
2060 void Clipboard_CopyMap(){
2061 g_Clipboard.SetLength( 0 );
2062 Map_Export( &g_Clipboard, "xmap", false, true );
2065 void Clipboard_PasteMap(){
2066 if ( g_Clipboard.GetLength() > 0 ) {
2067 g_Clipboard.Seek( 0, SEEK_SET );
2068 Map_Import( &g_Clipboard, "xmap", true );
2073 Platform-independent GTK clipboard support.
2074 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2076 #if defined ( __linux__ ) || defined ( __APPLE__ )
2080 RADIANT_CLIPPINGS = 23,
2083 static const GtkTargetEntry clipboard_targets[] = {
2084 { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2087 static void clipboard_get( GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner ){
2090 GdkAtom type = GDK_NONE;
2092 len = g_Clipboard.GetLength();
2099 buffer = g_Clipboard.GetBuffer();
2102 if ( info == clipboard_targets[0].info ) {
2103 type = gdk_atom_intern( clipboard_targets[0].target, FALSE );
2106 gtk_selection_data_set( selection_data, type, 8, buffer, len );
2109 static void clipboard_clear( GtkClipboard *clipboard, gpointer user_data_or_owner ){
2112 static void clipboard_received( GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data ){
2113 g_Clipboard.SetLength( 0 );
2115 if ( data->length < 0 ) {
2116 Sys_FPrintf( SYS_ERR, "Error retrieving selection\n" );
2118 else if ( strcmp( gdk_atom_name( data->type ), clipboard_targets[0].target ) == 0 ) {
2119 g_Clipboard.Write( data->data, data->length );
2122 Clipboard_PasteMap();
2125 void clipboard_copy(){
2126 Clipboard_CopyMap();
2128 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2130 gtk_clipboard_set_with_data( clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL );
2133 void clipboard_paste(){
2134 GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2136 gtk_clipboard_request_contents( clipboard, gdk_atom_intern( clipboard_targets[0].target, FALSE ), clipboard_received, NULL );
2140 #elif defined( WIN32 )
2142 void clipboard_copy(){
2143 Clipboard_CopyMap();
2145 bool bClipped = false;
2146 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2147 if ( nClipboard > 0 ) {
2148 if ( ::OpenClipboard( NULL ) ) {
2150 long lSize = g_Clipboard.GetLength();
2151 HANDLE h = ::GlobalAlloc( GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof( long ) );
2153 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2154 memcpy( cp, &lSize, sizeof( long ) );
2155 cp += sizeof( long );
2156 g_Clipboard.Seek( 0, SEEK_SET );
2157 g_Clipboard.Read( cp, lSize );
2158 ::GlobalUnlock( h );
2159 ::SetClipboardData( nClipboard, h );
2167 Sys_Printf( "Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n" );
2171 void clipboard_paste(){
2172 bool bPasted = false;
2173 UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2174 if ( nClipboard > 0 && ::OpenClipboard( NULL ) ) {
2175 if ( IsClipboardFormatAvailable( nClipboard ) ) {
2176 HANDLE h = ::GetClipboardData( nClipboard );
2178 g_Clipboard.SetLength( 0 );
2179 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2181 memcpy( &lSize, cp, sizeof( long ) );
2182 cp += sizeof( long );
2183 g_Clipboard.Write( cp, lSize );
2184 ::GlobalUnlock( h );
2190 Clipboard_PasteMap();
2195 void MainFrame::Copy(){
2199 void MainFrame::Paste(){
2201 UpdateSurfaceDialog();
2205 #ifdef DBG_WINDOWPOS
2206 GtkWidget *watchit = NULL;
2208 void CheckWatchit( char *msg ){
2209 static int width = 0;
2210 if ( ( watchit != NULL ) && ( watchit->allocation.width != width ) ) {
2211 Sys_Printf( "CheckWatchit %s: %d\n", msg, watchit->allocation.width );
2212 width = watchit->allocation.width;
2218 BOOL CALLBACK m_pCountMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2219 int *n = (int *) dwData;
2226 struct monitorInfo_s {
2227 GdkRectangle *win_monitors;
2231 BOOL CALLBACK m_pEnumMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2232 monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2233 GdkRectangle *monitor;
2236 monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2238 memset( &lpmi, 0, sizeof( MONITORINFOEX ) );
2239 lpmi.cbSize = sizeof( MONITORINFOEX );
2241 GetMonitorInfo( hMonitor, &lpmi );
2243 if ( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2246 SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0 );
2247 monitor->x = rect.left;
2248 monitor->y = rect.top;
2249 monitor->width = rect.right - rect.left;
2250 monitor->height = rect.bottom - rect.top;
2252 if ( monitorInfo->i_win_mon != 0 ) {
2253 GdkRectangle temp = *monitor;
2254 *monitor = monitorInfo->win_monitors[0];
2255 monitorInfo->win_monitors[0] = temp;
2259 monitor->x = lpmi.rcMonitor.left;
2260 monitor->y = lpmi.rcMonitor.top;
2261 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2262 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2265 monitorInfo->i_win_mon++;
2270 void PositionWindowOnPrimaryScreen( window_position_t& position ){
2271 const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2273 if ( position.x <= primaryMonitorRect.x + 6 ) {
2274 position.x = primaryMonitorRect.x + 6;
2276 else if ( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 ) {
2277 position.x = primaryMonitorRect.x + 6;
2280 if ( position.y <= primaryMonitorRect.y + 6 ) {
2281 position.y = primaryMonitorRect.y + 6;
2283 else if ( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 ) {
2284 position.y = primaryMonitorRect.y + 6;
2287 if ( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 ) {
2288 position.w = primaryMonitorRect.width - 18;
2290 if ( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 ) {
2291 position.h = primaryMonitorRect.height - 18;
2296 GtkWidget* create_framed_widget( GtkWidget* widget ){
2297 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2298 gtk_widget_show( frame );
2299 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2300 gtk_container_add( GTK_CONTAINER( frame ), widget );
2301 gtk_widget_show( widget );
2305 gboolean entry_focus_in( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2306 gtk_window_remove_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2310 gboolean entry_focus_out( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2311 gtk_window_add_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2315 GtkWidget* create_framed_texwnd( TexWnd* texwnd ){
2316 GtkWidget* frame = gtk_frame_new( (char*)NULL );
2317 gtk_widget_show( frame );
2318 gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2320 GtkWidget* hbox = gtk_hbox_new( FALSE, 0 );
2321 gtk_widget_show( hbox );
2322 gtk_container_add( GTK_CONTAINER( frame ), hbox );
2324 GtkWidget* w = gtk_vscrollbar_new( GTK_ADJUSTMENT( gtk_adjustment_new( 0,0,0,1,1,1 ) ) );
2325 gtk_widget_show( w );
2326 gtk_box_pack_end( GTK_BOX( hbox ), w, FALSE, TRUE, 0 );
2327 g_qeglobals_gui.d_texture_scroll = w;
2329 GtkWidget* texbox = gtk_vbox_new( FALSE, 0 );
2330 gtk_widget_show( texbox );
2331 gtk_box_pack_start( GTK_BOX( hbox ), texbox, TRUE, TRUE, 0 );
2333 w = gtk_entry_new();
2334 gtk_box_pack_start( GTK_BOX( texbox ), w, FALSE, FALSE, 0 );
2335 texwnd->m_pFilter = w;
2336 g_signal_connect( G_OBJECT( w ), "focus_in_event", G_CALLBACK( entry_focus_in ), NULL );
2337 g_signal_connect( G_OBJECT( w ), "focus_out_event", G_CALLBACK( entry_focus_out ), NULL );
2339 w = texwnd->GetWidget();
2340 gtk_box_pack_start( GTK_BOX( texbox ), w, TRUE, TRUE, 0 );
2341 gtk_widget_show( w );
2346 static ZWnd *create_floating_zwnd( MainFrame *mainframe ){
2347 ZWnd *pZWnd = new ZWnd();
2348 GtkWidget* wnd = create_floating( mainframe );
2350 gtk_window_set_title( GTK_WINDOW( wnd ), "Z" );
2352 pZWnd->m_pParent = wnd;
2355 GtkWidget* frame = create_framed_widget( pZWnd->GetWidget() );
2356 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2359 gtk_widget_realize( wnd );
2361 // turn OFF minimize and maximize boxes.
2362 // Must be *after* realize, or wnd->window is NULL
2363 // should do the right thing on *nix, need to verify.
2364 gdk_window_set_decorations( wnd->window,
2365 GdkWMDecoration( GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2366 //TODO 50 by observation, will vary depending on decoration sizes
2368 GdkGeometry geometry;
2369 geometry.min_width = 50;
2370 //we only care about width, but have to set this too, or get nasty bugs
2371 geometry.min_height = 10;
2372 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE );
2376 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2377 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2380 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posZWnd );
2382 if ( g_PrefsDlg.m_bZVis ) {
2383 gtk_widget_show( wnd );
2389 static const int gutter = 12;
2391 void MainFrame::Create(){
2392 GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2394 gtk_widget_set_events( window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2395 gtk_signal_connect( GTK_OBJECT( window ), "delete_event",
2396 GTK_SIGNAL_FUNC( mainframe_delete ), this );
2397 gtk_signal_connect( GTK_OBJECT( window ), "destroy",
2398 GTK_SIGNAL_FUNC( mainframe_destroy ), this );
2399 gtk_signal_connect( GTK_OBJECT( window ), "key_press_event",
2400 GTK_SIGNAL_FUNC( mainframe_keypress ), this );
2401 gtk_signal_connect( GTK_OBJECT( window ), "key_release_event",
2402 GTK_SIGNAL_FUNC( mainframe_keyrelease ), this );
2403 gtk_signal_connect( GTK_OBJECT( window ), "map_event",
2404 GTK_SIGNAL_FUNC( mainframe_map ), this );
2405 gtk_signal_connect( GTK_OBJECT( window ), "unmap_event",
2406 GTK_SIGNAL_FUNC( mainframe_unmap ), this );
2408 g_qeglobals_gui.d_main_window = window;
2411 // calculate gdk offset
2412 int n_win_monitors = 0;
2414 monitorInfo_s monitorInfo;
2416 // detect multiple monitors
2417 EnumDisplayMonitors( NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>( &n_win_monitors ) );
2419 monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2420 monitorInfo.i_win_mon = 0;
2421 EnumDisplayMonitors( NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>( &monitorInfo ) );
2423 gdk_offset_x = G_MININT;
2424 gdk_offset_y = G_MININT;
2427 for ( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2428 gdk_offset_x = MAX( gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x );
2429 gdk_offset_y = MAX( gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y );
2432 Sys_Printf( "GDK's coordinate system is offset by %d over the x-axis and %d over the y-axis from Windows' coordinate system.\n", gdk_offset_x, gdk_offset_y );
2434 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2436 GdkDisplay *display;
2438 gint n_gdk_monitors = 0;
2442 // detect multiple monitors
2443 display = gdk_display_get_default();
2444 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name( display ), gdk_display_get_n_screens( display ) );
2446 screen = gdk_display_get_screen( display, 1 );
2447 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2449 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2451 for ( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2452 memset( &rect, 0, sizeof( rect ) );
2453 gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2454 Sys_Printf( " monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2457 memcpy( &primaryMonitorRect, &rect, sizeof( primaryMonitorRect ) );
2461 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2464 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2465 primaryMonitorRect.width = gdk_screen_width();
2466 primaryMonitorRect.height = gdk_screen_height();
2471 load_window_pos( window, g_PrefsDlg.mWindowInfo.position );
2473 GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
2474 gtk_container_add( GTK_CONTAINER( window ), vbox );
2475 gtk_widget_show( vbox );
2477 create_main_menu( window, vbox );
2479 create_main_toolbar( window, vbox );
2480 create_plugin_toolbar( window,vbox );
2482 m_nCurrentStyle = g_PrefsDlg.m_nView;
2484 g_pGroupDlg->Create();
2489 gtk_widget_show( window );
2491 // not needed on win32, it's in the .rc
2496 load_pixmap( "icon.bmp", window, &pixmap, &mask );
2497 gdk_window_set_icon( window->window, NULL, pixmap, mask );
2501 if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) {
2503 GtkWidget* vsplit = gtk_vpaned_new();
2504 m_pSplits[0] = vsplit;
2505 gtk_box_pack_start( GTK_BOX( vbox ), vsplit, TRUE, TRUE, 0 );
2506 gtk_widget_show( vsplit );
2509 GtkWidget* hsplit = gtk_hpaned_new();
2510 m_pSplits[2] = hsplit;
2511 gtk_paned_add1( GTK_PANED( vsplit ), hsplit );
2512 gtk_widget_show( hsplit );
2515 GtkWidget* hsplit2 = gtk_hpaned_new();
2516 m_pSplits[3] = hsplit2;
2517 gtk_paned_add2( GTK_PANED( hsplit ), hsplit2 );
2518 gtk_widget_show( hsplit2 );
2521 GtkWidget* vsplit2 = gtk_vpaned_new();
2522 m_pSplits[1] = vsplit2;
2523 if ( CurrentStyle() == eRegular ) {
2524 gtk_paned_add2( GTK_PANED( hsplit2 ), vsplit2 );
2527 gtk_paned_add1( GTK_PANED( hsplit ), vsplit2 );
2529 gtk_widget_show( vsplit2 );
2532 m_pCamWnd = new CamWnd();
2534 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2535 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2539 m_pXYWnd = new XYWnd();
2540 m_pXYWnd->SetViewType( XY );
2542 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2543 gtk_paned_add1( GTK_PANED( hsplit2 ), frame );
2547 m_pZWnd = new ZWnd();
2549 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2550 if ( CurrentStyle() == eRegular ) {
2551 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2554 gtk_paned_add2( GTK_PANED( hsplit2 ), frame );
2559 m_pTexWnd = new TexWnd();
2561 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2562 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2567 GtkWidget* scr = gtk_scrolled_window_new( NULL, NULL );
2568 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
2569 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
2570 gtk_widget_show( scr );
2571 gtk_paned_pack2( GTK_PANED( vsplit ), scr, FALSE, TRUE );
2574 GtkWidget* text = gtk_text_view_new();
2575 gtk_widget_set_size_request( text, 0, -1 ); // allow shrinking
2576 gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( text ), GTK_WRAP_WORD );
2577 gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
2578 gtk_container_add( GTK_CONTAINER( scr ), text );
2579 gtk_widget_show( text );
2580 g_qeglobals_gui.d_edit = text;
2588 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nXYHeight + 28 );
2590 if ( CurrentStyle() == eRegular ) {
2591 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nZWidth );
2592 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2596 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nCamWidth );
2597 while ( gtk_events_pending() ) gtk_main_iteration();
2598 gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2601 while ( gtk_events_pending() ) gtk_main_iteration();
2603 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), g_PrefsDlg.mWindowInfo.nCamHeight );
2605 else if ( CurrentStyle() == eFloating ) {
2607 GtkWidget* wnd = create_floating( this );
2608 gtk_window_set_title( GTK_WINDOW( wnd ), "Camera" );
2611 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2612 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2615 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posCamWnd );
2617 gtk_widget_show( wnd );
2619 m_pCamWnd = new CamWnd();
2622 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2623 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2626 m_pCamWnd->m_pParent = wnd;
2629 if ( g_PrefsDlg.m_bFloatingZ ) {
2630 m_pZWnd = create_floating_zwnd( this );
2633 GtkWidget* wnd = create_floating( this );
2634 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2637 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2638 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2641 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2643 m_pXYWnd = new XYWnd();
2644 m_pXYWnd->SetViewType( XY );
2647 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2648 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2651 m_pXYWnd->m_pParent = wnd;
2653 gtk_widget_show( wnd );
2658 GtkWidget* wnd = create_floating( this );
2659 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2662 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2663 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2666 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2668 m_pZWnd = new ZWnd();
2669 m_pZWnd->m_pParent = wnd;
2671 m_pXYWnd = new XYWnd();
2672 m_pXYWnd->SetViewType( XY );
2673 m_pXYWnd->m_pParent = wnd;
2677 GtkWidget* hsplit = gtk_hpaned_new();
2678 m_pSplits[0] = hsplit;
2679 gtk_container_add( GTK_CONTAINER( wnd ), hsplit );
2680 gtk_widget_show( hsplit );
2683 GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2684 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2687 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2688 gtk_paned_add2( GTK_PANED( hsplit ), frame );
2692 gtk_widget_show( wnd );
2694 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nZFloatWidth );
2698 GtkWidget* wnd = create_floating( this );
2699 gtk_window_set_title( GTK_WINDOW( wnd ), _( "XZ View" ) );
2702 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2703 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2706 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXZWnd );
2708 m_pXZWnd = new XYWnd();
2709 m_pXZWnd->m_pParent = wnd;
2710 m_pXZWnd->SetViewType( XZ );
2713 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2714 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2717 if ( g_PrefsDlg.m_bXZVis ) {
2718 gtk_widget_show( wnd );
2723 GtkWidget* wnd = create_floating( this );
2724 gtk_window_set_title( GTK_WINDOW( wnd ), _( "YZ View" ) );
2727 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2728 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2731 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posYZWnd );
2733 m_pYZWnd = new XYWnd();
2734 m_pYZWnd->m_pParent = wnd;
2735 m_pYZWnd->SetViewType( YZ );
2738 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2739 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2742 if ( g_PrefsDlg.m_bYZVis ) {
2743 gtk_widget_show( wnd );
2747 m_pTexWnd = new TexWnd();
2749 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2750 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2753 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2754 gtk_widget_show( w );
2755 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2759 g_pGroupDlg->Show();
2764 GtkWidget* hsplit = gtk_hpaned_new();
2765 m_pSplits[0] = hsplit;
2766 gtk_box_pack_start( GTK_BOX( vbox ), hsplit, TRUE, TRUE, 0 );
2767 gtk_widget_show( hsplit );
2770 GtkWidget* vsplit1 = gtk_vpaned_new();
2771 m_pSplits[1] = vsplit1;
2772 gtk_paned_add1( GTK_PANED( hsplit ), vsplit1 );
2773 gtk_widget_show( vsplit1 );
2776 GtkWidget* vsplit2 = gtk_vpaned_new();
2777 m_pSplits[2] = vsplit2;
2778 gtk_paned_add2( GTK_PANED( hsplit ), vsplit2 );
2779 gtk_widget_show( vsplit2 );
2781 m_pCamWnd = new CamWnd();
2783 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2784 gtk_paned_add1( GTK_PANED( vsplit1 ), frame );
2787 m_pXYWnd = new XYWnd();
2788 m_pXYWnd->SetViewType( XY );
2790 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2791 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2794 m_pYZWnd = new XYWnd();
2795 m_pYZWnd->SetViewType( YZ );
2797 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2798 gtk_paned_add2( GTK_PANED( vsplit1 ), frame );
2801 m_pXZWnd = new XYWnd();
2802 m_pXZWnd->SetViewType( XZ );
2804 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2805 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2811 // g_qeglobals_gui.d_edit = NULL;
2814 m_pTexWnd = new TexWnd();
2815 GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2818 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2819 gtk_widget_show( w );
2820 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2824 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2825 // gtk_widget_realize (m_pTexWnd->GetWidget ());
2826 m_pZWnd = create_floating_zwnd( this );
2828 while ( gtk_events_pending() )
2829 gtk_main_iteration();
2832 int x = GTK_PANED( m_pSplits[0] )->max_position / 2 - gutter;
2833 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), x );
2837 int y = GTK_PANED( m_pSplits[1] )->max_position / 2 - gutter;
2838 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), y );
2839 gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), y );
2843 if ( g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED ) {
2844 gtk_window_maximize( GTK_WINDOW( window ) );
2847 gtk_widget_show( window );
2851 if ( m_pXYWnd ) { // this is always true?
2852 m_pXYWnd->SetActive( true );
2854 m_bSplittersOK = true;
2855 Texture_SetMode( g_qeglobals.d_savedinfo.iTexMenu );
2857 g_pParentWnd->OnEntitiesSetViewAs( 0 );
2859 // m_wndTextureBar.Create (vbox);
2860 create_main_statusbar( window, vbox );
2863 ShowMenuItemKeyBindings( window );
2865 if ( g_qeglobals_gui.d_edit != NULL ) {
2866 console_construct( g_qeglobals_gui.d_edit );
2869 // bool load_last = FALSE;
2872 SetButtonMenuStates();
2874 // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2876 g_bIgnoreCommands++;
2877 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
2878 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
2879 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaderlistonly" ) );
2880 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
2881 g_bIgnoreCommands--;
2883 // if (g_PrefsDlg.m_bTextureBar)
2884 // gtk_widget_show (m_wndTextureBar.m_pWidget);
2886 SetActiveXY( m_pXYWnd );
2888 s_idle_id = gtk_timeout_add( 25, mainframe_idle, this );
2890 QGL_InitExtensions();
2892 if ( g_PrefsDlg.mLocalPrefs.mbEmpty ) {
2893 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2894 g_PrefsDlg.SavePrefs();
2897 // remove the pid file
2898 remove( g_pidGameFile.GetBuffer() );
2900 Sys_Printf( "Entering message loop\n" );
2904 m_nTimer = gtk_timeout_add( 1000, timer, this );
2907 // =============================================================================
2910 MainFrame::MainFrame(){
2912 m_bSplittersOK = false;
2913 g_pParentWnd = this;
2914 m_pXYWnd = (XYWnd*)NULL;
2916 m_pTexWnd = (TexWnd*)NULL;
2917 m_pZWnd = (ZWnd*)NULL;
2918 m_pYZWnd = (XYWnd*)NULL;
2919 m_pXZWnd = (XYWnd*)NULL;
2920 m_pActiveXY = (XYWnd*)NULL;
2921 m_bCamPreview = true;
2923 for ( int n = 0; n < 6; n++ )
2924 m_pStatusLabel[n] = NULL;
2925 m_bNeedStatusUpdate = false;
2927 m_bSleeping = false;
2931 MainFrame::~MainFrame(){
2932 while ( g_BSPFrontendCommands )
2934 free( g_BSPFrontendCommands->data );
2935 g_BSPFrontendCommands = g_slist_remove( g_BSPFrontendCommands, g_BSPFrontendCommands->data );
2939 void MainFrame::ReleaseContexts(){
2941 m_pXYWnd->DestroyContext();
2944 m_pYZWnd->DestroyContext();
2947 m_pXZWnd->DestroyContext();
2950 m_pCamWnd->DestroyContext();
2953 m_pTexWnd->DestroyContext();
2956 m_pZWnd->DestroyContext();
2960 void MainFrame::CreateContexts(){
2962 m_pCamWnd->CreateContext();
2965 m_pXYWnd->CreateContext();
2968 m_pYZWnd->CreateContext();
2971 m_pXZWnd->CreateContext();
2974 m_pTexWnd->CreateContext();
2977 m_pZWnd->CreateContext();
2981 static void Sys_Iconify( GtkWidget *w ){
2982 // we might not have been realized yet
2983 if ( w->window == NULL ) {
2987 if ( !GTK_WIDGET_MAPPED( w ) ) {
2991 #if defined ( __linux__ ) || defined ( __APPLE__ )
2992 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Iconify\n" );
2994 XWindowAttributes xattr;
2995 GdkWindowPrivate *Private;
2997 Private = (GdkWindowPrivate*)w->window;
2998 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 0 ) );
3000 if ( !Private->destroyed ) {
3001 xattr.map_state = IsUnmapped;
3002 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3004 if ( xattr.map_state != IsUnmapped ) {
3005 g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 1 ) );
3008 XIconifyWindow( Private->xdisplay, Private->xwindow, 0 );
3014 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_MINIMIZE );
3018 static void Sys_Restore( GtkWidget *w ){
3019 // we might not have been realized yet
3020 if ( w->window == NULL ) {
3024 if ( !GTK_WIDGET_VISIBLE( w ) ) {
3028 #if defined ( __linux__ ) || defined ( __APPLE__ )
3029 Sys_FPrintf( SYS_WRN, "FIXME: Sys_Restore\n" );
3031 XWindowAttributes xattr;
3032 GdkWindowPrivate *Private;
3034 Private = (GdkWindowPrivate*)w->window;
3036 xattr.map_state = IsUnmapped;
3037 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3039 if ( xattr.map_state == IsUnmapped ) {
3040 XMapRaised( Private->xdisplay, Private->xwindow );
3046 ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_RESTORE );
3054 void RefreshModelSkin( GSList **pModels, entitymodel_t *model ){
3055 //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3056 // so we avoid the fucked up ones, assuming they are at the end
3057 if ( !model->strSkin ) {
3059 Sys_Printf( "Dropping model %p with empty skin in RefreshModelSkin\n", model );
3062 // and also keeping it so we have an actual count of empty models
3063 g_slist_append( *pModels, model );
3066 // do we have this model already?
3067 if ( g_slist_find( *pModels, model ) ) {
3070 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3071 Sys_Printf( "Already processed model: %p %s\n", model, ( (GString *)model->strSkin )->str );
3075 model->nTextureBind = Texture_LoadSkin( ( (GString *)model->strSkin )->str, &model->nSkinWidth, &model->nSkinHeight );
3076 if ( model->nTextureBind != -1 ) {
3077 Sys_Printf( "LOADED SKIN: %s\n", ( (GString *)model->strSkin )->str );
3080 Sys_Printf( "Load skin failed: %s\n", ( (GString *)model->strSkin )->str );
3082 *pModels = g_slist_append( *pModels, model );
3084 Sys_Printf( "Processed model %p %s\n", model, ( (GString *)model->strSkin )->str );
3088 void MainFrame::OnSleep(){
3090 if ( m_bSleeping ) {
3091 // useful when trying to debug crashes in the sleep code
3092 Sys_Printf( "Going into sleep mode..\n" );
3094 Sys_Printf( "Dispatching sleep msg..." );
3095 DispatchRadiantMsg( RADIANT_SLEEP );
3096 Sys_Printf( "Done.\n" );
3098 if ( CurrentStyle() == eSplit ) {
3099 Sys_Iconify( m_pZWnd->m_pParent );
3102 Sys_Iconify( m_pWidget );
3104 QERApp_FreeShaders();
3105 g_bScreenUpdates = false;
3108 Sys_Printf( "Releasing contexts..." );
3110 Sys_Printf( "Done.\n" );
3112 // free all the skins in the caches
3113 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3114 g_lstSkinCache.RemoveAll();
3118 Sys_Printf( "Waking up\n" );
3119 if ( CurrentStyle() == eSplit ) {
3120 Sys_Restore( m_pZWnd->m_pParent );
3123 Sys_Restore( m_pWidget );
3126 Sys_Printf( "Creating contexts..." );
3128 Sys_Printf( "Done.\n" );
3130 Sys_Printf( "Making current on camera..." );
3131 m_pCamWnd->MakeCurrent();
3132 Sys_Printf( "Done.\n" );
3134 Sys_Printf( "Reloading shaders..." );
3135 // reload the shader scripts and textures
3136 QERApp_ReloadShaders();
3138 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3139 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
3140 Sys_Printf( "Done.\n" );
3142 // rebuild the patches by setting the bDirty flag on them
3143 for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next )
3145 if ( b->patchBrush ) {
3146 b->pPatch->bDirty = true;
3150 Sys_Printf( "Reloading skins..." );
3151 // we have purged all the skins before going to sleep
3152 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3153 // namely, all entitymodel_t
3154 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3155 // (a single eclass_t can reference several entitymodel_t)
3156 // FIXME: and what's up with md3Class then? what is it used for?
3160 GSList *Models = NULL;
3161 for (ent = entities.next; ent != &entities; ent = ent->next)
3163 // if it's a model with skin then the fixedsize flag must be on
3164 // only if there IS a model .. we are not trying to load
3165 if (ent->eclass->fixedsize)
3167 if (ent->eclass->model)
3171 Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3173 entitymodel_t *model;
3174 for (model = ent->eclass->model; model; model=model->pNext)
3175 RefreshModelSkin (&Models, model);
3176 } else if (ent->md3Class)
3178 entitymodel_t *model;
3179 for (model = ent->md3Class->model; model; model=model->pNext)
3180 RefreshModelSkin (&Models, model);
3184 Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3189 for (e = g_md3Cache; e ; e = e->next)
3191 entitymodel_t *model;
3192 for (model = e->model; model; model=model->pNext)
3193 if (!g_slist_find (Models, model))
3195 Sys_Printf("model %p ", model);
3197 Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3199 Sys_Printf("not found in main loop (no skin)\n");
3203 // clean the model list
3204 g_slist_free (Models);
3206 Sys_Printf( "Done.\n" );
3208 g_bScreenUpdates = true;
3210 Sys_Printf( "Dispatching wake msg..." );
3211 DispatchRadiantMsg( RADIANT_WAKEUP );
3212 Sys_Printf( "Done\n" );
3216 void WINAPI QERApp_Sleep(){
3217 g_pParentWnd->OnSleep();
3222 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3223 and not in OnDestroy because the info may be lost already?
3224 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3226 void MainFrame::OnDelete(){
3227 save_window_pos( m_pWidget, g_PrefsDlg.mWindowInfo.position );
3229 // surface inspector and patch inspector
3230 save_window_pos( g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd );
3231 save_window_pos( g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd );
3233 // entity inspector / group dialog
3234 // NOTE TTimo do we have to save a different window depending on the view mode?
3235 save_window_pos( g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd );
3237 if ( g_PrefsDlg.m_bFloatingZ ) {
3238 save_window_pos( m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd );
3241 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED( m_pSplits[0] )->child1_size;
3244 if ( CurrentStyle() == eFloating ) {
3245 save_window_pos( m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd );
3246 save_window_pos( m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd );
3247 save_window_pos( m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd );
3248 save_window_pos( m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd );
3251 g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state( g_pParentWnd->m_pWidget->window );
3254 void MainFrame::OnDestroy(){
3255 // shut down console output first
3256 // (we'll still get the info if we are running a log file anyway)
3257 g_qeglobals_gui.d_edit = NULL;
3260 Sys_Printf( "MainFrame::OnDestroy\n" );
3263 gtk_timeout_remove( s_idle_id );
3266 gtk_timeout_remove( m_nTimer );
3269 if ( !g_qeglobals.disable_ini ) {
3270 Sys_Printf( "Start writing prefs\n" );
3271 Sys_Printf( "MRU_Save... " );
3273 Sys_Printf( "OK\n" );
3277 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split1" );
3278 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED( w )->child1_size;
3279 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split2" );
3280 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED( w )->child1_size;
3282 if ( !FloatingGroupDialog() ) {
3283 GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3285 vsplit = m_pSplits[0];
3286 vsplit2 = m_pSplits[1];
3287 hsplit = m_pSplits[2];
3288 hsplit2 = m_pSplits[3];
3290 g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED( vsplit )->child1_size;
3291 g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED( hsplit2 )->child1_size;
3293 if ( CurrentStyle() == eRegular ) {
3294 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED( hsplit )->child1_size;
3297 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED( hsplit )->child1_size;
3300 g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED( vsplit2 )->child1_size;
3304 if ( g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit ) {
3305 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
3306 g_PrefsDlg.m_bZVis = TRUE;
3309 g_PrefsDlg.m_bZVis = FALSE;
3313 g_PrefsDlg.SavePrefs();
3314 Sys_Printf( "Done prefs\n" );
3317 // spog - this may be better in another place..
3318 // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3319 g_qeglobals.d_savedinfo.filters = FilterListDelete( g_qeglobals.d_savedinfo.filters );
3321 delete m_pXYWnd; m_pXYWnd = NULL;
3322 delete m_pYZWnd; m_pYZWnd = NULL;
3323 delete m_pXZWnd; m_pXZWnd = NULL;
3324 delete m_pZWnd; m_pZWnd = NULL;
3325 delete m_pTexWnd; m_pTexWnd = NULL;
3326 delete m_pCamWnd; m_pCamWnd = NULL;
3328 if ( g_pGroupDlg->m_pWidget ) {
3329 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3330 gtk_widget_destroy( g_pGroupDlg->m_pWidget );
3331 g_pGroupDlg->m_pWidget = NULL;
3334 if ( strcmpi( currentmap, "unnamed.map" ) != 0 ) {
3335 g_PrefsDlg.m_strLastMap = currentmap;
3336 g_PrefsDlg.SavePrefs();
3338 Sys_Printf( "CleanUpEntities..." );
3340 Sys_Printf( "Done.\n" );
3342 Sys_Printf( "Releasing brushes..." );
3343 while ( active_brushes.next != &active_brushes )
3344 Brush_Free( active_brushes.next, false );
3345 while ( selected_brushes.next != &selected_brushes )
3346 Brush_Free( selected_brushes.next, false );
3347 while ( filtered_brushes.next != &filtered_brushes )
3348 Brush_Free( filtered_brushes.next, false );
3349 Sys_Printf( "Done.\n" );
3351 Sys_Printf( "Releasing entities..." );
3352 while ( entities.next != &entities )
3353 Entity_Free( entities.next );
3354 Sys_Printf( "Done.\n" );
3356 epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3359 epair_t* pNextEPair = pEPair->next;
3360 free( pEPair->key );
3361 free( pEPair->value );
3363 pEPair = pNextEPair;
3366 entity_t* pEntity = g_qeglobals.d_project_entity->next;
3367 while ( pEntity != NULL && pEntity != g_qeglobals.d_project_entity )
3369 entity_t* pNextEntity = pEntity->next;
3370 Entity_Free( pEntity );
3371 pEntity = pNextEntity;
3374 Sys_Printf( "Freeing world entity..." );
3375 if ( world_entity ) {
3376 Entity_Free( world_entity );
3378 Sys_Printf( "Done.\n" );
3380 Sys_Printf( "Shutdown VFS..." );
3382 Sys_Printf( "Done.\n" );
3384 Sys_Printf( "FreeShaders..." );
3385 QERApp_FreeShaders();
3386 Sys_Printf( "Done.\n" );
3389 // TTimo: now using profile.cpp code
3390 void MainFrame::LoadCommandMap(){
3393 bool bUserCmdList = false;
3395 // verbose a little: count of user commands we recognized
3397 int iOverrideCount = 0;
3401 #if defined ( __linux__ ) || defined ( __APPLE__ )
3402 strINI = g_PrefsDlg.m_rc_path->str;
3403 #elif defined( WIN32 )
3404 strINI = g_strGameToolsPath;
3406 #error "WTF are you compiling this on"
3409 strINI += "shortcuts.ini";
3411 f = fopen( strINI.GetBuffer(), "r" );
3414 // loop through all the commands
3415 for ( int i = 0; i < g_nCommandCount; i++ )
3418 if ( read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ) ) {
3419 if ( !bUserCmdList ) {
3420 Sys_Printf( "Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3421 bUserCmdList = true;
3426 strBuff.TrimRight();
3427 strBuff.MakeLower();
3428 int nSpecial = strBuff.Find( "+alt" );
3429 g_Commands[i].m_nModifiers = 0;
3430 if ( nSpecial >= 0 ) {
3431 g_Commands[i].m_nModifiers |= RAD_ALT;
3432 FindReplace( strBuff, "+alt", "" );
3434 nSpecial = strBuff.Find( "+ctrl" );
3435 if ( nSpecial >= 0 ) {
3436 g_Commands[i].m_nModifiers |= RAD_CONTROL;
3437 FindReplace( strBuff, "+ctrl", "" );
3439 nSpecial = strBuff.Find( "+shift" );
3440 if ( nSpecial >= 0 ) {
3441 g_Commands[i].m_nModifiers |= RAD_SHIFT;
3442 FindReplace( strBuff, "+shift", "" );
3445 strBuff.TrimRight();
3446 strBuff.MakeUpper();
3447 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3449 nLen = strBuff.GetLength();
3450 if ( nLen == 1 ) { // most often case.. deal with first
3451 g_Commands[i].m_nKey = __toascii( strBuff.GetAt( 0 ) );
3456 for ( j = 0; j < g_nKeyCount; j++ )
3458 if ( strBuff.CompareNoCase( g_Keys[j].m_strName ) == 0 ) {
3459 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3464 if ( j == g_nKeyCount ) {
3465 Sys_Printf( "WARNING: failed to parse user command %s\n", value );
3469 // maybe this new shortcut is overriding another one
3470 // then we need to disable the other binded key
3471 for ( j = 0; j < g_nCommandCount; j++ )
3476 if ( g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers ) {
3478 g_Commands[j].m_nKey = 0;
3481 // it's the only one
3487 if ( iOverrideCount ) {
3488 Sys_Printf( "User's command list overrides %d default commands\n", iOverrideCount );
3490 Sys_Printf( "Parsed %d custom shortcuts\n", iCount );
3493 Sys_Printf( "Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer() );
3497 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3498 // we also output the count of commands that are not binded .. dunno if it's much use ..
3499 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3500 void MainFrame::ShowMenuItemKeyBindings( GtkWidget* window ){
3501 //!\todo Find a better way to get the global accelerator group..
3502 GtkAccelGroup *accel = GTK_ACCEL_GROUP( gtk_accel_groups_from_object( G_OBJECT( window ) )->data );
3508 for ( i = 0; i < g_nCommandCount; i++ )
3510 if ( g_Commands[i].m_nKey == 0 ) {
3515 item = g_object_get_data( G_OBJECT( m_pWidget ), g_Commands[i].m_strMenu );
3516 if ( item == NULL ) {
3517 Sys_FPrintf( SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3518 g_Commands[i].m_strCommand );
3523 if ( g_Commands[i].m_nModifiers ) { // are there modifiers present?
3524 if ( g_Commands[i].m_nModifiers & RAD_SHIFT ) {
3525 mods |= GDK_SHIFT_MASK;
3527 if ( g_Commands[i].m_nModifiers & RAD_ALT ) {
3528 mods |= GDK_MOD1_MASK;
3530 if ( g_Commands[i].m_nModifiers & RAD_CONTROL ) {
3531 mods |= GDK_CONTROL_MASK;
3535 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3536 if ( gtk_accelerator_valid( g_Commands[i].m_nKey, (GdkModifierType)mods ) ) {
3538 // NOTE TTimo this is the important place where all the shortcuts are binded
3539 Sys_Printf( "Calling gtk_widget_add_accelerator on command: %s menu: %s key: %d mods: %d\n", g_Commands[i].m_strCommand, g_Commands[i].m_strMenu, g_Commands[i].m_nKey, mods );
3541 gtk_widget_add_accelerator( GTK_WIDGET( item ), "activate", accel, g_Commands[i].m_nKey,
3542 (GdkModifierType)mods, GTK_ACCEL_VISIBLE );
3546 GtkAccelLabel *accel_label = GTK_ACCEL_LABEL( GTK_BIN( item )->child );
3550 g_free( accel_label->accel_string );
3551 accel_label->accel_string = NULL;
3553 gstring = g_string_new( accel_label->accel_string );
3554 g_string_append( gstring, " " );
3557 if ( mods & GDK_SHIFT_MASK ) {
3558 g_string_append( gstring, "Shft" );
3561 if ( mods & GDK_CONTROL_MASK ) {
3563 g_string_append( gstring, "+" );
3565 g_string_append( gstring, "Ctl" );
3568 if ( mods & GDK_MOD1_MASK ) {
3570 g_string_append( gstring, "+" );
3572 g_string_append( gstring, "Alt" );
3577 g_string_append( gstring, "+" );
3579 if ( g_Commands[i].m_nKey < 0x80 || ( g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff ) ) {
3580 switch ( g_Commands[i].m_nKey )
3583 g_string_append( gstring, "Space" );
3586 g_string_append( gstring, "Backslash" );
3589 g_string_append_c( gstring, toupper( g_Commands[i].m_nKey ) );
3597 tmp = gtk_accelerator_name( g_Commands[i].m_nKey, (GdkModifierType)0 );
3598 if ( tmp[0] != 0 && tmp[1] == 0 ) {
3599 tmp[0] = toupper( tmp[0] );
3601 g_string_append( gstring, tmp );
3605 g_free( accel_label->accel_string );
3606 accel_label->accel_string = gstring->str;
3607 g_string_free( gstring, FALSE );
3609 if ( !accel_label->accel_string ) {
3610 accel_label->accel_string = g_strdup( "" );
3613 gtk_widget_queue_resize( GTK_WIDGET( accel_label ) );
3618 Sys_Printf( "%d commands not bound to a key\n", iCount );
3622 // Checks whether a given filename ends in .map
3623 const bool IsMap(const char* filename){
3624 return strlen(filename) >= 4 && strcmp(filename + strlen(filename) - 4, ".map") == 0;
3627 void MainFrame::CreateQEChildren(){
3628 // load the project file, if it is a project file. (Or at least no .map)
3629 if ( g_argc > 1 && !IsMap( g_argv[1] ) ) {
3630 Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
3631 if ( !QE_LoadProject( g_argv[1] ) ) {
3632 Error( "Unable to load project file %s\n", g_argv[1] );
3637 const char* filename = NULL;
3640 bool bTriedTemplate = false;
3642 if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
3643 // we need to regenerate from template
3644 Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
3645 g_PrefsDlg.m_strLastProject = "";
3648 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3650 while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
3652 if ( !bTriedTemplate ) {
3653 // try default project location
3654 bTriedTemplate = true;
3655 // for all OSes, we look for the template in the base installation (no homepath here)
3656 strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
3657 strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
3658 strcat( buf, "/scripts/" );
3659 strcat( buf, PROJECT_TEMPLATE_NAME );
3664 gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
3666 filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
3667 if ( filename != NULL ) {
3671 Error( "Cannot continue without loading a project..." );
3680 void MainFrame::OnTimer(){
3681 GdkModifierType mask;
3683 gdk_window_get_pointer( NULL, NULL, NULL, &mask );
3685 if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
3686 QE_CountBrushesAndUpdateStatusBar();
3690 // see MainFrame::UpdateStatusText below
3691 if ( m_bNeedStatusUpdate ) {
3692 for ( int n = 0; n < 6; n++ )
3694 if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
3695 gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
3698 m_bNeedStatusUpdate = false;
3702 void MainFrame::UpdateStatusText(){
3703 m_bNeedStatusUpdate = true;
3706 void MainFrame::SetStatusText( int nPane, const char* pText ){
3707 if ( pText && nPane <= 5 && nPane >= 0 ) {
3708 m_strStatus[nPane] = pText;
3712 void MainFrame::SetButtonMenuStates(){
3714 g_bIgnoreCommands++;
3716 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
3717 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
3718 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
3719 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
3720 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
3721 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
3722 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
3723 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
3724 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
3725 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
3726 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
3727 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
3728 //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3729 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3730 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
3731 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3732 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3733 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3734 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3735 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3736 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3737 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
3738 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3739 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
3740 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
3741 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3742 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
3743 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
3744 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3745 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
3746 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
3747 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3748 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
3749 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
3750 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3751 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
3752 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
3753 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3754 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
3755 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
3756 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3757 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
3758 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
3759 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3760 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
3761 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
3762 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3763 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
3764 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
3765 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3766 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
3767 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3768 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3769 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3770 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3771 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3772 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3773 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
3774 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3775 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
3776 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
3777 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3778 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
3779 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
3780 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3781 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
3782 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
3783 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3784 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
3785 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
3786 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3787 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
3788 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
3789 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3790 ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
3791 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
3792 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
3793 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
3794 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
3795 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
3796 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3797 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
3798 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
3799 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
3800 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
3802 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
3803 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3804 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
3805 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
3807 if ( !g_pGameDescription->mNoPatch ) {
3808 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
3809 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
3811 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
3812 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
3813 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
3814 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
3815 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
3816 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
3819 int id, n = g_PrefsDlg.m_nTextureScale;
3822 case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3823 case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3824 case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3825 case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3826 default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3828 SetTextureScale( id );
3830 // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3832 if (g_qeglobals.d_project_entity)
3834 FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
3838 g_bIgnoreCommands--;
3841 void MainFrame::UpdateWindows( int nBits ){
3842 if ( !g_bScreenUpdates ) {
3845 #ifdef DBG_WINDOWPOS
3846 static int bean_count = 0;
3848 sprintf( bean_buf,"UpdateWindows %d",bean_count );
3849 CheckWatchit( bean_buf );
3853 if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
3855 m_pXYWnd->RedrawWindow();
3858 m_pXZWnd->RedrawWindow();
3861 m_pYZWnd->RedrawWindow();
3865 if ( nBits & W_CAMERA || ( ( nBits & W_CAMERA_IFON ) && m_bCamPreview ) ) {
3867 m_pCamWnd->RedrawWindow();
3871 if ( nBits & ( W_Z | W_Z_OVERLAY ) ) {
3873 m_pZWnd->RedrawWindow();
3877 if ( nBits & W_TEXTURE ) {
3879 m_pTexWnd->RedrawWindow();
3882 #ifdef DBG_WINDOWPOS
3883 sprintf( bean_buf,"%d (end UpdateWidows)",bean_count );
3884 CheckWatchit( bean_buf );
3888 void MainFrame::RoutineProcessing(){
3889 #ifdef DBG_WINDOWPOS
3890 static int bean_count = 0;
3892 sprintf( bean_buf,"RoutineProcessing %d",bean_count );
3893 CheckWatchit( bean_buf );
3899 double oldtime = 0.0;
3902 /* // checking KeyState works right
3904 a2 = GetKeyState(VK_MENU);
3907 Sys_Printf("VK_MENU: %d\n",a2);
3911 b2 = GetKeyState(VK_UP);
3914 Sys_Printf("VK_UP: %d\n",b2);
3918 time = Sys_DoubleTime();
3919 delta = time - oldtime;
3921 if ( delta > 0.2 ) {
3925 // update the BSP process watcher
3926 if ( m_pWatchBSP ) {
3927 m_pWatchBSP->RoutineProcessing();
3930 // run time dependant behavior
3932 m_pCamWnd->Cam_MouseControl( delta );
3935 if ( g_nUpdateBits ) {
3936 int nBits = g_nUpdateBits; // this is done to keep this routine from being
3937 g_nUpdateBits = 0; // re-entered due to the paint process.. only
3938 UpdateWindows( nBits ); // happens in rare cases but causes a stack overflow
3941 // Enable/disable the menu items
3944 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3945 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3946 if (!g_PrefsDlg.m_bWideToolbar)
3948 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3949 gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3951 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3952 gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3953 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3954 gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3955 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3956 gtk_widget_set_sensitive (item, region_active);
3957 g_bIgnoreCommands++;
3958 // update the toolbar before displaying the menu:
3959 // show in use check box
3960 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3961 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3962 // show all check box
3963 item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3964 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3965 g_bIgnoreCommands--;
3968 #ifdef DBG_WINDOWPOS
3969 sprintf( bean_buf,"%d (end RoutineProcessing)",bean_count );
3970 CheckWatchit( bean_buf );
3974 void MainFrame::DoWatchBSP(){
3975 // network monitoring of the BSP process
3976 if ( !m_pWatchBSP ) {
3977 m_pWatchBSP = new CWatchBSP();
3981 void MainFrame::CleanPlugInMenu(){
3982 GtkWidget *menu, *sep;
3985 // delete everything after the separator
3986 menu = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) );
3987 sep = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin_separator" ) );
3988 m_nNextPlugInID = ID_PLUGIN_START;
3990 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3993 gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( lst->next->data ) );
3994 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3998 void MainFrame::AddPlugInMenuItem( IPlugIn* pPlugIn ){
3999 GtkWidget *menu, *item, *parent;
4000 const char *menuText;
4002 parent = gtk_menu_item_new_with_label( pPlugIn->getMenuName() );
4003 gtk_widget_show( parent );
4004 gtk_container_add( GTK_CONTAINER( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) ), parent );
4006 int nCount = pPlugIn->getCommandCount();
4008 menu = gtk_menu_new();
4009 while ( nCount > 0 )
4011 menuText = pPlugIn->getCommand( --nCount );
4012 if ( menuText != NULL && strlen( menuText ) > 0 ) {
4013 if ( !strcmp( menuText, "-" ) ) {
4014 item = gtk_menu_item_new();
4015 gtk_widget_set_sensitive( item, FALSE );
4019 item = gtk_menu_item_new_with_label( menuText );
4020 gtk_signal_connect( GTK_OBJECT( item ), "activate",
4021 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( m_nNextPlugInID ) );
4023 gtk_widget_show( item );
4024 gtk_container_add( GTK_CONTAINER( menu ), item );
4025 pPlugIn->addMenuID( m_nNextPlugInID++ );
4028 gtk_menu_item_set_submenu( GTK_MENU_ITEM( parent ), menu );
4032 void MainFrame::OnPlugIn( unsigned int nID, char* str ){
4033 m_PlugInMgr.Dispatch( nID, str );
4036 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype( IToolbarButton::EType type ){
4039 case IToolbarButton::eSpace:
4040 return GTK_TOOLBAR_CHILD_SPACE;
4041 case IToolbarButton::eButton:
4042 return GTK_TOOLBAR_CHILD_BUTTON;
4043 case IToolbarButton::eToggleButton:
4044 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4045 case IToolbarButton::eRadioButton:
4046 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4048 Error( "invalid toolbar button type" );
4049 return (GtkToolbarChildType)0;
4052 void toolbar_insert( GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data ){
4053 GtkWidget *w, *pixmap;
4054 GdkPixmap *gdkpixmap;
4057 load_plugin_bitmap( image, (void **)&gdkpixmap, (void **)&mask );
4058 pixmap = gtk_pixmap_new( gdkpixmap, mask );
4059 gdk_pixmap_unref( gdkpixmap );
4060 gdk_pixmap_unref( mask );
4061 w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), gtktoolbarchildtype_for_toolbarbuttontype( type ), NULL, text, tooltip, "", GTK_WIDGET( pixmap ), handler, data );
4064 void SignalToolbarButton( GtkWidget *widget, gpointer data ){
4065 const_cast<const IToolbarButton*>( reinterpret_cast<IToolbarButton*>( data ) )->activate();
4068 void MainFrame::AddPlugInToolbarButton( const IToolbarButton* button ){
4069 GtkWidget*const toolbar = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "toolbar_plugin" ) );
4070 toolbar_insert( toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC( SignalToolbarButton ), reinterpret_cast<gpointer>( const_cast<IToolbarButton*>( button ) ) );
4073 void MainFrame::OnSelectionSelectNudgedown(){
4074 NudgeSelection( 3, g_qeglobals.d_gridsize );
4077 void MainFrame::OnSelectionSelectNudgeleft(){
4078 NudgeSelection( 0, g_qeglobals.d_gridsize );
4081 void MainFrame::OnSelectionSelectNudgeright(){
4082 NudgeSelection( 2, g_qeglobals.d_gridsize );
4085 void MainFrame::OnSelectionSelectNudgeup(){
4086 NudgeSelection( 1, g_qeglobals.d_gridsize );
4089 void MainFrame::NudgeSelection( int nDirection, float fAmount ){
4090 if ( ActiveXY()->RotateMode() ) {
4092 if ( ActiveXY()->GetViewType() == XY ) {
4096 if ( g_pParentWnd->ActiveXY()->GetViewType() == XZ ) {
4101 if ( nDirection == 2 || nDirection == 3 ) {
4105 float fDeg = -fAmount;
4106 float fAdj = fAmount;
4108 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4110 strStatus.Format( "Rotation x:: %.1f y:: %.1f z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4111 g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2] );
4112 g_pParentWnd->SetStatusText( 2, strStatus );
4113 Select_RotateAxis( nAxis, fDeg, false, true );
4114 Sys_UpdateWindows( W_ALL );
4117 if ( ActiveXY()->ScaleMode() ) {
4118 if ( nDirection == 0 || nDirection == 3 ) {
4122 v[0] = v[1] = v[2] = 1.0;
4123 if ( fAmount > 0 ) {
4135 Select_Scale( ( g_nScaleHow & SCALE_X ) ? v[0] : 1.0,
4136 ( g_nScaleHow & SCALE_Y ) ? v[1] : 1.0,
4137 ( g_nScaleHow & SCALE_Z ) ? v[2] : 1.0 );
4138 Sys_UpdateWindows( W_ALL );
4142 // 0 - left, 1 - up, 2 - right, 3 - down
4144 if ( nDirection == 0 ) {
4145 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4148 else if ( nDirection == 1 ) {
4149 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4151 else if ( nDirection == 2 ) {
4152 nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4156 nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4159 Nudge( nDim, fAmount );
4163 void MainFrame::Nudge( int nDim, float fNudge ){
4165 vMove[0] = vMove[1] = vMove[2] = 0;
4166 vMove[nDim] = fNudge;
4168 if ( ( g_qeglobals.d_select_mode == sel_vertex ||
4169 g_qeglobals.d_select_mode == sel_curvepoint )
4170 && g_qeglobals.d_num_move_points ) {
4171 Select_NudgePoint( vMove, true );
4174 Select_Move( vMove, true );
4176 Sys_UpdateWindows( W_ALL );
4179 void MainFrame::SetGridStatus(){
4183 c1 = ( g_PrefsDlg.m_bTextureLock ) ? 'M' : ' ';
4184 c2 = ( g_PrefsDlg.m_bRotateLock ) ? 'R' : ' ';
4185 strStatus.Format( "G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4186 g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2 );
4187 SetStatusText( 4, strStatus );
4190 void MainFrame::UpdatePatchToolbarButtons(){
4192 g_bIgnoreCommands++;
4193 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
4194 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
4195 // item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4196 // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4197 g_bIgnoreCommands--;
4200 // =============================================================================
4203 void MainFrame::OnFileNew(){
4204 if ( ConfirmModified() ) {
4209 void MainFrame::OnFileOpen(){
4210 if ( !ConfirmModified() ) {
4217 if ( !g_pGameDescription->noMapsInHome ) {
4218 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4219 strcat( buf, "maps/" );
4225 str = file_dialog( m_pWidget, TRUE, _( "Open Map" ), buf, MAP_MAJOR, "maps/" );
4227 if ( str != NULL ) {
4228 strcpy( currentmap,str );
4230 Map_LoadFile( str );
4234 void MainFrame::OnFileImportmap(){
4238 if ( !g_pGameDescription->noMapsInHome ) {
4239 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4240 strcat( buf, "maps/" );
4246 str = file_dialog( m_pWidget, TRUE, _( "Import Map" ), buf, MAP_MAJOR, "maps/" );
4248 if ( str != NULL ) {
4249 Map_ImportFile( str );
4253 void MainFrame::OnFileSave(){
4254 if ( !strcmp( currentmap, "unnamed.map" ) ) {
4258 Map_SaveFile( currentmap, false );
4262 void MainFrame::OnFileSaveas(){
4266 if ( !g_pGameDescription->noMapsInHome ) {
4267 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4268 strcat( buf, "maps/" );
4274 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Save Map" ), buf, MAP_MAJOR, "maps/" );
4276 if ( str != NULL ) {
4277 strcpy( currentmap, str );
4279 Map_SaveFile( str, false ); // ignore region
4283 void MainFrame::OnFileExportmap(){
4287 if ( !g_pGameDescription->noMapsInHome ) {
4288 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4289 strcat( buf, "maps/" );
4295 str = file_dialog( m_pWidget, FALSE, _( "Export Selection" ), buf, MAP_MAJOR, "maps/" );
4297 if ( str != NULL ) {
4298 Map_SaveSelected( str );
4302 void MainFrame::OnFileSaveregion(){
4306 if ( !g_pGameDescription->noMapsInHome ) {
4307 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4308 strcat( buf, "maps/" );
4314 str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Export Region" ), buf, MAP_MAJOR, "maps/" );
4316 if ( str != NULL ) {
4317 Map_SaveFile( str, true ); // ignore region
4321 void MainFrame::OnFileNewproject(){
4322 char* name = DoNewProjectDlg();
4324 // create a new project:
4325 // create directories and grab current project, save it in new project tree in scripts/user.qe4
4326 // on linux we create under ~/.q3a, on win32 under strEnginePath
4327 // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4328 if ( ( name != NULL ) && ( strlen( name ) > 0 ) ) {
4329 CString strNewBasePath;
4331 // NOTE TTimo this would probably not work right on *nix
4332 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4333 strNewBasePath += name;
4334 strNewBasePath += "/";
4336 CString strProjToLoad;
4337 CString strMapToLoad;
4339 // if the dir exists, ask the user if they want to continue anyway
4340 if ( Q_mkdir( strNewBasePath.GetBuffer(), 0755 ) != 0 ) {
4342 strMsg.Format( "The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer() );
4343 Sys_Printf( strMsg );
4344 if ( gtk_MessageBox( m_pWidget, _( strMsg ), _( "Error" ), MB_YESNO ) != IDYES ) {
4345 Sys_Printf( "New Project cancelled, directory already exists for project\n" );
4352 strDir = strNewBasePath;
4354 Q_mkdir( strDir.GetBuffer(), 0755 );
4356 strDir = strNewBasePath;
4357 strDir += "textures/";
4358 Q_mkdir( strDir.GetBuffer(), 0755 );
4360 strDir = strNewBasePath;
4361 strDir += "scripts/";
4362 Q_mkdir( strDir.GetBuffer(), 0755 );
4364 // print a warning for total conversions, since setting the basepath when required files are
4365 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4366 Sys_FPrintf( SYS_WRN, "*** Note: basepath unchanged\n" );
4368 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name );
4370 strDir = strNewBasePath;
4371 strDir += "maps/autosave.map";
4372 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4374 // state that this is a user project file, no templating
4375 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4376 // create the project file
4377 strProjToLoad = strNewBasePath;
4378 strProjToLoad += "scripts/";
4379 strProjToLoad += name;
4380 strProjToLoad += ".";
4381 strProjToLoad += PROJECT_FILETYPE;
4382 QE_SaveProject( strProjToLoad.GetBuffer() );
4387 void MainFrame::OnFileLoadproject(){
4388 if ( ConfirmModified() ) {
4393 void MainFrame::OnFileProjectsettings(){
4394 DoProjectSettings();
4397 void MainFrame::OnFilePointfile(){
4398 if ( g_qeglobals.d_pointfile_display_list ) {
4406 void MainFrame::OnMru( unsigned int nID ){
4407 if ( ConfirmModified() ) {
4408 MRU_Activate( nID - ID_FILE_RECENT1 );
4412 void MainFrame::OnFileExit(){
4413 if ( ConfirmModified() ) {
4414 // stop printing during shutdown
4415 // NOTE: we should cleanly release GL contexts and stuff when exiting
4419 g_qeglobals_gui.d_edit = NULL;
4420 gtk_widget_destroy( m_pWidget );
4424 void MainFrame::OnFileCheckUpdate(){
4427 URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4429 URL += "&OS_dlup=1";
4431 URL += "&OS_dlup=2";
4433 URL += "&Version_dlup=" RADIANT_VERSION;
4434 g_PrefsDlg.mGamesDialog.AddPacksURL( URL );
4435 OpenURL( URL.GetBuffer() );
4438 void MainFrame::OnEditUndo(){
4442 void MainFrame::OnEditRedo(){
4446 void MainFrame::OnEditCopybrush(){
4450 void MainFrame::OnEditPastebrush(){
4453 Undo_Start( "paste" );
4457 Undo_EndBrushList( &selected_brushes );
4461 void MainFrame::OnEditPastebrushToCamera(){
4464 vec3_t mid, camorigin, delta;
4466 ActiveXY()->Paste();
4468 // Work out the delta
4469 Select_GetMid( mid );
4471 // Snap camera origin to grid
4472 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4473 camorigin[0] = floor( camorigin[0] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4474 camorigin[1] = floor( camorigin[1] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4475 camorigin[2] = floor( camorigin[2] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4477 VectorSubtract( camorigin, mid, delta );
4480 Select_Move( delta, false );
4482 Undo_Start( "paste to camera" );
4483 Undo_EndBrushList( &selected_brushes );
4488 void MainFrame::OnSelectionDelete(){
4491 // ActiveXY()->UndoCopy();
4492 Undo_Start( "delete" );
4493 Undo_AddBrushList( &selected_brushes );
4494 //add all deleted entities to the undo
4495 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
4497 Undo_AddEntity( brush->owner );
4499 // NOTE: Select_Delete does NOT delete entities
4501 Undo_EndBrushList( &selected_brushes );
4505 void MainFrame::OnEditMapinfo(){
4509 void MainFrame::OnEditEntityinfo(){
4513 void MainFrame::OnBrushScripts(){
4517 void MainFrame::OnEditLoadprefab(){
4518 const char *filename;
4521 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4522 CurPath = g_PrefsDlg.m_strPrefabPath;
4523 AddSlash( CurPath );
4526 filename = file_dialog( m_pWidget, TRUE, _( "Import Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4528 if ( filename != NULL ) {
4529 Map_ImportFile( filename );
4533 void MainFrame::OnEditSaveprefab(){
4534 const char *filename;
4537 if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4538 CurPath = g_PrefsDlg.m_strPrefabPath;
4543 getcwd( tmp, PATH_MAX );
4546 AddSlash( CurPath );
4548 filename = file_dialog( m_pWidget, FALSE, _( "Export Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4549 if ( filename != NULL ) {
4550 Map_SaveSelected( filename );
4554 void MainFrame::OnPrefs(){
4555 int nView = g_PrefsDlg.m_nView;
4556 bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4557 bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4558 int nShader = g_PrefsDlg.m_nShader;
4559 int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4560 // int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4561 g_PrefsDlg.LoadPrefs();
4563 if ( g_PrefsDlg.DoModal() == IDOK ) {
4564 if ( ( g_PrefsDlg.m_nLatchedView != nView ) ||
4565 ( g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus ) ||
4566 ( g_PrefsDlg.m_bLatchedWideToolbar != bToolbar ) ||
4567 ( g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar ) ||
4568 ( g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar ) ||
4569 ( g_PrefsDlg.m_nLatchedShader != nShader ) ||
4570 ( g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality )
4571 || ( g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ )
4573 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for the changes to take effect." ) );
4576 // if the view mode was switched to floating, set the Z window on by default
4577 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4578 // (and we simply hope there will be a SavePrefs before we die)
4579 if ( ( g_PrefsDlg.m_nView != nView ) && ( (EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating ) ) {
4580 g_PrefsDlg.m_bZVis = true;
4584 m_pTexWnd->UpdatePrefs();
4587 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
4588 g_bIgnoreCommands++;
4589 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4590 ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
4591 g_bIgnoreCommands--;
4595 void MainFrame::OnTogglecamera(){
4596 if ( CurrentStyle() == eFloating ) { // floating views
4597 if ( m_pCamWnd && m_pCamWnd->m_pParent ) {
4598 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->m_pParent ) ) {
4599 widget_delete_hide( m_pCamWnd->m_pParent );
4602 gtk_widget_show( m_pCamWnd->m_pParent );
4608 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->GetWidget() ) ) {
4609 gtk_widget_hide( m_pCamWnd->GetWidget() );
4612 gtk_widget_show( m_pCamWnd->GetWidget() );
4617 void MainFrame::OnToggleconsole(){
4618 if ( FloatingGroupDialog() ) { // QE4 style
4619 if ( inspector_mode == W_CONSOLE ) {
4620 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4621 widget_delete_hide( g_qeglobals_gui.d_entity );
4624 gtk_widget_show( g_qeglobals_gui.d_entity );
4629 gtk_widget_show( g_qeglobals_gui.d_entity );
4630 SetInspectorMode( W_CONSOLE );
4635 // trigger the entity inspector on/off
4636 void MainFrame::OnViewEntity(){
4637 // make sure we're working with the current selection (bugzilla #436)
4638 if ( !GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4642 if ( !FloatingGroupDialog() ) {
4643 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_ENTITY ) {
4644 widget_delete_hide( g_qeglobals_gui.d_entity );
4648 gtk_widget_show( g_qeglobals_gui.d_entity );
4649 SetInspectorMode( W_ENTITY );
4654 if ( inspector_mode == W_ENTITY ) {
4655 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4656 widget_delete_hide( g_qeglobals_gui.d_entity );
4659 gtk_widget_show( g_qeglobals_gui.d_entity );
4664 gtk_widget_show( g_qeglobals_gui.d_entity );
4665 SetInspectorMode( W_ENTITY );
4670 void MainFrame::OnViewGroups(){
4671 if ( !FloatingGroupDialog() ) {
4672 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_GROUP ) {
4673 widget_delete_hide( g_qeglobals_gui.d_entity );
4677 gtk_widget_show( g_qeglobals_gui.d_entity );
4678 SetInspectorMode( W_GROUP );
4683 if ( inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating ) {
4684 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4685 widget_delete_hide( g_qeglobals_gui.d_entity );
4688 gtk_widget_show( g_qeglobals_gui.d_entity );
4693 gtk_widget_show( g_qeglobals_gui.d_entity );
4694 SetInspectorMode( W_GROUP );
4699 void MainFrame::OnToggleview(){
4700 if ( CurrentStyle() == eFloating ) { // QE4 style
4701 if ( m_pXYWnd && m_pXYWnd->m_pParent ) {
4702 if ( GTK_WIDGET_VISIBLE( m_pXYWnd->m_pParent ) ) {
4703 widget_delete_hide( m_pXYWnd->m_pParent );
4706 gtk_widget_show( m_pXYWnd->m_pParent );
4712 void MainFrame::OnToggleviewXz(){
4713 if ( CurrentStyle() == eFloating ) { // QE4 style
4714 if ( m_pXZWnd && m_pXZWnd->m_pParent ) {
4715 // get windowplacement doesn't actually save this so we will here
4716 g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE( m_pXZWnd->m_pParent );
4717 if ( g_PrefsDlg.m_bXZVis ) {
4718 widget_delete_hide( m_pXZWnd->m_pParent );
4721 gtk_widget_show( m_pXZWnd->m_pParent );
4723 g_PrefsDlg.m_bXZVis ^= 1;
4724 g_PrefsDlg.SavePrefs();
4729 void MainFrame::OnToggleviewYz(){
4730 if ( CurrentStyle() == eFloating ) { // QE4 style
4731 if ( m_pYZWnd && m_pYZWnd->m_pParent ) {
4732 g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE( m_pYZWnd->m_pParent );
4733 if ( g_PrefsDlg.m_bYZVis ) {
4734 widget_delete_hide( m_pYZWnd->m_pParent );
4737 gtk_widget_show( m_pYZWnd->m_pParent );
4739 g_PrefsDlg.m_bYZVis ^= 1;
4740 g_PrefsDlg.SavePrefs();
4745 void MainFrame::OnTogglez(){
4746 if ( g_pParentWnd->FloatingGroupDialog() ) { // QE4 style
4747 if ( m_pZWnd && m_pZWnd->m_pParent ) {
4748 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
4749 widget_delete_hide( m_pZWnd->m_pParent );
4752 gtk_widget_show( m_pZWnd->m_pParent );
4754 g_PrefsDlg.m_bZVis ^= 1;
4755 g_PrefsDlg.SavePrefs();
4759 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4763 void MainFrame::OnViewCenter(){
4764 m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4765 m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor( ( m_pCamWnd->Camera()->angles[YAW] + 11 ) / 22.5 );
4766 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
4769 void MainFrame::OnViewUpfloor(){
4770 m_pCamWnd->Cam_ChangeFloor( true );
4773 void MainFrame::OnViewDownfloor(){
4774 m_pCamWnd->Cam_ChangeFloor( false );
4777 void MainFrame::OnViewCenterview(){
4778 if ( CurrentStyle() == eSplit ) {
4779 GetXYWnd()->PositionView();
4780 GetXZWnd()->PositionView();
4781 GetYZWnd()->PositionView();
4782 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4785 m_pXYWnd->PositionView();
4786 Sys_UpdateWindows( W_XY );
4790 void MainFrame::OnViewNextview(){
4791 if ( CurrentStyle() == eSplit ) {
4792 GetXYWnd()->PositionView();
4793 GetXZWnd()->PositionView();
4794 GetYZWnd()->PositionView();
4795 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4798 if ( m_pXYWnd->GetViewType() == XY ) {
4799 m_pXYWnd->SetViewType( XZ );
4802 if ( m_pXYWnd->GetViewType() == XZ ) {
4803 m_pXYWnd->SetViewType( YZ );
4806 m_pXYWnd->SetViewType( XY );
4808 m_pXYWnd->PositionView();
4809 Sys_UpdateWindows( W_XY );
4813 void MainFrame::OnViewXy(){
4814 if ( !FloatingGroupDialog() ) {
4815 m_pXYWnd->SetViewType( XY );
4816 m_pXYWnd->PositionView();
4818 Sys_UpdateWindows( W_XY );
4821 void MainFrame::OnViewSide(){
4822 if ( !FloatingGroupDialog() ) {
4823 m_pXYWnd->SetViewType( XZ );
4824 m_pXYWnd->PositionView();
4826 Sys_UpdateWindows( W_XY );
4829 void MainFrame::OnViewFront(){
4830 if ( !FloatingGroupDialog() ) {
4831 m_pXYWnd->SetViewType( YZ );
4832 m_pXYWnd->PositionView();
4834 Sys_UpdateWindows( W_XY );
4837 void MainFrame::OnView100(){
4839 m_pXYWnd->SetScale( 1 );
4842 m_pXZWnd->SetScale( 1 );
4845 m_pYZWnd->SetScale( 1 );
4847 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4850 void MainFrame::OnViewZoomin(){
4851 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4852 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0 / 4 );
4853 if ( m_pXYWnd->Scale() > 30 ) {
4854 m_pXYWnd->SetScale( 30 );
4858 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4859 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0 / 4 );
4860 if ( m_pXZWnd->Scale() > 30 ) {
4861 m_pXZWnd->SetScale( 30 );
4865 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4866 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0 / 4 );
4867 if ( m_pYZWnd->Scale() > 30 ) {
4868 m_pYZWnd->SetScale( 30 );
4872 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4875 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4876 // we don't go below a zoom factor corresponding to 10% of the max world size
4877 // (this has to be computed against the window size)
4878 void MainFrame::OnViewZoomout(){
4880 if ( m_pXYWnd && m_pXYWnd->Active() ) {
4881 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0 / 5 );
4882 min_scale = MIN( m_pXYWnd->Width(),m_pXYWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4883 if ( m_pXYWnd->Scale() < min_scale ) {
4884 m_pXYWnd->SetScale( min_scale );
4888 if ( m_pXZWnd && m_pXZWnd->Active() ) {
4889 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0 / 5 );
4890 min_scale = MIN( m_pXZWnd->Width(),m_pXZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4891 if ( m_pXZWnd->Scale() < min_scale ) {
4892 m_pXZWnd->SetScale( min_scale );
4896 if ( m_pYZWnd && m_pYZWnd->Active() ) {
4897 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0 / 5 );
4898 min_scale = MIN( m_pYZWnd->Width(),m_pYZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4899 if ( m_pYZWnd->Scale() < min_scale ) {
4900 m_pYZWnd->SetScale( min_scale );
4903 Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4906 void MainFrame::OnViewZ100(){
4908 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4911 void MainFrame::OnViewZzoomin(){
4913 if ( z.scale > 4 ) {
4916 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4919 void MainFrame::OnViewZzoomout(){
4920 z.scale *= 4.0f / 5;
4921 if ( z.scale < 0.125 ) {
4924 Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4927 void MainFrame::OnViewCubein(){
4928 g_PrefsDlg.m_nCubicScale--;
4929 if ( g_PrefsDlg.m_nCubicScale < 1 ) {
4930 g_PrefsDlg.m_nCubicScale = 1;
4932 g_PrefsDlg.SavePrefs();
4933 Sys_UpdateWindows( W_CAMERA );
4937 void MainFrame::OnViewCubeout(){
4938 g_PrefsDlg.m_nCubicScale++;
4939 if ( g_PrefsDlg.m_nCubicScale > 22 ) {
4940 g_PrefsDlg.m_nCubicScale = 22;
4942 g_PrefsDlg.SavePrefs();
4943 Sys_UpdateWindows( W_CAMERA );
4947 void MainFrame::OnViewShownames(){
4948 g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
4949 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
4950 g_bIgnoreCommands++;
4951 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4952 g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE );
4953 g_bIgnoreCommands--;
4954 Sys_UpdateWindows( W_XY );
4957 void MainFrame::OnViewShowAngles(){
4958 g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
4959 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
4960 g_bIgnoreCommands++;
4961 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4962 g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE );
4963 g_bIgnoreCommands--;
4964 Sys_UpdateWindows( W_XY );
4967 void MainFrame::OnViewShowblocks(){
4968 g_qeglobals.show_blocks ^= 1;
4969 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showblocks" ) );
4970 g_bIgnoreCommands++;
4971 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.show_blocks ? TRUE : FALSE );
4972 g_bIgnoreCommands--;
4973 Sys_UpdateWindows( W_XY );
4976 void MainFrame::OnViewShowcoordinates(){
4977 g_qeglobals.d_savedinfo.show_coordinates ^= 1;
4978 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
4979 g_bIgnoreCommands++;
4980 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4981 g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE );
4982 g_bIgnoreCommands--;
4983 Sys_UpdateWindows( W_XY | W_Z );
4986 void MainFrame::OnViewShowOutline(){
4987 g_qeglobals.d_savedinfo.show_outline ^= 1;
4988 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
4989 g_bIgnoreCommands++;
4990 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4991 g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE );
4992 g_bIgnoreCommands--;
4993 Sys_UpdateWindows( W_XY );
4996 void MainFrame::OnViewShowAxes(){
4997 g_qeglobals.d_savedinfo.show_axis ^= 1;
4998 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
4999 g_bIgnoreCommands++;
5000 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
5001 g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE );
5002 g_bIgnoreCommands--;
5003 Sys_UpdateWindows( W_XY );
5006 void MainFrame::OnViewShowWorkzone(){
5007 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showworkzone" ) );
5008 g_bIgnoreCommands++;
5009 if ( g_qeglobals.d_show_work ) {
5010 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
5011 g_qeglobals.d_show_work = false;
5015 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5016 g_qeglobals.d_show_work = true;
5018 g_bIgnoreCommands--;
5019 Sys_UpdateWindows( W_XY );
5022 void MainFrame::OnViewHideshowHideselected(){
5027 void MainFrame::OnViewHideshowShowhidden(){
5028 Select_ShowAllHidden();
5032 sets the view mode for the entities
5033 called upon LoadPrefs too
5034 NOTE TTimo previous implementation had a SavePrefs call
5035 .. I don't think it is relevant, removed (the prefs are saved upon exit)
5036 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5037 (otherwise we are always called following user action on the widget)
5039 void MainFrame::OnEntitiesSetViewAs( int mode ){
5040 gpointer item = NULL;
5042 switch ( g_PrefsDlg.m_nEntityShowState )
5045 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5048 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5050 case ENTITY_SELECTED:
5051 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5053 case ENTITY_SELECTED_SKIN:
5054 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5056 case ENTITY_SKINNED:
5057 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5059 case ENTITY_SKINNED_BOXED:
5060 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5063 g_bIgnoreCommands++;
5064 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5065 g_bIgnoreCommands--;
5071 case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5072 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5073 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5075 case ID_VIEW_ENTITIESAS_WIREFRAME:
5076 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5077 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5079 case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5080 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5081 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5083 case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5084 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5085 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5087 case ID_VIEW_ENTITIESAS_SKINNED:
5088 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5089 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5091 case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5092 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5093 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5096 Sys_FPrintf( SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n" );
5101 Sys_FPrintf( SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n" );
5105 g_bIgnoreCommands++;
5106 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5107 g_bIgnoreCommands--;
5109 Sys_UpdateWindows( W_ALL );
5112 void MainFrame::OnViewCubicclipping(){
5115 g_PrefsDlg.m_bCubicClipping ^= 1;
5116 g_bIgnoreCommands++;
5117 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
5118 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5119 w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
5120 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5121 g_bIgnoreCommands--;
5122 g_PrefsDlg.SavePrefs();
5123 //Map_BuildBrushData ();
5124 Sys_UpdateWindows( W_CAMERA );
5127 void MainFrame::OnViewOpengllighting(){
5128 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
5129 g_PrefsDlg.m_bGLLighting ^= 1;
5130 g_PrefsDlg.SavePrefs();
5131 g_bIgnoreCommands++;
5132 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE );
5133 Sys_UpdateWindows( W_XY | W_CAMERA );
5134 g_bIgnoreCommands--;
5137 void MainFrame::OnSelectionDragedges(){
5138 if ( g_qeglobals.d_select_mode == sel_edge ) {
5139 g_qeglobals.d_select_mode = sel_brush;
5140 Sys_UpdateWindows( W_ALL );
5144 SetupVertexSelection();
5145 if ( g_qeglobals.d_numpoints ) {
5146 g_qeglobals.d_select_mode = sel_edge;
5148 Sys_UpdateWindows( W_ALL );
5152 void MainFrame::OnSelectionDragvertecies(){
5153 if ( g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint ) {
5154 g_qeglobals.d_select_mode = sel_brush;
5155 Sys_UpdateWindows( W_ALL );
5159 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5160 if ( OnlyPatchesSelected() ) {
5163 else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5165 SetupVertexSelection();
5166 if ( g_qeglobals.d_numpoints ) {
5167 g_qeglobals.d_select_mode = sel_vertex;
5170 Sys_UpdateWindows( W_ALL );
5174 void MainFrame::OnSelectionClone(){
5178 // called when the escape key is used (either on the main window or on an inspector)
5179 void MainFrame::OnSelectionDeselect(){
5180 if ( g_bClipMode ) {
5184 if ( g_bRotateMode ) {
5185 OnSelectMouserotate();
5188 if ( g_bScaleMode ) {
5189 OnSelectMousescale();
5192 if ( g_bPathMode ) {
5194 ActiveXY()->KillPathMode();
5199 if ( g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0 ) {
5200 g_qeglobals.d_num_move_points = 0;
5201 Sys_UpdateWindows( W_ALL );
5206 SetStatusText( 2, " " );
5211 void MainFrame::OnBrushFlipx(){
5212 Undo_Start( "flip X" );
5213 Undo_AddBrushList( &selected_brushes );
5215 Select_FlipAxis( 0 );
5216 // spog - this does not work - it's a rotate not a flip
5218 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5220 if(b->owner->eclass->fixedsize)
5223 float a = FloatForKey(b->owner, "angle");
5224 a = div ((int)(180 - a), 180).rem;
5225 sprintf (buf, "%d", (int)a);
5226 SetKeyValue(b->owner, "angle", buf);
5227 Brush_Build(b,true,true,false,false); // don't filter
5231 Undo_EndBrushList( &selected_brushes );
5235 void MainFrame::OnBrushFlipy(){
5236 Undo_Start( "flip Y" );
5237 Undo_AddBrushList( &selected_brushes );
5239 Select_FlipAxis( 1 );
5240 // spog - this does not work - it's a rotate not a flip
5242 for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5244 if(b->owner->eclass->fixedsize)
5246 float a = FloatForKey(b->owner, "angle");
5247 if (a == 0 || a == 180 || a == 360)
5249 if ( a == 90 || a == 270)
5263 sprintf (buf, "%d", (int)a);
5264 SetKeyValue(b->owner, "angle", buf);
5265 Brush_Build(b,true,true,false,false); // don't filter
5270 Undo_EndBrushList( &selected_brushes );
5274 void MainFrame::OnBrushFlipz(){
5275 Undo_Start( "flip Z" );
5276 Undo_AddBrushList( &selected_brushes );
5277 Select_FlipAxis( 2 );
5278 Undo_EndBrushList( &selected_brushes );
5282 void MainFrame::OnBrushRotatex(){
5283 Undo_Start( "rotate X" );
5284 Undo_AddBrushList( &selected_brushes );
5285 Select_RotateAxis( 0, 90 );
5286 Undo_EndBrushList( &selected_brushes );
5290 void MainFrame::OnBrushRotatey(){
5291 Undo_Start( "rotate Y" );
5292 Undo_AddBrushList( &selected_brushes );
5293 Select_RotateAxis( 1, 90 );
5294 Undo_EndBrushList( &selected_brushes );
5298 void MainFrame::OnBrushRotatez(){
5299 Undo_Start( "rotate Z" );
5300 Undo_AddBrushList( &selected_brushes );
5301 Select_RotateAxis( 2, 90 );
5302 Undo_EndBrushList( &selected_brushes );
5306 void MainFrame::OnSelectionArbitraryrotation(){
5307 Undo_Start( "arbitrary rotation" );
5308 Undo_AddBrushList( &selected_brushes );
5312 Undo_EndBrushList( &selected_brushes );
5316 void MainFrame::OnSelectScale(){
5317 Undo_Start( "scale" );
5318 Undo_AddBrushList( &selected_brushes );
5320 Undo_EndBrushList( &selected_brushes );
5324 void MainFrame::OnSelectionMakehollow(){
5326 // ActiveXY()->UndoCopy();
5327 Undo_Start( "hollow" );
5328 Undo_AddBrushList( &selected_brushes );
5330 Undo_EndBrushList( &selected_brushes );
5334 void MainFrame::OnSelectionCsgsubtract(){
5335 Undo_Start( "CSG subtract" );
5340 void MainFrame::OnSelectionCsgmerge(){
5341 Undo_Start( "CSG merge" );
5342 Undo_AddBrushList( &selected_brushes );
5344 Undo_EndBrushList( &selected_brushes );
5348 void MainFrame::OnSelectionNoOutline(){
5349 //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5350 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) ^ OUTLINE_ZBUF;
5351 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5352 g_bIgnoreCommands++;
5353 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5354 g_bIgnoreCommands--;
5355 Sys_UpdateWindows( W_CAMERA );
5358 void MainFrame::OnSelectionOutlineStyle(){
5359 if ( ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) && ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) ) {
5360 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5362 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) {
5363 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5365 else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) {
5366 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5369 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5371 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5372 g_bIgnoreCommands++;
5373 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5374 g_bIgnoreCommands--;
5375 Sys_UpdateWindows( W_CAMERA );
5378 void MainFrame::OnSelectionSelectcompletetall(){
5380 ActiveXY()->UndoCopy();
5382 Select_CompleteTall();
5385 void MainFrame::OnSelectionSelecttouching(){
5389 void MainFrame::OnSelectionSelectpartialtall(){
5390 Select_PartialTall();
5393 void MainFrame::OnSelectionSelectinside(){
5397 void MainFrame::OnViewClipper(){
5398 GtkWidget *w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_clipper" ) );
5399 g_bIgnoreCommands++;
5402 if ( ActiveXY()->ClipMode() ) {
5403 ActiveXY()->SetClipMode( false );
5404 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), FALSE );
5408 if ( ActiveXY()->RotateMode() ) {
5409 OnSelectMouserotate();
5411 ActiveXY()->SetClipMode( true );
5412 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), TRUE );
5415 g_bIgnoreCommands--;
5418 void MainFrame::OnClipSelected(){
5419 if ( m_pActiveXY && m_pActiveXY->ClipMode() ) {
5420 Undo_Start( "clip selected" );
5421 Undo_AddBrushList( &selected_brushes );
5422 m_pActiveXY->Clip();
5423 Undo_EndBrushList( &selected_brushes );
5428 if ( g_bPatchBendMode ) {
5429 Patch_BendHandleENTER();
5431 // else if (g_bPatchBendMode)
5432 // Patch_InsDelHandleENTER();
5436 void MainFrame::OnSplitSelected(){
5437 if ( m_pActiveXY ) {
5438 Undo_Start( "split selected" );
5439 Undo_AddBrushList( &selected_brushes );
5440 m_pActiveXY->SplitClip();
5441 Undo_EndBrushList( &selected_brushes );
5446 void MainFrame::OnFlipClip(){
5447 if ( m_pActiveXY ) {
5448 m_pActiveXY->FlipClip();
5452 void MainFrame::OnSelectionConnect(){
5453 Undo_Start( "connect selected entities" );
5454 Undo_AddBrushList( &selected_brushes );
5456 Undo_EndBrushList( &selected_brushes );
5460 void MainFrame::OnSelectionUngroupentity(){
5461 Undo_Start( "ungroup selected entities" );
5462 Undo_AddBrushList( &selected_brushes );
5464 Undo_EndBrushList( &selected_brushes );
5468 void MainFrame::OnSelectionMergeentity(){
5469 Undo_Start( "merge entity" );
5470 Undo_AddBrushList( &selected_brushes );
5471 Select_MergeEntity();
5472 Undo_EndBrushList( &selected_brushes );
5476 void MainFrame::OnSelectionGroupworld(){
5477 Undo_Start( "group world" );
5478 Undo_AddBrushList( &selected_brushes );
5479 Select_GroupEntity( world_entity );
5480 Undo_EndBrushList( &selected_brushes );
5484 void MainFrame::OnSelectionMakeDetail(){
5485 Undo_Start( "make detail" );
5486 Undo_AddBrushList( &selected_brushes );
5487 Select_MakeDetail();
5488 Undo_EndBrushList( &selected_brushes );
5492 void MainFrame::OnSelectionMakeStructural(){
5493 Undo_Start( "make structural" );
5494 Undo_AddBrushList( &selected_brushes );
5495 Select_MakeStructural();
5496 Undo_EndBrushList( &selected_brushes );
5500 void MainFrame::OnBspCommand( unsigned int nID ){
5501 // make sure we don't attempt to region compile a map with the camera outside the region
5502 if ( region_active ) {
5505 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5506 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5507 (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2] );
5510 for ( i = 0 ; i < 3 ; i++ )
5512 if ( vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i] ) {
5513 Sys_FPrintf( SYS_ERR, "The camera must be in the region to start a region compile.\n" );
5519 // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5520 if ( stricmp( currentmap, "unnamed.map" ) == 0 ) {
5524 if ( g_PrefsDlg.m_bSnapShots && ( stricmp( currentmap, "unnamed.map" ) != 0 ) ) {
5528 if ( g_qeglobals.bBSPFrontendPlugin ) {
5529 char *cmd = (char*)g_slist_nth_data( g_BSPFrontendCommands, nID - CMD_BSPCOMMAND );
5530 g_BSPFrontendTable.m_pfnDispatchBSPCommand( cmd );
5534 RunBsp( bsp_commands[nID - CMD_BSPCOMMAND] );
5538 void MainFrame::OnGrid( unsigned int nID ){
5539 if ( nID == ID_GRID_025 ) {
5540 g_qeglobals.d_gridsize = 0.25f;
5541 g_qeglobals.d_bSmallGrid = true;
5543 else if ( nID == ID_GRID_05 ) {
5544 g_qeglobals.d_gridsize = 0.5f;
5545 g_qeglobals.d_bSmallGrid = true;
5551 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5552 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5553 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5554 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5555 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5556 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5557 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5558 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5559 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5561 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5562 g_qeglobals.d_bSmallGrid = false;
5567 // SnapTToGrid option: need to check everywhere the grid size is changed
5568 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5569 if ( g_PrefsDlg.m_bSnapTToGrid ) {
5573 Sys_UpdateWindows( W_XY | W_Z );
5576 void MainFrame::OnSnaptogrid(){
5577 g_PrefsDlg.m_bSnap ^= 1;
5578 g_PrefsDlg.SavePrefs();
5580 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
5581 g_bIgnoreCommands++;
5582 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bSnap ? TRUE : FALSE );
5583 g_bIgnoreCommands--;
5586 void MainFrame::OnTexturesShowinuse(){
5588 Texture_ShowInuse();
5590 if ( !g_bShowAllShaders ) {
5591 Sys_Printf( "Already showing only in-use textures.\n" );
5594 Sys_UpdateWindows( W_TEXTURE );
5598 void MainFrame::OnTexturesShowall(){
5602 // do some triggering on/off, if the inspector is already up then hide it
5603 void MainFrame::OnTexturesInspector(){
5607 void MainFrame::OnViewNearest( unsigned int nID ){
5608 Texture_SetMode( nID );
5611 void MainFrame::OnTextureReplaceall(){
5612 FindTextureDialog::show();
5615 void MainFrame::OnToggleLock(){
5616 g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5618 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
5619 g_bIgnoreCommands++;
5620 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE );
5621 g_bIgnoreCommands--;
5622 g_PrefsDlg.SavePrefs();
5626 void MainFrame::OnToggleRotatelock(){
5627 g_PrefsDlg.m_bRotateLock ^= 1;
5629 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
5630 g_bIgnoreCommands++;
5631 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE );
5632 g_bIgnoreCommands--;
5633 g_PrefsDlg.SavePrefs();
5637 // use a dialog for direct selection of a texture menu
5638 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5639 void MainFrame::OnTexturesLoad(){
5640 char def_path[NAME_MAX];
5643 // check if that works with fs_game (I suspect some more design is needed)
5644 // see how this is done in 1.2?
5645 strcpy( def_path, g_pGameDescription->mEnginePath.GetBuffer() );
5646 strcat( def_path, g_pGameDescription->mBaseGame.GetBuffer() );
5647 strcat( def_path, "/" );
5649 char *dir = dir_dialog( m_pWidget, _( "Load textures from path" ), def_path );
5651 if ( dir != NULL ) {
5652 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5653 Sys_Printf( "user select: '%s'\n", dir );
5654 // remove a potential trailing slash?
5655 if ( dir[strlen( dir ) - 1] == '/' || dir[strlen( dir ) - 1] == '\\' ) {
5656 dir[strlen( dir ) - 1] = '\0';
5658 char *pouic = MAX( strrchr( dir, '/' ),strrchr( dir, '\\' ) );
5660 strcpy( texture_directory, pouic + 1 );
5661 Sys_Printf( "Loading '%s'\n", texture_directory );
5662 Texture_ShowDirectory();
5665 Sys_FPrintf( SYS_WRN, "Failed to extract the directory\n" );
5670 Sys_FPrintf( SYS_WRN, "texture load dialog cancelled\n" );
5674 void MainFrame::OnTexturesReloadshaders(){
5676 QERApp_ReloadShaders();
5678 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5679 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
5680 Sys_UpdateWindows( W_ALL );
5684 void MainFrame::OnTexturesShadersShow(){
5685 g_PrefsDlg.m_bShowShaders ^= 1;
5686 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
5687 g_bIgnoreCommands++;
5688 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
5689 g_bIgnoreCommands--;
5690 Sys_UpdateWindows( W_TEXTURE );
5693 void MainFrame::SetTextureScale( int id ){
5698 case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5699 g_PrefsDlg.m_nTextureScale = 10;
5700 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_10" ) );
5702 case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5703 g_PrefsDlg.m_nTextureScale = 25;
5704 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_25" ) );
5706 case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5707 g_PrefsDlg.m_nTextureScale = 50;
5708 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_50" ) );
5710 case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5711 g_PrefsDlg.m_nTextureScale = 200;
5712 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_200" ) );
5715 g_PrefsDlg.m_nTextureScale = 100;
5716 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_100" ) );
5720 g_bIgnoreCommands++;
5721 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5722 g_bIgnoreCommands--;
5724 Texture_ResetPosition();
5727 void MainFrame::OnTexturewindowScaleup(){
5728 switch ( g_PrefsDlg.m_nTextureScale ) {
5729 // 200, all the way in, don't do anything
5731 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_200 );
5734 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5737 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5740 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5745 void MainFrame::OnTexturewindowScaledown(){
5746 switch ( g_PrefsDlg.m_nTextureScale ) {
5748 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5751 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5754 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5757 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_10 );
5759 // 10, all the way out, don't do anything
5763 void MainFrame::OnTexturesLoadlist(){
5767 void MainFrame::OnTexturesShaderlistonly(){
5768 g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5769 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ),"menu_textures_shaderlistonly" ) );
5770 g_bIgnoreCommands++;
5771 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
5772 g_bIgnoreCommands--;
5776 void MainFrame::OnTextureWad( unsigned int nID ){
5778 Texture_ShowDirectory( nID );
5779 Sys_UpdateWindows( W_ALL );
5783 void MainFrame::OnMiscBenchmark(){
5784 m_pCamWnd->BenchMark();
5787 void MainFrame::OnColorSetoriginal(){
5788 for ( int i = 0 ; i < 3 ; i++ )
5790 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5791 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5792 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5793 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5794 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5798 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5799 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5800 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5802 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5803 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5804 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5807 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5808 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5809 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5811 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5812 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5813 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5815 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5816 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5817 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5819 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5820 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5821 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5823 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5824 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5825 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5827 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5828 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5829 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5831 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5832 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5833 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5835 g_PrefsDlg.SavePrefs();
5836 Sys_UpdateWindows( W_ALL );
5839 void MainFrame::OnColorSetqer(){
5840 for ( int i = 0 ; i < 3 ; i++ )
5842 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5843 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5844 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5845 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5846 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5849 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5850 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5851 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5853 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5854 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5855 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5857 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5858 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5859 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5861 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5862 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5863 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5865 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5866 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5867 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5869 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5870 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5871 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5873 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5874 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5875 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5877 g_PrefsDlg.SavePrefs();
5878 Sys_UpdateWindows( W_ALL );
5881 void MainFrame::OnColorSetblack(){
5882 for ( int i = 0 ; i < 3 ; i++ )
5884 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5885 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5886 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
5887 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5890 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
5891 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
5892 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
5894 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5895 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5896 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5898 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
5899 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
5900 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
5902 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5903 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5904 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5906 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5907 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5908 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5910 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
5911 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
5912 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
5914 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
5915 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
5916 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
5918 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5919 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5920 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5922 g_PrefsDlg.SavePrefs();
5923 Sys_UpdateWindows( W_ALL );
5926 /* ydnar: to emulate maya/max/lightwave color schemes */
5927 void MainFrame::OnColorSetydnar(){
5928 for ( int i = 0 ; i < 3 ; i++ )
5930 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5931 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
5932 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
5933 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
5934 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5937 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
5938 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
5939 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5941 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5942 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5943 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5945 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5946 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5947 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5949 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5950 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5951 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5953 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5954 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5955 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5957 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5958 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5959 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5961 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5962 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5963 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5965 g_PrefsDlg.SavePrefs();
5966 Sys_UpdateWindows( W_ALL );
5969 void MainFrame::OnTexturebk(){
5970 DoColor( COLOR_TEXTUREBACK );
5971 Sys_UpdateWindows( W_ALL );
5974 void MainFrame::OnColorsXybk(){
5975 DoColor( COLOR_GRIDBACK );
5976 Sys_UpdateWindows( W_ALL );
5979 void MainFrame::OnColorsMajor(){
5980 DoColor( COLOR_GRIDMAJOR );
5981 Sys_UpdateWindows( W_ALL );
5984 void MainFrame::OnColorsMinor(){
5985 DoColor( COLOR_GRIDMINOR );
5986 Sys_UpdateWindows( W_ALL );
5989 void MainFrame::OnColorsMajor_Alt(){
5990 DoColor( COLOR_GRIDMAJOR_ALT );
5991 Sys_UpdateWindows( W_ALL );
5994 void MainFrame::OnColorsMinor_Alt(){
5995 DoColor( COLOR_GRIDMINOR_ALT );
5996 Sys_UpdateWindows( W_ALL );
5999 void MainFrame::OnColorsGridtext(){
6000 DoColor( COLOR_GRIDTEXT );
6001 Sys_UpdateWindows( W_ALL );
6004 void MainFrame::OnColorsGridblock(){
6005 DoColor( COLOR_GRIDBLOCK );
6006 Sys_UpdateWindows( W_ALL );
6009 void MainFrame::OnColorsCameraBack(){
6010 DoColor( COLOR_CAMERABACK );
6011 Sys_UpdateWindows( W_ALL );
6014 void MainFrame::OnColorsBrush(){
6015 DoColor( COLOR_BRUSHES );
6016 Sys_UpdateWindows( W_ALL );
6019 void MainFrame::OnColorsSelectedbrush(){
6020 DoColor( COLOR_SELBRUSHES );
6021 Sys_UpdateWindows( W_ALL );
6024 void MainFrame::OnColorsSelectedbrush3D(){
6025 DoColor( COLOR_SELBRUSHES3D );
6026 Sys_UpdateWindows( W_ALL );
6029 void MainFrame::OnColorsClipper(){
6030 DoColor( COLOR_CLIPPER );
6031 Sys_UpdateWindows( W_ALL );
6034 void MainFrame::OnColorsViewname(){
6035 DoColor( COLOR_VIEWNAME );
6036 Sys_UpdateWindows( W_ALL );
6039 void MainFrame::OnMiscGamma(){
6040 float fSave = g_qeglobals.d_savedinfo.fGamma;
6042 if ( fSave != g_qeglobals.d_savedinfo.fGamma ) {
6043 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for Gamma settings to take effect." ) );
6046 void MainFrame::OnMiscFindbrush(){
6050 void MainFrame::OnMiscNextleakspot(){
6054 void MainFrame::OnMiscPreviousleakspot(){
6058 void MainFrame::OnMiscPrintxy(){
6062 void MainFrame::OnMiscSelectentitycolor(){
6063 if ( edit_entity ) {
6064 CString strColor = ValueForKey( edit_entity, "_color" );
6065 if ( strColor.GetLength() > 0 ) {
6067 int n = sscanf( strColor,"%f %f %f", &fR, &fG, &fB );
6069 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6070 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6071 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6075 if ( inspector_mode == W_ENTITY && ( DoColor( COLOR_ENTITY ) ) ) {
6077 sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6078 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6079 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
6081 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntValueField] ), buffer );
6082 gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntKeyField] ), "_color" );
6084 //DK - SOF change to get color to entity quickly
6085 //--::SetWindowText( hwndEnt[EntValueField], buffer );
6086 //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6089 Sys_UpdateWindows( W_ALL );
6093 void MainFrame::OnConvertcurves(){
6096 for ( brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next )
6098 if ( pb->curveBrush ) {
6099 for ( face_t* f = pb->brush_faces ; f ; f = f->next )
6101 if ( f->texdef.contents & CONTENTS_LADDER ) {
6102 f->texdef.contents &= ~CONTENTS_LADDER;
6103 f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6108 Map_BuildBrushData();
6112 void MainFrame::OnRegionOff(){
6116 void MainFrame::OnRegionSetxy(){
6120 void MainFrame::OnRegionSettallbrush(){
6121 Map_RegionTallBrush();
6124 void MainFrame::OnRegionSetbrush(){
6128 void MainFrame::OnRegionSetselection(){
6129 Map_RegionSelectedBrushes();
6132 void MainFrame::OnBrush3sided(){
6133 Undo_Start( "3 sided" );
6134 Undo_AddBrushList( &selected_brushes );
6135 Brush_MakeSided( 3 );
6136 Undo_EndBrushList( &selected_brushes );
6140 void MainFrame::OnBrush4sided(){
6141 Undo_Start( "4 sided" );
6142 Undo_AddBrushList( &selected_brushes );
6143 Brush_MakeSided( 4 );
6144 Undo_EndBrushList( &selected_brushes );
6148 void MainFrame::OnBrush5sided(){
6149 Undo_Start( "5 sided" );
6150 Undo_AddBrushList( &selected_brushes );
6151 Brush_MakeSided( 5 );
6152 Undo_EndBrushList( &selected_brushes );
6156 void MainFrame::OnBrush6sided(){
6157 Undo_Start( "6 sided" );
6158 Undo_AddBrushList( &selected_brushes );
6159 Brush_MakeSided( 6 );
6160 Undo_EndBrushList( &selected_brushes );
6164 void MainFrame::OnBrush7sided(){
6165 Undo_Start( "7 sided" );
6166 Undo_AddBrushList( &selected_brushes );
6167 Brush_MakeSided( 7 );
6168 Undo_EndBrushList( &selected_brushes );
6172 void MainFrame::OnBrush8sided(){
6173 Undo_Start( "8 sided" );
6174 Undo_AddBrushList( &selected_brushes );
6175 Brush_MakeSided( 8 );
6176 Undo_EndBrushList( &selected_brushes );
6180 void MainFrame::OnBrush9sided(){
6181 Undo_Start( "9 sided" );
6182 Undo_AddBrushList( &selected_brushes );
6183 Brush_MakeSided( 9 );
6184 Undo_EndBrushList( &selected_brushes );
6188 void MainFrame::OnBrushArbitrarysided(){
6189 Undo_Start( "arbitrary sided" );
6190 Undo_AddBrushList( &selected_brushes );
6192 Undo_EndBrushList( &selected_brushes );
6196 void MainFrame::OnBrushMakecone(){
6197 Undo_Start( "make cone" );
6198 Undo_AddBrushList( &selected_brushes );
6200 Undo_EndBrushList( &selected_brushes );
6204 void MainFrame::OnBrushPrimitivesSphere(){
6205 Undo_Start( "make sphere" );
6206 Undo_AddBrushList( &selected_brushes );
6208 DoSides( false, true );
6210 Undo_EndBrushList( &selected_brushes );
6214 void MainFrame::OnCurvePatchtube(){
6215 Undo_Start( "make curve cylinder" );
6216 Undo_AddBrushList( &selected_brushes );
6217 Patch_BrushToMesh( false );
6218 Sys_UpdateWindows( W_ALL );
6219 Undo_EndBrushList( &selected_brushes );
6223 void MainFrame::OnCurvePatchdensetube(){
6224 Undo_Start( "dense cylinder" );
6225 Undo_AddBrushList( &selected_brushes );
6227 Patch_BrushToMesh( false );
6228 OnCurveInsertAddrow();
6229 Sys_UpdateWindows( W_ALL );
6231 Undo_EndBrushList( &selected_brushes );
6235 void MainFrame::OnCurvePatchverydensetube(){
6236 Undo_Start( "very dense cylinder" );
6237 Undo_AddBrushList( &selected_brushes );
6239 Patch_BrushToMesh( false );
6240 OnCurveInsertAddrow();
6241 OnCurveInsertInsertrow();
6242 OnCurveInsertAddrow();
6243 Sys_UpdateWindows( W_ALL );
6245 Undo_EndBrushList( &selected_brushes );
6249 void MainFrame::OnCurvePatchsquare(){
6250 Undo_Start( "square cylinder" );
6251 Undo_AddBrushList( &selected_brushes );
6253 Patch_BrushToMesh( false, false, false, true );
6254 Sys_UpdateWindows( W_ALL );
6256 Undo_EndBrushList( &selected_brushes );
6260 void MainFrame::OnCurvePatchendcap(){
6261 Undo_Start( "make end cap" );
6262 Undo_AddBrushList( &selected_brushes );
6263 Patch_BrushToMesh( false, false, true );
6264 Sys_UpdateWindows( W_ALL );
6265 Undo_EndBrushList( &selected_brushes );
6269 void MainFrame::OnCurvePatchbevel(){
6270 Undo_Start( "make bevel" );
6271 Undo_AddBrushList( &selected_brushes );
6272 Patch_BrushToMesh( false, true, false );
6273 Sys_UpdateWindows( W_ALL );
6274 Undo_EndBrushList( &selected_brushes );
6278 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel(){
6279 Undo_Start( "square bevel" );
6280 Undo_AddBrushList( &selected_brushes );
6282 Patch_BrushToMesh( false, true, false, true );
6283 Sys_UpdateWindows( W_ALL );
6285 Undo_EndBrushList( &selected_brushes );
6289 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap(){
6290 Undo_Start( "square endcap" );
6291 Undo_AddBrushList( &selected_brushes );
6293 Patch_BrushToMesh( false, false, true, true );
6294 Sys_UpdateWindows( W_ALL );
6296 Undo_EndBrushList( &selected_brushes );
6300 void MainFrame::OnCurvePatchcone(){
6301 Undo_Start( "make curve cone" );
6302 Undo_AddBrushList( &selected_brushes );
6303 Patch_BrushToMesh( true );
6304 Sys_UpdateWindows( W_ALL );
6305 Undo_EndBrushList( &selected_brushes );
6309 void MainFrame::OnCurveSimplepatchmesh(){
6310 Undo_Start( "make simpe patch mesh" );
6311 Undo_AddBrushList( &selected_brushes );
6313 Undo_EndBrushList( &selected_brushes );
6317 void MainFrame::OnCurveInsertInsertcolumn(){
6318 Undo_Start( "insert (2) columns" );
6319 Undo_AddBrushList( &selected_brushes );
6320 Patch_AdjustSelected( true, true, false );
6321 Sys_UpdateWindows( W_ALL );
6322 Undo_EndBrushList( &selected_brushes );
6326 void MainFrame::OnCurveInsertAddcolumn(){
6327 Undo_Start( "add (2) columns" );
6328 Undo_AddBrushList( &selected_brushes );
6329 Patch_AdjustSelected( true, true, true );
6330 Sys_UpdateWindows( W_ALL );
6331 Undo_EndBrushList( &selected_brushes );
6335 void MainFrame::OnCurveInsertInsertrow(){
6336 Undo_Start( "insert (2) rows" );
6337 Undo_AddBrushList( &selected_brushes );
6338 Patch_AdjustSelected( true, false, false );
6339 Sys_UpdateWindows( W_ALL );
6340 Undo_EndBrushList( &selected_brushes );
6344 void MainFrame::OnCurveInsertAddrow(){
6345 Undo_Start( "add (2) rows" );
6346 Undo_AddBrushList( &selected_brushes );
6347 Patch_AdjustSelected( true, false, true );
6348 Sys_UpdateWindows( W_ALL );
6349 Undo_EndBrushList( &selected_brushes );
6353 void MainFrame::OnCurveDeleteFirstcolumn(){
6354 Undo_Start( "delete first (2) columns" );
6355 Undo_AddBrushList( &selected_brushes );
6356 Patch_AdjustSelected( false, true, true );
6357 Sys_UpdateWindows( W_ALL );
6358 Undo_EndBrushList( &selected_brushes );
6362 void MainFrame::OnCurveDeleteLastcolumn(){
6363 Undo_Start( "delete last (2) columns" );
6364 Undo_AddBrushList( &selected_brushes );
6365 Patch_AdjustSelected( false, true, false );
6366 Sys_UpdateWindows( W_ALL );
6367 Undo_EndBrushList( &selected_brushes );
6371 void MainFrame::OnCurveDeleteFirstrow(){
6372 Undo_Start( "delete first (2) rows" );
6373 Undo_AddBrushList( &selected_brushes );
6374 Patch_AdjustSelected( false, false, true );
6375 Sys_UpdateWindows( W_ALL );
6376 Undo_EndBrushList( &selected_brushes );
6380 void MainFrame::OnCurveDeleteLastrow(){
6381 Undo_Start( "delete last (2) rows" );
6382 Undo_AddBrushList( &selected_brushes );
6383 Patch_AdjustSelected( false, false, false );
6384 Sys_UpdateWindows( W_ALL );
6385 Undo_EndBrushList( &selected_brushes );
6389 void MainFrame::OnCurveNegative(){
6390 Patch_ToggleInverted();
6391 //Sys_UpdateWindows(W_ALL);
6394 void MainFrame::OnCurveRedisperseRows(){
6395 Undo_Start( "redisperse rows" );
6396 Undo_AddBrushList( &selected_brushes );
6397 Patch_DisperseRows();
6398 Sys_UpdateWindows( W_ALL );
6399 Undo_EndBrushList( &selected_brushes );
6403 void MainFrame::OnCurveRedisperseIntermediateCols(){
6404 Undo_Start( "redisperse im cols" );
6405 Undo_AddBrushList( &selected_brushes );
6406 Patch_DisperseIntermediateColumns();
6407 Sys_UpdateWindows( W_ALL );
6408 Undo_EndBrushList( &selected_brushes );
6412 void MainFrame::OnCurveRedisperseIntermediateRows(){
6413 Undo_Start( "redisperse im rows" );
6414 Undo_AddBrushList( &selected_brushes );
6415 Patch_DisperseIntermediateRows();
6416 Sys_UpdateWindows( W_ALL );
6417 Undo_EndBrushList( &selected_brushes );
6421 void MainFrame::OnCurveMatrixTranspose(){
6423 Sys_UpdateWindows( W_ALL );
6426 void MainFrame::OnCurveCap(){
6428 Sys_UpdateWindows( W_ALL );
6431 void MainFrame::OnCurveCyclecap(){
6432 Patch_CycleCapSelected();
6433 Sys_UpdateWindows( W_ALL );
6436 void MainFrame::OnCurveOverlaySet(){
6437 Patch_SetOverlays();
6438 Sys_UpdateWindows( W_ALL );
6441 void MainFrame::OnCurveOverlayClear(){
6442 Patch_ClearOverlays();
6443 Sys_UpdateWindows( W_ALL );
6446 void MainFrame::OnCurveThicken(){
6447 Undo_Start( "curve thicken" );
6448 Undo_AddBrushList( &selected_brushes );
6450 Undo_EndBrushList( &selected_brushes );
6455 this can no longer be trigger manually from the menu
6456 happens only once at startup
6458 void MainFrame::OnPluginsRefresh(){
6463 // open the Q3Rad manual
6464 void MainFrame::OnHelp(){
6465 // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6467 help = g_strAppPath;
6468 help += "Q3Rad_Manual/index.htm";
6469 OpenURL( help.GetBuffer() );
6472 // FIXME: we'll go towards a unified help thing soon
6473 void MainFrame::OnHelpLinks(){
6475 link = g_strAppPath;
6476 link += "links.htm";
6477 OpenURL( link.GetBuffer() );
6480 void MainFrame::OnHelpBugreport(){
6481 OpenURL( "http://www.qeradiant.com/faq/fom-serve/cache/138.html" );
6484 void MainFrame::OnHelpCommandlist(){
6488 void MainFrame::OnHelpAbout(){
6492 void MainFrame::OnPopupSelection(){
6493 GtkWidget *menu, *item;
6494 const gchar *labels[] = { _( "Select Complete Tall" ), _( "Select Touching" ), _( "Select Partial Tall" ), _( "Select Inside" )};
6495 int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6496 ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6498 menu = gtk_menu_new();
6500 for ( int i = 0; i < 4; i++ )
6502 item = gtk_menu_item_new_with_label( labels[i] );
6503 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( HandleCommand ),
6504 GINT_TO_POINTER( ids[i] ) );
6505 gtk_widget_show( item );
6506 gtk_menu_append( GTK_MENU( menu ), item );
6509 gtk_menu_popup( GTK_MENU( menu ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6512 void MainFrame::OnViewChange(){
6514 //HandlePopup(this, IDR_POPUP_VIEW);
6517 void MainFrame::OnTexturesPopup(){
6518 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "render_quality_menu" );
6519 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6522 void MainFrame::ToggleCamera(){
6523 if ( m_bCamPreview ) {
6524 m_bCamPreview = false;
6527 m_bCamPreview = true;
6531 void MainFrame::OnViewCameraupdate(){
6532 Sys_UpdateWindows( W_CAMERA );
6535 void MainFrame::OnSelectMouserotate(){
6536 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mouserotate" ) );
6537 g_bIgnoreCommands++;
6540 if ( ActiveXY()->ClipMode() ) {
6543 if ( ActiveXY()->RotateMode() ) {
6544 // SetRotateMode(false) always works
6545 ActiveXY()->SetRotateMode( false );
6546 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6550 // may not work if no brush selected, see return value
6551 if ( ActiveXY()->SetRotateMode( true ) ) {
6552 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6555 // if MFC called, we need to set back to FALSE ourselves
6556 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6560 g_bIgnoreCommands--;
6563 void MainFrame::OnSelectMousescale(){
6564 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mousescale" ) );
6565 g_bIgnoreCommands++;
6568 if ( ActiveXY()->ClipMode() ) {
6571 if ( ActiveXY()->RotateMode() ) {
6572 // SetRotateMode(false) always works
6573 ActiveXY()->SetRotateMode( false );
6574 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6576 if ( ActiveXY()->ScaleMode() ) {
6577 ActiveXY()->SetScaleMode( false );
6578 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6582 ActiveXY()->SetScaleMode( true );
6583 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6586 g_bIgnoreCommands--;
6589 void MainFrame::OnScalelockx(){
6590 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockx" ) );
6591 g_bIgnoreCommands++;
6593 if ( g_nScaleHow & SCALE_X ) {
6594 g_nScaleHow ^= SCALE_X;
6595 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6599 g_nScaleHow |= SCALE_X;
6600 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6602 g_bIgnoreCommands--;
6605 void MainFrame::OnScalelocky(){
6606 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelocky" ) );
6607 g_bIgnoreCommands++;
6609 if ( g_nScaleHow & SCALE_Y ) {
6610 g_nScaleHow ^= SCALE_Y;
6611 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6615 g_nScaleHow |= SCALE_Y;
6616 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6618 g_bIgnoreCommands--;
6621 void MainFrame::OnScalelockz(){
6622 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockz" ) );
6623 g_bIgnoreCommands++;
6625 if ( g_nScaleHow & SCALE_Z ) {
6626 g_nScaleHow ^= SCALE_Z;
6627 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6631 g_nScaleHow |= SCALE_Z;
6632 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6634 g_bIgnoreCommands--;
6637 void MainFrame::OnDontselectcurve(){
6638 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
6639 g_bIgnoreCommands++;
6640 g_PrefsDlg.m_bSelectCurves ^= 1;
6641 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
6642 g_bIgnoreCommands--;
6645 void MainFrame::OnPatchToggleBox(){
6646 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
6647 g_bIgnoreCommands++;
6648 g_bPatchShowBounds ^= 1;
6649 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
6650 g_bIgnoreCommands--;
6651 Sys_UpdateWindows( W_ALL );
6654 void MainFrame::OnPatchWireframe(){
6655 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_wireframe" ) );
6656 g_bIgnoreCommands++;
6657 g_bPatchWireFrame ^= 1;
6658 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWireFrame ) ? TRUE : FALSE );
6659 g_bIgnoreCommands--;
6660 Sys_UpdateWindows( W_ALL );
6663 void MainFrame::OnPatchBend(){
6664 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
6665 g_bIgnoreCommands++;
6667 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
6668 g_bIgnoreCommands--;
6669 Sys_UpdateWindows( W_ALL );
6672 void MainFrame::OnPatchWeld(){
6673 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
6674 g_bIgnoreCommands++;
6676 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
6677 g_bIgnoreCommands--;
6678 Sys_UpdateWindows( W_ALL );
6681 void MainFrame::OnPatchDrilldown(){
6682 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
6683 g_bIgnoreCommands++;
6684 g_bPatchDrillDown ^= 1;
6685 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
6686 g_bIgnoreCommands--;
6687 Sys_UpdateWindows( W_ALL );
6690 void MainFrame::OnShowEntities(){
6691 gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "view_entitiesas_menu" ); // use pointer to existing menu object
6692 gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6695 void MainFrame::OnDropGroupName(){
6697 char* name = DoNameDlg ("Name Selection");
6702 Sys_UpdateWindows (W_ALL);
6708 void MainFrame::OnDropGroupNewgroup(){
6712 void MainFrame::OnDropGroupRemove(){
6714 Select_AddToGroup("World");
6715 Sys_UpdateWindows (W_ALL);
6719 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6720 void MainFrame::OnFaceFit(){
6724 void MainFrame::OnDontselectmodel(){
6725 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
6726 g_bIgnoreCommands++;
6727 g_PrefsDlg.m_bSelectModels ^= 1;
6728 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
6729 g_bIgnoreCommands--;
6732 void MainFrame::OnViewTexture(){
6733 if ( FloatingGroupDialog() ) { // QE4 style
6734 if ( inspector_mode == W_TEXTURE ) {
6735 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
6736 widget_delete_hide( g_qeglobals_gui.d_entity );
6739 gtk_widget_show( g_qeglobals_gui.d_entity );
6744 gtk_widget_show( g_qeglobals_gui.d_entity );
6745 SetInspectorMode( W_TEXTURE );
6750 void MainFrame::OnPatchInspector(){
6751 TogglePatchInspector();
6754 void MainFrame::OnCurveNegativeTextureX(){
6755 Patch_InvertTexture( false );
6756 //Sys_UpdateWindows(W_ALL);
6759 void MainFrame::OnCurveNegativeTextureY(){
6760 Patch_InvertTexture( true );
6761 //Sys_UpdateWindows(W_ALL);
6764 void MainFrame::OnCurveInsertcolumn(){
6765 if ( &selected_brushes == selected_brushes.next ) {
6768 Undo_Start( "insert colum" );
6769 Undo_AddBrushList( &selected_brushes );
6770 //Patch_AdjustSelectedRowCols(0, 2);
6771 Patch_AdjustSelected( true, true, true );
6772 Sys_UpdateWindows( W_ALL );
6773 Undo_EndBrushList( &selected_brushes );
6777 void MainFrame::OnCurveInsertrow(){
6778 if ( &selected_brushes == selected_brushes.next ) {
6781 Undo_Start( "insert row" );
6782 Undo_AddBrushList( &selected_brushes );
6783 //Patch_AdjustSelectedRowCols(2, 0);
6784 Patch_AdjustSelected( true, false, true );
6785 Sys_UpdateWindows( W_ALL );
6786 Undo_EndBrushList( &selected_brushes );
6790 void MainFrame::OnCurveDeletecolumn(){
6791 if ( &selected_brushes == selected_brushes.next ) {
6794 Undo_Start( "delete column" );
6795 Undo_AddBrushList( &selected_brushes );
6796 Patch_AdjustSelected( false, true, true );
6797 Sys_UpdateWindows( W_ALL );
6798 Undo_EndBrushList( &selected_brushes );
6802 void MainFrame::OnCurveDeleterow(){
6803 if ( &selected_brushes == selected_brushes.next ) {
6806 Undo_Start( "delete row" );
6807 Undo_AddBrushList( &selected_brushes );
6808 Patch_AdjustSelected( false, false, true );
6809 Sys_UpdateWindows( W_ALL );
6810 Undo_EndBrushList( &selected_brushes );
6814 void MainFrame::OnPatchTab(){
6815 if ( g_bPatchBendMode ) {
6816 Patch_BendHandleTAB();
6818 // else if (g_bPatchInsertMode)
6819 // Patch_InsDelHandleTAB();
6822 // check to see if the selected brush is part of a func group
6823 // if it is, deselect everything and reselect the next brush
6825 brush_t *b2, *b = selected_brushes.next;
6827 if ( b != &selected_brushes ) {
6828 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6831 for ( b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext )
6838 if ( b2 == &e->brushes ) {
6842 Select_Brush( b2, false );
6843 Sys_UpdateWindows( W_ALL );
6849 void MainFrame::OnSelectFuncGroup(){
6850 // check to see if the selected brush is part of a func group
6851 // if it is, deselect everything and reselect the next brush
6853 brush_t *b = selected_brushes.next;
6855 if ( b != &selected_brushes ) {
6856 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6858 Select_SelectGroup( e );
6863 void MainFrame::OnCameraForward( bool keydown ){
6864 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6866 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6867 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6868 Sys_UpdateWindows( nUpdate );
6873 m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
6876 m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
6881 void MainFrame::OnCameraBack( bool keydown ){
6882 if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6884 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6885 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6886 Sys_UpdateWindows( nUpdate );
6891 m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
6894 m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
6899 void MainFrame::OnCameraLeft( bool keydown ){
6901 if ( m_pCamWnd->m_bFreeMove ) {
6902 OnCameraStrafeleft( keydown );
6907 if ( g_PrefsDlg.m_bCamDiscrete ) {
6909 m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
6910 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6911 Sys_UpdateWindows( nUpdate );
6916 m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
6919 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
6924 void MainFrame::OnCameraRight( bool keydown ){
6926 if ( m_pCamWnd->m_bFreeMove ) {
6927 OnCameraStraferight( keydown );
6932 if ( g_PrefsDlg.m_bCamDiscrete ) {
6934 m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
6935 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6936 Sys_UpdateWindows( nUpdate );
6941 m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
6944 m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
6949 void MainFrame::OnCameraUp(){
6950 m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
6951 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6952 Sys_UpdateWindows( nUpdate );
6955 void MainFrame::OnCameraDown(){
6956 m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
6957 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6958 Sys_UpdateWindows( nUpdate );
6961 void MainFrame::OnCameraAngleup(){
6962 m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
6963 if ( m_pCamWnd->Camera()->angles[0] > 85 ) {
6964 m_pCamWnd->Camera()->angles[0] = 85;
6966 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6969 void MainFrame::OnCameraAngledown(){
6970 m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
6971 if ( m_pCamWnd->Camera()->angles[0] < -85 ) {
6972 m_pCamWnd->Camera()->angles[0] = -85;
6974 Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6977 void MainFrame::OnCameraStrafeleft( bool keydown ){
6978 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6980 if ( !m_pCamWnd->m_bFreeMove ) {
6982 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6983 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6984 Sys_UpdateWindows( nUpdate );
6991 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
6994 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
6998 void MainFrame::OnCameraStraferight( bool keydown ){
6999 // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7001 if ( !m_pCamWnd->m_bFreeMove ) {
7003 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
7004 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
7005 Sys_UpdateWindows( nUpdate );
7012 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7015 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7019 void MainFrame::OnGridToggle(){
7020 g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7021 Sys_UpdateWindows( W_XY | W_Z );
7024 void MainFrame::OnViewCrosshair(){
7026 Sys_UpdateWindows( W_XY );
7029 void MainFrame::OnSelectionTextureRotateclock(){
7030 Select_RotateTexture( abs( g_PrefsDlg.m_nRotation ) );
7033 void MainFrame::OnSelectionTextureRotatecounter(){
7034 Select_RotateTexture( -abs( g_PrefsDlg.m_nRotation ) );
7037 void MainFrame::OnSelectionTextureScaleup(){
7038 Select_ScaleTexture( 0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7041 void MainFrame::OnSelectionTextureScaledown(){
7042 Select_ScaleTexture( 0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7045 void MainFrame::OnSelectionTextureScaleLeft(){
7046 Select_ScaleTexture( -g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7049 void MainFrame::OnSelectionTextureScaleRight(){
7050 Select_ScaleTexture( g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7053 void MainFrame::OnSelectionTextureShiftleft(){
7054 Select_ShiftTexture( (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7057 void MainFrame::OnSelectionTextureShiftright(){
7058 Select_ShiftTexture( (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7061 void MainFrame::OnSelectionTextureShiftup(){
7062 Select_ShiftTexture( 0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7065 void MainFrame::OnSelectionTextureShiftdown(){
7066 Select_ShiftTexture( 0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7069 void MainFrame::OnGridPrev(){
7071 if ( g_qeglobals.d_gridsize == 1 ) {
7072 g_qeglobals.d_gridsize = 0.5;
7073 g_qeglobals.d_bSmallGrid = true;
7074 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7076 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7077 g_qeglobals.d_gridsize = 0.25;
7078 g_qeglobals.d_bSmallGrid = true;
7079 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_025" ) );
7081 else if ( g_qeglobals.d_gridsize > 1 ) {
7082 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7083 g_qeglobals.d_bSmallGrid = false;
7085 switch ( (int)g_qeglobals.d_gridsize )
7087 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7088 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7089 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7090 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7091 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7092 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7093 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7094 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7095 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7103 // SnapTToGrid option: need to check everywhere the grid size is changed
7104 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7105 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7110 g_bIgnoreCommands++;
7111 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7112 g_bIgnoreCommands--;
7114 Sys_UpdateWindows( W_XY | W_Z );
7117 void MainFrame::OnGridNext(){
7119 if ( g_qeglobals.d_gridsize == 0.25 ) {
7120 g_qeglobals.d_gridsize = 0.5;
7121 g_qeglobals.d_bSmallGrid = true;
7122 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7124 else if ( g_qeglobals.d_gridsize == 0.5 ) {
7125 g_qeglobals.d_gridsize = 1;
7126 g_qeglobals.d_bSmallGrid = false;
7127 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) );
7129 else if ( g_qeglobals.d_gridsize < 256 ) {
7130 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7131 g_qeglobals.d_bSmallGrid = false;
7133 switch ( (int)g_qeglobals.d_gridsize )
7135 case 1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7136 case 2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7137 case 4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7138 case 8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7139 case 16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7140 case 32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7141 case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7142 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7143 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7144 default: item = NULL;
7152 // SnapTToGrid option: need to check everywhere the grid size is changed
7153 // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7154 if ( g_PrefsDlg.m_bSnapTToGrid ) {
7159 g_bIgnoreCommands++;
7160 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7161 g_bIgnoreCommands--;
7163 Sys_UpdateWindows( W_XY | W_Z );
7166 void MainFrame::OnSelectionMovedown(){
7167 if ( &selected_brushes == selected_brushes.next ) {
7170 Undo_Start( "move down" );
7171 Undo_AddBrushList( &selected_brushes );
7174 vAmt[0] = vAmt[1] = 0.0;
7175 vAmt[2] = -g_qeglobals.d_gridsize;
7176 Select_Move( vAmt );
7177 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7179 Undo_EndBrushList( &selected_brushes );
7183 void MainFrame::OnSelectionMoveup(){
7184 if ( &selected_brushes == selected_brushes.next ) {
7187 Undo_Start( "move up" );
7188 Undo_AddBrushList( &selected_brushes );
7191 vAmt[0] = vAmt[1] = 0.0;
7192 vAmt[2] = g_qeglobals.d_gridsize;
7193 Select_Move( vAmt );
7194 Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7196 Undo_EndBrushList( &selected_brushes );
7200 void MainFrame::OnSelectionPrint(){
7201 for ( brush_t* b = selected_brushes.next ; b != &selected_brushes ; b = b->next )
7205 void MainFrame::OnSelectionTogglesizepaint(){
7206 g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7207 Sys_UpdateWindows( W_XY );
7210 void MainFrame::OnPatchNaturalize(){
7211 Patch_NaturalizeSelected();
7212 Sys_UpdateWindows( W_ALL );
7215 void MainFrame::OnSnapToGrid(){
7216 if ( &selected_brushes == selected_brushes.next ) {
7219 Undo_Start( "snap selection to grid" );
7220 Undo_AddBrushList( &selected_brushes );
7221 //Select_SnapToGrid();
7222 for ( brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next )
7224 if ( pb->patchBrush ) {
7225 Patch_SnapToGrid( pb->pPatch );
7228 Brush_SnapToGrid( pb );
7231 Sys_UpdateWindows( W_ALL );
7232 Undo_EndBrushList( &selected_brushes );
7236 void MainFrame::OnSelectAll(){
7240 void MainFrame::OnSelectionInvert(){
7242 Sys_UpdateWindows( W_XY | W_Z | W_CAMERA );
7246 void PerformFiltering(){
7251 for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7252 brush->bFiltered = FilterBrush( brush );
7254 for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7255 brush->bFiltered = FilterBrush( brush );
7258 void MainFrame::OnFilterAreaportals(){
7259 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
7260 g_bIgnoreCommands++;
7261 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS ) & EXCLUDE_AREAPORTALS ) {
7262 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7265 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7267 g_bIgnoreCommands--;
7269 Sys_UpdateWindows( W_XY | W_CAMERA );
7272 void MainFrame::OnFilterCaulk(){
7273 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
7274 g_bIgnoreCommands++;
7275 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK ) & EXCLUDE_CAULK ) {
7276 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7279 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7281 g_bIgnoreCommands--;
7283 Sys_UpdateWindows( W_XY | W_CAMERA );
7286 void MainFrame::OnFilterClips(){
7287 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
7288 g_bIgnoreCommands++;
7289 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) {
7290 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7293 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7295 g_bIgnoreCommands--;
7297 Sys_UpdateWindows( W_XY | W_CAMERA );
7300 void MainFrame::OnFilterBotClips(){
7301 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
7302 g_bIgnoreCommands++;
7303 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP ) & EXCLUDE_BOTCLIP ) {
7304 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7307 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7309 g_bIgnoreCommands--;
7311 Sys_UpdateWindows( W_XY | W_CAMERA );
7314 void MainFrame::OnFilterStructural(){
7315 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
7316 g_bIgnoreCommands++;
7317 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL ) & EXCLUDE_STRUCTURAL ) {
7318 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7321 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7323 g_bIgnoreCommands--;
7325 Sys_UpdateWindows( W_XY | W_CAMERA );
7328 void MainFrame::OnFilterDetails(){
7329 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
7330 g_bIgnoreCommands++;
7331 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS ) & EXCLUDE_DETAILS ) {
7332 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7335 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7337 g_bIgnoreCommands--;
7339 Sys_UpdateWindows( W_XY | W_CAMERA );
7342 void MainFrame::OnFilterEntities(){
7343 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
7344 g_bIgnoreCommands++;
7345 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) {
7346 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7349 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7351 g_bIgnoreCommands--;
7353 Sys_UpdateWindows( W_XY | W_CAMERA );
7356 void MainFrame::OnFilterHintsskips(){
7357 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
7358 g_bIgnoreCommands++;
7359 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS ) & EXCLUDE_HINTSSKIPS ) {
7360 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7363 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7365 g_bIgnoreCommands--;
7367 Sys_UpdateWindows( W_XY | W_CAMERA );
7370 void MainFrame::OnFilterLights(){
7371 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
7372 g_bIgnoreCommands++;
7373 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) {
7374 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7377 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7379 g_bIgnoreCommands--;
7381 Sys_UpdateWindows( W_XY | W_CAMERA );
7384 void MainFrame::OnFilterLiquids(){
7385 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
7386 g_bIgnoreCommands++;
7387 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS ) & EXCLUDE_LIQUIDS ) {
7388 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7391 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7393 g_bIgnoreCommands--;
7395 Sys_UpdateWindows( W_XY | W_CAMERA );
7398 void MainFrame::OnFilterModels(){
7399 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
7400 g_bIgnoreCommands++;
7401 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS ) & EXCLUDE_MODELS ) {
7402 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7405 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7407 g_bIgnoreCommands--;
7409 Sys_UpdateWindows( W_XY | W_CAMERA );
7412 void MainFrame::OnFilterPatches(){
7413 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
7414 g_bIgnoreCommands++;
7415 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES ) & EXCLUDE_CURVES ) {
7416 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7419 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7421 g_bIgnoreCommands--;
7423 Sys_UpdateWindows( W_XY | W_CAMERA );
7426 void MainFrame::OnFilterPaths(){
7427 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
7428 g_bIgnoreCommands++;
7429 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) {
7430 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7433 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7435 g_bIgnoreCommands--;
7437 Sys_UpdateWindows( W_XY | W_CAMERA );
7440 void MainFrame::OnFilterClusterportals(){
7441 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
7442 g_bIgnoreCommands++;
7443 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS ) & EXCLUDE_CLUSTERPORTALS ) {
7444 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7447 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7449 g_bIgnoreCommands--;
7451 Sys_UpdateWindows( W_XY | W_CAMERA );
7454 void MainFrame::OnFilterLightgrid(){
7455 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
7456 g_bIgnoreCommands++;
7457 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID ) & EXCLUDE_LIGHTGRID ) {
7458 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7461 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7463 g_bIgnoreCommands--;
7465 Sys_UpdateWindows( W_XY | W_CAMERA );
7468 void MainFrame::OnFilterTranslucent(){
7469 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
7470 g_bIgnoreCommands++;
7471 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT ) & EXCLUDE_TRANSLUCENT ) {
7472 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7475 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7477 g_bIgnoreCommands--;
7479 Sys_UpdateWindows( W_XY | W_CAMERA );
7482 void MainFrame::OnFilterTriggers(){
7483 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
7484 g_bIgnoreCommands++;
7485 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS ) & EXCLUDE_TRIGGERS ) {
7486 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7489 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7491 g_bIgnoreCommands--;
7493 Sys_UpdateWindows( W_XY | W_CAMERA );
7496 void MainFrame::OnFilterWorld(){
7497 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
7498 g_bIgnoreCommands++;
7499 if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) {
7500 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7503 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7505 g_bIgnoreCommands--;
7507 Sys_UpdateWindows( W_XY | W_CAMERA );
7517 // =============================================================================
7518 // leo: Unused functions, not called anywhere from the code (need to check)
7520 void MainFrame::OnViewConsole(){
7521 if ( FloatingGroupDialog() ) { // QE4 style
7522 if ( inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating ) { // are we in console mode already?
7523 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
7524 widget_delete_hide( g_qeglobals_gui.d_entity );
7527 gtk_widget_show( g_qeglobals_gui.d_entity );
7532 gtk_widget_show( g_qeglobals_gui.d_entity );
7533 SetInspectorMode( W_CONSOLE );
7538 void MainFrame::OnCurveFreeze(){
7542 void MainFrame::OnCurveUnFreeze(){
7543 Patch_UnFreeze( false );
7546 void MainFrame::OnCurveUnFreezeAll(){
7547 Patch_UnFreeze( true );
7550 void MainFrame::OnSelectReselect(){
7554 void MainFrame::OnSelectionTextureFit(){
7555 // TODO: Add your command handler code here
7558 void MainFrame::OnPatchEnter(){
7562 void MainFrame::OnDropGroupAddtoWorld(){
7564 Select_AddToGroup("World");
7565 Sys_UpdateWindows (W_ALL);