#pragma once #include "MenuIconButton.h" #include "DEFINES.h" #include "Crawler.h" #include "Item.h" #include "safemap.h" INCLUDE_game INCLUDE_ITEM_DATA class MenuItemButton:public MenuIconButton{ private: std::vector&invRef; int inventoryIndex=0; bool valid=false; public: inline MenuItemButton(geom2d::rectrect,std::vector&invRef,int invIndex,MenuFunc onClick) :MenuIconButton(rect,invRef.size()>invIndex?ITEM_DATA.at(invRef[invIndex]).Decal():nullptr,onClick),invRef(invRef),inventoryIndex(invIndex){ draggable=true; valid=invRef.size()>invIndex; } inline Item GetItem(){ return Inventory::GetItem(invRef.at(inventoryIndex)); } inline void UseItem(uint32_t amt=1){ if(invRef.size()<=inventoryIndex)return; return Inventory::UseItem(invRef.at(inventoryIndex),amt); } protected: virtual inline void Update(Crawler*game)override{ MenuIconButton::Update(game); valid=invRef.size()>inventoryIndex&&ITEM_DATA.count(invRef[inventoryIndex]); if(valid){ icon=ITEM_DATA.at(invRef[inventoryIndex]).Decal(); }else{ icon=nullptr; } } virtual inline void Draw(Crawler*game,vf2d parentPos,bool focused)override{ MenuIconButton::Draw(game,parentPos,focused); } virtual inline MenuComponent*PickUpDraggableItem()override{ if(valid){ MenuItemButton*pickUp=new MenuItemButton(rect,invRef,inventoryIndex,onClick); valid=false; return pickUp; }else{ return nullptr; } } virtual inline bool DropDraggableItem(MenuComponent*draggable)override{ //HACK Warning! We're making a bold assumption that every component that is draggable is of the same type! This may change in the future.... MenuItemButton*draggedItem=(MenuItemButton*)draggable; ITCategory cat=ITEM_DATA.at(draggedItem->invRef.at(draggedItem->inventoryIndex)).Category(); return Inventory::SwapItems(cat,draggedItem->inventoryIndex,inventoryIndex); } };