From 65ca31fd444b4c977ee84ef971e55fbef78ce17a Mon Sep 17 00:00:00 2001 From: Garux Date: Wed, 2 Aug 2017 09:25:04 +0300 Subject: [PATCH] Radiant: menus... * Shortcuts item moved from Help to Edit misc... * fix: q1 mdl reader out of bounds reading crash * fix: q1 mdl loading of MDL_FRAME_GROUP case * fix: rightclick main wnd border, release in texbro glwidget == crash (unfreezepointer) * texbro: search in currently shown textures * ask for saving nonsaved map on project settings change * func_detail to nongame group ents counter * deiconify main wnd, unmaximize maximized view on app closing to save correct layout data * close preferences dialog on ESC * Enter = Ok in global and path settings dialogs * print renderer stats in XY views too * global 'show renderer stats' option, def = off * ~10x faster opengl text rendering --- libs/gtkutil/dialog.cpp | 7 ++ libs/gtkutil/glfont.cpp | 66 +++++++++++++- libs/string/string.h | 17 ++++ plugins/md3model/mdl.cpp | 5 +- radiant/camwindow.cpp | 10 +- radiant/camwindow.h | 5 +- radiant/gtkdlgs.cpp | 10 +- radiant/mainframe.cpp | 192 +++++++++++++++++++++------------------ radiant/map.cpp | 3 +- radiant/preferences.cpp | 6 ++ radiant/texwindow.cpp | 61 ++++++++++--- radiant/xywindow.cpp | 23 ++++- 12 files changed, 286 insertions(+), 119 deletions(-) diff --git a/libs/gtkutil/dialog.cpp b/libs/gtkutil/dialog.cpp index fb513e97..e89098b0 100644 --- a/libs/gtkutil/dialog.cpp +++ b/libs/gtkutil/dialog.cpp @@ -166,9 +166,14 @@ gboolean dialog_delete_callback( GtkWidget *widget, GdkEventAny* event, ModalDia return TRUE; } +#include + GtkWindow* create_simple_modal_dialog_window( const char* title, ModalDialog& dialog, GtkWidget* contents ){ GtkWindow* window = create_fixedsize_modal_dialog_window( 0, title, dialog ); + GtkAccelGroup* accel = gtk_accel_group_new(); + gtk_window_add_accel_group( window, accel ); + GtkVBox* vbox1 = create_dialog_vbox( 8, 4 ); gtk_container_add( GTK_CONTAINER( window ), GTK_WIDGET( vbox1 ) ); @@ -180,6 +185,8 @@ GtkWindow* create_simple_modal_dialog_window( const char* title, ModalDialog& di GtkButton* button = create_dialog_button( "OK", G_CALLBACK( dialog_button_ok ), &dialog ); gtk_container_add( GTK_CONTAINER( alignment ), GTK_WIDGET( button ) ); + gtk_widget_grab_default( GTK_WIDGET( button ) ); + gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Return, (GdkModifierType)0, (GtkAccelFlags)0 ); return window; } diff --git a/libs/gtkutil/glfont.cpp b/libs/gtkutil/glfont.cpp index 09211a05..6346ba38 100644 --- a/libs/gtkutil/glfont.cpp +++ b/libs/gtkutil/glfont.cpp @@ -169,7 +169,7 @@ GLFont *glfont_create( const char* font_string ){ return new GLFontCallList( font_list_base, font_ascent, font_descent, font_height ); } -#else +#elif 0 // new font code ripped from ZeroRadiant @@ -336,4 +336,68 @@ GLFont *glfont_create( const char* font_string ){ return new GLFontInternal( font_string ); } +#elif 1 + +#include +#include +#include + +GLFont *glfont_create( const char* font_string ){ + GLuint font_list_base = glGenLists( 256 ); + int font_height = 0, font_ascent = 0, font_descent = 0; + + PangoFontDescription* font_desc = pango_font_description_from_string( font_string ); + //PangoFontDescription* font_desc = pango_font_description_from_string( "arial 7" ); + + PangoFont* font = gdk_gl_font_use_pango_font( font_desc, 0, 256, font_list_base ); + + if ( font == 0 ) { + pango_font_description_free( font_desc ); + font_desc = pango_font_description_from_string( "arial 8" ); + font = gdk_gl_font_use_pango_font( font_desc, 0, 256, font_list_base ); + } + + if ( font == 0 ) { + pango_font_description_free( font_desc ); + font_desc = pango_font_description_from_string( "fixed 8" ); + font = gdk_gl_font_use_pango_font( font_desc, 0, 256, font_list_base ); + } + + if ( font == 0 ) { + pango_font_description_free( font_desc ); + font_desc = pango_font_description_from_string( "courier new 8" ); + font = gdk_gl_font_use_pango_font( font_desc, 0, 256, font_list_base ); + } + + if ( font != 0 ) { + + PangoFontMap *fontmap = pango_ft2_font_map_new(); + pango_ft2_font_map_set_resolution( PANGO_FT2_FONT_MAP( fontmap ), 72, 72 ); + PangoContext *ft2_context = pango_font_map_create_context( fontmap ); + pango_context_set_font_description( ft2_context, font_desc ); + PangoLayout *layout = pango_layout_new( ft2_context ); + +#if 1 //FONT_SIZE_WORKAROUND + pango_layout_set_width( layout, -1 ); // -1 no wrapping. All text on one line. + pango_layout_set_text( layout, "_|The quick brown fox jumped over the lazy sleeping dog's back then sat on a tack.", -1 ); // -1 null-terminated string. +#endif + + int font_ascent_pango_units = pango_layout_get_baseline( layout ); + PangoRectangle log_rect; + pango_layout_get_extents( layout, NULL, &log_rect ); + g_object_unref( G_OBJECT( layout ) ); + int font_descent_pango_units = log_rect.height - font_ascent_pango_units; + + pango_font_description_free( font_desc ); + g_object_unref( G_OBJECT( ft2_context ) ); + g_object_unref( G_OBJECT( fontmap ) ); + + font_ascent = PANGO_PIXELS_CEIL( font_ascent_pango_units ); + font_descent = PANGO_PIXELS_CEIL( font_descent_pango_units ); + font_height = font_ascent + font_descent; + } + return new GLFontCallList( font_list_base, font_ascent, font_descent, font_height ); +} + + #endif diff --git a/libs/string/string.h b/libs/string/string.h index dd67d2af..1273db7f 100644 --- a/libs/string/string.h +++ b/libs/string/string.h @@ -251,6 +251,23 @@ inline char* string_to_uppercase( char* string ){ return string; } +//http://stackoverflow.com/questions/27303062/strstr-function-like-that-ignores-upper-or-lower-case +//chux: Somewhat tricky to match the corner cases of strstr() with inputs like "x","", "","x", "","" +inline const char* string_in_string_nocase( const char* haystack, const char* needle ) { + do { + const char* h = haystack; + const char* n = needle; + while ( std::tolower( ( unsigned char ) *h ) == std::tolower( ( unsigned char ) *n ) && *n ) { + h++; + n++; + } + if ( *n == 0 ) { + return haystack; + } + } while ( *haystack++ ); + return 0; +} + /// \brief A re-entrant string tokeniser similar to strchr. class StringTokeniser { diff --git a/plugins/md3model/mdl.cpp b/plugins/md3model/mdl.cpp index 6fe16c41..19e0d248 100644 --- a/plugins/md3model/mdl.cpp +++ b/plugins/md3model/mdl.cpp @@ -158,14 +158,15 @@ void MDLSurface_read( Surface& surface, const byte* buffer, const char* name ){ break; case MDL_FRAME_GROUP: int numframes = istream_read_int32_le( inputStream ); - inputStream.seek( ( MDL_XYZNORMAL_SIZE * 2 ) + ( numframes * 4 ) ); + //inputStream.seek( ( MDL_XYZNORMAL_SIZE * 2 ) + ( numframes * 4 ) ); + inputStream.seek( ( MDL_XYZNORMAL_SIZE * 4 ) + ( numframes * 4 ) + 16 );//group min_vec3 + max_vec3 + timings_float[numframes] + frame min_vec3 + max_vec3 + name_char[16] found = true; break; } } } - Array mdlXyzNormals( header.numtris ); + Array mdlXyzNormals( header.numverts ); for ( Array::iterator i = mdlXyzNormals.begin(); i != mdlXyzNormals.end(); ++i ) { inputStream.read( ( *i ).v, 3 ); diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index ef7c5795..43da650e 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -79,7 +79,6 @@ struct camwindow_globals_private_t bool m_bCamInverseMouse; bool m_bCamDiscrete; bool m_bCubicClipping; - bool m_showStats; int m_nStrafeMode; camwindow_globals_private_t() : @@ -89,7 +88,6 @@ struct camwindow_globals_private_t m_bCamInverseMouse( false ), m_bCamDiscrete( true ), m_bCubicClipping( false ), - m_showStats( true ), m_nStrafeMode( 3 ){ } @@ -1559,10 +1557,10 @@ ShowStatsExportCaller g_show_stats_caller; BoolExportCallback g_show_stats_callback( g_show_stats_caller ); ToggleItem g_show_stats( g_show_stats_callback ); */ -BoolExportCaller g_show_stats_caller( g_camwindow_globals_private.m_showStats ); +BoolExportCaller g_show_stats_caller( g_camwindow_globals.m_showStats ); ToggleItem g_show_stats( g_show_stats_caller ); void ShowStatsToggle(){ - g_camwindow_globals_private.m_showStats ^= 1; + g_camwindow_globals.m_showStats ^= 1; g_show_stats.update(); UpdateAllWindows(); } @@ -1709,7 +1707,7 @@ void CamWnd::Cam_Draw(){ glEnd(); } - if ( g_camwindow_globals_private.m_showStats ) { + if ( g_camwindow_globals.m_showStats ) { glRasterPos3f( 1.0f, static_cast( m_Camera.height ) - GlobalOpenGL().m_font->getPixelDescent(), 0.0f ); extern const char* Renderer_GetStats(); GlobalOpenGL().drawString( Renderer_GetStats() ); @@ -2142,7 +2140,7 @@ void CamWnd_Construct(){ GlobalToggles_insert( "ShowStats", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_stats ) ); - GlobalPreferenceSystem().registerPreference( "ShowStats", BoolImportStringCaller( g_camwindow_globals_private.m_showStats ), BoolExportStringCaller( g_camwindow_globals_private.m_showStats ) ); + GlobalPreferenceSystem().registerPreference( "ShowStats", BoolImportStringCaller( g_camwindow_globals.m_showStats ), BoolExportStringCaller( g_camwindow_globals.m_showStats ) ); GlobalPreferenceSystem().registerPreference( "MoveSpeed", IntImportStringCaller( g_camwindow_globals_private.m_nMoveSpeed ), IntExportStringCaller( g_camwindow_globals_private.m_nMoveSpeed ) ); GlobalPreferenceSystem().registerPreference( "CamLinkSpeed", BoolImportStringCaller( g_camwindow_globals_private.m_bCamLinkSpeed ), BoolExportStringCaller( g_camwindow_globals_private.m_bCamLinkSpeed ) ); GlobalPreferenceSystem().registerPreference( "AngleSpeed", IntImportStringCaller( g_camwindow_globals_private.m_nAngleSpeed ), IntExportStringCaller( g_camwindow_globals_private.m_nAngleSpeed ) ); diff --git a/radiant/camwindow.h b/radiant/camwindow.h index 14610550..bc6c847b 100644 --- a/radiant/camwindow.h +++ b/radiant/camwindow.h @@ -72,11 +72,14 @@ struct camwindow_globals_t bool m_bZoomInToPointer; + bool m_showStats; + camwindow_globals_t() : color_cameraback( 0.25f, 0.25f, 0.25f ), color_selbrushes3d( 1.0f, 0.f, 0.f ), m_nCubicScale( 14 ), - m_bZoomInToPointer( true ){ + m_bZoomInToPointer( true ), + m_showStats( false ){ } }; diff --git a/radiant/gtkdlgs.cpp b/radiant/gtkdlgs.cpp index 3669107a..e1d986df 100644 --- a/radiant/gtkdlgs.cpp +++ b/radiant/gtkdlgs.cpp @@ -343,13 +343,15 @@ void ProjectSettingsDialog_ok( ProjectSettingsDialog& dialog ){ : dir; if ( !path_equal( new_gamename, gamename_get() ) ) { - ScopeDisableScreenUpdates disableScreenUpdates( "Processing...", "Changing Game Name" ); + if ( ConfirmModified( "Edit Project Settings" ) ) { + ScopeDisableScreenUpdates disableScreenUpdates( "Processing...", "Changing Game Name" ); - EnginePath_Unrealise(); + EnginePath_Unrealise(); - gamename_set( new_gamename ); + gamename_set( new_gamename ); - EnginePath_Realise(); + EnginePath_Realise(); + } } if ( globalMappingMode().do_mapping_mode ) { diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 9e3d4876..8a5d3bec 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -1940,6 +1940,7 @@ GtkMenuItem* create_edit_menu(){ create_menu_item_with_mnemonic( menu, "Select Connected Entities", "SelectConnectedEntities" ); menu_separator( menu ); + create_menu_item_with_mnemonic( menu, "Shortcuts...", FreeCaller() ); create_menu_item_with_mnemonic( menu, "Pre_ferences...", "Preferences" ); return edit_menu_item; @@ -2046,7 +2047,7 @@ GtkMenuItem* create_view_menu( MainFrame::EViewStyle style ){ create_check_menu_item_with_mnemonic( menu_in_menu, "Show Window Outline", "ShowWindowOutline" ); create_check_menu_item_with_mnemonic( menu_in_menu, "Show Axes", "ShowAxes" ); create_check_menu_item_with_mnemonic( menu_in_menu, "Show Workzone", "ShowWorkzone" ); - create_check_menu_item_with_mnemonic( menu_in_menu, "Show Camera Stats", "ShowStats" ); + create_check_menu_item_with_mnemonic( menu_in_menu, "Show Renderer Stats", "ShowStats" ); } { @@ -2256,7 +2257,6 @@ GtkMenuItem* create_help_menu(){ create_game_help_menu( menu ); // create_menu_item_with_mnemonic( menu, "Bug report", FreeCaller() ); - create_menu_item_with_mnemonic( menu, "Shortcuts", FreeCaller() ); create_menu_item_with_mnemonic( menu, "_About", FreeCaller() ); return help_menu_item; @@ -2768,6 +2768,98 @@ void MainFrame::OnSleep(){ } +void MainFrame_toggleFullscreen(){ + GtkWindow* wnd = MainFrame_getWindow(); + if( gdk_window_get_state( GTK_WIDGET( wnd )->window ) & GDK_WINDOW_STATE_FULLSCREEN ){ + //some portion of buttsex, because gtk_window_unfullscreen doesn't work correctly after calling some modal window + bool maximized = ( gdk_window_get_state( GTK_WIDGET( wnd )->window ) & GDK_WINDOW_STATE_MAXIMIZED ); + gtk_window_unfullscreen( wnd ); + if( maximized ){ + gtk_window_unmaximize( wnd ); + gtk_window_maximize( wnd ); + } + else{ + gtk_window_move( wnd, g_layout_globals.m_position.x, g_layout_globals.m_position.y ); + gtk_window_resize( wnd, g_layout_globals.m_position.w, g_layout_globals.m_position.h ); + } + } + else{ + gtk_window_fullscreen( wnd ); + } +} + +class MaximizeView +{ +public: + MaximizeView(): m_maximized( false ){ + } + void toggle(){ + return m_maximized ? restore() : maximize(); + } + bool isMaximized(){ + return m_maximized; + } +private: + bool m_maximized; + int m_vSplitPos; + int m_vSplit2Pos; + int m_hSplitPos; + + void restore(){ + m_maximized = false; + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit ), m_vSplitPos ); + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit2 ), m_vSplit2Pos ); + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_hSplit ), m_hSplitPos ); + } + + void maximize(){ + m_maximized = true; + m_vSplitPos = gtk_paned_get_position( GTK_PANED( g_pParentWnd->m_vSplit ) ); + m_vSplit2Pos = gtk_paned_get_position( GTK_PANED( g_pParentWnd->m_vSplit2 ) ); + m_hSplitPos = gtk_paned_get_position( GTK_PANED( g_pParentWnd->m_hSplit ) ); + + int vSplitX, vSplitY, vSplit2X, vSplit2Y, hSplitX, hSplitY; + gdk_window_get_origin( g_pParentWnd->m_vSplit->window, &vSplitX, &vSplitY ); + gdk_window_get_origin( g_pParentWnd->m_vSplit2->window, &vSplit2X, &vSplit2Y ); + gdk_window_get_origin( g_pParentWnd->m_hSplit->window, &hSplitX, &hSplitY ); + + vSplitY += m_vSplitPos; + vSplit2Y += m_vSplit2Pos; + hSplitX += m_hSplitPos; + + int cur_x, cur_y; + Sys_GetCursorPos( MainFrame_getWindow(), &cur_x, &cur_y ); + + if( cur_x > hSplitX ){ + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_hSplit ), 0 ); + } + else{ + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_hSplit ), 9999 ); + } + if( cur_y > vSplitY ){ + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit ), 0 ); + } + else{ + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit ), 9999 ); + } + if( cur_y > vSplit2Y ){ + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit2 ), 0 ); + } + else{ + gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit2 ), 9999 ); + } + } +}; + +MaximizeView g_maximizeview; + +void Maximize_View(){ + if( g_pParentWnd != 0 && g_pParentWnd->m_vSplit != 0 && g_pParentWnd->m_vSplit2 != 0 && g_pParentWnd->m_hSplit != 0 ) + g_maximizeview.toggle(); +} + + + GtkWindow* create_splash(){ GtkWindow* window = GTK_WINDOW( gtk_window_new( GTK_WINDOW_TOPLEVEL ) ); gtk_window_set_decorated( window, FALSE ); @@ -3143,6 +3235,14 @@ void MainFrame::Create(){ } void MainFrame::SaveWindowInfo(){ + //restore good state first + if( gdk_window_get_state( GTK_WIDGET( m_window )->window ) & GDK_WINDOW_STATE_ICONIFIED ){ + gtk_window_deiconify( m_window ); + } + if( g_maximizeview.isMaximized() ){ + g_maximizeview.toggle(); + } + if ( !FloatingGroupDialog() ) { g_layout_globals.nXYHeight = gtk_paned_get_position( GTK_PANED( m_vSplit ) ); @@ -3262,7 +3362,7 @@ void GlobalGL_sharedContextCreated(){ #ifdef WIN32 /* win32 is dodgy here, just use courier new then */ - g_font = glfont_create( "arial 9" ); + g_font = glfont_create( "arial 8" ); #else GtkSettings *settings = gtk_settings_get_default(); gchar *fontname; @@ -3329,92 +3429,6 @@ void Layout_registerPreferencesPage(){ PreferencesDialog_addInterfacePage( FreeCaller1() ); } -void MainFrame_toggleFullscreen(){ - GtkWindow* wnd = MainFrame_getWindow(); - if( gdk_window_get_state( GTK_WIDGET( wnd )->window ) & GDK_WINDOW_STATE_FULLSCREEN ){ - //some portion of buttsex, because gtk_window_unfullscreen doesn't work correctly after calling some modal window - bool maximize = ( gdk_window_get_state( GTK_WIDGET( wnd )->window ) & GDK_WINDOW_STATE_MAXIMIZED ); - gtk_window_unfullscreen( wnd ); - if( maximize ){ - gtk_window_unmaximize( wnd ); - gtk_window_maximize( wnd ); - } - else{ - gtk_window_move( wnd, g_layout_globals.m_position.x, g_layout_globals.m_position.y ); - gtk_window_resize( wnd, g_layout_globals.m_position.w, g_layout_globals.m_position.h ); - } - } - else{ - gtk_window_fullscreen( wnd ); - } -} - -class MaximizeView -{ -public: - MaximizeView(): m_maximized( false ){ - } - void toggle(){ - return m_maximized ? restore() : maximize(); - } -private: - bool m_maximized; - int m_vSplitPos; - int m_vSplit2Pos; - int m_hSplitPos; - - void restore(){ - m_maximized = false; - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit ), m_vSplitPos ); - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit2 ), m_vSplit2Pos ); - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_hSplit ), m_hSplitPos ); - } - - void maximize(){ - m_maximized = true; - m_vSplitPos = gtk_paned_get_position( GTK_PANED( g_pParentWnd->m_vSplit ) ); - m_vSplit2Pos = gtk_paned_get_position( GTK_PANED( g_pParentWnd->m_vSplit2 ) ); - m_hSplitPos = gtk_paned_get_position( GTK_PANED( g_pParentWnd->m_hSplit ) ); - - int vSplitX, vSplitY, vSplit2X, vSplit2Y, hSplitX, hSplitY; - gdk_window_get_origin( g_pParentWnd->m_vSplit->window, &vSplitX, &vSplitY ); - gdk_window_get_origin( g_pParentWnd->m_vSplit2->window, &vSplit2X, &vSplit2Y ); - gdk_window_get_origin( g_pParentWnd->m_hSplit->window, &hSplitX, &hSplitY ); - - vSplitY += m_vSplitPos; - vSplit2Y += m_vSplit2Pos; - hSplitX += m_hSplitPos; - - int cur_x, cur_y; - Sys_GetCursorPos( MainFrame_getWindow(), &cur_x, &cur_y ); - - if( cur_x > hSplitX ){ - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_hSplit ), 0 ); - } - else{ - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_hSplit ), 9999 ); - } - if( cur_y > vSplitY ){ - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit ), 0 ); - } - else{ - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit ), 9999 ); - } - if( cur_y > vSplit2Y ){ - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit2 ), 0 ); - } - else{ - gtk_paned_set_position( GTK_PANED( g_pParentWnd->m_vSplit2 ), 9999 ); - } - } -}; - -MaximizeView g_maximizeview; - -void Maximize_View(){ - if( g_pParentWnd != 0 && g_pParentWnd->m_vSplit != 0 && g_pParentWnd->m_vSplit2 != 0 && g_pParentWnd->m_hSplit != 0 ) - g_maximizeview.toggle(); -} void FocusAllViews(){ XY_Centralize(); //using centralizing here, not focusing function diff --git a/radiant/map.cpp b/radiant/map.cpp index 93d8a67f..01d9a271 100644 --- a/radiant/map.cpp +++ b/radiant/map.cpp @@ -825,7 +825,8 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const { if( entity->isContainer() ){ ++m_groupents; if( !string_equal_nocase( "func_group", entity->getKeyValue( "classname" ) ) && - !string_equal_nocase( "_decal", entity->getKeyValue( "classname" ) ) ){ + !string_equal_nocase( "_decal", entity->getKeyValue( "classname" ) ) && + !string_equal_nocase( "func_detail", entity->getKeyValue( "classname" ) ) ){ ++m_groupents_ingame; ++m_ents_ingame; } diff --git a/radiant/preferences.cpp b/radiant/preferences.cpp index 78757c39..e838ab8a 100644 --- a/radiant/preferences.cpp +++ b/radiant/preferences.cpp @@ -692,12 +692,17 @@ PreferencesPage createPage( const char* treeName, const char* frameName ){ } }; +#include + GtkWindow* PrefsDlg::BuildDialog(){ PreferencesDialog_addInterfacePreferences( FreeCaller1() ); //Mouse_registerPreferencesPage(); GtkWindow* dialog = create_floating_window( "NetRadiant Preferences", m_parent ); + GtkAccelGroup* accel = gtk_accel_group_new(); + gtk_window_add_accel_group( dialog, accel ); + { GtkWidget* mainvbox = gtk_vbox_new( FALSE, 5 ); gtk_container_add( GTK_CONTAINER( dialog ), mainvbox ); @@ -716,6 +721,7 @@ GtkWindow* PrefsDlg::BuildDialog(){ { GtkButton* button = create_dialog_button( "Cancel", G_CALLBACK( dialog_button_cancel ), &m_modal ); gtk_box_pack_end( GTK_BOX( hbox ), GTK_WIDGET( button ), FALSE, FALSE, 0 ); + gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0 ); } { GtkButton* button = create_dialog_button( "Clean", G_CALLBACK( OnButtonClean ), this ); diff --git a/radiant/texwindow.cpp b/radiant/texwindow.cpp index 650436b7..fd855458 100644 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@ -234,6 +234,7 @@ GtkWidget* m_scr_win_tags; GtkWidget* m_tag_notebook; GtkWidget* m_search_button; GtkWidget* m_shader_info_item; +GtkWidget* m_filter_entry; std::set m_all_tags; GtkListStore* m_all_tags_list; @@ -444,7 +445,7 @@ void Texture_NextPos( TextureBrowser& textureBrowser, TextureLayout& layout, qte textureBrowser.getTextureWH( q, nWidth, nHeight ); if ( layout.current_x + nWidth > textureBrowser.width - 8 && layout.current_row ) { // go to the next row unless the texture is the first on the row layout.current_x = 8; - layout.current_y -= layout.current_row + TextureBrowser_fontHeight( textureBrowser ) + 4;//+4 + layout.current_y -= layout.current_row + TextureBrowser_fontHeight( textureBrowser ) + 5;//+4 layout.current_row = 0; } @@ -476,11 +477,26 @@ bool TextureSearch_IsShown( const char* name ){ } } +bool Texture_filtered( const char* name, TextureBrowser& textureBrowser ){ + const char* filter = gtk_entry_get_text( GTK_ENTRY( textureBrowser.m_filter_entry ) ); + if( string_empty( filter ) ){ + return false; + } + if( string_in_string_nocase( name, filter ) != 0 ){ + return false; + } + return true; +} + CopiedString g_notex; CopiedString g_shadernotex; // if texture_showinuse jump over non in-use textures -bool Texture_IsShown( IShader* shader, bool show_shaders, bool show_textures, bool hideUnused, bool hideNonShadersInCommon ){ +/* +bool show_shaders, bool show_textures, bool hideUnused, bool hideNonShadersInCommon +textureBrowser.m_showShaders, textureBrowser.m_showTextures, textureBrowser.m_hideUnused, textureBrowser.m_hideNonShadersInCommon +*/ +bool Texture_IsShown( IShader* shader, TextureBrowser& textureBrowser ){ // filter notex / shadernotex images if ( g_TextureBrowser_filterNotex && ( string_equal( g_notex.c_str(), shader->getTexture()->name ) || string_equal( g_shadernotex.c_str(), shader->getTexture()->name ) ) ) { return false; @@ -503,19 +519,19 @@ bool Texture_IsShown( IShader* shader, bool show_shaders, bool show_textures, bo return false; } - if ( !show_shaders && !shader->IsDefault() ) { + if ( !textureBrowser.m_showShaders && !shader->IsDefault() ) { return false; } - if ( !show_textures && shader->IsDefault() ) { + if ( !textureBrowser.m_showTextures && shader->IsDefault() ) { return false; } - if ( hideUnused && !shader->IsInUse() ) { + if ( textureBrowser.m_hideUnused && !shader->IsInUse() ) { return false; } - if( hideNonShadersInCommon && shader->IsDefault() && !shader->IsInUse() //&& g_TextureBrowser_currentDirectory != "" + if( textureBrowser.m_hideNonShadersInCommon && shader->IsDefault() && !shader->IsInUse() //&& g_TextureBrowser_currentDirectory != "" && shader_equal_prefix( shader_get_textureName( shader->getName() ), TextureBrowser_getComonShadersDir() ) ){ return false; } @@ -534,6 +550,10 @@ bool Texture_IsShown( IShader* shader, bool show_shaders, bool show_textures, bo } } + if( Texture_filtered( path_get_filename_start( shader->getName() ), textureBrowser ) ){ + return false; + } + return true; } @@ -556,7 +576,7 @@ void TextureBrowser_evaluateHeight( TextureBrowser& textureBrowser ){ { IShader* shader = QERApp_ActiveShaders_IteratorCurrent(); - if ( !Texture_IsShown( shader, textureBrowser.m_showShaders, textureBrowser.m_showTextures, textureBrowser.m_hideUnused, textureBrowser.m_hideNonShadersInCommon ) ) { + if ( !Texture_IsShown( shader, textureBrowser ) ) { continue; } @@ -908,7 +928,7 @@ void TextureBrowser_Focus( TextureBrowser& textureBrowser, const char* name ){ { IShader* shader = QERApp_ActiveShaders_IteratorCurrent(); - if ( !Texture_IsShown( shader, textureBrowser.m_showShaders, textureBrowser.m_showTextures, textureBrowser.m_hideUnused, textureBrowser.m_hideNonShadersInCommon ) ) { + if ( !Texture_IsShown( shader, textureBrowser ) ) { continue; } @@ -952,7 +972,7 @@ IShader* Texture_At( TextureBrowser& textureBrowser, int mx, int my ){ { IShader* shader = QERApp_ActiveShaders_IteratorCurrent(); - if ( !Texture_IsShown( shader, textureBrowser.m_showShaders, textureBrowser.m_showTextures, textureBrowser.m_hideUnused, textureBrowser.m_hideNonShadersInCommon ) ) { + if ( !Texture_IsShown( shader, textureBrowser ) ) { continue; } @@ -1019,8 +1039,10 @@ void TextureBrowser_trackingDelta( int x, int y, unsigned int state, void* data } void TextureBrowser_Tracking_MouseUp( TextureBrowser& textureBrowser ){ - textureBrowser.m_move_started = false; - textureBrowser.m_freezePointer.unfreeze_pointer( textureBrowser.m_parent, false ); + if( textureBrowser.m_move_started ){ + textureBrowser.m_move_started = false; + textureBrowser.m_freezePointer.unfreeze_pointer( textureBrowser.m_parent, false ); + } } void TextureBrowser_Tracking_MouseDown( TextureBrowser& textureBrowser ){ @@ -1100,7 +1122,7 @@ void Texture_Draw( TextureBrowser& textureBrowser ){ { IShader* shader = QERApp_ActiveShaders_IteratorCurrent(); - if ( !Texture_IsShown( shader, textureBrowser.m_showShaders, textureBrowser.m_showTextures, textureBrowser.m_hideUnused, textureBrowser.m_hideNonShadersInCommon ) ) { + if ( !Texture_IsShown( shader, textureBrowser ) ) { continue; } @@ -1242,7 +1264,7 @@ void Texture_Draw( TextureBrowser& textureBrowser ){ glDisable( GL_TEXTURE_2D ); glColor3f( 1,1,1 ); - glRasterPos2i( x, y - TextureBrowser_fontHeight( textureBrowser ) + 2 );//+5 + glRasterPos2i( x, y - TextureBrowser_fontHeight( textureBrowser ) + 3 );//+5 // don't draw the directory name const char* name = shader->getName(); @@ -1676,6 +1698,7 @@ void TextureBrowser_createTreeViewTree(){ g_signal_connect( g_TextureBrowser.m_treeViewTree, "row-activated", (GCallback) TreeView_onRowActivated, NULL ); renderer = gtk_cell_renderer_text_new(); + //g_object_set( G_OBJECT( renderer ), "ellipsize", PANGO_ELLIPSIZE_START, NULL ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW( g_TextureBrowser.m_treeViewTree ), -1, "", renderer, "text", 0, NULL ); TextureBrowser_constructTreeStore(); @@ -2087,6 +2110,11 @@ void TextureBrowser_SetNotex(){ g_shadernotex = name.c_str(); } +void TextureBrowser_filterChanged( GtkEditable *editable, TextureBrowser* textureBrowser ){ + TextureBrowser_heightChanged( *textureBrowser ); + textureBrowser->m_originInvalid = true; +} + GtkWidget* TextureBrowser_constructWindow( GtkWindow* toplevel ){ // The gl_widget and the tag assignment frame should be packed into a GtkVPaned with the slider // position stored in local.pref. gtk_paned_get_position() and gtk_paned_set_position() don't @@ -2154,6 +2182,13 @@ GtkWidget* TextureBrowser_constructWindow( GtkWindow* toplevel ){ //gtk_table_attach( GTK_TABLE( table ), menu_bar, 0, 3, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0 ); //gtk_widget_show( menu_bar ); } + {//filter entry + GtkWidget* entry = gtk_entry_new(); + gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( entry ), FALSE, FALSE, 0 ); + gtk_widget_show( entry ); + g_TextureBrowser.m_filter_entry = entry; + g_signal_connect( G_OBJECT( entry ), "changed", G_CALLBACK( TextureBrowser_filterChanged ), &g_TextureBrowser ); + } { // Texture TreeView g_TextureBrowser.m_scr_win_tree = gtk_scrolled_window_new( NULL, NULL ); gtk_container_set_border_width( GTK_CONTAINER( g_TextureBrowser.m_scr_win_tree ), 0 ); diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index 341eeb30..52929bdf 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -138,8 +138,8 @@ void ClipPoint::Draw( const char *label, float scale ){ // draw label glRasterPos3f( m_ptClip[0] + offset, m_ptClip[1] + offset, m_ptClip[2] + offset ); - //glCallLists( GLsizei( strlen( label ) ), GL_UNSIGNED_BYTE, label ); //fails with GCC - //glCallLists( GLsizei( strlen( label ) ), GL_UNSIGNED_BYTE, reinterpret_cast( label ) ); //worx + //glCallLists( GLsizei( strlen( label ) ), GL_UNSIGNED_BYTE, label ); //fails //new font rendering? + //glCallLists( GLsizei( strlen( label ) ), GL_UNSIGNED_BYTE, reinterpret_cast( label ) ); //worx :o GlobalOpenGL().drawString( label ); } @@ -2594,6 +2594,9 @@ void XYWnd::XY_Draw(){ glClear( GL_COLOR_BUFFER_BIT ); + extern void Renderer_ResetStats(); + Renderer_ResetStats(); + // // set up viewpoint // @@ -2763,6 +2766,22 @@ void XYWnd::XY_Draw(){ } } + + if( g_camwindow_globals.m_showStats ){ + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glOrtho( 0, m_nWidth, 0, m_nHeight, 0, 1 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + glColor3fv( vector3_to_array( g_xywindow_globals.color_viewname ) ); + + glRasterPos3f( 2.f, GlobalOpenGL().m_font->getPixelDescent() + 1.f, 0.0f ); + extern const char* Renderer_GetStats(); + GlobalOpenGL().drawString( Renderer_GetStats() ); + } + GlobalOpenGL_debugAssertNoErrors(); glFinish();