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