From 7be81c67dfbbbd2dd1839a3244d7c9427ffcc56d Mon Sep 17 00:00:00 2001
From: auria <auria@178a84e3-b1eb-0310-8ba1-8eac791a3b58>
Date: Sat, 18 Jul 2009 18:17:43 +0000
Subject: [PATCH] Added files forgotten in previous commit

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3766 178a84e3-b1eb-0310-8ba1-8eac791a3b58
---
 src/guiengine/abstract_state_manager.cpp | 143 +++++++++++++++++++++++
 src/guiengine/abstract_state_manager.hpp |  46 ++++++++
 2 files changed, 189 insertions(+)
 create mode 100644 src/guiengine/abstract_state_manager.cpp
 create mode 100644 src/guiengine/abstract_state_manager.hpp

diff --git a/src/guiengine/abstract_state_manager.cpp b/src/guiengine/abstract_state_manager.cpp
new file mode 100644
index 000000000..59f3c0da1
--- /dev/null
+++ b/src/guiengine/abstract_state_manager.cpp
@@ -0,0 +1,143 @@
+//  SuperTuxKart - a fun racing game with go-kart
+//  Copyright (C) 2009 Marianne Gagnon
+//
+//  This program is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU General Public License
+//  as published by the Free Software Foundation; either version 3
+//  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 General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+
+#include "guiengine/abstract_state_manager.hpp"
+
+#include <vector>
+
+#include "main_loop.hpp"
+#include "audio/sound_manager.hpp"
+#include "config/player.hpp"
+#include "config/user_config.hpp"
+#include "graphics/irr_driver.hpp"
+#include "guiengine/engine.hpp"
+#include "guiengine/modaldialog.hpp"
+#include "guiengine/screen.hpp"
+#include "guiengine/widget.hpp"
+#include "input/device_manager.hpp"
+#include "input/input_manager.hpp"
+#include "io/file_manager.hpp"
+#include "network/network_manager.hpp"
+#include "race/race_manager.hpp"
+#include "states_screens/options_screen.hpp"
+#include "states_screens/kart_selection.hpp"
+#include "states_screens/credits.hpp"
+#include "utils/translation.hpp"
+
+using namespace GUIEngine;
+
+
+/**
+* Name of the event sent when constructing a menu
+*/
+const std::string g_init_event = "init";
+
+AbstractStateManager::AbstractStateManager()
+{
+    m_game_mode = false;
+}
+
+#if 0
+#pragma mark -
+#pragma mark Other
+#endif
+
+/*
+void initGUI()
+{
+    IrrlichtDevice* device = irr_driver->getDevice();
+    video::IVideoDriver* driver = device->getVideoDriver();
+    GUIEngine::init(device, driver, &eventCallback);
+}
+ */
+
+void AbstractStateManager::enterGameState()
+{
+    m_menu_stack.clear();
+    m_menu_stack.push_back("race");
+    m_game_mode = true;
+    cleanForGame();
+    input_manager->setMode(InputManager::INGAME);
+}
+
+bool AbstractStateManager::isGameState()
+{
+    return m_game_mode;
+}
+
+
+#if 0
+#pragma mark -
+#pragma mark Push/pop menus
+#endif
+
+void AbstractStateManager::pushMenu(std::string name)
+{
+    input_manager->setMode(InputManager::MENU);
+    m_menu_stack.push_back(name);
+    m_game_mode = false;
+    switchToScreen(name.c_str());
+    
+    eventCallback(NULL, g_init_event);
+}
+void AbstractStateManager::replaceTopMostMenu(std::string name)
+{
+    input_manager->setMode(InputManager::MENU);
+    m_menu_stack[m_menu_stack.size()-1] = name;
+    m_game_mode = false;
+    switchToScreen(name.c_str());
+    
+    eventCallback(NULL, g_init_event);
+}
+
+void AbstractStateManager::reshowTopMostMenu()
+{
+    switchToScreen( m_menu_stack[m_menu_stack.size()-1].c_str() );
+    eventCallback(NULL, g_init_event);
+}
+
+void AbstractStateManager::popMenu()
+{
+    m_menu_stack.pop_back();
+    
+    if(m_menu_stack.size() == 0)
+    {
+        main_loop->abort();
+        return;
+    }
+    
+    m_game_mode = m_menu_stack[m_menu_stack.size()-1] == "race";
+    
+    std::cout << "-- switching to screen " << m_menu_stack[m_menu_stack.size()-1].c_str() << std::endl;
+    switchToScreen(m_menu_stack[m_menu_stack.size()-1].c_str());
+    
+    eventCallback(NULL, g_init_event);
+}
+
+void AbstractStateManager::resetAndGoToMenu(std::string name)
+{
+    race_manager->exitRace();
+    input_manager->setMode(InputManager::MENU);
+    m_menu_stack.clear();
+    m_menu_stack.push_back(name);
+    m_game_mode = false;
+    sound_manager->positionListener( Vec3(0,0,0), Vec3(0,1,0) );
+    switchToScreen(name.c_str());
+    eventCallback(NULL, g_init_event);
+}
+
diff --git a/src/guiengine/abstract_state_manager.hpp b/src/guiengine/abstract_state_manager.hpp
new file mode 100644
index 000000000..0fb40a6e7
--- /dev/null
+++ b/src/guiengine/abstract_state_manager.hpp
@@ -0,0 +1,46 @@
+#ifndef HEADER_ABSTRACT_STATE_MANAGER_HPP
+#define HEADER_ABSTRACT_STATE_MANAGER_HPP
+
+#include <vector>
+#include <string>
+
+namespace GUIEngine
+{
+    class Widget;
+
+/**
+  * Abstract base class you must override from to use the GUI engine
+  */
+class AbstractStateManager
+{
+protected:
+    /**
+      * Whether we are in game mode
+      */
+    bool m_game_mode;
+    
+    /**
+     * This stack will contain menu names (e.g. main.stkgui), and/or 'race'.
+     */
+    std::vector<std::string> m_menu_stack;
+    
+public:
+    AbstractStateManager();
+    virtual ~AbstractStateManager() { }
+    
+    void pushMenu(std::string name);
+    void replaceTopMostMenu(std::string name);
+    void popMenu();
+    void resetAndGoToMenu(std::string name);
+    void enterGameState();
+    bool isGameState();
+    void reshowTopMostMenu();
+
+    // method to override in children
+    virtual void escapePressed() = 0;
+    virtual void onUpdate(float elpased_time) = 0;
+    virtual void eventCallback(Widget* widget, const std::string& name) = 0;
+};
+
+}
+#endif