/*
License ( OLC - 3 )
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Copyright 2018 - 2023 OneLoneCoder . com
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
1. Redistributions or derivations of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice . This list of conditions and the following disclaimer must be
reproduced in the documentation and / or other materials provided with the distribution .
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND ANY
EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED
TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR
BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
*/
# 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 + parentPos , rect . size , PixelLerp ( Menu : : themes [ Menu : : themeSelection ] . GetButtonCol ( ) , Menu : : themes [ Menu : : themeSelection ] . GetHighlightCol ( ) , hoverEffect / " ThemeGlobal.HighlightTime " _F ) ) ;
}
if ( border ) {
game - > DrawRect ( rect . pos + parentPos , rect . size ) ;
}
if ( showDefaultLabel ) {
game - > DrawStringProp ( rect . pos + parentPos + 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 ( ) { }
std : : string MenuComponent : : GetName ( ) {
return name ;
}