refactor and fix filterbar

This commit is contained in:
Garux 2020-05-22 00:23:41 +03:00
parent 95809d79f5
commit d46aaf514d

View File

@ -15,15 +15,6 @@
#include "entity.h" #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 ){ CopiedString GetCommonShader( const char* name ){
StringOutputStream sstream( 128 ); StringOutputStream sstream( 128 );
sstream << "shader_" << name; sstream << "shader_" << name;
@ -48,213 +39,115 @@ void SetCommonShader( const char* name ){
Select_SetShader( GetCommonShader( name ).c_str() ); Select_SetShader( GetCommonShader( name ).c_str() );
} }
const char* g_caulk_shader = 0;
const char* GetCaulkShader(){ const char* GetCaulkShader(){
if( !g_caulk_shader ){ static const char* caulk_shader = string_clone( GetCommonShader( "caulk" ).c_str() );
g_caulk_shader = strdup( GetCommonShader( "caulk" ).c_str() ); return caulk_shader;
}
return g_caulk_shader;
} }
gboolean Translucent_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ class CommonFunc
{
const std::vector<const char*> m_funcStrings;
public:
CommonFunc( GtkToggleToolButton* button, const std::vector<const char*>&& funcStrings ) : m_funcStrings( funcStrings ){
g_signal_connect( G_OBJECT( gtk_bin_get_child( GTK_BIN( button ) ) ), "button_press_event", G_CALLBACK( texFunc ), this );
}
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 );
}
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;
}
static gboolean texFunc( GtkWidget *widget, GdkEventButton *event, gpointer data ){
CommonFunc* self = reinterpret_cast<CommonFunc*>( data );
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
if ( ButtonNum == 1 ){ if ( m_recentFunc != self ){
ToggleActions %= 2; m_toggleFuncNum = 0;
m_recentFunc = self;
} }
else{ else{
ToggleActions = 0; m_toggleFuncNum %= self->m_funcStrings.size();
ButtonNum = 1;
} }
if( ToggleActions == 0 ){
SetCommonShader( "nodraw" ); SetCommonShader( self->m_funcStrings[m_toggleFuncNum] );
} ++m_toggleFuncNum;
else if( ToggleActions == 1 ){
SetCommonShader( "nodrawnonsolid" );
}
ToggleActions++;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
static gboolean commandFunc( GtkWidget *widget, GdkEventButton *event, gpointer data ){
CommonFunc* self = reinterpret_cast<CommonFunc*>( data );
gboolean Caulk_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
SetCommonShader( "caulk" ); GlobalCommands_find( self->m_funcStrings[0] ).m_callback();
ToggleActions = 0; m_toggleFuncNum = 0;
m_recentFunc = self;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
};
gboolean Clip_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ std::size_t CommonFunc::m_toggleFuncNum = 0;
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { CommonFunc* CommonFunc::m_recentFunc = nullptr;
if ( ButtonNum == 3 ){
ToggleActions %= 2;
}
else{
ToggleActions = 0;
ButtonNum = 3;
}
if( ToggleActions == 0 ){
SetCommonShader( "clip" );
}
else if( ToggleActions == 1 ){
SetCommonShader( "weapclip" );
}
ToggleActions++;
return TRUE;
}
return FALSE;
}
gboolean Liquids_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ static std::list<CommonFunc> g_commonFuncs;
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
if ( ButtonNum == 4 ){
ToggleActions %= 3;
}
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;
}
gboolean Hint_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
if ( ButtonNum == 5 ){
ToggleActions %= 3;
}
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;
}
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 ){ gboolean Func_Groups_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
Entity_createFromSelection( "func_group", g_vector3_identity ); Entity_createFromSelection( "func_group", g_vector3_identity );
ToggleActions = 0; CommonFunc::m_toggleFuncNum = 0;
return TRUE; return TRUE;
} }
return FALSE; 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* create_filter_toolbar(){
GtkToolbar* toolbar = toolbar_new(); GtkToolbar* toolbar = toolbar_new();
g_signal_connect( G_OBJECT( toolbar ), "enter_notify_event", G_CALLBACK( ToggleActions0 ), 0 ); 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" ); 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 ); g_commonFuncs.emplace_back( button, "MakeStructural" );
button = toolbar_append_toggle_button( toolbar, "Details (CTRL + D)\nRightClick: MakeDetail", "f-details.png", "FilterDetails" ); 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 ); g_commonFuncs.emplace_back( button, "MakeDetail" );
button = toolbar_append_toggle_button( toolbar, "Func_Groups\nRightClick: create func_group", "f-funcgroups.png", "FilterFuncGroups" ); 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 ); 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_toggle_button( toolbar, "Patches (CTRL + P)", "patch_wireframe.png", "FilterPatches" );
toolbar_append_space( toolbar ); toolbar_append_space( toolbar );
// if ( g_pGameDescription->mGameType == "doom3" ) { // 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" ); // button = toolbar_append_toggle_button( toolbar, "Visportals (ALT + 3)", "f-areaportal.png", "FilterVisportals" );
// } // }
// else{ // else{
// button = toolbar_append_toggle_button( toolbar, "Areaportals (ALT + 3)\nRightClick: toggle tex\n\tnoDraw\n\tnoDrawNonSolid", "f-areaportal.png", "FilterAreaportals" ); // button = toolbar_append_toggle_button( toolbar, "Areaportals (ALT + 3)", "f-areaportal.png", "FilterAreaportals" );
// } // }
// g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( Translucent_button_press ), 0 );
button = toolbar_append_toggle_button( toolbar, "Translucent (ALT + 4)\nRightClick: toggle tex\n\tnoDraw\n\tnoDrawNonSolid", "f-translucent.png", "FilterTranslucent" ); 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 ); g_commonFuncs.emplace_back( button, std::vector<const char*>{ "nodraw", "nodrawnonsolid" } );
button = toolbar_append_toggle_button( toolbar, "Liquids (ALT + 5)\nRightClick: toggle tex\n\twaterCaulk\n\tlavaCaulk\n\tslimeCaulk", "f-liquids.png", "FilterLiquids" ); 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 ); g_commonFuncs.emplace_back( button, std::vector<const char*>{ "watercaulk", "lavacaulk", "slimecaulk" } );
button = toolbar_append_toggle_button( toolbar, "Caulk (ALT + 6)\nRightClick: tex Caulk", "f-caulk.png", "FilterCaulk" ); 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 ); g_commonFuncs.emplace_back( button, std::vector<const char*>{ "caulk" } );
button = toolbar_append_toggle_button( toolbar, "Clips (ALT + 7)\nRightClick: toggle tex\n\tplayerClip\n\tweapClip", "f-clip.png", "FilterClips" ); 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 ); g_commonFuncs.emplace_back( button, std::vector<const char*>{ "clip", "weapclip" } );
button = toolbar_append_toggle_button( toolbar, "HintsSkips (CTRL + H)\nRightClick: toggle tex\n\thint\n\thintLocal\n\thintSkip", "f-hint.png", "FilterHintsSkips" ); 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 ); g_commonFuncs.emplace_back( button, std::vector<const char*>{ "hint", "hintlocal", "hintskip" } );
//toolbar_append_toggle_button( toolbar, "Paths (ALT + 8)", "texture_lock.png", "FilterPaths" ); //toolbar_append_toggle_button( toolbar, "Paths (ALT + 8)", "texture_lock.png", "FilterPaths" );
toolbar_append_space( toolbar ); toolbar_append_space( toolbar );
@ -263,7 +156,7 @@ GtkToolbar* create_filter_toolbar(){
toolbar_append_toggle_button( toolbar, "Models (SHIFT + M)", "f-models.png", "FilterModels" ); 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" ); 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 ); g_commonFuncs.emplace_back( button, std::vector<const char*>{ "trigger" } );
//toolbar_append_toggle_button( toolbar, "Decals (SHIFT + D)", "f-decals.png", "FilterDecals" ); //toolbar_append_toggle_button( toolbar, "Decals (SHIFT + D)", "f-decals.png", "FilterDecals" );
toolbar_append_space( toolbar ); toolbar_append_space( toolbar );
@ -273,10 +166,10 @@ GtkToolbar* create_filter_toolbar(){
toolbar_append_space( toolbar ); toolbar_append_space( toolbar );
button = toolbar_append_toggle_button( toolbar, "Region Set Selection (CTRL + SHIFT + R)\nRightClick: Region Off", "f-region.png", "RegionSetSelection" ); 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 ); g_commonFuncs.emplace_back( button, "RegionOff" );
button = toolbar_append_toggle_button( toolbar, "Hide Selected (H)\nRightClick: Show Hidden (SHIFT + H)", "f-hide.png", "HideSelected" ); 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 ); g_commonFuncs.emplace_back( button, "ShowHidden" );
return toolbar; return toolbar;
} }