Fix overlapping sub-component mouse hover bug, populate blacksmith weapon and armor lists with player's equipment.
This commit is contained in:
parent
bd066ee787
commit
3410b5b92b
@ -72,6 +72,8 @@ void Menu::InitializeBlacksmithCraftingWindow(){
|
|||||||
|
|
||||||
auto weaponTab=blacksmithWindow->ADD("Weapon Tab",MenuComponent)({{2,0},{blacksmithWindow->size.x/2-4,24}},"Weapon",[](MenuFuncData data){
|
auto weaponTab=blacksmithWindow->ADD("Weapon Tab",MenuComponent)({{2,0},{blacksmithWindow->size.x/2-4,24}},"Weapon",[](MenuFuncData data){
|
||||||
Component<MenuComponent>(BLACKSMITH,"Armor Tab")->selected=false;
|
Component<MenuComponent>(BLACKSMITH,"Armor Tab")->selected=false;
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(BLACKSMITH,"Weapon Inventory Display")->Enable(true);
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(BLACKSMITH,"Armor Inventory Display")->Enable(false);
|
||||||
data.component->selected=true;
|
data.component->selected=true;
|
||||||
return true;
|
return true;
|
||||||
})END;
|
})END;
|
||||||
@ -79,12 +81,14 @@ void Menu::InitializeBlacksmithCraftingWindow(){
|
|||||||
weaponTab->selectionType=SelectionType::HIGHLIGHT;
|
weaponTab->selectionType=SelectionType::HIGHLIGHT;
|
||||||
auto armorTab=blacksmithWindow->ADD("Armor Tab",MenuComponent)({{blacksmithWindow->size.x/2+2,0},{blacksmithWindow->size.x/2-4,24}},"Armor",[](MenuFuncData data){
|
auto armorTab=blacksmithWindow->ADD("Armor Tab",MenuComponent)({{blacksmithWindow->size.x/2+2,0},{blacksmithWindow->size.x/2-4,24}},"Armor",[](MenuFuncData data){
|
||||||
Component<MenuComponent>(BLACKSMITH,"Weapon Tab")->selected=false;
|
Component<MenuComponent>(BLACKSMITH,"Weapon Tab")->selected=false;
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(BLACKSMITH,"Weapon Inventory Display")->Enable(false);
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(BLACKSMITH,"Armor Inventory Display")->Enable(true);
|
||||||
data.component->selected=true;
|
data.component->selected=true;
|
||||||
return true;
|
return true;
|
||||||
})END;
|
})END;
|
||||||
armorTab->selectionType=SelectionType::HIGHLIGHT;
|
armorTab->selectionType=SelectionType::HIGHLIGHT;
|
||||||
|
|
||||||
auto inventoryDisplay=blacksmithWindow->ADD("Weapon Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
auto weaponsDisplay=blacksmithWindow->ADD("Weapon Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
||||||
[](MenuFuncData data){
|
[](MenuFuncData data){
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
@ -97,6 +101,23 @@ void Menu::InitializeBlacksmithCraftingWindow(){
|
|||||||
InventoryCreator::RowPlayerWeapons_InventoryUpdate,
|
InventoryCreator::RowPlayerWeapons_InventoryUpdate,
|
||||||
{.padding=1,.size={207,28}}
|
{.padding=1,.size={207,28}}
|
||||||
)END;
|
)END;
|
||||||
|
AddInventoryListener(weaponsDisplay,"Equipment");
|
||||||
|
|
||||||
|
auto armorDisplay=blacksmithWindow->ADD("Armor Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
||||||
|
[](MenuFuncData data){
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[](MenuFuncData data){
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[](MenuFuncData data){
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
InventoryCreator::RowPlayerArmor_InventoryUpdate,
|
||||||
|
{.padding=1,.size={207,28}}
|
||||||
|
)END;
|
||||||
|
AddInventoryListener(armorDisplay,"Equipment");
|
||||||
|
armorDisplay->Enable(false);
|
||||||
|
|
||||||
#pragma region Inventory Description
|
#pragma region Inventory Description
|
||||||
float inventoryDescriptionWidth=blacksmithWindow->pos.x+blacksmithWindow->size.x-26-224;
|
float inventoryDescriptionWidth=blacksmithWindow->pos.x+blacksmithWindow->size.x-26-224;
|
||||||
|
@ -141,16 +141,8 @@ std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)>
|
|||||||
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
||||||
std::vector<std::shared_ptr<Item>>weapons;
|
std::vector<std::shared_ptr<Item>>weapons;
|
||||||
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(weapons),[](std::shared_ptr<Item> item){return item.get()->IsWeapon();});
|
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(weapons),[](std::shared_ptr<Item> item){return item.get()->IsWeapon();});
|
||||||
//We only want to refresh the inventory slots if the component count no longer matches what's actually in our inventory.
|
|
||||||
if(component.components.size()<weapons.size()){//We need more space to display our items.
|
|
||||||
component.AddButtonOnSlotUpdate(cat);
|
|
||||||
}else
|
|
||||||
if(component.components.size()>weapons.size()){ //There are empty spots, so let's clean up.
|
|
||||||
component.RemoveAllComponents();
|
component.RemoveAllComponents();
|
||||||
for(std::weak_ptr<Item> item:Inventory::get(cat)){
|
|
||||||
component.AddButtonOnSlotUpdate(cat);
|
component.AddButtonOnSlotUpdate(cat);
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)> InventoryCreator::RowPlayerWeapons_AddButtonOnSlotUpdate=
|
std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)> InventoryCreator::RowPlayerWeapons_AddButtonOnSlotUpdate=
|
||||||
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
||||||
@ -158,17 +150,17 @@ std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)>
|
|||||||
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(weapons),[](std::shared_ptr<Item> item){return item.get()->IsWeapon();});
|
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(weapons),[](std::shared_ptr<Item> item){return item.get()->IsWeapon();});
|
||||||
|
|
||||||
RowInventoryScrollableWindowComponent*c=DYNAMIC_CAST<RowInventoryScrollableWindowComponent*>(&component);
|
RowInventoryScrollableWindowComponent*c=DYNAMIC_CAST<RowInventoryScrollableWindowComponent*>(&component);
|
||||||
size_t invSize=c->components.size()+1;
|
|
||||||
int invWidth=int(c->rect.size.x/(float(c->options.size.x)+c->options.padding));
|
|
||||||
int x=int((invSize-1)%invWidth);
|
|
||||||
int y=int((invSize-1)/invWidth);
|
|
||||||
int itemIndex=y*invWidth+x;
|
|
||||||
|
|
||||||
vf2d buttonSize=c->options.size;
|
vf2d buttonSize=c->options.size;
|
||||||
vf2d totalSpacing={c->options.padding+buttonSize.x,c->options.padding+buttonSize.y};
|
vf2d totalSpacing={c->options.padding+buttonSize.x,c->options.padding+buttonSize.y};
|
||||||
|
|
||||||
for(std::shared_ptr<Item> weapon:weapons){
|
for(std::shared_ptr<Item> weapon:weapons){
|
||||||
auto newItem=c->ADD("item_"+cat+"_"+std::to_string(itemIndex),RowItemDisplay)({totalSpacing*vf2d{float(x),float(y)},buttonSize},weapon,c->inventoryButtonClickAction,c->itemNameLabelName,c->itemDescriptionLabelName,c->inventoryButtonsActive?ButtonAttr::NONE:ButtonAttr::UNSELECTABLE)END;
|
size_t invSize=c->components.size()+1;
|
||||||
|
int invWidth=int(c->rect.size.x/(float(c->options.size.x)+c->options.padding));
|
||||||
|
int x=int((invSize-1)%invWidth);
|
||||||
|
int y=int((invSize-1)/invWidth);
|
||||||
|
int itemIndex=y*invWidth+x;
|
||||||
|
auto newItem=c->ADD("item_Weapon_"+std::to_string(itemIndex),RowItemDisplay)({totalSpacing*vf2d{float(x),float(y)},buttonSize},weapon,c->inventoryButtonClickAction,c->itemNameLabelName,c->itemDescriptionLabelName,c->inventoryButtonsActive?ButtonAttr::NONE:ButtonAttr::UNSELECTABLE)END;
|
||||||
newItem->SetCompactDescriptions(c->compact==COMPACT);
|
newItem->SetCompactDescriptions(c->compact==COMPACT);
|
||||||
newItem->SetPriceLabelType(c->priceLabel);
|
newItem->SetPriceLabelType(c->priceLabel);
|
||||||
newItem->SetHoverFunc(c->inventoryButtonHoverAction);
|
newItem->SetHoverFunc(c->inventoryButtonHoverAction);
|
||||||
@ -182,16 +174,8 @@ std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)>
|
|||||||
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
||||||
std::vector<std::shared_ptr<Item>>armor;
|
std::vector<std::shared_ptr<Item>>armor;
|
||||||
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(armor),[](std::shared_ptr<Item> item){return item.get()->IsArmor();});
|
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(armor),[](std::shared_ptr<Item> item){return item.get()->IsArmor();});
|
||||||
//We only want to refresh the inventory slots if the component count no longer matches what's actually in our inventory.
|
|
||||||
if(component.components.size()<armor.size()){//We need more space to display our items.
|
|
||||||
component.AddButtonOnSlotUpdate(cat);
|
|
||||||
}else
|
|
||||||
if(component.components.size()>armor.size()){ //There are empty spots, so let's clean up.
|
|
||||||
component.RemoveAllComponents();
|
component.RemoveAllComponents();
|
||||||
for(std::weak_ptr<Item> item:Inventory::get(cat)){
|
|
||||||
component.AddButtonOnSlotUpdate(cat);
|
component.AddButtonOnSlotUpdate(cat);
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)> InventoryCreator::RowPlayerArmor_AddButtonOnSlotUpdate=
|
std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)> InventoryCreator::RowPlayerArmor_AddButtonOnSlotUpdate=
|
||||||
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
[](InventoryScrollableWindowComponent&component,ITCategory cat){
|
||||||
@ -199,17 +183,17 @@ std::function<void(InventoryScrollableWindowComponent&component,ITCategory cat)>
|
|||||||
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(armor),[](std::shared_ptr<Item> item){return item.get()->IsArmor();});
|
std::copy_if(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),std::back_inserter(armor),[](std::shared_ptr<Item> item){return item.get()->IsArmor();});
|
||||||
|
|
||||||
RowInventoryScrollableWindowComponent*c=DYNAMIC_CAST<RowInventoryScrollableWindowComponent*>(&component);
|
RowInventoryScrollableWindowComponent*c=DYNAMIC_CAST<RowInventoryScrollableWindowComponent*>(&component);
|
||||||
size_t invSize=c->components.size()+1;
|
|
||||||
int invWidth=int(c->rect.size.x/(float(c->options.size.x)+c->options.padding));
|
|
||||||
int x=int((invSize-1)%invWidth);
|
|
||||||
int y=int((invSize-1)/invWidth);
|
|
||||||
int itemIndex=y*invWidth+x;
|
|
||||||
|
|
||||||
vf2d buttonSize=c->options.size;
|
vf2d buttonSize=c->options.size;
|
||||||
vf2d totalSpacing={c->options.padding+buttonSize.x,c->options.padding+buttonSize.y};
|
vf2d totalSpacing={c->options.padding+buttonSize.x,c->options.padding+buttonSize.y};
|
||||||
|
|
||||||
for(std::shared_ptr<Item> armor:armor){
|
for(std::shared_ptr<Item> armor:armor){
|
||||||
auto newItem=c->ADD("item_"+cat+"_"+std::to_string(itemIndex),RowItemDisplay)({totalSpacing*vf2d{float(x),float(y)},buttonSize},armor,c->inventoryButtonClickAction,c->itemNameLabelName,c->itemDescriptionLabelName,c->inventoryButtonsActive?ButtonAttr::NONE:ButtonAttr::UNSELECTABLE)END;
|
size_t invSize=c->components.size()+1;
|
||||||
|
int invWidth=int(c->rect.size.x/(float(c->options.size.x)+c->options.padding));
|
||||||
|
int x=int((invSize-1)%invWidth);
|
||||||
|
int y=int((invSize-1)/invWidth);
|
||||||
|
int itemIndex=y*invWidth+x;
|
||||||
|
auto newItem=c->ADD("item_Armor_"+std::to_string(itemIndex),RowItemDisplay)({totalSpacing*vf2d{float(x),float(y)},buttonSize},armor,c->inventoryButtonClickAction,c->itemNameLabelName,c->itemDescriptionLabelName,c->inventoryButtonsActive?ButtonAttr::NONE:ButtonAttr::UNSELECTABLE)END;
|
||||||
newItem->SetCompactDescriptions(c->compact==COMPACT);
|
newItem->SetCompactDescriptions(c->compact==COMPACT);
|
||||||
newItem->SetPriceLabelType(c->priceLabel);
|
newItem->SetPriceLabelType(c->priceLabel);
|
||||||
newItem->SetHoverFunc(c->inventoryButtonHoverAction);
|
newItem->SetHoverFunc(c->inventoryButtonHoverAction);
|
||||||
|
@ -204,7 +204,8 @@ protected:
|
|||||||
DrawScrollbar(window,{},focused);
|
DrawScrollbar(window,{},focused);
|
||||||
}
|
}
|
||||||
virtual bool GetHoverState(Crawler*game,MenuComponent*child)override{
|
virtual bool GetHoverState(Crawler*game,MenuComponent*child)override{
|
||||||
return geom2d::overlaps(geom2d::rect<float>{Menu::menus[parentMenu]->pos+rect.pos+child->rect.pos,child->rect.size},game->GetMousePos());
|
return geom2d::overlaps(geom2d::rect<float>{Menu::menus[parentMenu]->pos+rect.pos,rect.size},game->GetMousePos())&& //Make sure the mouse is inside the parent window component first....
|
||||||
|
geom2d::overlaps(geom2d::rect<float>{Menu::menus[parentMenu]->pos+rect.pos+child->rect.pos,child->rect.size},game->GetMousePos());
|
||||||
}
|
}
|
||||||
//Calculates the bounds of all components.
|
//Calculates the bounds of all components.
|
||||||
inline void CalculateBounds(){
|
inline void CalculateBounds(){
|
||||||
|
@ -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 4919
|
#define VERSION_BUILD 4930
|
||||||
|
|
||||||
#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