Added row item display button components.
This commit is contained in:
parent
ac0f5c42aa
commit
3251053364
@ -46,6 +46,7 @@ All rights reserved.
|
|||||||
#include "EquipSlotButton.h"
|
#include "EquipSlotButton.h"
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
#include "ScrollableWindowComponent.h"
|
#include "ScrollableWindowComponent.h"
|
||||||
|
#include "RowItemDisplay.h"
|
||||||
|
|
||||||
INCLUDE_game
|
INCLUDE_game
|
||||||
INCLUDE_GFX
|
INCLUDE_GFX
|
||||||
@ -133,26 +134,37 @@ void Menu::InitializeCharacterMenuWindow(){
|
|||||||
ScrollableWindowComponent*equipList=Component<ScrollableWindowComponent>(data.component->parentMenu,"Equip List");
|
ScrollableWindowComponent*equipList=Component<ScrollableWindowComponent>(data.component->parentMenu,"Equip List");
|
||||||
equipList->RemoveAllComponents();
|
equipList->RemoveAllComponents();
|
||||||
for(int counter=0;Item&it:availableEquipment){
|
for(int counter=0;Item&it:availableEquipment){
|
||||||
float xOffset=(counter%3)*26;
|
|
||||||
Item&itemInvRef=Inventory::GetItem(it.Name());
|
Item&itemInvRef=Inventory::GetItem(it.Name());
|
||||||
auto equip=equipList->ADD("Equip Item "+std::to_string(counter),MenuItemItemButton)({{2+xOffset,2},{24,24}},itemInvRef,MenuType::ENUM_END,
|
auto equip=equipList->ADD("Equip Item "+std::to_string(counter),RowItemDisplay)({{2,2+counter*28.f},{120-12,28}},itemInvRef,
|
||||||
[](MenuFuncData data){
|
[](MenuFuncData data){
|
||||||
MenuItemItemButton*comp=(MenuItemItemButton*)data.component;
|
RowItemDisplay*comp=dynamic_cast<RowItemDisplay*>(data.component);
|
||||||
Inventory::EquipItem(comp->GetItem(),EquipSlot(comp->I(Attribute::EQUIP_TYPE)));
|
if(comp!=nullptr){
|
||||||
for(MenuComponent*button:((ScrollableWindowComponent*)data.parentComponent)->GetComponents()){
|
Inventory::EquipItem(comp->GetItem(),EquipSlot(comp->I(Attribute::EQUIP_TYPE)));
|
||||||
MenuItemItemButton*comp=(MenuItemItemButton*)button;
|
for(MenuComponent*button:((ScrollableWindowComponent*)data.parentComponent)->GetComponents()){
|
||||||
comp->SetSelected(false);
|
RowItemDisplay*comp=dynamic_cast<RowItemDisplay*>(button);
|
||||||
|
if(comp!=nullptr){
|
||||||
|
comp->SetSelected(false);
|
||||||
|
}else{
|
||||||
|
ERR("WARNING! Attempting to cast a button that isn't a RowItemDisplay!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
comp->SetSelected(true);
|
||||||
|
for(int counter=0;ItemAttribute attribute:displayAttrs){
|
||||||
|
StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label");
|
||||||
|
statDisplayLabel->SetStatChangeAmt(0);
|
||||||
|
}
|
||||||
|
MenuItemItemButton*equipButton=Component<MenuItemItemButton>(CHARACTER_MENU,"Equip Slot "+slotNames[data.parentComponent->I(A::INDEXED_THEME)]);
|
||||||
|
equipButton->SetItem(comp->GetItem());
|
||||||
|
}else{
|
||||||
|
ERR("WARNING! Attempting to cast a button that isn't a RowItemDisplay!");
|
||||||
}
|
}
|
||||||
comp->SetSelected(true);
|
|
||||||
for(int counter=0;ItemAttribute attribute:displayAttrs){
|
|
||||||
StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label");
|
|
||||||
statDisplayLabel->SetStatChangeAmt(0);
|
|
||||||
}
|
|
||||||
MenuItemItemButton*equipButton=Component<MenuItemItemButton>(CHARACTER_MENU,"Equip Slot "+slotNames[data.parentComponent->I(A::INDEXED_THEME)]);
|
|
||||||
equipButton->SetItem(comp->GetItem());
|
|
||||||
return true;
|
return true;
|
||||||
},[&](MenuFuncData data){
|
},"Item Name","Item Description")END;
|
||||||
MenuItemItemButton*button=(MenuItemItemButton*)data.component;
|
|
||||||
|
equip->SetHoverFunc(
|
||||||
|
[&](MenuFuncData data){
|
||||||
|
RowItemDisplay*button=dynamic_cast<RowItemDisplay*>(data.component);
|
||||||
|
if(button!=nullptr){
|
||||||
Item&buttonItem=button->GetItem();
|
Item&buttonItem=button->GetItem();
|
||||||
std::vector<int>statsBeforeEquip;
|
std::vector<int>statsBeforeEquip;
|
||||||
EquipSlot slot=EquipSlot(button->I(Attribute::EQUIP_TYPE));
|
EquipSlot slot=EquipSlot(button->I(Attribute::EQUIP_TYPE));
|
||||||
@ -171,16 +183,24 @@ void Menu::InitializeCharacterMenuWindow(){
|
|||||||
if(*equippedItem!=Item::BLANK){
|
if(*equippedItem!=Item::BLANK){
|
||||||
Inventory::EquipItem(*equippedItem,slot);
|
Inventory::EquipItem(*equippedItem,slot);
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
ERR("WARNING! Attempting to cast a button that isn't a RowItemDisplay!");
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
},[](MenuFuncData data){
|
});
|
||||||
|
equip->SetMouseOutFunc(
|
||||||
|
[](MenuFuncData data){
|
||||||
for(int counter=0;ItemAttribute attribute:displayAttrs){
|
for(int counter=0;ItemAttribute attribute:displayAttrs){
|
||||||
StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label");
|
StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label");
|
||||||
statDisplayLabel->SetStatChangeAmt(0);
|
statDisplayLabel->SetStatChangeAmt(0);
|
||||||
counter++;
|
counter++;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},"Item Name","Item Description")END;
|
});
|
||||||
|
|
||||||
|
equip->SetShowQuantity(false);
|
||||||
|
equip->SetSelectionType(SelectionType::NONE);
|
||||||
|
|
||||||
equip->I(Attribute::EQUIP_TYPE)=int(slot);
|
equip->I(Attribute::EQUIP_TYPE)=int(slot);
|
||||||
if(Inventory::GetEquip(slot)==&itemInvRef){
|
if(Inventory::GetEquip(slot)==&itemInvRef){
|
||||||
equip->SetSelected(true);
|
equip->SetSelected(true);
|
||||||
|
@ -231,7 +231,12 @@ private:
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T*Component(MenuType menu,std::string componentName){
|
T*Component(MenuType menu,std::string componentName){
|
||||||
return (T*)Menu::menus[menu]->components[componentName];
|
T*tmp=dynamic_cast<T*>(Menu::menus[menu]->components[componentName]);
|
||||||
|
if(tmp!=nullptr){
|
||||||
|
return tmp;
|
||||||
|
}else{
|
||||||
|
ERR("WARNING! Attempting to cast a button that isn't a "<<typeid(T).name()<<"!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MenuFuncData{
|
struct MenuFuncData{
|
||||||
|
@ -121,6 +121,7 @@ void MenuComponent::DrawDecal(ViewPort&window,bool focused){
|
|||||||
case CROSSHAIR:drawutil::DrawCrosshairDecalViewPort(window,{rect.pos+V(A::DRAW_OFFSET),rect.size},0);break;
|
case CROSSHAIR:drawutil::DrawCrosshairDecalViewPort(window,{rect.pos+V(A::DRAW_OFFSET),rect.size},0);break;
|
||||||
case INNER_BOX:window.DrawRectDecal(rect.pos+V(A::DRAW_OFFSET)+vi2d{1,1},rect.size-vi2d{2,2});break;
|
case INNER_BOX:window.DrawRectDecal(rect.pos+V(A::DRAW_OFFSET)+vi2d{1,1},rect.size-vi2d{2,2});break;
|
||||||
case HIGHLIGHT:break;//Not used.
|
case HIGHLIGHT:break;//Not used.
|
||||||
|
case SelectionType::NONE:break;//Displays nothing.
|
||||||
default:ERR("Undefined selection type selected: "<<int(selectionType));
|
default:ERR("Undefined selection type selected: "<<int(selectionType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -205,7 +206,6 @@ void MenuComponent::OnMouseOut(){};
|
|||||||
void MenuComponent::OnHover(){};
|
void MenuComponent::OnHover(){};
|
||||||
|
|
||||||
void MenuComponent::_OnMouseOut(){
|
void MenuComponent::_OnMouseOut(){
|
||||||
if(name=="Equip Item 2"){std::cout<<std::boolalpha<<hoverState<<","<<hovered<<","<<runHoverFunctions<<std::endl;}
|
|
||||||
if(!hovered){
|
if(!hovered){
|
||||||
if(runHoverFunctions){
|
if(runHoverFunctions){
|
||||||
if(hoverState){
|
if(hoverState){
|
||||||
|
@ -57,9 +57,12 @@ enum class SelectionType{
|
|||||||
CROSSHAIR,
|
CROSSHAIR,
|
||||||
HIGHLIGHT,
|
HIGHLIGHT,
|
||||||
INNER_BOX,
|
INNER_BOX,
|
||||||
|
NONE,
|
||||||
};
|
};
|
||||||
|
|
||||||
using enum SelectionType;
|
using SelectionType::CROSSHAIR;
|
||||||
|
using SelectionType::HIGHLIGHT;
|
||||||
|
using SelectionType::INNER_BOX;
|
||||||
|
|
||||||
class MenuComponent:public IAttributable{
|
class MenuComponent:public IAttributable{
|
||||||
friend class Menu;
|
friend class Menu;
|
||||||
@ -82,7 +85,6 @@ private:
|
|||||||
void _DrawDecal(ViewPort&window,bool focused);
|
void _DrawDecal(ViewPort&window,bool focused);
|
||||||
void _OnMouseOut();
|
void _OnMouseOut();
|
||||||
void _OnHover();
|
void _OnHover();
|
||||||
bool selected=false;
|
|
||||||
SelectionType selectionType=CROSSHAIR;
|
SelectionType selectionType=CROSSHAIR;
|
||||||
protected:
|
protected:
|
||||||
int depth=0;
|
int depth=0;
|
||||||
@ -99,6 +101,7 @@ protected:
|
|||||||
bool hovered=false;
|
bool hovered=false;
|
||||||
bool selectable=true;
|
bool selectable=true;
|
||||||
bool selectableViaKeyboard=true;
|
bool selectableViaKeyboard=true;
|
||||||
|
bool selected=false;
|
||||||
bool disabled=false; //If set to true, this component will not be rendered or updated.
|
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 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.
|
bool valid=true; //If set to false, this would cause the component to be removed.
|
||||||
|
@ -107,11 +107,11 @@ protected:
|
|||||||
labelNameText="";
|
labelNameText="";
|
||||||
labelDescriptionText="";
|
labelDescriptionText="";
|
||||||
}
|
}
|
||||||
if(itemNameLabelName!=""&&labelNameText.length()>0){
|
if(itemNameLabelName!=""){
|
||||||
Component<MenuLabel>(parentMenu,itemNameLabelName)->label=labelNameText;
|
Component<MenuLabel>(parentMenu,itemNameLabelName)->label=labelNameText;
|
||||||
Component<MenuLabel>(parentMenu,itemNameLabelName)->Enable(true);
|
Component<MenuLabel>(parentMenu,itemNameLabelName)->Enable(true);
|
||||||
}
|
}
|
||||||
if(itemDescriptionLabelName!=""&&labelDescriptionText.length()>0){
|
if(itemDescriptionLabelName!=""){
|
||||||
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->label=labelDescriptionText;
|
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->label=labelDescriptionText;
|
||||||
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true);
|
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true);
|
||||||
}
|
}
|
||||||
|
@ -47,22 +47,31 @@ class RowItemDisplay:public MenuComponent{
|
|||||||
std::string itemNameLabelName;
|
std::string itemNameLabelName;
|
||||||
std::string itemDescriptionLabelName;
|
std::string itemDescriptionLabelName;
|
||||||
CompactText compact=NON_COMPACT;
|
CompactText compact=NON_COMPACT;
|
||||||
|
bool showQuantity=true;
|
||||||
public:
|
public:
|
||||||
inline RowItemDisplay(geom2d::rect<float>rect,Item&itemRef,MenuFunc onClick,std::string itemNameLabelName,std::string itemDescriptionLabelName,ButtonAttr attributes=ButtonAttr::NONE)
|
inline RowItemDisplay(geom2d::rect<float>rect,Item&itemRef,MenuFunc onClick,std::string itemNameLabelName,std::string itemDescriptionLabelName,ButtonAttr attributes=ButtonAttr::NONE)
|
||||||
:MenuComponent(rect,"",onClick,attributes),itemNameLabelName(itemNameLabelName),itemDescriptionLabelName(itemDescriptionLabelName),itemRef(itemRef){
|
:MenuComponent(rect,"",onClick,attributes),itemNameLabelName(itemNameLabelName),itemDescriptionLabelName(itemDescriptionLabelName),itemRef(itemRef){}
|
||||||
|
|
||||||
}
|
|
||||||
virtual inline void DrawDecal(ViewPort&window,bool focused)final{
|
virtual inline void DrawDecal(ViewPort&window,bool focused)final{
|
||||||
float scaleFactor=rect.size.y/24;
|
MenuComponent::DrawDecal(window,focused);
|
||||||
|
float scaleFactor=(rect.size.y-4)/24;
|
||||||
vf2d iconSize=vf2d{scaleFactor,scaleFactor}*24.f;
|
vf2d iconSize=vf2d{scaleFactor,scaleFactor}*24.f;
|
||||||
window.DrawDecal(rect.pos+vf2d{2,2},itemRef.Decal(),{scaleFactor,scaleFactor});
|
window.DrawDecal(rect.pos+vf2d{2,2},itemRef.Decal(),{scaleFactor,scaleFactor});
|
||||||
window.DrawRectDecal(rect.pos+vf2d{2,2},iconSize);
|
window.DrawRectDecal(rect.pos+vf2d{2,2},iconSize);
|
||||||
|
|
||||||
window.DrawShadowStringPropDecal(rect.pos+vf2d{4,4}+iconSize,itemRef.Name());
|
std::string itemName=itemRef.Name();
|
||||||
|
vf2d scaledSize={std::min(1.f,(rect.size.x-6-iconSize.x)/game->GetTextSizeProp(itemName).x),1};
|
||||||
|
|
||||||
std::string quantityText=std::format("x{}",itemRef.Amt());
|
window.DrawShadowStringPropDecal(rect.pos+vf2d{4,4}+vf2d{iconSize.x,iconSize.y/2-4},itemName,WHITE,BLACK,scaledSize);
|
||||||
vf2d qtyTextSize=game->GetTextSizeProp(quantityText);
|
|
||||||
window.DrawShadowStringPropDecal(rect.pos+rect.size-vf2d{2,2}+vf2d{-qtyTextSize.x,qtyTextSize.y},quantityText);
|
if(showQuantity){
|
||||||
|
std::string quantityText=std::format("x{}",itemRef.Amt());
|
||||||
|
vf2d qtyTextSize=game->GetTextSizeProp(quantityText);
|
||||||
|
window.DrawShadowStringPropDecal(rect.pos+rect.size-vf2d{2,2}+vf2d{-qtyTextSize.x,0},quantityText);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selected){
|
||||||
|
window.DrawShadowStringDecal(rect.pos+vf2d{2,2}+iconSize-vf2d{8,8},"E",GREEN,VERY_DARK_GREEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
inline void SetCompactDescriptions(bool compact){
|
inline void SetCompactDescriptions(bool compact){
|
||||||
if(compact)this->compact=COMPACT;
|
if(compact)this->compact=COMPACT;
|
||||||
@ -76,7 +85,14 @@ public:
|
|||||||
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(false);
|
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual inline void OnHover()override{
|
virtual inline void SetShowQuantity(bool showQuantity){
|
||||||
|
this->showQuantity=showQuantity;
|
||||||
|
}
|
||||||
|
virtual inline Item&GetItem(){
|
||||||
|
return itemRef;
|
||||||
|
}
|
||||||
|
void UpdateLabel(){
|
||||||
|
if(itemRef.IsBlank())return;
|
||||||
std::string labelNameText;
|
std::string labelNameText;
|
||||||
std::string labelDescriptionText;
|
std::string labelDescriptionText;
|
||||||
if(valid){
|
if(valid){
|
||||||
@ -95,4 +111,7 @@ public:
|
|||||||
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true);
|
Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
virtual inline void OnHover()override{
|
||||||
|
UpdateLabel();
|
||||||
|
}
|
||||||
};
|
};
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 1
|
#define VERSION_PATCH 1
|
||||||
#define VERSION_BUILD 3990
|
#define VERSION_BUILD 4009
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user