# include "Crawler.h"
# include "MenuComponent.h"
typedef Attribute A ;
MenuComponent : : MenuComponent ( MenuType parent , geom2d : : rect < float > rect , std : : string label , MenuFunc onClick , ButtonAttr attributes )
: parentMenu ( parent ) , rect ( rect ) , label ( label ) , menuDest ( MenuType : : ENUM_END ) , onClick ( onClick ) , hoverEffect ( 0 ) , selectable ( ! ( attributes & ButtonAttr : : UNSELECTABLE ) ) , selectableViaKeyboard ( ! ( attributes & ButtonAttr : : UNSELECTABLE_VIA_KEYBOARD ) ) , memoryLeakInfo ( Menu : : GetMemoryLeakReportInfo ( ) ) {
Menu : : unhandledComponents . push_back ( this ) ;
}
MenuComponent : : MenuComponent ( MenuType parent , geom2d : : rect < float > rect , std : : string label , MenuType menuDest , MenuFunc onClick , ButtonAttr attributes )
: MenuComponent ( parent , rect , label , onClick , attributes ) {
//NOTE: This constructor also calls the other constructor above!
this - > menuDest = menuDest ;
}
MenuComponent : : ~ MenuComponent ( ) {
Menu * pMenu = Menu : : menus [ parentMenu ] ;
for ( auto key : pMenu - > buttons ) {
std : : vector < MenuComponent * > & components = key . second ;
std : : erase_if ( components , [ & ] ( MenuComponent * component ) { return component = = this ; } ) ;
}
for ( auto key : pMenu - > keyboardButtons ) {
std : : vector < MenuComponent * > & components = key . second ;
std : : erase_if ( components , [ & ] ( MenuComponent * component ) { return component = = this ; } ) ;
}
std : : erase_if ( pMenu - > displayComponents , [ & ] ( MenuComponent * component ) { return component = = this ; } ) ;
//pMenu->components.erase(this->name); //We're not going to do this here because we are in the middle of a loop for another menu component when cleaning up.
}
void MenuComponent : : AfterCreate ( ) { }
void MenuComponent : : Update ( Crawler * game ) {
if ( hovered ) {
hoverEffect = std : : min ( " ThemeGlobal.HighlightTime " _F , hoverEffect + game - > GetElapsedTime ( ) ) ;
} else {
hoverEffect = std : : max ( 0.f , hoverEffect - game - > GetElapsedTime ( ) ) ;
}
}
void MenuComponent : : _Update ( Crawler * game ) {
if ( ! disabled ) {
Update ( game ) ;
}
}
void MenuComponent : : Draw ( Crawler * game , vf2d parentPos ) {
if ( background ) {
game - > FillRect ( rect . pos , rect . size , PixelLerp ( Menu : : themes [ Menu : : themeSelection ] . GetButtonCol ( ) , Menu : : themes [ Menu : : themeSelection ] . GetHighlightCol ( ) , hoverEffect / " ThemeGlobal.HighlightTime " _F ) ) ;
}
if ( border ) {
game - > DrawRect ( rect . pos , rect . size ) ;
}
if ( showDefaultLabel ) {
game - > DrawStringProp ( rect . pos + rect . size / 2 - game - > GetTextSizeProp ( label ) / 2 , label ) ;
}
}
void MenuComponent : : _Draw ( Crawler * game ) {
_Draw ( game , { 0 , 0 } ) ;
}
void MenuComponent : : _Draw ( Crawler * game , vf2d parentPos ) {
if ( ! disabled ) {
Draw ( game , parentPos ) ;
}
}
void MenuComponent : : DrawDecal ( Crawler * game , vf2d parentPos , bool focused ) { }
void MenuComponent : : _DrawDecal ( Crawler * game , bool focused ) {
_DrawDecal ( game , { 0 , 0 } , focused ) ;
}
void MenuComponent : : _DrawDecal ( Crawler * game , vf2d parentPos , bool focused ) {
if ( ! disabled ) {
DrawDecal ( game , parentPos , focused ) ;
}
}
MenuComponent * MenuComponent : : PickUpDraggableItem ( ) {
return nullptr ;
}
bool MenuComponent : : DropDraggableItem ( MenuComponent * draggable ) {
return false ;
}
bool MenuComponent : : GetHoverState ( Crawler * game ) {
if ( parentComponent ! = nullptr ) {
return parentComponent - > GetHoverState ( game , this ) ;
} else {
vf2d parentWindowPos = Menu : : menus [ parentMenu ] - > pos ;
return geom2d : : overlaps ( geom2d : : rect < float > { rect . pos + parentWindowPos , rect . size } , game - > GetMousePos ( ) ) ;
}
}
bool MenuComponent : : GetHoverState ( Crawler * game , MenuComponent * child ) {
return false ;
}
bool MenuComponent : : PointWithinParent ( MenuComponent * child , vi2d drawPos ) {
if ( parentComponent ! = nullptr ) {
return parentComponent - > PointWithinParent ( child , drawPos ) ;
} else {
return true ;
}
}
bool MenuComponent : : HandleOutsideDisabledButtonSelection ( MenuComponent * disabledButton ) {
return false ;
} ;
vf2d MenuComponent : : GetPos ( ) {
return rect . pos ;
}
void MenuComponent : : OnInventorySlotsUpdate ( ITCategory cat ) { }
std : : string MenuComponent : : GetLabel ( ) {
return label ;
}
void MenuComponent : : Enable ( bool enabled ) {
disabled = ! enabled ;
} ;
void MenuComponent : : Cleanup ( ) { }