1 #include "Gwen/Gwen.h"
2 #include "Gwen/Controls/CrossSplitter.h"
3 #include "Gwen/Controls/Button.h"
4 
5 using namespace Gwen;
6 using namespace Controls;
7 
GWEN_CONTROL_CONSTRUCTOR(CrossSplitter)8 GWEN_CONTROL_CONSTRUCTOR(CrossSplitter)
9 {
10 	m_VSplitter = new SplitterBar(this);
11 	m_VSplitter->SetPos(0, 128);
12 	m_VSplitter->onDragged.Add(this, &CrossSplitter::OnVerticalMoved);
13 	m_VSplitter->SetCursor(Gwen::CursorType::SizeNS);
14 
15 	m_HSplitter = new SplitterBar(this);
16 	m_HSplitter->SetPos(128, 0);
17 	m_HSplitter->onDragged.Add(this, &CrossSplitter::OnHorizontalMoved);
18 	m_HSplitter->SetCursor(Gwen::CursorType::SizeWE);
19 
20 	m_CSplitter = new SplitterBar(this);
21 	m_CSplitter->SetPos(128, 128);
22 	m_CSplitter->onDragged.Add(this, &CrossSplitter::OnCenterMoved);
23 	m_CSplitter->SetCursor(Gwen::CursorType::SizeAll);
24 
25 	m_fHVal = 0.5f;
26 	m_fVVal = 0.5f;
27 
28 	SetPanel(0, NULL);
29 	SetPanel(1, NULL);
30 	SetPanel(2, NULL);
31 	SetPanel(3, NULL);
32 
33 	SetSplitterSize(5);
34 	SetSplittersVisible(false);
35 
36 	m_iZoomedSection = -1;
37 }
38 
UpdateVSplitter()39 void CrossSplitter::UpdateVSplitter()
40 {
41 	m_VSplitter->MoveTo(m_VSplitter->X(), (Height() - m_VSplitter->Height()) * (m_fVVal));
42 }
UpdateHSplitter()43 void CrossSplitter::UpdateHSplitter()
44 {
45 	m_HSplitter->MoveTo((Width() - m_HSplitter->Width()) * (m_fHVal), m_HSplitter->Y());
46 }
47 
OnCenterMoved(Controls::Base *)48 void CrossSplitter::OnCenterMoved(Controls::Base* /*control*/)
49 {
50 	//Move the other two bars into position
51 	CalculateValueCenter();
52 	Invalidate();
53 }
54 
UpdateCSplitter()55 void CrossSplitter::UpdateCSplitter()
56 {
57 	m_CSplitter->MoveTo((Width() - m_CSplitter->Width()) * (m_fHVal), (Height() - m_CSplitter->Height()) * (m_fVVal));
58 }
59 
OnHorizontalMoved(Controls::Base *)60 void CrossSplitter::OnHorizontalMoved(Controls::Base* /*control*/)
61 {
62 	m_fHVal = CalculateValueHorizontal();
63 	Invalidate();
64 }
OnVerticalMoved(Controls::Base *)65 void CrossSplitter::OnVerticalMoved(Controls::Base* /*control*/)
66 {
67 	m_fVVal = CalculateValueVertical();
68 	Invalidate();
69 }
70 
CalculateValueCenter()71 void CrossSplitter::CalculateValueCenter()
72 {
73 	m_fHVal = (float)m_CSplitter->X() / (float)(Width() - m_CSplitter->Width());
74 	m_fVVal = (float)m_CSplitter->Y() / (float)(Height() - m_CSplitter->Height());
75 }
76 
CalculateValueHorizontal()77 float CrossSplitter::CalculateValueHorizontal()
78 {
79 	return (float)m_HSplitter->X() / (float)(Width() - m_HSplitter->Width());
80 }
81 
CalculateValueVertical()82 float CrossSplitter::CalculateValueVertical()
83 {
84 	return (float)m_VSplitter->Y() / (float)(Height() - m_VSplitter->Height());
85 }
86 
Layout(Skin::Base *)87 void CrossSplitter::Layout(Skin::Base* /*skin*/)
88 {
89 	m_VSplitter->SetSize(Width(), m_fBarSize);
90 	m_HSplitter->SetSize(m_fBarSize, Height());
91 	m_CSplitter->SetSize(m_fBarSize, m_fBarSize);
92 
93 	UpdateVSplitter();
94 	UpdateHSplitter();
95 	UpdateCSplitter();
96 
97 	if (m_iZoomedSection == -1)
98 	{
99 		if (m_Sections[0])
100 			m_Sections[0]->SetBounds(0, 0, m_HSplitter->X(), m_VSplitter->Y());
101 
102 		if (m_Sections[1])
103 			m_Sections[1]->SetBounds(m_HSplitter->X() + m_fBarSize, 0, Width() - (m_HSplitter->X() + m_fBarSize), m_VSplitter->Y());
104 
105 		if (m_Sections[2])
106 			m_Sections[2]->SetBounds(0, m_VSplitter->Y() + m_fBarSize, m_HSplitter->X(), Height() - (m_VSplitter->Y() + m_fBarSize));
107 
108 		if (m_Sections[3])
109 			m_Sections[3]->SetBounds(m_HSplitter->X() + m_fBarSize, m_VSplitter->Y() + m_fBarSize, Width() - (m_HSplitter->X() + m_fBarSize), Height() - (m_VSplitter->Y() + m_fBarSize));
110 	}
111 	else
112 	{
113 		//This should probably use Fill docking instead
114 		m_Sections[(int)m_iZoomedSection]->SetBounds(0, 0, Width(), Height());
115 	}
116 }
117 
SetPanel(int index,Controls::Base * pPanel)118 void CrossSplitter::SetPanel(int index, Controls::Base* pPanel)
119 {
120 	Debug::AssertCheck(index >= 0 && index <= 3, "CrossSplitter::SetPanel out of range");
121 
122 	m_Sections[index] = pPanel;
123 
124 	if (pPanel)
125 	{
126 		pPanel->Dock(Pos::None);
127 		pPanel->SetParent(this);
128 	}
129 
130 	Invalidate();
131 }
132 
GetPanel(int i)133 Controls::Base* CrossSplitter::GetPanel(int i)
134 {
135 	return m_Sections[i];
136 }
137 
ZoomChanged()138 void CrossSplitter::ZoomChanged()
139 {
140 	onZoomChange.Call(this);
141 	if (m_iZoomedSection == -1)
142 	{
143 		onUnZoomed.Call(this);
144 	}
145 	else
146 	{
147 		onZoomed.Call(this);
148 	}
149 }
150 
Zoom(int section)151 void CrossSplitter::Zoom(int section)
152 {
153 	UnZoom();
154 
155 	if (m_Sections[section])
156 	{
157 		for (int i = 0; i < 4; i++)
158 		{
159 			if (i != section && m_Sections[i])
160 				m_Sections[i]->SetHidden(true);
161 		}
162 		m_iZoomedSection = section;
163 
164 		Invalidate();
165 	}
166 	ZoomChanged();
167 }
168 
UnZoom()169 void CrossSplitter::UnZoom()
170 {
171 	m_iZoomedSection = -1;
172 
173 	for (int i = 0; i < 4; i++)
174 	{
175 		if (m_Sections[i])
176 			m_Sections[i]->SetHidden(false);
177 	}
178 
179 	Invalidate();
180 	ZoomChanged();
181 }
182