# pragma region License
/*
License ( OLC - 3 )
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Copyright 2024 Joshua Sigona < sigonasr2 @ gmail . 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 .
Portions of this software are copyright © 2024 The FreeType
Project ( www . freetype . org ) . Please see LICENSE_FT . txt for more information .
All rights reserved .
*/
# pragma endregion
# include "InventoryScrollableWindowComponent.h"
# include "RowItemDisplay.h"
# include "InventoryCreator.h"
class RowInventoryScrollableWindowComponent : public InventoryScrollableWindowComponent {
friend class InventoryCreator ;
friend class Menu ;
std : : weak_ptr < RowItemDisplay > selectedComponent ;
protected :
PriceLabel : : PriceLabel priceLabel = PriceLabel : : NONE ;
public :
inline RowInventoryScrollableWindowComponent ( geom2d : : rect < float > rect , std : : string itemNameLabelName , std : : string itemDescriptionLabelName , std : : function < bool ( MenuFuncData ) > inventoryButtonClickAction , std : : function < bool ( MenuFuncData ) > inventoryButtonHoverAction , std : : function < bool ( MenuFuncData ) > inventoryButtonMouseOutAction , const InventoryCreator & creator , InventoryWindowOptions options = { . padding = 8 , . size = { 24 , 24 } } , bool inventoryButtonsActive = true , ComponentAttr attributes = ComponentAttr : : BACKGROUND | ComponentAttr : : OUTLINE )
: InventoryScrollableWindowComponent ( rect , itemNameLabelName , itemDescriptionLabelName , inventoryButtonClickAction , inventoryButtonHoverAction , inventoryButtonMouseOutAction , creator , options , inventoryButtonsActive , attributes ) { }
virtual inline void AfterCreate ( ) override final {
ScrollableWindowComponent : : AfterCreate ( ) ;
if ( options . size . x > rect . size . x | | options . size . y > rect . size . y ) ERR ( std : : format ( " WARNING! Component {} has Inventory Option Sizes: {} which is not large enough to fit in the component whose size is {}! Please make the component larger or the items smaller. " , name , options . size . str ( ) , rect . size . str ( ) ) ) ;
}
virtual inline void SetCompactDescriptions ( CompactText compact ) override final {
this - > compact = compact ;
for ( std : : weak_ptr < MenuComponent > component : components ) {
std : : weak_ptr < RowItemDisplay > itemButton = DYNAMIC_POINTER_CAST < RowItemDisplay > ( component . lock ( ) ) ;
itemButton . lock ( ) - > SetCompactDescriptions ( compact ) ;
}
}
virtual inline void SetPriceLabelType ( PriceLabel : : PriceLabel labelType ) final {
this - > priceLabel = labelType ;
for ( std : : weak_ptr < MenuComponent > component : components ) {
std : : weak_ptr < RowItemDisplay > itemButton = DYNAMIC_POINTER_CAST < RowItemDisplay > ( component . lock ( ) ) ;
itemButton . lock ( ) - > SetPriceLabelType ( labelType ) ;
}
}
inline void ClearSelectedChild ( ) {
std : : weak_ptr < RowItemDisplay > previousSelectedComponent { selectedComponent } ;
if ( ! selectedComponent . expired ( ) ) selectedComponent . lock ( ) - > itemIsSelected = false ;
selectedComponent . reset ( ) ;
if ( ! previousSelectedComponent . expired ( ) ) previousSelectedComponent . lock ( ) - > onMouseOut ( MenuFuncData { * Menu : : menus [ parentMenu ] , game , Menu : : menus [ parentMenu ] - > components [ name ] , previousSelectedComponent . lock ( ) - > parentComponent } ) ; //HACK ALERT: It's possible the selected component uses functions that set components via a mouse hover/click. This will fake a mouse out event which hopefully I set a callback to clear any menu states that were set due to mouse hover/click...
}
inline void SelectChild ( std : : weak_ptr < RowItemDisplay > childComponent ) {
selectedComponent = childComponent ;
for ( std : : weak_ptr < MenuComponent > child : components ) {
RowItemDisplay & rowItem { * DYNAMIC_POINTER_CAST < RowItemDisplay > ( child ) } ;
rowItem . itemIsSelected = false ;
}
selectedComponent . lock ( ) - > itemIsSelected = true ;
}
inline std : : optional < std : : reference_wrapper < RowItemDisplay > > GetSelectedChild ( ) const {
if ( ! selectedComponent . expired ( ) ) {
return * selectedComponent . lock ( ) ;
}
return { } ;
}
} ;