3 Copyright (C) 2010-11 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2011 Ciaran Gultnieks <ciaran@ciarang.com>
5 Copyright (C) 2011 teddydestodes <derkomtur@schattengang.net>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include "guiKeyChangeMenu.h"
24 #include "serialization.h"
29 GUIKeyChangeMenu::GUIKeyChangeMenu(gui::IGUIEnvironment* env,
30 gui::IGUIElement* parent, s32 id, IMenuManager *menumgr) :
31 GUIModalMenu(env, parent, id, menumgr)
37 GUIKeyChangeMenu::~GUIKeyChangeMenu()
42 void GUIKeyChangeMenu::removeChildren()
44 const core::list<gui::IGUIElement*> &children = getChildren();
45 core::list<gui::IGUIElement*> children_copy;
46 for (core::list<gui::IGUIElement*>::ConstIterator i = children.begin(); i
47 != children.end(); i++)
49 children_copy.push_back(*i);
51 for (core::list<gui::IGUIElement*>::Iterator i = children_copy.begin(); i
52 != children_copy.end(); i++)
58 void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
66 Calculate new sizes and positions
71 core::rect < s32 > rect(screensize.X / 2 - size.X / 2,
72 screensize.Y / 2 - size.Y / 2, screensize.X / 2 + size.X / 2,
73 screensize.Y / 2 + size.Y / 2);
76 recalculateAbsolutePosition(false);
81 core::rect < s32 > rect(0, 0, 125, 20);
82 rect += topleft + v2s32(25, 3);
83 //gui::IGUIStaticText *t =
84 Environment->addStaticText(wgettext("KEYBINDINGS"),
85 rect, false, true, this, -1);
86 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
92 core::rect < s32 > rect(0, 0, 100, 20);
93 rect += topleft + v2s32(offset.X, offset.Y);
94 Environment->addStaticText(wgettext("Forward"),
95 rect, false, true, this, -1);
96 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
100 core::rect < s32 > rect(0, 0, 100, 30);
101 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
102 this->forward = Environment->addButton(rect, this,
103 GUI_ID_KEY_FORWARD_BUTTON,
104 wgettext(KeyNames[key_forward]));
107 offset += v2s32(0, 25);
109 core::rect < s32 > rect(0, 0, 100, 20);
110 rect += topleft + v2s32(offset.X, offset.Y);
111 Environment->addStaticText(wgettext("Backward"),
112 rect, false, true, this, -1);
113 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
117 core::rect < s32 > rect(0, 0, 100, 30);
118 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
119 this->backward = Environment->addButton(rect, this,
120 GUI_ID_KEY_BACKWARD_BUTTON,
121 wgettext(KeyNames[key_backward]));
123 offset += v2s32(0, 25);
125 core::rect < s32 > rect(0, 0, 100, 20);
126 rect += topleft + v2s32(offset.X, offset.Y);
127 Environment->addStaticText(wgettext("Left"),
128 rect, false, true, this, -1);
129 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
133 core::rect < s32 > rect(0, 0, 100, 30);
134 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
135 this->left = Environment->addButton(rect, this, GUI_ID_KEY_LEFT_BUTTON,
136 wgettext(KeyNames[key_left]));
138 offset += v2s32(0, 25);
140 core::rect < s32 > rect(0, 0, 100, 20);
141 rect += topleft + v2s32(offset.X, offset.Y);
142 Environment->addStaticText(wgettext("Right"),
143 rect, false, true, this, -1);
144 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
148 core::rect < s32 > rect(0, 0, 100, 30);
149 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
150 this->right = Environment->addButton(rect, this,
151 GUI_ID_KEY_RIGHT_BUTTON,
152 wgettext(KeyNames[key_right]));
154 offset += v2s32(0, 25);
156 core::rect < s32 > rect(0, 0, 100, 20);
157 rect += topleft + v2s32(offset.X, offset.Y);
158 Environment->addStaticText(wgettext("Use"),
159 rect, false, true, this, -1);
160 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
164 core::rect < s32 > rect(0, 0, 100, 30);
165 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
166 this->use = Environment->addButton(rect, this, GUI_ID_KEY_USE_BUTTON,
167 wgettext(KeyNames[key_use]));
169 offset += v2s32(0, 25);
171 core::rect < s32 > rect(0, 0, 100, 20);
172 rect += topleft + v2s32(offset.X, offset.Y);
173 Environment->addStaticText(wgettext("Sneak"),
174 rect, false, true, this, -1);
175 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
179 core::rect < s32 > rect(0, 0, 100, 30);
180 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
181 this->sneak = Environment->addButton(rect, this,
182 GUI_ID_KEY_SNEAK_BUTTON,
183 wgettext(KeyNames[key_sneak]));
185 offset += v2s32(0, 25);
187 core::rect < s32 > rect(0, 0, 100, 20);
188 rect += topleft + v2s32(offset.X, offset.Y);
189 Environment->addStaticText(wgettext("Jump"), rect, false, true, this, -1);
190 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
194 core::rect < s32 > rect(0, 0, 100, 30);
195 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
196 this->jump = Environment->addButton(rect, this, GUI_ID_KEY_JUMP_BUTTON,
197 wgettext(KeyNames[key_jump]));
200 offset += v2s32(0, 25);
202 core::rect < s32 > rect(0, 0, 100, 20);
203 rect += topleft + v2s32(offset.X, offset.Y);
204 Environment->addStaticText(wgettext("Inventory"),
205 rect, false, true, this, -1);
206 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
210 core::rect < s32 > rect(0, 0, 100, 30);
211 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
212 this->inventory = Environment->addButton(rect, this,
213 GUI_ID_KEY_INVENTORY_BUTTON,
214 wgettext(KeyNames[key_inventory]));
216 offset += v2s32(0, 25);
218 core::rect < s32 > rect(0, 0, 100, 20);
219 rect += topleft + v2s32(offset.X, offset.Y);
220 Environment->addStaticText(wgettext("Chat"), rect, false, true, this, -1);
221 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
225 core::rect < s32 > rect(0, 0, 100, 30);
226 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
227 this->chat = Environment->addButton(rect, this, GUI_ID_KEY_CHAT_BUTTON,
228 wgettext(KeyNames[key_chat]));
232 offset = v2s32(250, 40);
234 core::rect < s32 > rect(0, 0, 100, 20);
235 rect += topleft + v2s32(offset.X, offset.Y);
236 Environment->addStaticText(wgettext("Toggle fly"),
237 rect, false, true, this, -1);
238 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
242 core::rect < s32 > rect(0, 0, 100, 30);
243 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
244 this->fly = Environment->addButton(rect, this, GUI_ID_KEY_FLY_BUTTON,
245 wgettext(KeyNames[key_fly]));
247 offset += v2s32(0, 25);
249 core::rect < s32 > rect(0, 0, 100, 20);
250 rect += topleft + v2s32(offset.X, offset.Y);
251 Environment->addStaticText(wgettext("Toggle fast"),
252 rect, false, true, this, -1);
253 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
257 core::rect < s32 > rect(0, 0, 100, 30);
258 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
259 this->fast = Environment->addButton(rect, this, GUI_ID_KEY_FAST_BUTTON,
260 wgettext(KeyNames[key_fast]));
262 offset += v2s32(0, 25);
264 core::rect < s32 > rect(0, 0, 100, 20);
265 rect += topleft + v2s32(offset.X, offset.Y);
266 Environment->addStaticText(wgettext("Range select"),
267 rect, false, true, this, -1);
268 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
272 core::rect < s32 > rect(0, 0, 100, 30);
273 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
274 this->range = Environment->addButton(rect, this,
275 GUI_ID_KEY_RANGE_BUTTON,
276 wgettext(KeyNames[key_range]));
279 offset += v2s32(0, 25);
281 core::rect < s32 > rect(0, 0, 100, 20);
282 rect += topleft + v2s32(offset.X, offset.Y);
283 Environment->addStaticText(wgettext("Print stacks"),
284 rect, false, true, this, -1);
285 //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
289 core::rect < s32 > rect(0, 0, 100, 30);
290 rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
291 this->dump = Environment->addButton(rect, this, GUI_ID_KEY_DUMP_BUTTON,
292 wgettext(KeyNames[key_dump]));
295 core::rect < s32 > rect(0, 0, 100, 30);
296 rect += topleft + v2s32(size.X - 100 - 20, size.Y - 40);
297 Environment->addButton(rect, this, GUI_ID_BACK_BUTTON,
301 core::rect < s32 > rect(0, 0, 100, 30);
302 rect += topleft + v2s32(size.X - 100 - 20 - 100 - 20, size.Y - 40);
303 Environment->addButton(rect, this, GUI_ID_ABORT_BUTTON,
309 void GUIKeyChangeMenu::drawMenu()
311 gui::IGUISkin* skin = Environment->getSkin();
314 video::IVideoDriver* driver = Environment->getVideoDriver();
316 video::SColor bgcolor(140, 0, 0, 0);
319 core::rect < s32 > rect(0, 0, 620, 620);
320 rect += AbsoluteRect.UpperLeftCorner;
321 driver->draw2DRectangle(bgcolor, rect, &AbsoluteClippingRect);
324 gui::IGUIElement::draw();
327 bool GUIKeyChangeMenu::acceptInput()
329 g_settings.set("keymap_forward", keycode_to_keyname(key_forward));
330 g_settings.set("keymap_backward", keycode_to_keyname(key_backward));
331 g_settings.set("keymap_left", keycode_to_keyname(key_left));
332 g_settings.set("keymap_right", keycode_to_keyname(key_right));
333 g_settings.set("keymap_jump", keycode_to_keyname(key_jump));
334 g_settings.set("keymap_sneak", keycode_to_keyname(key_sneak));
335 g_settings.set("keymap_inventory", keycode_to_keyname(key_inventory));
336 g_settings.set("keymap_chat", keycode_to_keyname(key_chat));
337 g_settings.set("keymap_rangeselect", keycode_to_keyname(key_range));
338 g_settings.set("keymap_freemove", keycode_to_keyname(key_fly));
339 g_settings.set("keymap_fastmove", keycode_to_keyname(key_fast));
340 g_settings.set("keymap_special1", keycode_to_keyname(key_use));
341 g_settings.set("keymap_print_debug_stacks", keycode_to_keyname(key_dump));
345 void GUIKeyChangeMenu::init_keys()
347 key_forward = getKeySetting("keymap_forward");
348 key_backward = getKeySetting("keymap_backward");
349 key_left = getKeySetting("keymap_left");
350 key_right = getKeySetting("keymap_right");
351 key_jump = getKeySetting("keymap_jump");
352 key_sneak = getKeySetting("keymap_sneak");
353 key_inventory = getKeySetting("keymap_inventory");
354 key_chat = getKeySetting("keymap_chat");
355 key_range = getKeySetting("keymap_rangeselect");
356 key_fly = getKeySetting("keymap_freemove");
357 key_fast = getKeySetting("keymap_fastmove");
358 key_use = getKeySetting("keymap_special1");
359 key_dump = getKeySetting("keymap_print_debug_stacks");
362 bool GUIKeyChangeMenu::resetMenu()
368 case GUI_ID_KEY_FORWARD_BUTTON:
369 this->forward->setText(
370 wgettext(KeyNames[key_forward]));
372 case GUI_ID_KEY_BACKWARD_BUTTON:
373 this->backward->setText(
374 wgettext(KeyNames[key_backward]));
376 case GUI_ID_KEY_LEFT_BUTTON:
377 this->left->setText(wgettext(KeyNames[key_left]));
379 case GUI_ID_KEY_RIGHT_BUTTON:
380 this->right->setText(wgettext(KeyNames[key_right]));
382 case GUI_ID_KEY_JUMP_BUTTON:
383 this->jump->setText(wgettext(KeyNames[key_jump]));
385 case GUI_ID_KEY_SNEAK_BUTTON:
386 this->sneak->setText(wgettext(KeyNames[key_sneak]));
388 case GUI_ID_KEY_INVENTORY_BUTTON:
389 this->inventory->setText(
390 wgettext(KeyNames[key_inventory]));
392 case GUI_ID_KEY_CHAT_BUTTON:
393 this->chat->setText(wgettext(KeyNames[key_chat]));
395 case GUI_ID_KEY_RANGE_BUTTON:
396 this->range->setText(wgettext(KeyNames[key_range]));
398 case GUI_ID_KEY_FLY_BUTTON:
399 this->fly->setText(wgettext(KeyNames[key_fly]));
401 case GUI_ID_KEY_FAST_BUTTON:
402 this->fast->setText(wgettext(KeyNames[key_fast]));
404 case GUI_ID_KEY_USE_BUTTON:
405 this->use->setText(wgettext(KeyNames[key_use]));
407 case GUI_ID_KEY_DUMP_BUTTON:
408 this->dump->setText(wgettext(KeyNames[key_dump]));
416 bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
418 if (event.EventType == EET_KEY_INPUT_EVENT && activeKey >= 0
419 && event.KeyInput.PressedDown)
422 if (activeKey == GUI_ID_KEY_FORWARD_BUTTON)
424 this->forward->setText(
425 wgettext(KeyNames[event.KeyInput.Key]));
426 this->key_forward = event.KeyInput.Key;
428 else if (activeKey == GUI_ID_KEY_BACKWARD_BUTTON)
430 this->backward->setText(
431 wgettext(KeyNames[event.KeyInput.Key]));
432 this->key_backward = event.KeyInput.Key;
434 else if (activeKey == GUI_ID_KEY_LEFT_BUTTON)
437 wgettext(KeyNames[event.KeyInput.Key]));
438 this->key_left = event.KeyInput.Key;
440 else if (activeKey == GUI_ID_KEY_RIGHT_BUTTON)
442 this->right->setText(
443 wgettext(KeyNames[event.KeyInput.Key]));
444 this->key_right = event.KeyInput.Key;
446 else if (activeKey == GUI_ID_KEY_JUMP_BUTTON)
449 wgettext(KeyNames[event.KeyInput.Key]));
450 this->key_jump = event.KeyInput.Key;
452 else if (activeKey == GUI_ID_KEY_SNEAK_BUTTON)
454 this->sneak->setText(
455 wgettext(KeyNames[event.KeyInput.Key]));
456 this->key_sneak = event.KeyInput.Key;
458 else if (activeKey == GUI_ID_KEY_INVENTORY_BUTTON)
460 this->inventory->setText(
461 wgettext(KeyNames[event.KeyInput.Key]));
462 this->key_inventory = event.KeyInput.Key;
464 else if (activeKey == GUI_ID_KEY_CHAT_BUTTON)
467 wgettext(KeyNames[event.KeyInput.Key]));
468 this->key_chat = event.KeyInput.Key;
470 else if (activeKey == GUI_ID_KEY_RANGE_BUTTON)
472 this->range->setText(
473 wgettext(KeyNames[event.KeyInput.Key]));
474 this->key_range = event.KeyInput.Key;
476 else if (activeKey == GUI_ID_KEY_FLY_BUTTON)
479 wgettext(KeyNames[event.KeyInput.Key]));
480 this->key_fly = event.KeyInput.Key;
482 else if (activeKey == GUI_ID_KEY_FAST_BUTTON)
485 wgettext(KeyNames[event.KeyInput.Key]));
486 this->key_fast = event.KeyInput.Key;
488 else if (activeKey == GUI_ID_KEY_USE_BUTTON)
491 wgettext(KeyNames[event.KeyInput.Key]));
492 this->key_use = event.KeyInput.Key;
494 else if (activeKey == GUI_ID_KEY_DUMP_BUTTON)
497 wgettext(KeyNames[event.KeyInput.Key]));
498 this->key_dump = event.KeyInput.Key;
504 if (event.EventType == EET_GUI_EVENT)
506 if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST
509 if (!canTakeFocus(event.GUIEvent.Element))
511 dstream << "GUIMainMenu: Not allowing focus change."
513 // Returning true disables focus change
517 if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED)
519 if(event.GUIEvent.Caller->getID() != GUI_ID_BACK_BUTTON &&
520 event.GUIEvent.Caller->getID() != GUI_ID_ABORT_BUTTON)
525 switch (event.GUIEvent.Caller->getID())
527 case GUI_ID_BACK_BUTTON: //back
531 case GUI_ID_ABORT_BUTTON: //abort
534 case GUI_ID_KEY_FORWARD_BUTTON:
536 activeKey = event.GUIEvent.Caller->getID();
537 this->forward->setText(wgettext("press Key"));
539 case GUI_ID_KEY_BACKWARD_BUTTON:
541 activeKey = event.GUIEvent.Caller->getID();
542 this->backward->setText(wgettext("press Key"));
544 case GUI_ID_KEY_LEFT_BUTTON:
546 activeKey = event.GUIEvent.Caller->getID();
547 this->left->setText(wgettext("press Key"));
549 case GUI_ID_KEY_RIGHT_BUTTON:
551 activeKey = event.GUIEvent.Caller->getID();
552 this->right->setText(wgettext("press Key"));
554 case GUI_ID_KEY_USE_BUTTON:
556 activeKey = event.GUIEvent.Caller->getID();
557 this->use->setText(wgettext("press Key"));
559 case GUI_ID_KEY_FLY_BUTTON:
561 activeKey = event.GUIEvent.Caller->getID();
562 this->fly->setText(wgettext("press Key"));
564 case GUI_ID_KEY_FAST_BUTTON:
566 activeKey = event.GUIEvent.Caller->getID();
567 this->fast->setText(wgettext("press Key"));
569 case GUI_ID_KEY_JUMP_BUTTON:
571 activeKey = event.GUIEvent.Caller->getID();
572 this->jump->setText(wgettext("press Key"));
574 case GUI_ID_KEY_CHAT_BUTTON:
576 activeKey = event.GUIEvent.Caller->getID();
577 this->chat->setText(wgettext("press Key"));
579 case GUI_ID_KEY_SNEAK_BUTTON:
581 activeKey = event.GUIEvent.Caller->getID();
582 this->sneak->setText(wgettext("press Key"));
584 case GUI_ID_KEY_INVENTORY_BUTTON:
586 activeKey = event.GUIEvent.Caller->getID();
587 this->inventory->setText(wgettext("press Key"));
589 case GUI_ID_KEY_DUMP_BUTTON:
591 activeKey = event.GUIEvent.Caller->getID();
592 this->dump->setText(wgettext("press Key"));
594 case GUI_ID_KEY_RANGE_BUTTON:
596 activeKey = event.GUIEvent.Caller->getID();
597 this->range->setText(wgettext("press Key"));
605 return Parent ? Parent->OnEvent(event) : false;