From d46aaf514da7bda009ca231e3f28bd842539e5f0 Mon Sep 17 00:00:00 2001 From: Garux Date: Fri, 22 May 2020 00:23:41 +0300 Subject: [PATCH] refactor and fix filterbar --- radiant/filterbar.cpp | 287 +++++++++++++----------------------------- 1 file changed, 90 insertions(+), 197 deletions(-) diff --git a/radiant/filterbar.cpp b/radiant/filterbar.cpp index 07dab671..632e7d6f 100644 --- a/radiant/filterbar.cpp +++ b/radiant/filterbar.cpp @@ -15,15 +15,6 @@ #include "entity.h" -int ToggleActions = 0; -int ButtonNum = 0; - -gboolean ToggleActions0( GtkWidget *widget, GdkEvent *event, gpointer user_data ){ - ToggleActions = 0; - return FALSE; - //globalOutputStream() << "ToggleActions\n"; -} - CopiedString GetCommonShader( const char* name ){ StringOutputStream sstream( 128 ); sstream << "shader_" << name; @@ -48,235 +39,137 @@ void SetCommonShader( const char* name ){ Select_SetShader( GetCommonShader( name ).c_str() ); } -const char* g_caulk_shader = 0; const char* GetCaulkShader(){ - if( !g_caulk_shader ){ - g_caulk_shader = strdup( GetCommonShader( "caulk" ).c_str() ); - } - return g_caulk_shader; + static const char* caulk_shader = string_clone( GetCommonShader( "caulk" ).c_str() ); + return caulk_shader; } -gboolean Translucent_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - if ( ButtonNum == 1 ){ - ToggleActions %= 2; - } - else{ - ToggleActions = 0; - ButtonNum = 1; - } - if( ToggleActions == 0 ){ - SetCommonShader( "nodraw" ); - } - else if( ToggleActions == 1 ){ - SetCommonShader( "nodrawnonsolid" ); - } - ToggleActions++; - return TRUE; +class CommonFunc +{ + const std::vector m_funcStrings; +public: + CommonFunc( GtkToggleToolButton* button, const std::vector&& funcStrings ) : m_funcStrings( funcStrings ){ + g_signal_connect( G_OBJECT( gtk_bin_get_child( GTK_BIN( button ) ) ), "button_press_event", G_CALLBACK( texFunc ), this ); } - return FALSE; -} - - -gboolean Caulk_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - SetCommonShader( "caulk" ); - ToggleActions = 0; - return TRUE; + CommonFunc( GtkToggleToolButton* button, const char* funcStrings ) : m_funcStrings( 1, funcStrings ){ + g_signal_connect( G_OBJECT( gtk_bin_get_child( GTK_BIN( button ) ) ), "button_press_event", G_CALLBACK( commandFunc ), this ); } - return FALSE; -} - -gboolean Clip_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - if ( ButtonNum == 3 ){ - ToggleActions %= 2; - } - else{ - ToggleActions = 0; - ButtonNum = 3; - } - if( ToggleActions == 0 ){ - SetCommonShader( "clip" ); - } - else if( ToggleActions == 1 ){ - SetCommonShader( "weapclip" ); - } - ToggleActions++; - return TRUE; + static std::size_t m_toggleFuncNum; + static CommonFunc* m_recentFunc; + static gboolean resetToggleFuncNum( GtkWidget *widget, GdkEvent *event, gpointer user_data ){ + m_toggleFuncNum = 0; + // globalOutputStream() << "resetToggleFuncNum\n"; + return FALSE; } - return FALSE; -} + static gboolean texFunc( GtkWidget *widget, GdkEventButton *event, gpointer data ){ + CommonFunc* self = reinterpret_cast( data ); + if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { + if ( m_recentFunc != self ){ + m_toggleFuncNum = 0; + m_recentFunc = self; + } + else{ + m_toggleFuncNum %= self->m_funcStrings.size(); + } -gboolean Liquids_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - if ( ButtonNum == 4 ){ - ToggleActions %= 3; + SetCommonShader( self->m_funcStrings[m_toggleFuncNum] ); + ++m_toggleFuncNum; + return TRUE; } - else{ - ToggleActions = 0; - ButtonNum = 4; - } - if( ToggleActions == 0 ){ - SetCommonShader( "watercaulk" ); - } - else if( ToggleActions == 1 ){ - SetCommonShader( "lavacaulk" ); - } - else if( ToggleActions == 2 ){ - SetCommonShader( "slimecaulk" ); - } - ToggleActions++; - return TRUE; + return FALSE; } - return FALSE; -} - - -gboolean Hint_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - if ( ButtonNum == 5 ){ - ToggleActions %= 3; + static gboolean commandFunc( GtkWidget *widget, GdkEventButton *event, gpointer data ){ + CommonFunc* self = reinterpret_cast( data ); + if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { + GlobalCommands_find( self->m_funcStrings[0] ).m_callback(); + m_toggleFuncNum = 0; + m_recentFunc = self; + return TRUE; } - else{ - ToggleActions = 0; - ButtonNum = 5; - } - if( ToggleActions == 0 ){ - SetCommonShader( "hint" ); - } - else if( ToggleActions == 1 ){ - SetCommonShader( "hintlocal" ); - } - else if( ToggleActions == 2 ){ - SetCommonShader( "hintskip" ); - } - ToggleActions++; - return TRUE; + return FALSE; } - return FALSE; -} +}; + +std::size_t CommonFunc::m_toggleFuncNum = 0; +CommonFunc* CommonFunc::m_recentFunc = nullptr; + +static std::list g_commonFuncs; -gboolean Trigger_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - SetCommonShader( "trigger" ); - ToggleActions = 0; - return TRUE; - } - return FALSE; -} gboolean Func_Groups_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { Entity_createFromSelection( "func_group", g_vector3_identity ); - ToggleActions = 0; + CommonFunc::m_toggleFuncNum = 0; return TRUE; } return FALSE; } -gboolean Detail_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - GlobalCommands_find( "MakeDetail" ).m_callback(); - ToggleActions = 0; - return TRUE; - } - return FALSE; -} - -gboolean Structural_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - GlobalCommands_find( "MakeStructural" ).m_callback(); - ToggleActions = 0; - return TRUE; - } - return FALSE; -} - -gboolean Region_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - GlobalCommands_find( "RegionOff" ).m_callback(); - ToggleActions = 0; - return TRUE; - } - return FALSE; -} - -gboolean Hide_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ - if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { - GlobalCommands_find( "ShowHidden" ).m_callback(); - ToggleActions = 0; - return TRUE; - } - return FALSE; -} GtkToolbar* create_filter_toolbar(){ - GtkToolbar* toolbar = toolbar_new(); - g_signal_connect( G_OBJECT( toolbar ), "enter_notify_event", G_CALLBACK( ToggleActions0 ), 0 ); + GtkToolbar* toolbar = toolbar_new(); + g_signal_connect( G_OBJECT( toolbar ), "enter_notify_event", G_CALLBACK( CommonFunc::resetToggleFuncNum ), 0 ); - GtkToggleToolButton* button; + GtkToggleToolButton* button; - toolbar_append_toggle_button( toolbar, "World (ALT + 1)", "f-world.png", "FilterWorldBrushes" ); + toolbar_append_toggle_button( toolbar, "World (ALT + 1)", "f-world.png", "FilterWorldBrushes" ); - button = toolbar_append_toggle_button( toolbar, "Structural (CTRL + SHIFT + D)\nRightClick: MakeStructural", "f-structural.png", "FilterStructural" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Structural_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Structural (CTRL + SHIFT + D)\nRightClick: MakeStructural", "f-structural.png", "FilterStructural" ); + g_commonFuncs.emplace_back( button, "MakeStructural" ); - button = toolbar_append_toggle_button( toolbar, "Details (CTRL + D)\nRightClick: MakeDetail", "f-details.png", "FilterDetails" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Detail_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Details (CTRL + D)\nRightClick: MakeDetail", "f-details.png", "FilterDetails" ); + g_commonFuncs.emplace_back( button, "MakeDetail" ); - button = toolbar_append_toggle_button( toolbar, "Func_Groups\nRightClick: create func_group", "f-funcgroups.png", "FilterFuncGroups" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Func_Groups_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Func_Groups\nRightClick: create func_group", "f-funcgroups.png", "FilterFuncGroups" ); + g_signal_connect( G_OBJECT( gtk_bin_get_child( GTK_BIN( button ) ) ), "button_press_event", G_CALLBACK( Func_Groups_button_press ), 0 ); - toolbar_append_toggle_button( toolbar, "Patches (CTRL + P)", "patch_wireframe.png", "FilterPatches" ); - toolbar_append_space( toolbar ); + toolbar_append_toggle_button( toolbar, "Patches (CTRL + P)", "patch_wireframe.png", "FilterPatches" ); + toolbar_append_space( toolbar ); -// if ( g_pGameDescription->mGameType == "doom3" ) { -// button = toolbar_append_toggle_button( toolbar, "Visportals (ALT + 3)\nRightClick: toggle tex\n\tnoDraw\n\tnoDrawNonSolid", "f-areaportal.png", "FilterVisportals" ); -// } -// else{ -// button = toolbar_append_toggle_button( toolbar, "Areaportals (ALT + 3)\nRightClick: toggle tex\n\tnoDraw\n\tnoDrawNonSolid", "f-areaportal.png", "FilterAreaportals" ); -// } -// g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Translucent_button_press ), 0 ); +// if ( g_pGameDescription->mGameType == "doom3" ) { +// button = toolbar_append_toggle_button( toolbar, "Visportals (ALT + 3)", "f-areaportal.png", "FilterVisportals" ); +// } +// else{ +// button = toolbar_append_toggle_button( toolbar, "Areaportals (ALT + 3)", "f-areaportal.png", "FilterAreaportals" ); +// } + button = toolbar_append_toggle_button( toolbar, "Translucent (ALT + 4)\nRightClick: toggle tex\n\tnoDraw\n\tnoDrawNonSolid", "f-translucent.png", "FilterTranslucent" ); + g_commonFuncs.emplace_back( button, std::vector{ "nodraw", "nodrawnonsolid" } ); - button = toolbar_append_toggle_button( toolbar, "Translucent (ALT + 4)\nRightClick: toggle tex\n\tnoDraw\n\tnoDrawNonSolid", "f-translucent.png", "FilterTranslucent" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Translucent_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Liquids (ALT + 5)\nRightClick: toggle tex\n\twaterCaulk\n\tlavaCaulk\n\tslimeCaulk", "f-liquids.png", "FilterLiquids" ); + g_commonFuncs.emplace_back( button, std::vector{ "watercaulk", "lavacaulk", "slimecaulk" } ); - button = toolbar_append_toggle_button( toolbar, "Liquids (ALT + 5)\nRightClick: toggle tex\n\twaterCaulk\n\tlavaCaulk\n\tslimeCaulk", "f-liquids.png", "FilterLiquids" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Liquids_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Caulk (ALT + 6)\nRightClick: tex Caulk", "f-caulk.png", "FilterCaulk" ); + g_commonFuncs.emplace_back( button, std::vector{ "caulk" } ); - button = toolbar_append_toggle_button( toolbar, "Caulk (ALT + 6)\nRightClick: tex Caulk", "f-caulk.png", "FilterCaulk" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Caulk_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Clips (ALT + 7)\nRightClick: toggle tex\n\tplayerClip\n\tweapClip", "f-clip.png", "FilterClips" ); + g_commonFuncs.emplace_back( button, std::vector{ "clip", "weapclip" } ); - button = toolbar_append_toggle_button( toolbar, "Clips (ALT + 7)\nRightClick: toggle tex\n\tplayerClip\n\tweapClip", "f-clip.png", "FilterClips" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Clip_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "HintsSkips (CTRL + H)\nRightClick: toggle tex\n\thint\n\thintLocal\n\thintSkip", "f-hint.png", "FilterHintsSkips" ); + g_commonFuncs.emplace_back( button, std::vector{ "hint", "hintlocal", "hintskip" } ); - button = toolbar_append_toggle_button( toolbar, "HintsSkips (CTRL + H)\nRightClick: toggle tex\n\thint\n\thintLocal\n\thintSkip", "f-hint.png", "FilterHintsSkips" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Hint_button_press ), 0 ); + //toolbar_append_toggle_button( toolbar, "Paths (ALT + 8)", "texture_lock.png", "FilterPaths" ); + toolbar_append_space( toolbar ); + toolbar_append_toggle_button( toolbar, "Entities (ALT + 2)", "f-entities.png", "FilterEntities" ); + toolbar_append_toggle_button( toolbar, "Lights (ALT + 0)", "f-lights.png", "FilterLights" ); + toolbar_append_toggle_button( toolbar, "Models (SHIFT + M)", "f-models.png", "FilterModels" ); - //toolbar_append_toggle_button( toolbar, "Paths (ALT + 8)", "texture_lock.png", "FilterPaths" ); - toolbar_append_space( toolbar ); - toolbar_append_toggle_button( toolbar, "Entities (ALT + 2)", "f-entities.png", "FilterEntities" ); - toolbar_append_toggle_button( toolbar, "Lights (ALT + 0)", "f-lights.png", "FilterLights" ); - toolbar_append_toggle_button( toolbar, "Models (SHIFT + M)", "f-models.png", "FilterModels" ); + button = toolbar_append_toggle_button( toolbar, "Triggers (CTRL + SHIFT + T)\nRightClick: tex Trigger", "f-triggers.png", "FilterTriggers" ); + g_commonFuncs.emplace_back( button, std::vector{ "trigger" } ); - button = toolbar_append_toggle_button( toolbar, "Triggers (CTRL + SHIFT + T)\nRightClick: tex Trigger", "f-triggers.png", "FilterTriggers" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Trigger_button_press ), 0 ); + //toolbar_append_toggle_button( toolbar, "Decals (SHIFT + D)", "f-decals.png", "FilterDecals" ); + toolbar_append_space( toolbar ); + //toolbar_append_button( toolbar, "InvertFilters", "f-invert.png", "InvertFilters" ); - //toolbar_append_toggle_button( toolbar, "Decals (SHIFT + D)", "f-decals.png", "FilterDecals" ); - toolbar_append_space( toolbar ); - //toolbar_append_button( toolbar, "InvertFilters", "f-invert.png", "InvertFilters" ); + toolbar_append_button( toolbar, "ResetFilters", "f-reset.png", "ResetFilters" ); - toolbar_append_button( toolbar, "ResetFilters", "f-reset.png", "ResetFilters" ); + toolbar_append_space( toolbar ); + button = toolbar_append_toggle_button( toolbar, "Region Set Selection (CTRL + SHIFT + R)\nRightClick: Region Off", "f-region.png", "RegionSetSelection" ); + g_commonFuncs.emplace_back( button, "RegionOff" ); - toolbar_append_space( toolbar ); - button = toolbar_append_toggle_button( toolbar, "Region Set Selection (CTRL + SHIFT + R)\nRightClick: Region Off", "f-region.png", "RegionSetSelection" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Region_button_press ), 0 ); + button = toolbar_append_toggle_button( toolbar, "Hide Selected (H)\nRightClick: Show Hidden (SHIFT + H)", "f-hide.png", "HideSelected" ); + g_commonFuncs.emplace_back( button, "ShowHidden" ); - button = toolbar_append_toggle_button( toolbar, "Hide Selected (H)\nRightClick: Show Hidden (SHIFT + H)", "f-hide.png", "HideSelected" ); - g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Hide_button_press ), 0 ); - - return toolbar; + return toolbar; }