# pragma once
# include "Menu.h"
class MenuComponent : IAttributable {
friend class Menu ;
friend class MenuItemButton ;
friend class ScrollableWindowComponent ;
friend class InventoryScrollableWindowComponent ;
MenuType menuDest ;
private :
float hoverEffect = 0 ;
virtual bool GetHoverState ( Crawler * game ) ;
//CALL THIS FOR A PARENT to check a child's DrawDecal validity!
virtual bool PointWithinParent ( MenuComponent * child , vi2d drawPos ) ;
protected :
std : : string name = " " ;
geom2d : : rect < float > rect ;
std : : string label ;
bool border = true ;
bool draggable = false ;
MenuFunc onClick ;
MenuType parentMenu = MenuType : : ENUM_END ;
MenuComponent * parentComponent = nullptr ;
bool hovered = false ;
bool selectable = true ;
bool selectableViaKeyboard = true ;
bool disabled = false ; //If set to true, this component will not be rendered or updated.
bool renderInMain = true ; //If set to false, this component is the responsibility of some other windowing system and won't be rendered or updated via the main window loop.
bool valid = true ; //If set to false, this would cause the component to be removed.
virtual void Update ( Crawler * game ) ;
virtual void Draw ( Crawler * game , vf2d parentPos , bool focused ) ;
virtual void DrawDecal ( Crawler * game , vf2d parentPos , bool focused ) ;
virtual bool GetHoverState ( Crawler * game , MenuComponent * child ) ;
virtual void AfterCreate ( ) ; //Called after the creation of all menus finish.
public :
MenuComponent ( MenuType parent , geom2d : : rect < float > rect , std : : string label , MenuFunc onClick , bool selectable = true , bool selectableViaKeyboard = true ) ;
MenuComponent ( MenuType parent , geom2d : : rect < float > rect , std : : string label , MenuType menuDest , MenuFunc onClick , bool selectable = true , bool selectableViaKeyboard = true ) ;
void _Update ( Crawler * game ) ;
void _Draw ( Crawler * game , vf2d parentPos , bool focused ) ;
void _DrawDecal ( Crawler * game , vf2d parentPos , bool focused ) ;
vf2d GetPos ( ) ;
//We picked up a draggable component, we should make a copy and return it here. If a nullptr is returned here, the pickup is not allowed.
//WARNING!!! This allocates a brand new component when successful!!! Be prepared to clear it!
virtual MenuComponent * PickUpDraggableItem ( ) ;
//We are attempting to drop draggable onto this item. If it's not allowed, return false.
virtual bool DropDraggableItem ( MenuComponent * draggable ) ;
//A notification that a button outside the region has been selected. Return false if it's not allowed.
virtual bool HandleOutsideDisabledButtonSelection ( MenuComponent * disabledButton ) ;
//Called whenever an inventory slot gets updated, whether it's adding or removing an item.
virtual void OnInventorySlotsUpdate ( ITCategory cat ) ;
} ;