GUIEngine addition. Now a queue of dialog windows.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13514 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
unitraxx 2013-08-19 18:08:51 +00:00
parent ac6ce5a4f0
commit f43c5c915f
6 changed files with 149 additions and 9 deletions

View File

@ -51,6 +51,7 @@ src/graphics/stars.cpp
src/guiengine/abstract_state_manager.cpp src/guiengine/abstract_state_manager.cpp
src/guiengine/abstract_top_level_container.cpp src/guiengine/abstract_top_level_container.cpp
src/guiengine/CGUISpriteBank.cpp src/guiengine/CGUISpriteBank.cpp
src/guiengine/dialog_queue.cpp
src/guiengine/engine.cpp src/guiengine/engine.cpp
src/guiengine/event_handler.cpp src/guiengine/event_handler.cpp
src/guiengine/layout_manager.cpp src/guiengine/layout_manager.cpp
@ -347,6 +348,7 @@ src/graphics/slip_stream.hpp
src/graphics/stars.hpp src/graphics/stars.hpp
src/guiengine/abstract_state_manager.hpp src/guiengine/abstract_state_manager.hpp
src/guiengine/abstract_top_level_container.hpp src/guiengine/abstract_top_level_container.hpp
src/guiengine/dialog_queue.hpp
src/guiengine/engine.hpp src/guiengine/engine.hpp
src/guiengine/event_handler.hpp src/guiengine/event_handler.hpp
src/guiengine/layout_manager.hpp src/guiengine/layout_manager.hpp

View File

@ -0,0 +1,74 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2013 Glenn De Jonghe
//
// 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/dialog_queue.hpp"
#include "assert.h"
using namespace GUIEngine;
namespace GUIEngine
{
static DialogQueue* dialog_queue_singleton(NULL);
DialogQueue* DialogQueue::get()
{
if (dialog_queue_singleton == NULL)
dialog_queue_singleton = new DialogQueue();
return dialog_queue_singleton;
}
void DialogQueue::deallocate()
{
delete dialog_queue_singleton;
dialog_queue_singleton = NULL;
} // deallocate
// ----------------------------------------------------------------------------
DialogQueue::DialogQueue()
{
}
// ----------------------------------------------------------------------------
void DialogQueue::pushDialog(ModalDialog * dialog, bool closes_any_dialog)
{
assert(!dialog->isInited());
m_queue.push( new Entry(dialog, closes_any_dialog)); }
}
// ----------------------------------------------------------------------------
void DialogQueue::update()
{
if(!m_queue.empty())
{
Entry * entry = m_queue.front();
if(entry->closes() || !ModalDialog::isADialogActive())
{
ModalDialog::dismiss();
entry->get()->doInit();
m_queue.pop();
delete entry;
}
}
}

View File

@ -0,0 +1,55 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2013 Glenn De Jonghe
//
// 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.
#ifndef HEADER_DIALOG_QUEUE_HPP
#define HEADER_DIALOG_QUEUE_HPP
#include <queue>
#include "guiengine/modaldialog.hpp"
/**
* \ingroup guiengine
*/
namespace GUIEngine
{
class DialogQueue
{
private :
class Entry
{
ModalDialog * m_dialog;
bool m_closes_any_dialog;
public :
Entry(ModalDialog * dialog, bool closes_any_dialog) : m_dialog(dialog), m_closes_any_dialog(closes_any_dialog) {}
bool closes() { return m_closes_any_dialog; }
ModalDialog* get() { return m_dialog; }
};
std::queue<Entry *> m_queue;
DialogQueue();
public :
/**Singleton */
static DialogQueue * get();
static void deallocate();
void pushDialog(ModalDialog * dialog, bool closes_any_dialog);
void update();
};
}
#endif

View File

@ -657,6 +657,7 @@ namespace GUIEngine
#include "guiengine/screen.hpp" #include "guiengine/screen.hpp"
#include "guiengine/skin.hpp" #include "guiengine/skin.hpp"
#include "guiengine/widget.hpp" #include "guiengine/widget.hpp"
#include "guiengine/dialog_queue.hpp"
#include "modes/demo_world.hpp" #include "modes/demo_world.hpp"
#include "modes/world.hpp" #include "modes/world.hpp"
#include "states_screens/race_gui_base.hpp" #include "states_screens/race_gui_base.hpp"
@ -835,6 +836,7 @@ namespace GUIEngine
{ {
widget->update(dt); widget->update(dt);
} }
DialogQueue::get()->update();
} }
} }

View File

@ -47,11 +47,12 @@ using namespace GUIEngine;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
ModalDialog::ModalDialog(const float percentWidth, const float percentHeight, ModalDialog::ModalDialog(const float percentWidth, const float percentHeight, bool do_init, ModalDialogLocation location)
ModalDialogLocation location)
{ {
m_dialog_location = location; m_dialog_location = location;
doInit(percentWidth, percentHeight); m_init = false;
if(do_init)
doInit();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -82,15 +83,16 @@ void ModalDialog::loadFromFile(const char* xmlFile)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void ModalDialog::doInit(const float percentWidth, const float percentHeight) void ModalDialog::doInit()
{ {
m_init = true;
pointer_was_shown = irr_driver->isPointerShown(); pointer_was_shown = irr_driver->isPointerShown();
irr_driver->showPointer(); irr_driver->showPointer();
const core::dimension2d<u32>& frame_size = GUIEngine::getDriver()->getCurrentRenderTargetSize(); const core::dimension2d<u32>& frame_size = GUIEngine::getDriver()->getCurrentRenderTargetSize();
const int w = (int)(frame_size.Width*percentWidth); const int w = (int)(frame_size.Width* m_percent_width);
const int h = (int)(frame_size.Height*percentHeight); const int h = (int)(frame_size.Height* m_percent_height);
assert(frame_size.Width > 0); assert(frame_size.Width > 0);
assert(frame_size.Height > 0); assert(frame_size.Height > 0);

View File

@ -55,11 +55,12 @@ namespace GUIEngine
class ModalDialog : public SkinWidgetContainer, public AbstractTopLevelContainer class ModalDialog : public SkinWidgetContainer, public AbstractTopLevelContainer
{ {
private: private:
/** Because C++ doesn't support constructor delegation... */
void doInit(const float percentWidth, const float percentHeight);
ModalDialogLocation m_dialog_location; ModalDialogLocation m_dialog_location;
float m_percent_width, m_percent_height;
bool m_init;
protected: protected:
irr::gui::IGUIWindow* m_irrlicht_window; irr::gui::IGUIWindow* m_irrlicht_window;
@ -70,7 +71,7 @@ namespace GUIEngine
/** /**
* \brief Creates a modal dialog with given percentage of screen width and height * \brief Creates a modal dialog with given percentage of screen width and height
*/ */
ModalDialog(const float percentWidth, const float percentHeight, ModalDialog(const float percentWidth, const float percentHeight, bool do_init = true,
ModalDialogLocation location = MODAL_DIALOG_LOCATION_CENTER); ModalDialogLocation location = MODAL_DIALOG_LOCATION_CENTER);
/** \brief Load a XML file to create the dialog from /** \brief Load a XML file to create the dialog from
@ -89,6 +90,10 @@ namespace GUIEngine
public: public:
LEAK_CHECK() LEAK_CHECK()
/** Because C++ doesn't support constructor delegation... */
void doInit();
bool isInited() {return m_init;}
virtual ~ModalDialog(); virtual ~ModalDialog();
/** Returns whether to block event propagation (usually, you will want to block events you processed) */ /** Returns whether to block event propagation (usually, you will want to block events you processed) */