X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fmainframe.cpp;h=69ae9652a83946ddb30e44316e78bfbee0361d36;hb=06d25930d81ee46fcf1f25ccacf23bf4109d6ce1;hp=7860a5b98e0f44b7aab5e899be91aff9b532caeb;hpb=f472e6f0e8066e62cf3e159287bb07de97d2e59d;p=xonotic%2Fnetradiant.git diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 7860a5b9..69ae9652 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -102,12 +102,24 @@ #include "texwindow.h" #include "filterbar.h" +#if GDEF_OS_WINDOWS +#include +#else +#include +#endif + +#ifdef WORKAROUND_WINDOWS_GTK2_GLWIDGET +/* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ +#define WORKAROUND_GOBJECT_SET_GLWIDGET(window, widget) g_object_set_data( G_OBJECT( window ), "glwidget", G_OBJECT( widget ) ) +#else +#define WORKAROUND_GOBJECT_SET_GLWIDGET(window, widget) +#endif + #define GARUX_DISABLE_GTKTHEME #ifndef GARUX_DISABLE_GTKTHEME #include "gtktheme.h" #endif - struct layout_globals_t { WindowPosition m_position; @@ -131,7 +143,7 @@ struct layout_globals_t }; layout_globals_t g_layout_globals; -glwindow_globals_t g_glwindow_globals; +//glwindow_globals_t g_glwindow_globals; // VFS @@ -161,6 +173,8 @@ void VFS_Refresh(){ RefreshReferences(); // also refresh texture browser TextureBrowser_RefreshShaders(); + // also show textures (all or common) + TextureBrowser_ShowStartupShaders( GlobalTextureBrowser() ); } void VFS_Restart(){ @@ -219,9 +233,7 @@ void HomePaths_Realise(){ } path.clear(); path << DirectoryCleaned( g_get_home_dir() ) << prefix << "/"; -#endif - -#if GDEF_OS_WINDOWS +#elif GDEF_OS_WINDOWS TCHAR mydocsdir[MAX_PATH + 1]; wchar_t *mydocsdirw; HMODULE shfolder = LoadLibrary( "shfolder.dll" ); @@ -258,13 +270,19 @@ void HomePaths_Realise(){ break; } } -#endif - -#if GDEF_OS_POSIX +#elif GDEF_OS_XDG + path.clear(); + path << DirectoryCleaned( g_get_user_data_dir() ) << ( prefix + 1 ) << "/"; + if ( file_exists( path.c_str() ) && file_is_directory( path.c_str() ) ) { + g_qeglobals.m_userEnginePath = path.c_str(); + break; + } + else { path.clear(); path << DirectoryCleaned( g_get_home_dir() ) << prefix << "/"; g_qeglobals.m_userEnginePath = path.c_str(); break; + } #endif } @@ -440,14 +458,32 @@ void setPakPath( int num, const char* path ){ } -// App Path +// executable file path (full path) +CopiedString g_strAppFilePath; + +// directory paths +CopiedString g_strAppPath; +CopiedString g_strLibPath; +CopiedString g_strDataPath; -CopiedString g_strAppPath; ///< holds the full path of the executable +const char* AppFilePath_get(){ + return g_strAppFilePath.c_str(); +} const char* AppPath_get(){ return g_strAppPath.c_str(); } +const char *LibPath_get() +{ + return g_strLibPath.c_str(); +} + +const char *DataPath_get() +{ + return g_strDataPath.c_str(); +} + /// the path to the local rc-dir const char* LocalRcPath_get( void ){ static CopiedString rc_path; @@ -546,39 +582,28 @@ struct PakPath4 { bool g_disableEnginePath = false; bool g_disableHomePath = false; -void Paths_constructPreferences( PreferencesPage& page ){ +void Paths_constructBasicPreferences( PreferencesPage& page ) { page.appendPathEntry( "Engine Path", true, make_property(g_strEnginePath) ); +} - page.appendCheckBox( - "", "Do not use Engine Path", - g_disableEnginePath - ); +void Paths_constructPreferences( PreferencesPage& page ){ + Paths_constructBasicPreferences( page ); - page.appendCheckBox( - "", "Do not use Home Path", - g_disableHomePath - ); + page.appendSpacer( 4 ); + page.appendLabel( "", "Advanced options" ); + page.appendCheckBox( "", "Do not use Engine Path", g_disableEnginePath ); + page.appendCheckBox( "", "Do not use Home Path", g_disableHomePath ); - for ( int i = 0; i < g_pakPathCount; i++ ) { - std::string label = "Pak Path " + std::to_string(i); - switch (i) { - case 0: - page.appendPathEntry( label.c_str(), true, make_property( g_strPakPath[i] ) ); - break; - case 1: - page.appendPathEntry( label.c_str(), true, make_property( g_strPakPath[i] ) ); - break; - case 2: - page.appendPathEntry( label.c_str(), true, make_property( g_strPakPath[i] ) ); - break; - case 3: - page.appendPathEntry( label.c_str(), true, make_property( g_strPakPath[i] ) ); - break; - case 4: - page.appendPathEntry( label.c_str(), true, make_property( g_strPakPath[i] ) ); - break; -} - } + page.appendSpacer( 4 ); + page.appendLabel( "", "Only a very few games support Pak Paths," ); + page.appendLabel( "", "if you don't know what it is, leave this blank." ); + + const char *label = "Pak Path "; + page.appendPathEntry( label, true, make_property( g_strPakPath[0] ) ); + page.appendPathEntry( label, true, make_property( g_strPakPath[1] ) ); + page.appendPathEntry( label, true, make_property( g_strPakPath[2] ) ); + page.appendPathEntry( label, true, make_property( g_strPakPath[3] ) ); + page.appendPathEntry( label, true, make_property( g_strPakPath[4] ) ); } void Paths_constructPage( PreferenceGroup& group ){ @@ -595,14 +620,14 @@ class PathsDialog : public Dialog { public: ui::Window BuildDialog(){ - auto frame = create_dialog_frame( "Path settings", ui::Shadow::ETCHED_IN ); + auto frame = create_dialog_frame( "Path Settings", ui::Shadow::ETCHED_IN ); auto vbox2 = create_dialog_vbox( 0, 4 ); frame.add(vbox2); { - PreferencesPage preferencesPage( *this, vbox2 ); - Paths_constructPreferences( preferencesPage ); + PreferencesPage page( *this, vbox2 ); + Paths_constructBasicPreferences( page ); } return ui::Window(create_simple_modal_dialog_window( "Engine Path Not Found", m_modal, frame )); @@ -761,7 +786,7 @@ void Radiant_detachGameToolsPathObserver( ModuleObserver& observer ){ void Radiant_Initialise(){ GlobalModuleServer_Initialise(); - Radiant_loadModulesFromRoot( AppPath_get() ); + Radiant_loadModulesFromRoot( LibPath_get() ); Preferences_Load(); @@ -790,7 +815,7 @@ void Radiant_Shutdown(){ } void Exit(){ - if ( ConfirmModified( "Exit Radiant" ) ) { + if ( ConfirmModified( "Exit " RADIANT_NAME ) ) { gtk_main_quit(); } } @@ -949,6 +974,53 @@ void ColorScheme_Ydnar(){ XY_UpdateAllWindows(); } +/* color scheme to fit the GTK Adwaita Dark theme */ +void ColorScheme_AdwaitaDark() +{ + // SI_Colors0 + // GlobalTextureBrowser().color_textureback + TextureBrowser_setBackgroundColour(GlobalTextureBrowser(), Vector3(0.25f, 0.25f, 0.25f)); + + // SI_Colors4 + g_camwindow_globals.color_cameraback = Vector3(0.25f, 0.25f, 0.25f); + // SI_Colors12 + g_camwindow_globals.color_selbrushes3d = Vector3(1.0f, 0.0f, 0.0f); + CamWnd_Update(*g_pParentWnd->GetCamWnd()); + + // SI_Colors1 + g_xywindow_globals.color_gridback = Vector3(0.25f, 0.25f, 0.25f); + // SI_Colors2 + g_xywindow_globals.color_gridminor = Vector3(0.21f, 0.23f, 0.23f); + // SI_Colors3 + g_xywindow_globals.color_gridmajor = Vector3(0.14f, 0.15f, 0.15f); + // SI_Colors14 + g_xywindow_globals.color_gridmajor_alt = Vector3(1.0f, 0.0f, 0.0f); + // SI_Colors6 + g_xywindow_globals.color_gridblock = Vector3(1.0f, 1.0f, 1.0f); + // SI_Colors7 + g_xywindow_globals.color_gridtext = Vector3(0.0f, 0.0f, 0.0f); + // ?? + g_xywindow_globals.color_selbrushes = Vector3(1.0f, 0.0f, 0.0f); + // ?? + g_xywindow_globals.color_clipper = Vector3(0.0f, 0.0f, 1.0f); + // SI_Colors8 + g_xywindow_globals.color_brushes = Vector3(0.73f, 0.73f, 0.73f); + + // SI_AxisColors0 + g_xywindow_globals.AxisColorX = Vector3(1.0f, 0.0f, 0.0f); + // SI_AxisColors1 + g_xywindow_globals.AxisColorY = Vector3(0.0f, 1.0f, 0.0f); + // SI_AxisColors2 + g_xywindow_globals.AxisColorZ = Vector3(0.0f, 0.0f, 1.0f); + SetWorldspawnColour(g_xywindow_globals.color_brushes); + // ?? + g_xywindow_globals.color_viewname = Vector3(0.5f, 0.0f, 0.75f); + XY_UpdateAllWindows(); + + // SI_Colors5 + // g_entity_globals.color_entity = Vector3(0.0f, 0.0f, 0.0f); +} + typedef Callback GetColourCallback; typedef Callback SetColourCallback; @@ -1062,6 +1134,7 @@ ui::MenuItem create_colours_menu(){ create_menu_item_with_mnemonic( menu_3, "Q3Radiant Original", "ColorSchemeQER" ); create_menu_item_with_mnemonic( menu_3, "Black and Green", "ColorSchemeBlackAndGreen" ); create_menu_item_with_mnemonic( menu_3, "Maya/Max/Lightwave Emulation", "ColorSchemeYdnar" ); + create_menu_item_with_mnemonic(menu_3, "Adwaita Dark", "ColorSchemeAdwaitaDark"); #ifndef GARUX_DISABLE_GTKTHEME create_menu_item_with_mnemonic( menu_in_menu, "GTK Theme...", "gtkThemeDlg" ); @@ -1758,9 +1831,11 @@ void Selection_SnapToGrid(){ static gint qe_every_second( gpointer data ){ - GdkModifierType mask; + if (g_pParentWnd == nullptr) + return TRUE; - gdk_window_get_pointer( 0, 0, 0, &mask ); + GdkModifierType mask; + gdk_window_get_pointer( gtk_widget_get_window(g_pParentWnd->m_window), nullptr, nullptr, &mask ); if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) { QE_CheckAutoSave(); @@ -1872,15 +1947,18 @@ void ScreenUpdates_Disable( const char* message, const char* title ){ bool isActiveApp = MainFrame_isActiveApp(); g_wait = create_wait_dialog( title, message ); - gtk_grab_add( g_wait.m_window ); if ( isActiveApp ) { g_wait.m_window.show(); + gtk_grab_add( g_wait.m_window ); ScreenUpdates_process(); } } else if ( g_wait.m_window.visible() ) { g_wait.m_label.text(message); + if ( GTK_IS_WINDOW(g_wait.m_window) ) { + gtk_grab_add(g_wait.m_window); + } ScreenUpdates_process(); } g_wait_stack.push_back( message ); @@ -2046,20 +2124,6 @@ ui::MenuItem create_edit_menu(){ return edit_menu_item; } -void fill_view_xy_top_menu( ui::Menu menu ){ - create_check_menu_item_with_mnemonic( menu, "XY (Top) View", "ToggleView" ); -} - - -void fill_view_yz_side_menu( ui::Menu menu ){ - create_check_menu_item_with_mnemonic( menu, "YZ (Side) View", "ToggleSideView" ); -} - - -void fill_view_xz_front_menu( ui::Menu menu ){ - create_check_menu_item_with_mnemonic( menu, "XZ (Front) View", "ToggleFrontView" ); -} - ui::Widget g_toggle_z_item{ui::null}; ui::Widget g_toggle_console_item{ui::null}; @@ -2075,13 +2139,13 @@ ui::MenuItem create_view_menu( MainFrame::EViewStyle style ){ } if ( style == MainFrame::eFloating ) { - fill_view_camera_menu( menu ); - fill_view_xy_top_menu( menu ); - fill_view_yz_side_menu( menu ); - fill_view_xz_front_menu( menu ); + create_check_menu_item_with_mnemonic( menu, "Camera View", "ToggleCamera" ); + create_check_menu_item_with_mnemonic( menu, "XY (Top) View", "ToggleView" ); + create_check_menu_item_with_mnemonic( menu, "XZ (Front) View", "ToggleFrontView" ); + create_check_menu_item_with_mnemonic( menu, "YZ (Side) View", "ToggleSideView" ); } if ( style == MainFrame::eFloating || style == MainFrame::eSplit ) { - create_menu_item_with_mnemonic( menu, "Console View", "ToggleConsole" ); + create_menu_item_with_mnemonic( menu, "Console", "ToggleConsole" ); create_menu_item_with_mnemonic( menu, "Texture Browser", "ToggleTextures" ); create_menu_item_with_mnemonic( menu, "Entity Inspector", "ToggleEntityInspector" ); } @@ -2099,6 +2163,7 @@ ui::MenuItem create_view_menu( MainFrame::EViewStyle style ){ if ( g_Layout_enableDetachableMenus.m_value ) { menu_tearoff( camera_menu ); } + create_menu_item_with_mnemonic( camera_menu, "Focus on Selected", "CameraFocusOnSelected" ); create_menu_item_with_mnemonic( camera_menu, "_Center", "CenterView" ); create_menu_item_with_mnemonic( camera_menu, "_Up Floor", "UpFloor" ); create_menu_item_with_mnemonic( camera_menu, "_Down Floor", "DownFloor" ); @@ -2106,11 +2171,15 @@ ui::MenuItem create_view_menu( MainFrame::EViewStyle style ){ create_menu_item_with_mnemonic( camera_menu, "Far Clip Plane In", "CubicClipZoomIn" ); create_menu_item_with_mnemonic( camera_menu, "Far Clip Plane Out", "CubicClipZoomOut" ); menu_separator( camera_menu ); + create_menu_item_with_mnemonic( camera_menu, "Decrease FOV", "FOVDec" ); + create_menu_item_with_mnemonic( camera_menu, "Increase FOV", "FOVInc" ); + menu_separator( camera_menu ); create_menu_item_with_mnemonic( camera_menu, "Next leak spot", "NextLeakSpot" ); create_menu_item_with_mnemonic( camera_menu, "Previous leak spot", "PrevLeakSpot" ); - menu_separator( camera_menu ); - create_menu_item_with_mnemonic( camera_menu, "Look Through Selected", "LookThroughSelected" ); - create_menu_item_with_mnemonic( camera_menu, "Look Through Camera", "LookThroughCamera" ); + //cameramodel is not implemented in instances, thus useless +// menu_separator( camera_menu ); +// create_menu_item_with_mnemonic( camera_menu, "Look Through Selected", "LookThroughSelected" ); +// create_menu_item_with_mnemonic( camera_menu, "Look Through Camera", "LookThroughCamera" ); } menu_separator( menu ); { @@ -2121,10 +2190,13 @@ ui::MenuItem create_view_menu( MainFrame::EViewStyle style ){ if ( style == MainFrame::eRegular || style == MainFrame::eRegularLeft || style == MainFrame::eFloating ) { create_menu_item_with_mnemonic( orthographic_menu, "_Next (XY, YZ, XY)", "NextView" ); create_menu_item_with_mnemonic( orthographic_menu, "XY (Top)", "ViewTop" ); - create_menu_item_with_mnemonic( orthographic_menu, "YZ", "ViewSide" ); - create_menu_item_with_mnemonic( orthographic_menu, "XZ", "ViewFront" ); + create_menu_item_with_mnemonic( orthographic_menu, "XZ (Front)", "ViewFront" ); + create_menu_item_with_mnemonic( orthographic_menu, "YZ (Side)", "ViewSide" ); menu_separator( orthographic_menu ); } + else{ + create_menu_item_with_mnemonic( orthographic_menu, "Center on Selected", "NextView" ); + } create_menu_item_with_mnemonic( orthographic_menu, "Center on Selected", "CenterXYView" ); menu_separator( orthographic_menu ); @@ -2218,6 +2290,9 @@ ui::MenuItem create_selection_menu(){ create_menu_item_with_mnemonic( menu_in_menu, "Nudge Right", "SelectNudgeRight" ); create_menu_item_with_mnemonic( menu_in_menu, "Nudge Up", "SelectNudgeUp" ); create_menu_item_with_mnemonic( menu_in_menu, "Nudge Down", "SelectNudgeDown" ); + menu_separator( menu_in_menu ); + create_menu_item_with_mnemonic( menu_in_menu, "Nudge +Z", "MoveSelectionUP" ); + create_menu_item_with_mnemonic( menu_in_menu, "Nudge -Z", "MoveSelectionDOWN" ); } { auto menu_in_menu = create_sub_menu_with_mnemonic( menu, "Rotate" ); @@ -2227,6 +2302,9 @@ ui::MenuItem create_selection_menu(){ create_menu_item_with_mnemonic( menu_in_menu, "Rotate X", "RotateSelectionX" ); create_menu_item_with_mnemonic( menu_in_menu, "Rotate Y", "RotateSelectionY" ); create_menu_item_with_mnemonic( menu_in_menu, "Rotate Z", "RotateSelectionZ" ); + menu_separator( menu_in_menu ); + create_menu_item_with_mnemonic( menu_in_menu, "Rotate Clockwise", "RotateSelectionClockwise" ); + create_menu_item_with_mnemonic( menu_in_menu, "Rotate Anticlockwise", "RotateSelectionAnticlockwise" ); } { auto menu_in_menu = create_sub_menu_with_mnemonic( menu, "Flip" ); @@ -2236,6 +2314,9 @@ ui::MenuItem create_selection_menu(){ create_menu_item_with_mnemonic( menu_in_menu, "Flip _X", "MirrorSelectionX" ); create_menu_item_with_mnemonic( menu_in_menu, "Flip _Y", "MirrorSelectionY" ); create_menu_item_with_mnemonic( menu_in_menu, "Flip _Z", "MirrorSelectionZ" ); + menu_separator( menu_in_menu ); + create_menu_item_with_mnemonic( menu_in_menu, "Flip Horizontally", "MirrorSelectionHorizontally" ); + create_menu_item_with_mnemonic( menu_in_menu, "Flip Vertically", "MirrorSelectionVertically" ); } menu_separator( menu ); create_menu_item_with_mnemonic( menu, "Arbitrary rotation...", "ArbitraryRotation" ); @@ -2355,8 +2436,8 @@ ui::MenuItem create_help_menu(){ create_game_help_menu( menu ); create_menu_item_with_mnemonic( menu, "Bug report", makeCallbackF(OpenBugReportURL) ); - create_menu_item_with_mnemonic( menu, "Shortcuts list", makeCallbackF(DoCommandListDlg) ); - create_menu_item_with_mnemonic( menu, "_About", makeCallbackF(DoAbout) ); + create_menu_item_with_mnemonic( menu, "Shortcuts", makeCallbackF(DoCommandListDlg) ); + create_menu_item_with_mnemonic( menu, "_About...", makeCallbackF(DoAbout) ); return help_menu_item; } @@ -2419,8 +2500,8 @@ void TexdefNudge_registerShortcuts(){ } void SelectNudge_registerShortcuts(){ - command_connect_accelerator( "MoveSelectionDOWN" ); - command_connect_accelerator( "MoveSelectionUP" ); + //command_connect_accelerator( "MoveSelectionDOWN" ); + //command_connect_accelerator( "MoveSelectionUP" ); //command_connect_accelerator("SelectNudgeLeft"); //command_connect_accelerator("SelectNudgeRight"); //command_connect_accelerator("SelectNudgeUp"); @@ -2481,12 +2562,17 @@ void UndoRedo_constructToolbar( ui::Toolbar toolbar ){ } void RotateFlip_constructToolbar( ui::Toolbar toolbar ){ - toolbar_append_button( toolbar, "x-axis Flip", "brush_flipx.png", "MirrorSelectionX" ); - toolbar_append_button( toolbar, "x-axis Rotate", "brush_rotatex.png", "RotateSelectionX" ); - toolbar_append_button( toolbar, "y-axis Flip", "brush_flipy.png", "MirrorSelectionY" ); - toolbar_append_button( toolbar, "y-axis Rotate", "brush_rotatey.png", "RotateSelectionY" ); - toolbar_append_button( toolbar, "z-axis Flip", "brush_flipz.png", "MirrorSelectionZ" ); - toolbar_append_button( toolbar, "z-axis Rotate", "brush_rotatez.png", "RotateSelectionZ" ); +// toolbar_append_button( toolbar, "x-axis Flip", "brush_flipx.png", "MirrorSelectionX" ); +// toolbar_append_button( toolbar, "x-axis Rotate", "brush_rotatex.png", "RotateSelectionX" ); +// toolbar_append_button( toolbar, "y-axis Flip", "brush_flipy.png", "MirrorSelectionY" ); +// toolbar_append_button( toolbar, "y-axis Rotate", "brush_rotatey.png", "RotateSelectionY" ); +// toolbar_append_button( toolbar, "z-axis Flip", "brush_flipz.png", "MirrorSelectionZ" ); +// toolbar_append_button( toolbar, "z-axis Rotate", "brush_rotatez.png", "RotateSelectionZ" ); + toolbar_append_button( toolbar, "Flip Horizontally", "brush_flip_hor.png", "MirrorSelectionHorizontally" ); + toolbar_append_button( toolbar, "Flip Vertically", "brush_flip_vert.png", "MirrorSelectionVertically" ); + + toolbar_append_button( toolbar, "Rotate Clockwise", "brush_rotate_clock.png", "RotateSelectionClockwise" ); + toolbar_append_button( toolbar, "Rotate Anticlockwise", "brush_rotate_anti.png", "RotateSelectionAnticlockwise" ); } void Select_constructToolbar( ui::Toolbar toolbar ){ @@ -2562,7 +2648,7 @@ ui::Toolbar create_main_toolbar( MainFrame::EViewStyle style ){ ComponentModes_constructToolbar( toolbar ); - if ( style == MainFrame::eRegular || style == MainFrame::eRegularLeft ) { + if ( style != MainFrame::eSplit ) { space(); XYWnd_constructToolbar( toolbar ); @@ -2750,10 +2836,14 @@ MainFrame::~MainFrame(){ for ( std::vector::iterator i = g_floating_windows.begin(); i != g_floating_windows.end(); ++i ) { +#ifndef WORKAROUND_MACOS_GTK2_DESTROY i->destroy(); +#endif } +#ifndef WORKAROUND_MACOS_GTK2_DESTROY m_window.destroy(); +#endif } void MainFrame::SetActiveXY( XYWnd* p ){ @@ -2886,6 +2976,13 @@ ui::Window create_splash(){ image.show(); window.add(image); + if( gtk_image_get_storage_type( image ) == GTK_IMAGE_PIXBUF ){ + GdkBitmap* mask; + GdkPixbuf* pix = gtk_image_get_pixbuf( image ); + gdk_pixbuf_render_pixmap_and_mask( pix, NULL, &mask, 255 ); + gtk_widget_shape_combine_mask ( GTK_WIDGET( window ), mask, 0, 0 ); + } + window.dimensions(-1, -1); window.show(); @@ -2910,13 +3007,16 @@ WindowPositionTracker g_posXZWnd; WindowPositionTracker g_posYZWnd; static gint mainframe_delete( ui::Widget widget, GdkEvent *event, gpointer data ){ - if ( ConfirmModified( "Exit Radiant" ) ) { + if ( ConfirmModified( "Exit " RADIANT_NAME ) ) { gtk_main_quit(); } return TRUE; } +PanedState g_single_hpaned = { 0.75f, -1, }; +PanedState g_single_vpaned = { 0.75f, -1, }; + void MainFrame::Create(){ ui::Window window = ui::Window( ui::window_type::TOP ); @@ -3016,7 +3116,8 @@ void MainFrame::Create(){ window.show(); - if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) { + if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) + { { ui::Widget hsplit = ui::HPaned(ui::New); m_hSplit = hsplit; @@ -3069,7 +3170,8 @@ void MainFrame::Create(){ } } } - else if ( CurrentStyle() == eFloating ) { + else if ( CurrentStyle() == eFloating ) + { { ui::Window window = ui::Window(create_persistent_floating_window( "Camera", m_window )); global_accel_connect_window( window ); @@ -3085,11 +3187,8 @@ void MainFrame::Create(){ window.add(frame); } CamWnd_setParent( *m_pCamWnd, window ); -#define GARUX_GTK_WORKAROUND -#ifndef GARUX_GTK_WORKAROUND - /* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ - g_object_set_data( G_OBJECT( window ), "glwidget", CamWnd_getWidget( *m_pCamWnd ) ); -#endif + + WORKAROUND_GOBJECT_SET_GLWIDGET( window, CamWnd_getWidget( *m_pCamWnd ) ); g_floating_windows.push_back( window ); } @@ -3109,10 +3208,8 @@ void MainFrame::Create(){ window.add(frame); } XY_Top_Shown_Construct( window ); -#ifndef GARUX_GTK_WORKAROUND - /* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ - g_object_set_data( G_OBJECT( window ), "glwidget", m_pXYWnd->GetWidget() ); -#endif + + WORKAROUND_GOBJECT_SET_GLWIDGET( window, m_pXYWnd->GetWidget() ); g_floating_windows.push_back( window ); } @@ -3132,10 +3229,8 @@ void MainFrame::Create(){ } XZ_Front_Shown_Construct( window ); -#ifndef GARUX_GTK_WORKAROUND - /* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ - g_object_set_data( G_OBJECT( window ), "glwidget", m_pXZWnd->GetWidget() ); -#endif + + WORKAROUND_GOBJECT_SET_GLWIDGET( window, m_pXZWnd->GetWidget() ); g_floating_windows.push_back( window ); } @@ -3155,10 +3250,8 @@ void MainFrame::Create(){ } YZ_Side_Shown_Construct( window ); -#ifndef GARUX_GTK_WORKAROUND - /* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ - g_object_set_data( G_OBJECT( window ), "glwidget", m_pYZWnd->GetWidget() ); -#endif + + WORKAROUND_GOBJECT_SET_GLWIDGET( window, m_pYZWnd->GetWidget() ); g_floating_windows.push_back( window ); } @@ -3166,10 +3259,7 @@ void MainFrame::Create(){ { auto frame = create_framed_widget( TextureBrowser_constructWindow( GroupDialog_getWindow() ) ); g_page_textures = GroupDialog_addPage( "Textures", frame, TextureBrowserExportTitleCaller() ); -#ifndef GARUX_GTK_WORKAROUND - /* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ - g_object_set_data( G_OBJECT( GroupDialog_getWindow() ), "glwidget", TextureBrowser_getGLWidget() ); -#endif + WORKAROUND_GOBJECT_SET_GLWIDGET( GroupDialog_getWindow(), TextureBrowser_getGLWidget() ); } // FIXME: find a way to do it with newer syntax @@ -3179,7 +3269,7 @@ void MainFrame::Create(){ GroupDialog_show(); } - else // 4 way + else if ( CurrentStyle() == eSplit ) { m_pCamWnd = NewCamWnd(); GlobalCamera_setCamWnd( *m_pCamWnd ); @@ -3208,12 +3298,70 @@ void MainFrame::Create(){ { auto frame = create_framed_widget( TextureBrowser_constructWindow( GroupDialog_getWindow() ) ); g_page_textures = GroupDialog_addPage( "Textures", frame, TextureBrowserExportTitleCaller() ); -#ifndef GARUX_GTK_WORKAROUND - /* workaround for gtk 2.24 issue: not displayed glwidget after toggle */ - g_object_set_data( G_OBJECT( GroupDialog_getWindow() ), "glwidget", TextureBrowser_getGLWidget() ); -#endif + + WORKAROUND_GOBJECT_SET_GLWIDGET( window, TextureBrowser_getGLWidget() ); } } + else // single window + { + m_pCamWnd = NewCamWnd(); + GlobalCamera_setCamWnd( *m_pCamWnd ); + CamWnd_setParent( *m_pCamWnd, window ); + + ui::Widget camera = CamWnd_getWidget( *m_pCamWnd ); + + m_pYZWnd = new XYWnd(); + m_pYZWnd->SetViewType( YZ ); + + ui::Widget yz = m_pYZWnd->GetWidget(); + + m_pXYWnd = new XYWnd(); + m_pXYWnd->SetViewType( XY ); + + ui::Widget xy = m_pXYWnd->GetWidget(); + + m_pXZWnd = new XYWnd(); + m_pXZWnd->SetViewType( XZ ); + + ui::Widget xz = m_pXZWnd->GetWidget(); + + ui::Widget hsplit = ui::HPaned(ui::New); + vbox.pack_start( hsplit, TRUE, TRUE, 0 ); + hsplit.show(); + + /* Before merging NetRadiantCustom: + ui::Widget split = create_split_views( camera, yz, xy, xz ); */ + m_hSplit = create_split_views( camera, yz, xy, xz, m_vSplit, m_vSplit2 ); + + ui::Widget vsplit = ui::VPaned(ui::New); + vsplit.show(); + + // textures + ui::Widget texture_window = create_framed_widget( TextureBrowser_constructWindow( window ) ); + + // console + ui::Widget console_window = create_framed_widget( Console_constructWindow( window ) ); + + /* Before merging NetRadiantCustom: + gtk_paned_add1( GTK_PANED( hsplit ), m_hSplit ); + gtk_paned_add2( GTK_PANED( hsplit ), vsplit ); + + gtk_paned_add1( GTK_PANED( vsplit ), texture_window ); + gtk_paned_add2( GTK_PANED( vsplit ), console_window ); + */ + + gtk_paned_pack1( GTK_PANED( hsplit ), m_hSplit, TRUE, TRUE ); + gtk_paned_pack2( GTK_PANED( hsplit ), vsplit, TRUE, TRUE); + + gtk_paned_pack1( GTK_PANED( vsplit ), texture_window, TRUE, TRUE ); + gtk_paned_pack2( GTK_PANED( vsplit ), console_window, TRUE, TRUE ); + + hsplit.connect( "size_allocate", G_CALLBACK( hpaned_allocate ), &g_single_hpaned ); + hsplit.connect( "notify::position", G_CALLBACK( paned_position ), &g_single_hpaned ); + + vsplit.connect( "size_allocate", G_CALLBACK( vpaned_allocate ), &g_single_vpaned ); + vsplit.connect( "notify::position", G_CALLBACK( paned_position ), &g_single_vpaned ); + } EntityList_constructWindow( window ); PreferencesDialog_constructWindow( window ); @@ -3322,7 +3470,7 @@ void MainFrame::SetStatusText( CopiedString& status_text, const char* pText ){ } void Sys_Status( const char* status ){ - if ( g_pParentWnd != 0 ) { + if ( g_pParentWnd != nullptr ) { g_pParentWnd->SetStatusText( g_pParentWnd->m_command_status, status ); } } @@ -3354,7 +3502,7 @@ void MainFrame::SetGridStatus(){ } void GridStatus_onTextureLockEnabledChanged(){ - if ( g_pParentWnd != 0 ) { + if ( g_pParentWnd != nullptr ) { g_pParentWnd->SetGridStatus(); } } @@ -3399,7 +3547,7 @@ void GlobalGL_sharedContextDestroyed(){ void Layout_constructPreferences( PreferencesPage& page ){ { - const char* layouts[] = { "window1.png", "window2.png", "window3.png", "window4.png" }; + const char* layouts[] = { "window1.png", "window2.png", "window3.png", "window4.png", "window5.png" }; page.appendRadioIcons( "Window Layout", STRING_ARRAY_RANGE( layouts ), @@ -3526,9 +3674,9 @@ void Maximize_View(){ g_maximizeview.toggle(); } - #include "preferencesystem.h" #include "stringio.h" +#include "transformpath/transformpath.h" void MainFrame_Construct(){ GlobalCommands_insert( "OpenManual", makeCallbackF(OpenHelpURL), Accelerator( GDK_KEY_F1 ) ); @@ -3569,24 +3717,17 @@ void MainFrame_Construct(){ GlobalCommands_insert( "ToggleEntityInspector", makeCallbackF(EntityInspector_ToggleShow), Accelerator( 'N' ) ); GlobalCommands_insert( "EntityList", makeCallbackF(EntityList_toggleShown), Accelerator( 'L' ) ); -// GlobalCommands_insert( "ShowHidden", FreeCaller(), Accelerator( 'H', (GdkModifierType)GDK_SHIFT_MASK ) ); -// GlobalCommands_insert( "HideSelected", FreeCaller(), Accelerator( 'H' ) ); +// GlobalCommands_insert( "ShowHidden", makeCallbackF( Select_ShowAllHidden ), Accelerator( 'H', (GdkModifierType)GDK_SHIFT_MASK ) ); +// GlobalCommands_insert( "HideSelected", makeCallbackF( HideSelected ), Accelerator( 'H' ) ); - Hide_registerCommands(); + Select_registerCommands(); GlobalToggles_insert( "DragVertices", makeCallbackF(SelectVertexMode), ToggleItem::AddCallbackCaller( g_vertexMode_button ), Accelerator( 'V' ) ); GlobalToggles_insert( "DragEdges", makeCallbackF(SelectEdgeMode), ToggleItem::AddCallbackCaller( g_edgeMode_button ), Accelerator( 'E' ) ); GlobalToggles_insert( "DragFaces", makeCallbackF(SelectFaceMode), ToggleItem::AddCallbackCaller( g_faceMode_button ), Accelerator( 'F' ) ); - GlobalCommands_insert( "MirrorSelectionX", makeCallbackF(Selection_Flipx) ); - GlobalCommands_insert( "RotateSelectionX", makeCallbackF(Selection_Rotatex) ); - GlobalCommands_insert( "MirrorSelectionY", makeCallbackF(Selection_Flipy) ); - GlobalCommands_insert( "RotateSelectionY", makeCallbackF(Selection_Rotatey) ); - GlobalCommands_insert( "MirrorSelectionZ", makeCallbackF(Selection_Flipz) ); - GlobalCommands_insert( "RotateSelectionZ", makeCallbackF(Selection_Rotatez) ); - - GlobalCommands_insert( "ArbitraryRotation", makeCallbackF(DoRotateDlg) ); - GlobalCommands_insert( "ArbitraryScale", makeCallbackF(DoScaleDlg) ); + GlobalCommands_insert( "ArbitraryRotation", makeCallbackF(DoRotateDlg), Accelerator( 'R', (GdkModifierType)GDK_SHIFT_MASK ) ); + GlobalCommands_insert( "ArbitraryScale", makeCallbackF(DoScaleDlg), Accelerator( 'S', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) ); GlobalCommands_insert( "BuildMenuCustomize", makeCallbackF(DoBuildMenu) ); GlobalCommands_insert( "Build_runRecentExecutedBuild", makeCallbackF(Build_runRecentExecutedBuild), Accelerator( GDK_F5 ) ); @@ -3612,6 +3753,7 @@ void MainFrame_Construct(){ GlobalCommands_insert( "ColorSchemeQER", makeCallbackF(ColorScheme_QER) ); GlobalCommands_insert( "ColorSchemeBlackAndGreen", makeCallbackF(ColorScheme_Black) ); GlobalCommands_insert( "ColorSchemeYdnar", makeCallbackF(ColorScheme_Ydnar) ); + GlobalCommands_insert( "ColorSchemeAdwaitaDark", makeCallbackF(ColorScheme_AdwaitaDark)); GlobalCommands_insert( "ChooseTextureBackgroundColor", makeCallback( g_ColoursMenu.m_textureback ) ); GlobalCommands_insert( "ChooseGridBackgroundColor", makeCallback( g_ColoursMenu.m_xyback ) ); GlobalCommands_insert( "ChooseGridMajorColor", makeCallback( g_ColoursMenu.m_gridmajor ) ); @@ -3702,9 +3844,11 @@ void MainFrame_Construct(){ #error "unknown platform" #endif ; + StringOutputStream path( 256 ); path << DirectoryCleaned( g_pGameDescription->getRequiredKeyValue( ENGINEPATH_ATTRIBUTE ) ); - g_strEnginePath = path.c_str(); + + g_strEnginePath = transformPath( path.c_str() ).c_str(); GlobalPreferenceSystem().registerPreference( "EnginePath", make_property_string( g_strEnginePath ) ); } @@ -3730,8 +3874,7 @@ void MainFrame_Construct(){ g_entityCount.setCountChangedCallback( makeCallbackF(QE_entityCountChanged) ); GlobalEntityCreator().setCounter( &g_entityCount ); - GLWidget_sharedContextCreated = GlobalGL_sharedContextCreated; - GLWidget_sharedContextDestroyed = GlobalGL_sharedContextDestroyed; + glwidget_set_shared_context_constructors( GlobalGL_sharedContextCreated, GlobalGL_sharedContextDestroyed); GlobalEntityClassManager().attach( g_WorldspawnColourEntityClassObserver ); } @@ -3746,8 +3889,66 @@ void MainFrame_Destroy(){ void GLWindow_Construct(){ - GlobalPreferenceSystem().registerPreference( "MouseButtons", make_property_string( g_glwindow_globals.m_nMouseType ) ); +// GlobalPreferenceSystem().registerPreference( "MouseButtons", make_property_string( g_glwindow_globals.m_nMouseType ) ); } void GLWindow_Destroy(){ } + +/* HACK: If ui::main is not called yet, +gtk_main_quit will not quit, so tell main +to not call ui::main. This happens when a +map is loaded from command line and require +a restart because of wrong format. +Delete this when the code to not have to +restart to load another format is merged. */ +extern bool g_dontStart; + +void Radiant_Restart(){ + // preferences are expected to be already saved in any way + // this is just to be sure and be future proof + Preferences_Save(); + + // this asks user for saving if map is modified + // user can chose to not save, it's ok + ConfirmModified( "Restart " RADIANT_NAME ); + + int status; + + char *argv[ 3 ]; + char exe_file[ 256 ]; + char map_file[ 256 ]; + bool with_map = false; + + strncpy( exe_file, g_strAppFilePath.c_str(), 256 ); + + if ( !Map_Unnamed( g_map ) ) { + strncpy( map_file, Map_Name( g_map ), 256 ); + with_map = true; + } + + argv[ 0 ] = exe_file; + argv[ 1 ] = with_map ? map_file : NULL; + argv[ 2 ] = NULL; + +#if GDEF_OS_WINDOWS + status = !_spawnvpe( P_NOWAIT, exe_file, argv, environ ); +#else + pid_t pid; + + status = posix_spawn( &pid, exe_file, NULL, NULL, argv, environ ); +#endif + + // quit if radiant successfully started + if ( status == 0 ) { + gtk_main_quit(); + /* HACK: If ui::main is not called yet, + gtk_main_quit will not quit, so tell main + to not call ui::main. This happens when a + map is loaded from command line and require + a restart because of wrong format. + Delete this when the code to not have to + restart to load another format is merged. */ + g_dontStart = true; + } +}