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