diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/guiInventoryMenu.cpp | 261 | ||||
-rw-r--r-- | src/guiInventoryMenu.h | 88 |
2 files changed, 349 insertions, 0 deletions
diff --git a/src/guiInventoryMenu.cpp b/src/guiInventoryMenu.cpp new file mode 100644 index 000000000..370ebd5d1 --- /dev/null +++ b/src/guiInventoryMenu.cpp @@ -0,0 +1,261 @@ +/* +Minetest-c55 +Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> + +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 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +#include "guiInventoryMenu.h" +#include "constants.h" + +void drawInventoryItem(gui::IGUIEnvironment* env, + InventoryItem *item, core::rect<s32> rect, + const core::rect<s32> *clip) +{ + gui::IGUISkin* skin = env->getSkin(); + if (!skin) + return; + video::IVideoDriver* driver = env->getVideoDriver(); + + video::ITexture *texture = NULL; + + if(item != NULL) + { + texture = item->getImage(); + } + + if(texture != NULL) + { + const video::SColor color(255,255,255,255); + const video::SColor colors[] = {color,color,color,color}; + driver->draw2DImage(texture, rect, + core::rect<s32>(core::position2d<s32>(0,0), + core::dimension2di(texture->getOriginalSize())), + clip, colors, false); + } + else + { + video::SColor bgcolor(128,128,128,128); + driver->draw2DRectangle(bgcolor, rect, clip); + } + + if(item != NULL) + { + gui::IGUIFont *font = skin->getFont(); + if(font) + { + core::rect<s32> rect2(rect.UpperLeftCorner, + (core::dimension2d<u32>(rect.getWidth(), 15))); + + video::SColor bgcolor(128,0,0,0); + driver->draw2DRectangle(bgcolor, rect2, clip); + + font->draw(item->getText().c_str(), rect2, + video::SColor(255,255,255,255), false, false, + clip); + } + } +} + +/* + GUIInventorySlot +*/ + +GUIInventorySlot::GUIInventorySlot(gui::IGUIEnvironment* env, + gui::IGUIElement* parent, s32 id, core::rect<s32> rect): + IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rect) +{ + m_item = NULL; +} + +void GUIInventorySlot::draw() +{ + if(!IsVisible) + return; + + drawInventoryItem(Environment, m_item, AbsoluteRect, + &AbsoluteClippingRect); + + gui::IGUIElement::draw(); +} + +bool GUIInventorySlot::OnEvent(const SEvent& event) +{ + /*if (!IsEnabled) + return IGUIElement::OnEvent(event);*/ + + switch(event.EventType) + { + case EET_MOUSE_INPUT_EVENT: + if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) + { + dstream<<"Slot pressed"<<std::endl; + //return true; + } + else + if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) + { + dstream<<"Slot released"<<std::endl; + //return true; + } + break; + default: + break; + } + + return Parent ? Parent->OnEvent(event) : false; +} + +/* + GUIInventoryMenu +*/ + +GUIInventoryMenu::GUIInventoryMenu(gui::IGUIEnvironment* env, + gui::IGUIElement* parent, s32 id, + Inventory *inventory): + IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, + core::rect<s32>(0,0,100,100)) +{ + m_inventory = inventory; + m_screensize_old = v2u32(0,0); + + resizeGui(); + + setVisible(false); +} + +GUIInventoryMenu::~GUIInventoryMenu() +{ +} + +void GUIInventoryMenu::resizeGui() +{ + video::IVideoDriver* driver = Environment->getVideoDriver(); + v2u32 screensize = driver->getScreenSize(); + if(screensize == m_screensize_old) + return; + m_screensize_old = screensize; + + for(u32 i=0; i<m_slots.size(); i++) + { + m_slots[i]->remove(); + } + m_slots.clear(); + + core::rect<s32> rect( + screensize.X/2 - 560/2, + screensize.Y/2 - 300/2, + screensize.X/2 + 560/2, + screensize.Y/2 + 300/2 + ); + + DesiredRect = rect; + recalculateAbsolutePosition(false); + + //v2s32 size = rect.getSize(); + + core::rect<s32> imgsize(0,0,48,48); + v2s32 basepos(30, 30); + for(s32 i=0; i<PLAYER_INVENTORY_SIZE; i++) + { + s32 x = (i%8) * 64; + s32 y = (i/8) * 64; + v2s32 p(x,y); + core::rect<s32> rect = imgsize + basepos + p; + GUIInventorySlot *item = + new GUIInventorySlot(Environment, this, -1, rect); + m_slots.push_back(item); + } + + update(); +} + +void GUIInventoryMenu::update() +{ + for(s32 i=0; i<PLAYER_INVENTORY_SIZE; i++) + { + m_slots[i]->setItem(m_inventory->getItem(i)); + } +} + +void GUIInventoryMenu::draw() +{ + if(!IsVisible) + return; + + gui::IGUISkin* skin = Environment->getSkin(); + if (!skin) + return; + video::IVideoDriver* driver = Environment->getVideoDriver(); + + video::SColor bgcolor(140,0,0,0); + driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect); + + gui::IGUIElement::draw(); +} + +bool GUIInventoryMenu::OnEvent(const SEvent& event) +{ + if(event.EventType==EET_KEY_INPUT_EVENT) + { + if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown) + { + setVisible(false); + return true; + } + if(event.KeyInput.Key==KEY_KEY_I && event.KeyInput.PressedDown) + { + setVisible(false); + return true; + } + } + if(event.EventType==EET_MOUSE_INPUT_EVENT) + { + if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) + { + } + } + if(event.EventType==EET_GUI_EVENT) + { + if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST + && isVisible()) + { + if(!canTakeFocus(event.GUIEvent.Element)) + { + dstream<<"GUIInventoryMenu: Not allowing focus change." + <<std::endl; + // Returning true disables focus change + return true; + } + } + if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED) + { + /*switch(event.GUIEvent.Caller->getID()) + { + case 256: // continue + setVisible(false); + break; + case 257: // exit + dev->closeDevice(); + break; + }*/ + } + } + + return Parent ? Parent->OnEvent(event) : false; +} + + diff --git a/src/guiInventoryMenu.h b/src/guiInventoryMenu.h new file mode 100644 index 000000000..8bfade4c4 --- /dev/null +++ b/src/guiInventoryMenu.h @@ -0,0 +1,88 @@ +/* +Minetest-c55 +Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> + +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 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +#ifndef GUIINVENTORYMENU_HEADER +#define GUIINVENTORYMENU_HEADER + +#include "common_irrlicht.h" +#include "inventory.h" + +void drawInventoryItem(gui::IGUIEnvironment* env, + InventoryItem *item, core::rect<s32> rect, + const core::rect<s32> *clip=0); + +class GUIInventorySlot: public gui::IGUIElement +{ +public: + GUIInventorySlot(gui::IGUIEnvironment* env, + gui::IGUIElement* parent, s32 id, core::rect<s32> rect); + + void setItem(InventoryItem *item) + { + m_item = item; + } + + void draw(); + + bool OnEvent(const SEvent& event); + +private: + InventoryItem *m_item; +}; + +class GUIInventoryMenu : public gui::IGUIElement +{ +public: + GUIInventoryMenu(gui::IGUIEnvironment* env, + gui::IGUIElement* parent, s32 id, + Inventory *inventory); + ~GUIInventoryMenu(); + + /* + Remove and re-add (or reposition) stuff + */ + void resizeGui(); + + // Updates stuff from inventory to screen + void update(); + + void draw(); + + void launch() + { + setVisible(true); + Environment->setFocus(this); + } + + bool canTakeFocus(gui::IGUIElement *e) + { + return (e && (e == this || isMyChild(e))); + } + + bool OnEvent(const SEvent& event); + +private: + Inventory *m_inventory; + core::array<GUIInventorySlot*> m_slots; + v2u32 m_screensize_old; +}; + +#endif + |