Mercurial > fife-parpg
diff engine/core/gui/guimanager.cpp @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | e84dccee1bb7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/gui/guimanager.cpp Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,231 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE 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 2 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., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +// Standard C++ library includes +#include <iostream> + +// 3rd party library includes +#include <boost/filesystem/convenience.hpp> +#include <guichan/sdl/sdlinput.hpp> +#include <guichan/focushandler.hpp> +#include <guichan.hpp> + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "util/log/logger.h" +#include "video/renderbackend.h" +#include "gui/base/gui_imageloader.h" +#include "gui/base/gui_font.h" +#include "gui/console/console.h" +#include "video/fonts/fontbase.h" +#include "video/fonts/truetypefont.h" +#include "video/fonts/subimagefont.h" +#include "eventchannel/widget/ec_widgetevent.h" +#include "eventchannel/key/ec_keyevent.h" +#include "eventchannel/mouse/ec_mouseevent.h" + +#include "guimanager.h" + + +namespace FIFE { + static Logger _log(LM_GUI); + + GUIManager::GUIManager(IWidgetListener* widgetlistener, ImagePool& pool) : + m_gcn_gui(new gcn::Gui()), + m_focushandler(0), + m_gcn_topcontainer(new gcn::Container()), + m_imgloader(new GuiImageLoader(pool)) , + m_input(new gcn::SDLInput()), + m_console(0), + m_fonts(), + m_widgetlistener(widgetlistener), + m_pool(pool), + m_logic_executed(false) { + + m_gcn_gui->setTop(m_gcn_topcontainer); + m_gcn_topcontainer->setOpaque(false); + m_gcn_gui->setInput(m_input); + + gcn::Image::setImageLoader(m_imgloader); + m_focushandler = m_gcn_topcontainer->_getFocusHandler(); + } + + GUIManager::~GUIManager() { + delete m_console; + delete m_gcn_topcontainer; + delete m_imgloader; + delete m_input; + delete m_gcn_gui; + std::vector<GuiFont*>::iterator i = m_fonts.begin(); + while (i != m_fonts.end()) { + delete *i; + ++i; + } + } + + void GUIManager::onSdlEvent(SDL_Event& evt) { + gcn::SDLInput *input = dynamic_cast<gcn::SDLInput*>(m_gcn_gui->getInput()); + if (!input) { + FL_WARN(_log, "GUIManager, GuichanGUI->getInput == 0 ... discarding events!"); + return; + } + input->pushInput(evt); + } + + void GUIManager::resizeTopContainer(unsigned int x, unsigned int y, unsigned int width, unsigned int height) { + m_gcn_topcontainer->setDimension(gcn::Rectangle(x, y, width, height)); + } + + gcn::Gui* GUIManager::getGuichanGUI() const { + return m_gcn_gui; + } + + void GUIManager::add(gcn::Widget* widget) { + if( !m_widgets.count(widget) ) { + m_gcn_topcontainer->add(widget); + m_widgets.insert(widget); + } + } + + void GUIManager::remove(gcn::Widget* widget) { + if( m_widgets.count(widget) ) { + m_widgets.erase(widget); + m_gcn_topcontainer->remove(widget); + } + } + + void GUIManager::init(gcn::Graphics* graphics, int screenWidth, int screenHeight) { + m_gcn_gui->setGraphics(graphics); + resizeTopContainer(0, 0, screenWidth, screenHeight); + m_console = new Console(); + } + + GuiFont* GUIManager::createFont(const std::string& path, unsigned int size, const std::string& glyphs) { + std::string fontpath = path; + std::string fontglyphs = glyphs; + int fontsize = size; + + // Set default settings if necessary + if(fontpath == "") { + fontpath = m_fontpath; + } + if(fontsize == 0) { + fontsize = m_fontsize; + } + if(fontglyphs == "") { + fontglyphs = m_fontglyphs; + } + + AbstractFont* font = NULL; + GuiFont* guifont = NULL; + if( boost::filesystem::extension(fontpath) == ".ttf" ) { + font = new TrueTypeFont(fontpath, fontsize); + } else { + font = new SubImageFont(fontpath, fontglyphs, m_pool); + } + guifont = new GuiFont(font); + + m_fonts.push_back(guifont); + return guifont; + } + + void GUIManager::releaseFont(GuiFont* font) { + std::vector<GuiFont*>::iterator i = m_fonts.begin(); + while (i != m_fonts.end()) { + if ((*i) == font) { + m_fonts.erase(i); + delete font; + return; + } + ++i; + } + } + + GuiFont* GUIManager::setDefaultFont(const std::string& path, unsigned int size, const std::string& glyphs) { + m_fontpath = path; + m_fontsize = size; + m_fontglyphs = glyphs; + + GuiFont* defaultfont = createFont(); + gcn::Widget::setGlobalFont(defaultfont); + if (m_console) { + m_console->reLayout(); + } + + return defaultfont; + } + + void GUIManager::turn() { + if (!m_logic_executed) { + // Due to a BUG in Guichan we need to catch GCN exceptions + // This is a potentially dangerous workaround put in place + // until we upgrade to Guichan 0.8.0 + // See here: http://code.google.com/p/guichan/issues/detail?id=24 + try { + m_gcn_gui->logic(); + } catch( const gcn::Exception& e) { + FL_WARN(_log, LMsg("GUIManager, discarding gcn::Exception: ") << e.getMessage()); + } + } + m_gcn_gui->draw(); + m_logic_executed = false; + } + + void GUIManager::action(const gcn::ActionEvent & event) { + WidgetEvent wevt; + wevt.setId(event.getId()); + wevt.setSourceWidget(event.getSource()); + m_widgetlistener->onWidgetAction(wevt); + } + + void GUIManager::evaluateKeyEventConsumption(KeyEvent& evt) { + gcn::Widget* w = m_focushandler->getFocused(); + if (w) { + evt.consume(); + } + } + + void GUIManager::evaluateMouseEventConsumption(MouseEvent& evt) { + gcn::Widget* w = m_gcn_topcontainer->getWidgetAt(evt.getX(), evt.getY()); + if (w && w->isVisible()) { + // evt.consume(); + } + } + + void GUIManager::mousePressed(MouseEvent& evt) { + evaluateMouseEventConsumption(evt); + if (!evt.isConsumed()) { + m_focushandler->focusNone(); + } + } + + void GUIManager::mouseDragged(MouseEvent& evt) { + try { + m_gcn_gui->logic(); + m_logic_executed = true; + } catch( const gcn::Exception& e) { + FL_WARN(_log, LMsg("GUIManager, discarding gcn::Exception: ") << e.getMessage()); + } + evaluateMouseEventConsumption(evt); + } +}