1 /*
2 	GWEN
3 	Copyright (c) 2010 Facepunch Studios
4 	See license in Gwen.h
5 */
6 
7 #include "Gwen/Controls/ScrollBar.h"
8 #include "Gwen/Controls/HorizontalScrollBar.h"
9 
10 using namespace Gwen;
11 using namespace Gwen::Controls;
12 
GWEN_CONTROL_CONSTRUCTOR(HorizontalScrollBar)13 GWEN_CONTROL_CONSTRUCTOR(HorizontalScrollBar)
14 {
15 	m_Bar->SetHorizontal();
16 
17 	m_ScrollButton[SCROLL_BUTTON_LEFT]->SetDirectionLeft();
18 	m_ScrollButton[SCROLL_BUTTON_LEFT]->onPress.Add(this, &HorizontalScrollBar::NudgeLeft);
19 
20 	m_ScrollButton[SCROLL_BUTTON_RIGHT]->SetDirectionRight();
21 	m_ScrollButton[SCROLL_BUTTON_RIGHT]->onPress.Add(this, &HorizontalScrollBar::NudgeRight);
22 
23 	m_Bar->onDragged.Add(this, &HorizontalScrollBar::OnBarMoved);
24 }
25 
Layout(Skin::Base * skin)26 void HorizontalScrollBar::Layout(Skin::Base* skin)
27 {
28 	BaseClass::Layout(skin);
29 
30 	m_ScrollButton[SCROLL_BUTTON_LEFT]->SetWidth(Height());
31 	m_ScrollButton[SCROLL_BUTTON_LEFT]->Dock(Pos::Left);
32 
33 	m_ScrollButton[SCROLL_BUTTON_RIGHT]->SetWidth(Height());
34 	m_ScrollButton[SCROLL_BUTTON_RIGHT]->Dock(Pos::Right);
35 
36 	m_Bar->SetHeight(GetButtonSize());
37 	m_Bar->SetPadding(Padding(GetButtonSize(), 0, GetButtonSize(), 0));
38 
39 	float barWidth = (m_fViewableContentSize / m_fContentSize) * (Width() - (GetButtonSize() * 2));
40 
41 	if (barWidth < GetButtonSize() * 0.5)
42 		barWidth = GetButtonSize() * 0.5;
43 
44 	m_Bar->SetWidth(barWidth);
45 	m_Bar->SetHidden(Width() - (GetButtonSize() * 2) <= barWidth);
46 
47 	//Based on our last scroll amount, produce a position for the bar
48 	if (!m_Bar->IsDepressed())
49 	{
50 		SetScrolledAmount(GetScrolledAmount(), true);
51 	}
52 }
53 
NudgeLeft(Base *)54 void HorizontalScrollBar::NudgeLeft(Base* /*control*/)
55 {
56 	if (!IsDisabled())
57 		SetScrolledAmount(GetScrolledAmount() - GetNudgeAmount(), true);
58 }
59 
NudgeRight(Base *)60 void HorizontalScrollBar::NudgeRight(Base* /*control*/)
61 {
62 	if (!IsDisabled())
63 		SetScrolledAmount(GetScrolledAmount() + GetNudgeAmount(), true);
64 }
65 
ScrollToLeft()66 void HorizontalScrollBar::ScrollToLeft()
67 {
68 	SetScrolledAmount(0, true);
69 }
ScrollToRight()70 void HorizontalScrollBar::ScrollToRight()
71 {
72 	SetScrolledAmount(1, true);
73 }
74 
GetNudgeAmount()75 float HorizontalScrollBar::GetNudgeAmount()
76 {
77 	if (m_bDepressed)
78 		return m_fViewableContentSize / m_fContentSize;
79 	else
80 		return BaseClass::GetNudgeAmount();
81 }
82 
OnMouseClickLeft(int x,int y,bool bDown)83 void HorizontalScrollBar::OnMouseClickLeft(int x, int y, bool bDown)
84 {
85 	if (bDown)
86 	{
87 		m_bDepressed = true;
88 		Gwen::MouseFocus = this;
89 	}
90 	else
91 	{
92 		Gwen::Point clickPos = CanvasPosToLocal(Gwen::Point(x, y));
93 		if (clickPos.x < m_Bar->X())
94 			NudgeLeft(this);
95 		else if (clickPos.x > m_Bar->X() + m_Bar->Width())
96 			NudgeRight(this);
97 
98 		m_bDepressed = false;
99 		Gwen::MouseFocus = NULL;
100 	}
101 }
102 
CalculateScrolledAmount()103 float HorizontalScrollBar::CalculateScrolledAmount()
104 {
105 	return (float)(m_Bar->X() - GetButtonSize()) / (float)(Width() - m_Bar->Width() - (GetButtonSize() * 2));
106 }
107 
SetScrolledAmount(float amount,bool forceUpdate)108 bool HorizontalScrollBar::SetScrolledAmount(float amount, bool forceUpdate)
109 {
110 	amount = Gwen::Clamp(amount, 0, 1);
111 
112 	if (!BaseClass::SetScrolledAmount(amount, forceUpdate))
113 		return false;
114 
115 	if (forceUpdate)
116 	{
117 		int newX = GetButtonSize() + (amount * ((Width() - m_Bar->Width()) - (GetButtonSize() * 2)));
118 		m_Bar->MoveTo(newX, m_Bar->Y());
119 	}
120 
121 	return true;
122 }
123 
OnBarMoved(Controls::Base * control)124 void HorizontalScrollBar::OnBarMoved(Controls::Base* control)
125 {
126 	if (m_Bar->IsDepressed())
127 	{
128 		SetScrolledAmount(CalculateScrolledAmount(), false);
129 		BaseClass::OnBarMoved(control);
130 	}
131 	else
132 		InvalidateParent();
133 }