]> git.lizzy.rs Git - minetest.git/blob - src/modalMenu.h
fixed bug in sneaking
[minetest.git] / src / modalMenu.h
1 /*
2 Minetest-c55
3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
4
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.
9
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.
14
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.
18 */
19
20 #ifndef MODALMENU_HEADER
21 #define MODALMENU_HEADER
22
23 #include "common_irrlicht.h"
24
25 class GUIModalMenu;
26
27 class IMenuManager
28 {
29 public:
30         // A GUIModalMenu calls these when this class is passed as a parameter
31         virtual void createdMenu(GUIModalMenu *menu) = 0;
32         virtual void deletingMenu(GUIModalMenu *menu) = 0;
33 };
34
35 /*
36         Remember to drop() the menu after creating, so that it can
37         remove itself when it wants to.
38 */
39
40 class GUIModalMenu : public gui::IGUIElement
41 {
42 public:
43         GUIModalMenu(gui::IGUIEnvironment* env,
44                         gui::IGUIElement* parent, s32 id,
45                         IMenuManager *menumgr):
46                 IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
47                                 core::rect<s32>(0,0,100,100))
48         {
49                 m_menumgr = menumgr;
50                 m_allow_focus_removal = false;
51                 m_screensize_old = v2u32(0,0);
52
53                 setVisible(true);
54                 Environment->setFocus(this);
55                 m_menumgr->createdMenu(this);
56         }
57         virtual ~GUIModalMenu()
58         {
59                 m_menumgr->deletingMenu(this);
60         }
61
62         void allowFocusRemoval(bool allow)
63         {
64                 m_allow_focus_removal = allow;
65         }
66
67         bool canTakeFocus(gui::IGUIElement *e)
68         {
69                 return (e && (e == this || isMyChild(e))) || m_allow_focus_removal;
70         }
71
72         void draw()
73         {
74                 if(!IsVisible)
75                         return;
76                         
77                 video::IVideoDriver* driver = Environment->getVideoDriver();
78                 v2u32 screensize = driver->getScreenSize();
79                 if(screensize != m_screensize_old)
80                 {
81                         m_screensize_old = screensize;
82                         regenerateGui(screensize);
83                 }
84
85                 drawMenu();
86         }
87         
88         /*
89                 This should be called when the menu wants to quit.
90
91                 WARNING: THIS DEALLOCATES THE MENU FROM MEMORY. Return
92                 immediately if you call this from the menu itself.
93         */
94         void quitMenu()
95         {
96                 allowFocusRemoval(true);
97                 // This removes Environment's grab on us
98                 Environment->removeFocus(this);
99                 this->remove();
100         }
101
102         void removeChildren()
103         {
104                 const core::list<gui::IGUIElement*> &children = getChildren();
105                 core::list<gui::IGUIElement*> children_copy;
106                 for(core::list<gui::IGUIElement*>::ConstIterator
107                                 i = children.begin(); i != children.end(); i++)
108                 {
109                         children_copy.push_back(*i);
110                 }
111                 for(core::list<gui::IGUIElement*>::Iterator
112                                 i = children_copy.begin();
113                                 i != children_copy.end(); i++)
114                 {
115                         (*i)->remove();
116                 }
117         }
118
119         virtual void regenerateGui(v2u32 screensize) = 0;
120         virtual void drawMenu() = 0;
121         virtual bool OnEvent(const SEvent& event) { return false; };
122         
123 private:
124         IMenuManager *m_menumgr;
125         // This might be necessary to expose to the implementation if it
126         // wants to launch other menus
127         bool m_allow_focus_removal;
128         v2u32 m_screensize_old;
129 };
130
131
132 #endif
133