Slider.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. GWEN
  3. Copyright (c) 2010 Facepunch Studios
  4. See license in Gwen.h
  5. */
  6. #include <math.h>
  7. #include "Gwen/Controls/Slider.h"
  8. using namespace Gwen;
  9. using namespace Gwen::Controls;
  10. using namespace Gwen::ControlsInternal;
  11. GWEN_CONTROL_CONSTRUCTOR( SliderBar )
  12. {
  13. SetTarget( this );
  14. RestrictToParent( true );
  15. }
  16. void SliderBar::Render( Skin::Base* skin )
  17. {
  18. skin->DrawButton( this, m_bDepressed, IsHovered() );
  19. }
  20. Slider::Slider( Controls::Base* pParent ) : BaseClass( pParent )
  21. {
  22. SetBounds( Gwen::Rect( 0, 0, 32, 128) );
  23. m_SliderBar = new SliderBar( this );
  24. m_SliderBar->onDragged.Add( this, &Slider::OnMoved );
  25. m_fMin = 0.0f;
  26. m_fMax = 1.0f;
  27. m_bClampToNotches = false;
  28. m_iNumNotches = 5;
  29. m_fValue = 0.0f;
  30. SetTabable( true );
  31. }
  32. void Slider::OnMoved( Controls::Base * /*control*/ )
  33. {
  34. SetValueInternal( CalculateValue() );
  35. }
  36. void Slider::Layout( Skin::Base* skin )
  37. {
  38. BaseClass::Layout( skin );
  39. }
  40. float Slider::CalculateValue()
  41. {
  42. return 0;
  43. }
  44. void Slider::SetValue( float val, bool /*forceUpdate*/ )
  45. {
  46. if (val < m_fMin) val = m_fMin;
  47. if (val > m_fMax) val = m_fMax;
  48. // Normalize Value
  49. val = (val - m_fMin) / (m_fMax - m_fMin);
  50. SetValueInternal( val );
  51. Redraw();
  52. }
  53. void Slider::SetValueInternal( float val )
  54. {
  55. if ( m_bClampToNotches )
  56. {
  57. val = floor( (val * (float)m_iNumNotches) + 0.5f );
  58. val /= (float) m_iNumNotches;
  59. }
  60. if ( m_fValue != val )
  61. {
  62. m_fValue = val;
  63. onValueChanged.Call( this );
  64. }
  65. UpdateBarFromValue();
  66. }
  67. float Slider::GetValue()
  68. {
  69. return m_fMin + (m_fValue * (m_fMax - m_fMin));
  70. }
  71. void Slider::SetRange( float fMin, float fMax )
  72. {
  73. m_fMin = fMin;
  74. m_fMax = fMax;
  75. }
  76. void Slider::RenderFocus( Gwen::Skin::Base* skin )
  77. {
  78. if ( Gwen::KeyboardFocus != this ) return;
  79. if ( !IsTabable() ) return;
  80. skin->DrawKeyboardHighlight( this, GetRenderBounds(), 0 );
  81. }