From 58c08c71e3b94189922c5b77459c54024f3116f7 Mon Sep 17 00:00:00 2001 From: Bitl Date: Wed, 15 Feb 2023 18:37:52 -0700 Subject: [PATCH 1/3] add really experimental string support --- src/game/gamepadui/gamepadui_options.cpp | 56 ++++++++++++++++++++---- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/game/gamepadui/gamepadui_options.cpp b/src/game/gamepadui/gamepadui_options.cpp index f086da2..57a9575 100644 --- a/src/game/gamepadui/gamepadui_options.cpp +++ b/src/game/gamepadui/gamepadui_options.cpp @@ -167,6 +167,7 @@ struct GamepadUIOption { int nWidth; int nHeight; + const char* strVal; }; void *pData; } userdata; @@ -353,9 +354,10 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton public: DECLARE_CLASS_SIMPLE( GamepadUIWheelyWheel, GamepadUIConvarButton ); - GamepadUIWheelyWheel( const char *pszCvar, const char *pszCvarDepends, bool bInstantApply, bool bSignOnly, vgui::Panel* pParent, vgui::Panel* pActionSignalTarget, const char *pSchemeFile, const char* pCommand, const char *pText, const char *pDescription ) + GamepadUIWheelyWheel( const char *pszCvar, const char *pszCvarDepends, bool bInstantApply, bool bSignOnly, bool bUsesString, vgui::Panel* pParent, vgui::Panel* pActionSignalTarget, const char *pSchemeFile, const char* pCommand, const char *pText, const char *pDescription ) : BaseClass( pszCvar, pszCvarDepends, bInstantApply, pParent, pActionSignalTarget, pSchemeFile, pCommand, pText, pDescription ) , m_bSignOnly( bSignOnly ) + , m_bUsesString( bUsesString ) { } @@ -400,6 +402,8 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton { if ( m_bSignOnly ) m_cvar.SetValue( abs( m_cvar.GetFloat() ) * m_Options[m_nSelectedItem].nValue ); + else if (m_bUsesString) + m_cvar.SetValue(m_Options[m_nSelectedItem].userdata.strVal); else m_cvar.SetValue( m_Options[ m_nSelectedItem ].nValue ); } @@ -408,7 +412,18 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton bool IsDirty() OVERRIDE { - return m_cvar.IsValid() && GetCvarValue() != m_Options[m_nSelectedItem].nValue; + bool dirty = false; + + if (m_bUsesString) + { + dirty = V_strcmp(m_Options[m_nSelectedItem].userdata.strVal, m_cvar.GetString()); + } + else + { + dirty = GetCvarValue() != m_Options[m_nSelectedItem].nValue; + } + + return m_cvar.IsValid() && dirty; } virtual void Paint() @@ -470,13 +485,25 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton { if ( m_cvar.IsValid() ) { - const int nCurrentValue = GetCvarValue(); - for ( int i = 0; i < m_Options.Count(); i++) + if (m_bUsesString) { - if ( m_Options[ i ].nValue == nCurrentValue ) - m_nSelectedItem = i; + const char *sCurrentValue = m_cvar.GetString(); + for (int i = 0; i < m_Options.Count(); i++) + { + if (!V_strcmp(m_Options[i].userdata.strVal,sCurrentValue)) + m_nSelectedItem = i; + } } - } + else + { + const int nCurrentValue = GetCvarValue(); + for ( int i = 0; i < m_Options.Count(); i++) + { + if ( m_Options[ i ].nValue == nCurrentValue ) + m_nSelectedItem = i; + } + } + } } GamepadUIOption *GetOption( int nIndex ) @@ -494,6 +521,7 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton private: bool m_bSignOnly = false; + bool m_bUsesString = false; int m_nSelectedItem = 0; CUtlVector< GamepadUIOption > m_Options; @@ -1825,8 +1853,9 @@ void GamepadUIOptionsPanel::LoadOptionTabs( const char *pszOptionsFile ) const char *pszCvarDepends = pItemData->GetString( "depends_on" ); bool bInstantApply = pItemData->GetBool( "instantapply" ); bool bSignOnly = pItemData->GetBool( "signonly" ); + bool bUsesString = pItemData->GetBool("usesstring"); auto button = new GamepadUIWheelyWheel( - pszCvar, pszCvarDepends, bInstantApply, bSignOnly, + pszCvar, pszCvarDepends, bInstantApply, bSignOnly, bUsesString, this, this, GAMEPADUI_RESOURCE_FOLDER "schemeoptions_wheelywheel.res", "button_pressed", @@ -1839,7 +1868,16 @@ void GamepadUIOptionsPanel::LoadOptionTabs( const char *pszOptionsFile ) for ( KeyValues* pOptionData = pOptions->GetFirstSubKey(); pOptionData != NULL; pOptionData = pOptionData->GetNextKey() ) { GamepadUIOption option; - option.nValue = V_atoi( pOptionData->GetName() ); + if (bUsesString) + { + option.userdata.strVal = pOptionData->GetName(); + option.nValue = 0; + } + else + { + option.nValue = V_atoi( pOptionData->GetName() ); + } + option.strOptionText = GamepadUIString( pOptionData->GetString() ); button->AddOptionItem( option ); } From 0433735cd42b0a4929e5916174fdd4a35988d55f Mon Sep 17 00:00:00 2001 From: Bitl Date: Wed, 15 Feb 2023 18:47:42 -0700 Subject: [PATCH 2/3] add support for nvalue to be used like a array index. --- src/game/gamepadui/gamepadui_options.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/game/gamepadui/gamepadui_options.cpp b/src/game/gamepadui/gamepadui_options.cpp index 57a9575..0865981 100644 --- a/src/game/gamepadui/gamepadui_options.cpp +++ b/src/game/gamepadui/gamepadui_options.cpp @@ -1865,13 +1865,14 @@ void GamepadUIOptionsPanel::LoadOptionTabs( const char *pszOptionsFile ) KeyValues *pOptions = pItemData->FindKey( "options" ); if ( pOptions ) { + int i = 0; for ( KeyValues* pOptionData = pOptions->GetFirstSubKey(); pOptionData != NULL; pOptionData = pOptionData->GetNextKey() ) { GamepadUIOption option; if (bUsesString) { option.userdata.strVal = pOptionData->GetName(); - option.nValue = 0; + option.nValue = i; } else { @@ -1880,6 +1881,7 @@ void GamepadUIOptionsPanel::LoadOptionTabs( const char *pszOptionsFile ) option.strOptionText = GamepadUIString( pOptionData->GetString() ); button->AddOptionItem( option ); + ++i; } } else if ( pszOptionsFrom && *pszOptionsFrom ) From 03938181870f5fdaf69be284dac337c5a4f8dbc6 Mon Sep 17 00:00:00 2001 From: Bitl Date: Wed, 15 Feb 2023 18:53:55 -0700 Subject: [PATCH 3/3] remove val out of userdata --- src/game/gamepadui/gamepadui_options.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/game/gamepadui/gamepadui_options.cpp b/src/game/gamepadui/gamepadui_options.cpp index 0865981..fbf645f 100644 --- a/src/game/gamepadui/gamepadui_options.cpp +++ b/src/game/gamepadui/gamepadui_options.cpp @@ -160,6 +160,7 @@ struct GamepadUIOption { GamepadUIString strOptionText; int nValue = 0; + const char* sValue = ""; union { @@ -167,7 +168,6 @@ struct GamepadUIOption { int nWidth; int nHeight; - const char* strVal; }; void *pData; } userdata; @@ -403,7 +403,7 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton if ( m_bSignOnly ) m_cvar.SetValue( abs( m_cvar.GetFloat() ) * m_Options[m_nSelectedItem].nValue ); else if (m_bUsesString) - m_cvar.SetValue(m_Options[m_nSelectedItem].userdata.strVal); + m_cvar.SetValue(m_Options[m_nSelectedItem].sValue); else m_cvar.SetValue( m_Options[ m_nSelectedItem ].nValue ); } @@ -416,7 +416,7 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton if (m_bUsesString) { - dirty = V_strcmp(m_Options[m_nSelectedItem].userdata.strVal, m_cvar.GetString()); + dirty = V_strcmp(m_Options[m_nSelectedItem].sValue, m_cvar.GetString()); } else { @@ -490,7 +490,7 @@ class GamepadUIWheelyWheel : public GamepadUIConvarButton const char *sCurrentValue = m_cvar.GetString(); for (int i = 0; i < m_Options.Count(); i++) { - if (!V_strcmp(m_Options[i].userdata.strVal,sCurrentValue)) + if (!V_strcmp(m_Options[i].sValue,sCurrentValue)) m_nSelectedItem = i; } } @@ -1871,7 +1871,7 @@ void GamepadUIOptionsPanel::LoadOptionTabs( const char *pszOptionsFile ) GamepadUIOption option; if (bUsesString) { - option.userdata.strVal = pOptionData->GetName(); + option.sValue = pOptionData->GetName(); option.nValue = i; } else