123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /*
- Minetest
- Copyright (C) 2013 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 Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser 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.
- */
- #pragma once
- #include "irrlichttypes_extrabloated.h"
- #ifdef HAVE_TOUCHSCREENGUI
- #include "touchscreengui.h"
- #endif
- class GUIModalMenu;
- class IMenuManager
- {
- public:
- // A GUIModalMenu calls these when this class is passed as a parameter
- virtual void createdMenu(gui::IGUIElement *menu) = 0;
- virtual void deletingMenu(gui::IGUIElement *menu) = 0;
- };
- /*
- Remember to drop() the menu after creating, so that it can
- remove itself when it wants to.
- */
- class GUIModalMenu : public gui::IGUIElement
- {
- public:
- GUIModalMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id,
- IMenuManager *menumgr):
- IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
- core::rect<s32>(0,0,100,100))
- {
- m_menumgr = menumgr;
- setVisible(true);
- Environment->setFocus(this);
- m_menumgr->createdMenu(this);
- }
- virtual ~GUIModalMenu()
- {
- m_menumgr->deletingMenu(this);
- }
- void allowFocusRemoval(bool allow)
- {
- m_allow_focus_removal = allow;
- }
- bool canTakeFocus(gui::IGUIElement *e)
- {
- return (e && (e == this || isMyChild(e))) || m_allow_focus_removal;
- }
- void draw()
- {
- if(!IsVisible)
- return;
- video::IVideoDriver* driver = Environment->getVideoDriver();
- v2u32 screensize = driver->getScreenSize();
- if(screensize != m_screensize_old /*|| m_force_regenerate_gui*/)
- {
- m_screensize_old = screensize;
- regenerateGui(screensize);
- //m_force_regenerate_gui = false;
- }
- drawMenu();
- }
- /*
- This should be called when the menu wants to quit.
- WARNING: THIS DEALLOCATES THE MENU FROM MEMORY. Return
- immediately if you call this from the menu itself.
- (More precisely, this decrements the reference count.)
- */
- void quitMenu()
- {
- allowFocusRemoval(true);
- // This removes Environment's grab on us
- Environment->removeFocus(this);
- m_menumgr->deletingMenu(this);
- this->remove();
- #ifdef HAVE_TOUCHSCREENGUI
- if (g_touchscreengui)
- g_touchscreengui->show();
- #endif
- }
- void removeChildren()
- {
- const core::list<gui::IGUIElement*> &children = getChildren();
- core::list<gui::IGUIElement*> children_copy;
- for (gui::IGUIElement *i : children) {
- children_copy.push_back(i);
- }
- for (gui::IGUIElement *i : children_copy) {
- i->remove();
- }
- }
- virtual void regenerateGui(v2u32 screensize) = 0;
- virtual void drawMenu() = 0;
- virtual bool preprocessEvent(const SEvent& event) { return false; };
- virtual bool OnEvent(const SEvent& event) { return false; };
- virtual bool pausesGame(){ return false; } // Used for pause menu
- protected:
- //bool m_force_regenerate_gui;
- v2u32 m_screensize_old;
- private:
- IMenuManager *m_menumgr;
- // This might be necessary to expose to the implementation if it
- // wants to launch other menus
- bool m_allow_focus_removal = false;
- };
|