Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

333 lines
9.2 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //
  7. //=============================================================================//
  8. #include "cvarslider.h"
  9. #include <stdio.h>
  10. #include "tier1/KeyValues.h"
  11. #include "tier1/convar.h"
  12. #include <vgui/IVGui.h>
  13. #include <vgui_controls/PropertyPage.h>
  14. #define CVARSLIDER_SCALE_FACTOR 100.0f
  15. // memdbgon must be the last include file in a .cpp file!!!
  16. #include <tier0/memdbgon.h>
  17. using namespace vgui;
  18. DECLARE_BUILD_FACTORY( CCvarSlider );
  19. //-----------------------------------------------------------------------------
  20. // Purpose:
  21. //-----------------------------------------------------------------------------
  22. CCvarSlider::CCvarSlider( Panel *parent, const char *name ) : Slider( parent, name )
  23. {
  24. SetupSlider( 0, 1, "", false );
  25. m_bCreatedInCode = false;
  26. AddActionSignalTarget( this );
  27. }
  28. //-----------------------------------------------------------------------------
  29. // Purpose:
  30. //-----------------------------------------------------------------------------
  31. CCvarSlider::CCvarSlider( Panel *parent, const char *panelName, char const *caption,
  32. float minValue, float maxValue, char const *cvarname, bool bAllowOutOfRange )
  33. : Slider( parent, panelName )
  34. {
  35. AddActionSignalTarget( this );
  36. SetupSlider( minValue, maxValue, cvarname, bAllowOutOfRange );
  37. // For backwards compatability. Ignore .res file settings for forced setup sliders.
  38. m_bCreatedInCode = true;
  39. }
  40. //-----------------------------------------------------------------------------
  41. // Purpose:
  42. //-----------------------------------------------------------------------------
  43. void CCvarSlider::SetupSlider( float minValue, float maxValue, const char *cvarname, bool bAllowOutOfRange )
  44. {
  45. // make sure min/max don't go outside cvar range if there's one
  46. ConVarRef var( cvarname, true );
  47. if ( var.IsValid() )
  48. {
  49. float flCVarMin;
  50. if ( var.GetMin( flCVarMin ) )
  51. {
  52. minValue = m_bUseConVarMinMax ? flCVarMin : MAX( minValue, flCVarMin );
  53. }
  54. float flCVarMax;
  55. if ( var.GetMax( flCVarMax ) )
  56. {
  57. maxValue = m_bUseConVarMinMax ? flCVarMax : MIN( maxValue, flCVarMax );
  58. }
  59. }
  60. m_flMinValue = minValue;
  61. m_flMaxValue = maxValue;
  62. // scale by CVARSLIDER_SCALE_FACTOR
  63. SetRange( (int)( CVARSLIDER_SCALE_FACTOR * minValue ), (int)( CVARSLIDER_SCALE_FACTOR * maxValue ) );
  64. char szMin[ 32 ];
  65. char szMax[ 32 ];
  66. Q_snprintf( szMin, sizeof( szMin ), "%.2f", minValue );
  67. Q_snprintf( szMax, sizeof( szMax ), "%.2f", maxValue );
  68. SetTickCaptions( szMin, szMax );
  69. Q_strncpy( m_szCvarName, cvarname, sizeof( m_szCvarName ) );
  70. m_bModifiedOnce = false;
  71. m_bAllowOutOfRange = bAllowOutOfRange;
  72. // Set slider to current value
  73. Reset();
  74. }
  75. //-----------------------------------------------------------------------------
  76. // Purpose:
  77. //-----------------------------------------------------------------------------
  78. CCvarSlider::~CCvarSlider()
  79. {
  80. }
  81. //-----------------------------------------------------------------------------
  82. // Purpose:
  83. //-----------------------------------------------------------------------------
  84. void CCvarSlider::ApplySettings( KeyValues *inResourceData )
  85. {
  86. BaseClass::ApplySettings( inResourceData );
  87. if ( !m_bCreatedInCode )
  88. {
  89. float minValue = inResourceData->GetFloat( "minvalue", 0 );
  90. float maxValue = inResourceData->GetFloat( "maxvalue", 1 );
  91. const char *cvarname = inResourceData->GetString( "cvar_name", "" );
  92. bool bAllowOutOfRange = inResourceData->GetInt( "allowoutofrange", 0 ) != 0;
  93. SetupSlider( minValue, maxValue, cvarname, bAllowOutOfRange );
  94. if ( GetParent() )
  95. {
  96. // HACK: If our parent is a property page, we want the dialog containing it
  97. if ( dynamic_cast<vgui::PropertyPage*>(GetParent()) && GetParent()->GetParent() )
  98. {
  99. GetParent()->GetParent()->AddActionSignalTarget( this );
  100. }
  101. else
  102. {
  103. GetParent()->AddActionSignalTarget( this );
  104. }
  105. }
  106. }
  107. }
  108. //-----------------------------------------------------------------------------
  109. // Purpose: Get control settings for editing
  110. //-----------------------------------------------------------------------------
  111. void CCvarSlider::GetSettings( KeyValues *outResourceData )
  112. {
  113. BaseClass::GetSettings(outResourceData);
  114. if ( !m_bCreatedInCode )
  115. {
  116. outResourceData->SetFloat( "minvalue", m_flMinValue );
  117. outResourceData->SetFloat( "maxvalue", m_flMaxValue );
  118. outResourceData->SetString( "cvar_name", m_szCvarName );
  119. outResourceData->SetInt( "allowoutofrange", m_bAllowOutOfRange );
  120. }
  121. }
  122. void CCvarSlider::SetCVarName( char const *cvarname )
  123. {
  124. Q_strncpy( m_szCvarName, cvarname, sizeof( m_szCvarName ) );
  125. m_bModifiedOnce = false;
  126. // Set slider to current value
  127. Reset();
  128. }
  129. void CCvarSlider::SetMinMaxValues( float minValue, float maxValue, bool bSetTickDisplay )
  130. {
  131. SetRange( (int)( CVARSLIDER_SCALE_FACTOR * minValue ), (int)( CVARSLIDER_SCALE_FACTOR * maxValue ) );
  132. if ( bSetTickDisplay )
  133. {
  134. char szMin[ 32 ];
  135. char szMax[ 32 ];
  136. Q_snprintf( szMin, sizeof( szMin ), "%.2f", minValue );
  137. Q_snprintf( szMax, sizeof( szMax ), "%.2f", maxValue );
  138. SetTickCaptions( szMin, szMax );
  139. }
  140. // Set slider to current value
  141. Reset();
  142. }
  143. void CCvarSlider::SetTickColor( Color color )
  144. {
  145. m_TickColor = color;
  146. }
  147. //-----------------------------------------------------------------------------
  148. // Purpose:
  149. //-----------------------------------------------------------------------------
  150. void CCvarSlider::Paint()
  151. {
  152. // Get engine's current value
  153. // float curvalue = engine->pfnGetCvarFloat( m_szCvarName );
  154. ConVarRef var( m_szCvarName, true );
  155. if ( !var.IsValid() )
  156. return;
  157. float curvalue = var.GetFloat();
  158. // did it get changed from under us?
  159. if (curvalue != m_fStartValue)
  160. {
  161. int val = (int)( CVARSLIDER_SCALE_FACTOR * curvalue );
  162. m_fStartValue = curvalue;
  163. m_fCurrentValue = curvalue;
  164. SetValue( val );
  165. m_iStartValue = GetValue();
  166. }
  167. BaseClass::Paint();
  168. }
  169. //-----------------------------------------------------------------------------
  170. // Purpose:
  171. //-----------------------------------------------------------------------------
  172. void CCvarSlider::ApplyChanges()
  173. {
  174. if (m_bModifiedOnce)
  175. {
  176. m_iStartValue = GetValue();
  177. if (m_bAllowOutOfRange)
  178. {
  179. m_fStartValue = m_fCurrentValue;
  180. }
  181. else
  182. {
  183. m_fStartValue = (float) m_iStartValue / CVARSLIDER_SCALE_FACTOR;
  184. }
  185. //engine->Cvar_SetValue( m_szCvarName, m_fStartValue );
  186. ConVarRef var( m_szCvarName, true );
  187. if ( !var.IsValid() )
  188. return;
  189. var.SetValue( (float)m_fStartValue );
  190. }
  191. }
  192. //-----------------------------------------------------------------------------
  193. // Purpose:
  194. //-----------------------------------------------------------------------------
  195. float CCvarSlider::GetSliderValue()
  196. {
  197. if (m_bAllowOutOfRange)
  198. {
  199. return m_fCurrentValue;
  200. }
  201. else
  202. {
  203. return ((float)GetValue())/ CVARSLIDER_SCALE_FACTOR;
  204. }
  205. }
  206. //-----------------------------------------------------------------------------
  207. // Purpose:
  208. //-----------------------------------------------------------------------------
  209. void CCvarSlider::SetSliderValue(float fValue)
  210. {
  211. int nVal = (int)( CVARSLIDER_SCALE_FACTOR * fValue );
  212. SetValue( nVal, false);
  213. // remember this slider value
  214. m_iLastSliderValue = GetValue();
  215. if (m_fCurrentValue != fValue)
  216. {
  217. m_fCurrentValue = fValue;
  218. m_bModifiedOnce = true;
  219. }
  220. }
  221. //-----------------------------------------------------------------------------
  222. // Purpose:
  223. //-----------------------------------------------------------------------------
  224. void CCvarSlider::Reset()
  225. {
  226. // Set slider to current value
  227. // m_fStartValue = engine->pfnGetCvarFloat( m_szCvarName );
  228. ConVarRef var( m_szCvarName, true );
  229. if ( !var.IsValid() )
  230. {
  231. m_fCurrentValue = m_fStartValue = 0.0f;
  232. SetValue( 0, false );
  233. m_iStartValue = GetValue();
  234. m_iLastSliderValue = m_iStartValue;
  235. return;
  236. }
  237. m_fStartValue = var.GetFloat();
  238. m_fCurrentValue = m_fStartValue;
  239. int value = (int)( CVARSLIDER_SCALE_FACTOR * m_fStartValue );
  240. SetValue( value, false );
  241. m_iStartValue = GetValue();
  242. m_iLastSliderValue = m_iStartValue;
  243. }
  244. //-----------------------------------------------------------------------------
  245. // Purpose:
  246. //-----------------------------------------------------------------------------
  247. bool CCvarSlider::HasBeenModified()
  248. {
  249. if (GetValue() != m_iStartValue)
  250. {
  251. m_bModifiedOnce = true;
  252. }
  253. return m_bModifiedOnce;
  254. }
  255. //-----------------------------------------------------------------------------
  256. // Purpose:
  257. // Input : position -
  258. //-----------------------------------------------------------------------------
  259. void CCvarSlider::OnSliderMoved()
  260. {
  261. if (HasBeenModified())
  262. {
  263. if (m_iLastSliderValue != GetValue())
  264. {
  265. m_iLastSliderValue = GetValue();
  266. m_fCurrentValue = ((float) m_iLastSliderValue)/CVARSLIDER_SCALE_FACTOR;
  267. }
  268. // tell parent that we've been modified
  269. PostActionSignal(new KeyValues("ControlModified"));
  270. }
  271. }
  272. //-----------------------------------------------------------------------------
  273. // Purpose:
  274. //-----------------------------------------------------------------------------
  275. void CCvarSlider::OnSliderDragEnd( void )
  276. {
  277. if ( !m_bCreatedInCode )
  278. {
  279. ApplyChanges();
  280. }
  281. }