1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		12/2008
5 */
6 #include "Precompiled.h"
7 #include "State.h"
8 
9 namespace demo
10 {
11 
State(const std::string & _layout,ControllerType _type)12 	State::State(const std::string& _layout, ControllerType _type) :
13 		wraps::BaseLayout(_layout),
14 		mFrameAdvise(false)
15 	{
16 		mType = _type;
17 
18 		assignWidget(mButton1, "Button1");
19 		assignWidget(mButton2, "Button2");
20 		assignWidget(mButton3, "Button3");
21 		assignWidget(mButton4, "Button4");
22 
23 		mMainWidget->setVisible(false);
24 		mButton1->setVisible(false);
25 		mButton2->setVisible(false);
26 		mButton3->setVisible(false);
27 		mButton4->setVisible(false);
28 
29 		mButton1->eventMouseButtonClick += MyGUI::newDelegate(this, &State::notifyMouseButtonClick);
30 		mButton2->eventMouseButtonClick += MyGUI::newDelegate(this, &State::notifyMouseButtonClick);
31 		mButton3->eventMouseButtonClick += MyGUI::newDelegate(this, &State::notifyMouseButtonClick);
32 		mButton4->eventMouseButtonClick += MyGUI::newDelegate(this, &State::notifyMouseButtonClick);
33 	}
34 
~State()35 	State::~State()
36 	{
37 		FrameAdvise(false);
38 	}
39 
setVisible(bool _visible)40 	void State::setVisible(bool _visible)
41 	{
42 		if (_visible)
43 		{
44 			mMainWidget->setVisible(false);
45 			mButton1->setVisible(false);
46 			mButton2->setVisible(false);
47 			mButton3->setVisible(false);
48 			mButton4->setVisible(false);
49 
50 			MyGUI::LayerManager::getInstance().upLayerItem(mMainWidget);
51 			MyGUI::LayerManager::getInstance().upLayerItem(mButton1);
52 			MyGUI::LayerManager::getInstance().upLayerItem(mButton2);
53 			MyGUI::LayerManager::getInstance().upLayerItem(mButton3);
54 			MyGUI::LayerManager::getInstance().upLayerItem(mButton4);
55 
56 			FrameAdvise(true);
57 			mCountTime = 0;
58 		}
59 		else
60 		{
61 			MyGUI::ControllerManager& manager = MyGUI::ControllerManager::getInstance();
62 
63 			MyGUI::ControllerFadeAlpha* controller = createControllerFadeAlpha(0, 3, true);
64 			manager.addItem(mMainWidget, controller);
65 
66 			controller = createControllerFadeAlpha(0, 3, true);
67 			manager.addItem(mButton1, controller);
68 			controller = createControllerFadeAlpha(0, 3, true);
69 			manager.addItem(mButton2, controller);
70 			controller = createControllerFadeAlpha(0, 3, true);
71 			manager.addItem(mButton3, controller);
72 			controller = createControllerFadeAlpha(0, 3, true);
73 			manager.addItem(mButton4, controller);
74 		}
75 	}
76 
notifyMouseButtonClick(MyGUI::Widget * _sender)77 	void State::notifyMouseButtonClick(MyGUI::Widget* _sender)
78 	{
79 		if (_sender == mButton1) eventButtonPress(ControllerType::Inertional, false);
80 		else if (_sender == mButton2) eventButtonPress(ControllerType::Accelerated, false);
81 		else if (_sender == mButton3) eventButtonPress(ControllerType::Slowed, false);
82 		else if (_sender == mButton4) eventButtonPress(ControllerType::Jump, false);
83 	}
84 
notifyFrameEvent(float _time)85 	void State::notifyFrameEvent(float _time)
86 	{
87 		mCountTime += _time;
88 
89 		const int offset = 30;
90 		const float time_diff = 0.3f;
91 		const MyGUI::IntSize& view = MyGUI::RenderManager::getInstance().getViewSize();
92 
93 		if (!mMainWidget->getVisible())
94 		{
95 			mMainWidget->setPosition(-mMainWidget->getWidth(), view.height - mMainWidget->getHeight() - offset);
96 			mMainWidget->setVisible(true);
97 			mMainWidget->setAlpha(1);
98 
99 			MyGUI::IntPoint  point(offset, view.height - mMainWidget->getHeight() - offset);
100 			MyGUI::ControllerManager::getInstance().addItem(mMainWidget, createControllerPosition(point));
101 		}
102 
103 		if (!mButton1->getVisible())
104 		{
105 			mButton1->setPosition(view.width, offset);
106 			mButton1->setVisible(true);
107 			mButton1->setAlpha(1);
108 			MyGUI::IntPoint point(view.width - mButton1->getWidth() - offset, offset);
109 			MyGUI::ControllerManager::getInstance().addItem(mButton1, createControllerPosition(point));
110 		}
111 
112 		if (mCountTime > time_diff)
113 		{
114 			if (!mButton2->getVisible())
115 			{
116 				mButton2->setPosition(view.width, (mButton2->getHeight() + offset) + offset);
117 				mButton2->setVisible(true);
118 				mButton2->setAlpha(1);
119 				MyGUI::IntPoint point(view.width - mButton1->getWidth() - offset, (mButton2->getHeight() + offset) + offset);
120 				MyGUI::ControllerManager::getInstance().addItem(mButton2, createControllerPosition(point));
121 			}
122 		}
123 
124 		if (mCountTime > time_diff * 2)
125 		{
126 			if (!mButton3->getVisible())
127 			{
128 				mButton3->setPosition(view.width, (mButton3->getHeight() + offset) * 2 + offset);
129 				mButton3->setVisible(true);
130 				mButton3->setAlpha(1);
131 				MyGUI::IntPoint point(view.width - mButton3->getWidth() - offset, (mButton3->getHeight() + offset) * 2 + offset);
132 				MyGUI::ControllerManager::getInstance().addItem(mButton3, createControllerPosition(point));
133 			}
134 		}
135 
136 		if (mCountTime > time_diff * 3)
137 		{
138 			if (!mButton4->getVisible())
139 			{
140 				mButton4->setPosition(view.width, (mButton4->getHeight() + offset) * 3 + offset);
141 				mButton4->setVisible(true);
142 				mButton4->setAlpha(1);
143 				MyGUI::IntPoint point(view.width - mButton4->getWidth() - offset, (mButton4->getHeight() + offset) * 3 + offset);
144 				MyGUI::ControllerPosition* controller = createControllerPosition(point);
145 				MyGUI::ControllerManager::getInstance().addItem(mButton4, controller);
146 				controller->eventPostAction += MyGUI::newDelegate(this, &State::notifyPostAction);
147 			}
148 
149 			FrameAdvise(false);
150 		}
151 	}
152 
notifyPostAction(MyGUI::Widget * _sender,MyGUI::ControllerItem * _controller)153 	void State::notifyPostAction(MyGUI::Widget* _sender, MyGUI::ControllerItem* _controller)
154 	{
155 		eventButtonPress(ControllerType::Slowed, true);
156 	}
157 
FrameAdvise(bool _advise)158 	void State::FrameAdvise(bool _advise)
159 	{
160 		if (_advise)
161 		{
162 			if (!mFrameAdvise)
163 			{
164 				mFrameAdvise = true;
165 				MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &State::notifyFrameEvent);
166 			}
167 		}
168 		else
169 		{
170 			if (mFrameAdvise)
171 			{
172 				mFrameAdvise = false;
173 				MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &State::notifyFrameEvent);
174 			}
175 		}
176 	}
177 
createControllerPosition(const MyGUI::IntPoint & _point)178 	MyGUI::ControllerPosition* State::createControllerPosition(const MyGUI::IntPoint& _point)
179 	{
180 		MyGUI::ControllerItem* item = MyGUI::ControllerManager::getInstance().createItem(MyGUI::ControllerPosition::getClassTypeName());
181 		MyGUI::ControllerPosition* controller = item->castType<MyGUI::ControllerPosition>();
182 
183 		controller->setPosition(_point);
184 		controller->setTime(0.5);
185 
186 		if (mType == ControllerType::Inertional) controller->setAction(MyGUI::newDelegate(MyGUI::action::inertionalMoveFunction));
187 		else if (mType == ControllerType::Accelerated) controller->setAction(MyGUI::newDelegate(MyGUI::action::acceleratedMoveFunction<30>));
188 		else if (mType == ControllerType::Slowed) controller->setAction(MyGUI::newDelegate(MyGUI::action::acceleratedMoveFunction<4>));
189 		else controller->setAction(MyGUI::newDelegate(MyGUI::action::jumpMoveFunction<5>));
190 
191 		return controller;
192 	}
193 
createControllerFadeAlpha(float _alpha,float _coef,bool _enable)194 	MyGUI::ControllerFadeAlpha* State::createControllerFadeAlpha(float _alpha, float _coef, bool _enable)
195 	{
196 		MyGUI::ControllerItem* item = MyGUI::ControllerManager::getInstance().createItem(MyGUI::ControllerFadeAlpha::getClassTypeName());
197 		MyGUI::ControllerFadeAlpha* controller = item->castType<MyGUI::ControllerFadeAlpha>();
198 
199 		controller->setAlpha(_alpha);
200 		controller->setCoef(_coef);
201 		controller->setEnabled(_enable);
202 
203 		return controller;
204 	}
205 
getClient()206 	MyGUI::Widget* State::getClient()
207 	{
208 		return mMainWidget->getClientWidget();
209 	}
210 
211 } // namespace demo
212