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