3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "guiMainMenu.h"
22 #include "serialization.h"
25 GUIMainMenu::GUIMainMenu(gui::IGUIEnvironment* env,
26 gui::IGUIElement* parent, s32 id,
27 IMenuManager *menumgr,
29 IGameCallback *gamecallback
31 GUIModalMenu(env, parent, id, menumgr),
34 m_gamecallback(gamecallback)
39 GUIMainMenu::~GUIMainMenu()
44 void GUIMainMenu::removeChildren()
46 const core::list<gui::IGUIElement*> &children = getChildren();
47 core::list<gui::IGUIElement*> children_copy;
48 for(core::list<gui::IGUIElement*>::ConstIterator
49 i = children.begin(); i != children.end(); i++)
51 children_copy.push_back(*i);
53 for(core::list<gui::IGUIElement*>::Iterator
54 i = children_copy.begin();
55 i != children_copy.end(); i++)
61 void GUIMainMenu::regenerateGui(v2u32 screensize)
63 std::wstring text_name;
64 std::wstring text_address;
65 std::wstring text_port;
73 gui::IGUIElement *e = getElementFromId(258);
75 text_name = e->getText();
77 text_name = m_data->name;
80 gui::IGUIElement *e = getElementFromId(256);
82 text_address = e->getText();
84 text_address = m_data->address;
87 gui::IGUIElement *e = getElementFromId(257);
89 text_port = e->getText();
91 text_port = m_data->port;
94 gui::IGUIElement *e = getElementFromId(263);
95 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
96 fancy_trees = ((gui::IGUICheckBox*)e)->isChecked();
98 fancy_trees = m_data->fancy_trees;
101 gui::IGUIElement *e = getElementFromId(262);
102 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
103 smooth_lighting = ((gui::IGUICheckBox*)e)->isChecked();
105 smooth_lighting = m_data->smooth_lighting;
110 gui::IGUIElement *e = getElementFromId(259);
111 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
112 creative_mode = ((gui::IGUICheckBox*)e)->isChecked();
114 creative_mode = m_data->creative_mode;
117 gui::IGUIElement *e = getElementFromId(261);
118 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
119 enable_damage = ((gui::IGUICheckBox*)e)->isChecked();
121 enable_damage = m_data->enable_damage;
130 Calculate new sizes and positions
133 v2s32 size(620, 430);
135 core::rect<s32> rect(
136 screensize.X/2 - size.X/2,
137 screensize.Y/2 - size.Y/2,
138 screensize.X/2 + size.X/2,
139 screensize.Y/2 + size.Y/2
143 recalculateAbsolutePosition(false);
145 //v2s32 size = rect.getSize();
155 v2s32 topleft_client(40, 0);
156 v2s32 size_client = size - v2s32(40, 0);
159 core::rect<s32> rect(0, 0, 20, 125);
160 rect += topleft_client + v2s32(-15, 60);
161 const wchar_t *text = L"C\nL\nI\nE\nN\nT";
162 //gui::IGUIStaticText *t =
163 Environment->addStaticText(text, rect, false, true, this, -1);
164 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
169 core::rect<s32> rect(0, 0, 100, 20);
170 rect += topleft_client + v2s32(40, 50+6);
171 const wchar_t *text = L"Nickname";
172 Environment->addStaticText(text, rect, false, true, this, -1);
175 core::rect<s32> rect(0, 0, 250, 30);
176 rect += topleft_client + v2s32(160, 50);
177 gui::IGUIElement *e =
178 Environment->addEditBox(text_name.c_str(), rect, true, this, 258);
180 Environment->setFocus(e);
184 core::rect<s32> rect(0, 0, 100, 20);
185 rect += topleft_client + v2s32(40, 100+6);
186 const wchar_t *text = L"Address + Port";
187 Environment->addStaticText(text, rect, false, true, this, -1);
190 core::rect<s32> rect(0, 0, 250, 30);
191 rect += topleft_client + v2s32(160, 100);
192 gui::IGUIElement *e =
193 Environment->addEditBox(text_address.c_str(), rect, true, this, 256);
195 Environment->setFocus(e);
198 core::rect<s32> rect(0, 0, 100, 30);
199 //rect += topleft_client + v2s32(160+250+20, 125);
200 rect += topleft_client + v2s32(size_client.X-40-100, 100);
201 Environment->addEditBox(text_port.c_str(), rect, true, this, 257);
204 core::rect<s32> rect(0, 0, 400, 20);
205 rect += topleft_client + v2s32(160, 100+35);
206 const wchar_t *text = L"Leave address blank to start a local server.";
207 Environment->addStaticText(text, rect, false, true, this, -1);
210 core::rect<s32> rect(0, 0, 250, 30);
211 rect += topleft_client + v2s32(40, 150);
212 Environment->addCheckBox(fancy_trees, rect, this, 263,
216 core::rect<s32> rect(0, 0, 250, 30);
217 rect += topleft_client + v2s32(40, 150+30);
218 Environment->addCheckBox(smooth_lighting, rect, this, 262,
223 core::rect<s32> rect(0, 0, 180, 30);
224 //rect += topleft_client + v2s32(size_client.X/2-180/2, 225-30/2);
225 rect += topleft_client + v2s32(size_client.X-180-40, 150+25);
226 Environment->addButton(rect, this, 257, L"Start Game / Connect");
233 v2s32 topleft_server(40, 250);
234 v2s32 size_server = size - v2s32(40, 0);
237 core::rect<s32> rect(0, 0, 20, 125);
238 rect += topleft_server + v2s32(-15, 40);
239 const wchar_t *text = L"S\nE\nR\nV\nE\nR";
240 //gui::IGUIStaticText *t =
241 Environment->addStaticText(text, rect, false, true, this, -1);
242 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
247 core::rect<s32> rect(0, 0, 250, 30);
248 rect += topleft_server + v2s32(40, 30);
249 Environment->addCheckBox(creative_mode, rect, this, 259, L"Creative Mode");
252 core::rect<s32> rect(0, 0, 250, 30);
253 rect += topleft_server + v2s32(40, 60);
254 Environment->addCheckBox(enable_damage, rect, this, 261, L"Enable Damage");
258 core::rect<s32> rect(0, 0, 130, 30);
259 //rect += topleft_server + v2s32(size_server.X-40-130, 100+25);
260 rect += topleft_server + v2s32(40, 100+25);
261 Environment->addButton(rect, this, 260, L"Delete map");
265 void GUIMainMenu::drawMenu()
267 gui::IGUISkin* skin = Environment->getSkin();
270 video::IVideoDriver* driver = Environment->getVideoDriver();
272 /*video::SColor bgcolor(140,0,0,0);
273 driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);*/
275 video::SColor bgcolor(140,0,0,0);
278 core::rect<s32> rect(0, 0, 620, 230);
279 rect += AbsoluteRect.UpperLeftCorner;
280 driver->draw2DRectangle(bgcolor, rect, &AbsoluteClippingRect);
284 core::rect<s32> rect(0, 250, 620, 430);
285 rect += AbsoluteRect.UpperLeftCorner;
286 driver->draw2DRectangle(bgcolor, rect, &AbsoluteClippingRect);
289 gui::IGUIElement::draw();
292 void GUIMainMenu::acceptInput()
295 gui::IGUIElement *e = getElementFromId(258);
297 m_data->name = e->getText();
300 gui::IGUIElement *e = getElementFromId(256);
302 m_data->address = e->getText();
305 gui::IGUIElement *e = getElementFromId(257);
307 m_data->port = e->getText();
310 gui::IGUIElement *e = getElementFromId(259);
311 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
312 m_data->creative_mode = ((gui::IGUICheckBox*)e)->isChecked();
315 gui::IGUIElement *e = getElementFromId(261);
316 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
317 m_data->enable_damage = ((gui::IGUICheckBox*)e)->isChecked();
320 gui::IGUIElement *e = getElementFromId(262);
321 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
322 m_data->smooth_lighting = ((gui::IGUICheckBox*)e)->isChecked();
325 gui::IGUIElement *e = getElementFromId(263);
326 if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
327 m_data->fancy_trees = ((gui::IGUICheckBox*)e)->isChecked();
333 bool GUIMainMenu::OnEvent(const SEvent& event)
335 if(event.EventType==EET_KEY_INPUT_EVENT)
337 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
339 m_gamecallback->exitToOS();
343 if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
350 if(event.EventType==EET_GUI_EVENT)
352 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
355 if(!canTakeFocus(event.GUIEvent.Element))
357 dstream<<"GUIMainMenu: Not allowing focus change."
359 // Returning true disables focus change
363 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
365 switch(event.GUIEvent.Caller->getID())
367 case 257: // Start game
371 case 260: // Delete map
372 // Don't accept input data, just set deletion request
373 m_data->delete_map = true;
379 if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER)
381 switch(event.GUIEvent.Caller->getID())
383 case 256: case 257: case 258:
391 return Parent ? Parent->OnEvent(event) : false;