summaryrefslogtreecommitdiff
path: root/src/guiCreateWorld.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/guiCreateWorld.cpp')
-rw-r--r--src/guiCreateWorld.cpp255
1 files changed, 255 insertions, 0 deletions
diff --git a/src/guiCreateWorld.cpp b/src/guiCreateWorld.cpp
new file mode 100644
index 000000000..7143f9558
--- /dev/null
+++ b/src/guiCreateWorld.cpp
@@ -0,0 +1,255 @@
+/*
+Minetest-c55
+Copyright (C) 2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "guiCreateWorld.h"
+#include "debug.h"
+#include "serialization.h"
+#include <string>
+#include <IGUICheckBox.h>
+#include <IGUIEditBox.h>
+#include <IGUIButton.h>
+#include <IGUIStaticText.h>
+#include <IGUIFont.h>
+#include <IGUIListBox.h>
+
+#include "gettext.h"
+
+enum
+{
+ GUI_ID_NAME_INPUT = 101,
+ GUI_ID_GAME_LISTBOX,
+ GUI_ID_CREATE,
+ GUI_ID_CANCEL
+};
+
+GUICreateWorld::GUICreateWorld(gui::IGUIEnvironment* env,
+ gui::IGUIElement* parent, s32 id,
+ IMenuManager *menumgr,
+ CreateWorldDest *dest,
+ const std::vector<SubgameSpec> &games
+):
+ GUIModalMenu(env, parent, id, menumgr),
+ m_dest(dest),
+ m_games(games)
+{
+ assert(games.size() > 0);
+}
+
+GUICreateWorld::~GUICreateWorld()
+{
+ removeChildren();
+ if(m_dest)
+ delete m_dest;
+}
+
+void GUICreateWorld::removeChildren()
+{
+ const core::list<gui::IGUIElement*> &children = getChildren();
+ core::list<gui::IGUIElement*> children_copy;
+ for(core::list<gui::IGUIElement*>::ConstIterator
+ i = children.begin(); i != children.end(); i++)
+ {
+ children_copy.push_back(*i);
+ }
+ for(core::list<gui::IGUIElement*>::Iterator
+ i = children_copy.begin();
+ i != children_copy.end(); i++)
+ {
+ (*i)->remove();
+ }
+}
+
+void GUICreateWorld::regenerateGui(v2u32 screensize)
+{
+ std::wstring name = L"";
+
+ {
+ gui::IGUIElement *e = getElementFromId(GUI_ID_NAME_INPUT);
+ if(e != NULL)
+ name = e->getText();
+ }
+
+ /*
+ Remove stuff
+ */
+ removeChildren();
+
+ /*
+ Calculate new sizes and positions
+ */
+ core::rect<s32> rect(
+ screensize.X/2 - 580/2,
+ screensize.Y/2 - 300/2,
+ screensize.X/2 + 580/2,
+ screensize.Y/2 + 300/2
+ );
+
+ DesiredRect = rect;
+ recalculateAbsolutePosition(false);
+
+ v2s32 size = rect.getSize();
+
+ v2s32 topleft = v2s32(10+80, 10+70);
+
+ /*
+ Add stuff
+ */
+ {
+ core::rect<s32> rect(0, 0, 100, 20);
+ rect += v2s32(0, 5) + topleft;
+ Environment->addStaticText(wgettext("World name"),
+ rect, false, true, this, -1);
+ }
+ {
+ core::rect<s32> rect(0, 0, 300, 30);
+ rect = rect + v2s32(100, 0) + topleft;
+ gui::IGUIElement *e =
+ Environment->addEditBox(name.c_str(), rect, true, this, GUI_ID_NAME_INPUT);
+ Environment->setFocus(e);
+
+ irr::SEvent evt;
+ evt.EventType = EET_KEY_INPUT_EVENT;
+ evt.KeyInput.Key = KEY_END;
+ evt.KeyInput.PressedDown = true;
+ e->OnEvent(evt);
+ }
+ {
+ core::rect<s32> rect(0, 0, 100, 20);
+ rect += v2s32(0, 40+5) + topleft;
+ Environment->addStaticText(wgettext("Game"),
+ rect, false, true, this, -1);
+ }
+ {
+ core::rect<s32> rect(0, 0, 300, 80);
+ rect += v2s32(100, 40) + topleft;
+ gui::IGUIListBox *e = Environment->addListBox(rect, this,
+ GUI_ID_GAME_LISTBOX);
+ e->setDrawBackground(true);
+ for(u32 i=0; i<m_games.size(); i++){
+ std::wostringstream os(std::ios::binary);
+ os<<narrow_to_wide(m_games[i].name).c_str();
+ os<<L" [";
+ os<<narrow_to_wide(m_games[i].id).c_str();
+ os<<L"]";
+ e->addItem(os.str().c_str());
+ }
+ e->setSelected(0);
+ }
+ changeCtype("");
+ {
+ core::rect<s32> rect(0, 0, 120, 30);
+ rect = rect + v2s32(170, 140) + topleft;
+ Environment->addButton(rect, this, GUI_ID_CANCEL,
+ wgettext("Cancel"));
+ }
+ {
+ core::rect<s32> rect(0, 0, 120, 30);
+ rect = rect + v2s32(300, 140) + topleft;
+ Environment->addButton(rect, this, GUI_ID_CREATE,
+ wgettext("Create"));
+ }
+ changeCtype("C");
+}
+
+void GUICreateWorld::drawMenu()
+{
+ gui::IGUISkin* skin = Environment->getSkin();
+ if (!skin)
+ return;
+ video::IVideoDriver* driver = Environment->getVideoDriver();
+
+ video::SColor bgcolor(140,0,0,0);
+ driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
+
+ gui::IGUIElement::draw();
+}
+
+void GUICreateWorld::acceptInput()
+{
+ if(m_dest)
+ {
+ gui::IGUIElement *e = getElementFromId(GUI_ID_NAME_INPUT);
+ if(e != NULL)
+ {
+ m_dest->accepted(e->getText(), m_games[0].id);
+ }
+ delete m_dest;
+ m_dest = NULL;
+ }
+}
+
+bool GUICreateWorld::OnEvent(const SEvent& event)
+{
+ if(event.EventType==EET_KEY_INPUT_EVENT)
+ {
+ if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
+ {
+ quitMenu();
+ return true;
+ }
+ if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
+ {
+ acceptInput();
+ quitMenu();
+ return true;
+ }
+ }
+ if(event.EventType==EET_GUI_EVENT)
+ {
+ if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
+ && isVisible())
+ {
+ if(!canTakeFocus(event.GUIEvent.Element))
+ {
+ dstream<<"GUICreateWorld: Not allowing focus change."
+ <<std::endl;
+ // Returning true disables focus change
+ return true;
+ }
+ }
+ bool accept_input = false;
+ if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED){
+ switch(event.GUIEvent.Caller->getID()){
+ case GUI_ID_CANCEL:
+ quitMenu();
+ return true;
+ break;
+ case GUI_ID_CREATE:
+ accept_input = true;
+ break;
+ }
+ }
+ if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER){
+ switch(event.GUIEvent.Caller->getID()){
+ case GUI_ID_NAME_INPUT:
+ accept_input = true;
+ break;
+ }
+ }
+ if(accept_input){
+ acceptInput();
+ quitMenu();
+ // quitMenu deallocates menu
+ return true;
+ }
+ }
+
+ return Parent ? Parent->OnEvent(event) : false;
+}
+