some generation-time mud flow tweaking
[oweals/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         void quitMenu()
92         {
93                 allowFocusRemoval(true);
94                 // This removes Environment's grab on us
95                 Environment->removeFocus(this);
96                 this->remove();
97         }
98
99         void removeChildren()
100         {
101                 const core::list<gui::IGUIElement*> &children = getChildren();
102                 core::list<gui::IGUIElement*> children_copy;
103                 for(core::list<gui::IGUIElement*>::ConstIterator
104                                 i = children.begin(); i != children.end(); i++)
105                 {
106                         children_copy.push_back(*i);
107                 }
108                 for(core::list<gui::IGUIElement*>::Iterator
109                                 i = children_copy.begin();
110                                 i != children_copy.end(); i++)
111                 {
112                         (*i)->remove();
113                 }
114         }
115
116         virtual void regenerateGui(v2u32 screensize) = 0;
117         virtual void drawMenu() = 0;
118         virtual bool OnEvent(const SEvent& event) { return false; };
119         
120 private:
121         IMenuManager *m_menumgr;
122         // This might be necessary to expose to the implementation if it
123         // wants to launch other menus
124         bool m_allow_focus_removal;
125         v2u32 m_screensize_old;
126 };
127
128
129 #endif
130