#include "common_irrlicht.h"
-//TODO: Change GUIElement private
+class GUIModalMenu;
+
+class IMenuManager
+{
+public:
+ // A GUIModalMenu calls these when this class is passed as a parameter
+ virtual void createdMenu(GUIModalMenu *menu) = 0;
+ virtual void deletingMenu(GUIModalMenu *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,
- int *active_menu_count):
+ IMenuManager *menumgr):
IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
core::rect<s32>(0,0,100,100))
{
- m_active_menu_count = active_menu_count;
+ //m_force_regenerate_gui = false;
+
+ m_menumgr = menumgr;
m_allow_focus_removal = false;
m_screensize_old = v2u32(0,0);
setVisible(true);
Environment->setFocus(this);
- (*m_active_menu_count)++;
+ m_menumgr->createdMenu(this);
}
virtual ~GUIModalMenu()
{
- (*m_active_menu_count)--;
+ m_menumgr->deletingMenu(this);
}
- bool canTakeFocus(gui::IGUIElement *e)
+ void allowFocusRemoval(bool allow)
{
- return (e && (e == this || isMyChild(e))) || m_allow_focus_removal;
+ m_allow_focus_removal = allow;
}
- void quitMenu()
+ bool canTakeFocus(gui::IGUIElement *e)
{
- m_allow_focus_removal = true;
- // This removes Environment's grab on us
- Environment->removeFocus(this);
- this->remove();
+ return (e && (e == this || isMyChild(e))) || m_allow_focus_removal;
}
- virtual void regenerateGui(v2u32 screensize) = 0;
-
- virtual void drawMenu() = 0;
-
void draw()
{
if(!IsVisible)
video::IVideoDriver* driver = Environment->getVideoDriver();
v2u32 screensize = driver->getScreenSize();
- if(screensize != m_screensize_old)
+ 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.
+ */
+ void quitMenu()
+ {
+ allowFocusRemoval(true);
+ // This removes Environment's grab on us
+ Environment->removeFocus(this);
+ this->remove();
+ }
+
+ void 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();
+ }
+ }
+
+ virtual void regenerateGui(v2u32 screensize) = 0;
+ virtual void drawMenu() = 0;
virtual bool OnEvent(const SEvent& event) { return false; };
-
+
+protected:
+ //bool m_force_regenerate_gui;
private:
- int *m_active_menu_count;
+ IMenuManager *m_menumgr;
+ // This might be necessary to expose to the implementation if it
+ // wants to launch other menus
bool m_allow_focus_removal;
v2u32 m_screensize_old;
};