Implemented controller/keyboard controls for the inventory consumable window
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
331a8c7941
commit
13a821c011
@ -85,4 +85,140 @@ void Menu::InitializeConsumableInventoryWindow(){
|
|||||||
inventoryWindow->ADD("itemDescription",MenuLabel)(geom2d::rect<float>(vf2d{2,117.f},{windowSize.x-4,windowSize.y-108}),"",1,ComponentAttr::SHADOW)END;
|
inventoryWindow->ADD("itemDescription",MenuLabel)(geom2d::rect<float>(vf2d{2,117.f},{windowSize.x-4,windowSize.y-108}),"",1,ComponentAttr::SHADOW)END;
|
||||||
|
|
||||||
auto okButton=inventoryWindow->ADD("OK Button",MenuComponent)(geom2d::rect<float>{{windowSize.x/2-24,173.f},{48,12}},"Ok",[](MenuFuncData data){Menu::CloseMenu();return true;})END;
|
auto okButton=inventoryWindow->ADD("OK Button",MenuComponent)(geom2d::rect<float>{{windowSize.x/2-24,173.f},{48,12}},"Ok",[](MenuFuncData data){Menu::CloseMenu();return true;})END;
|
||||||
|
|
||||||
|
inventoryWindow->SetupKeyboardNavigation(
|
||||||
|
[](MenuType type,Data&returnData){ //On Open
|
||||||
|
//Get the first component in the consumables list.
|
||||||
|
std::vector<std::weak_ptr<MenuComponent>>&components=Component<InventoryScrollableWindowComponent>(INVENTORY_CONSUMABLES,"inventory")->GetComponents();
|
||||||
|
if(components.size()>0){
|
||||||
|
returnData=components[0].lock()->GetName();
|
||||||
|
}else{
|
||||||
|
returnData="OK Button";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ //Button Key
|
||||||
|
{game->KEY_CONFIRM,{"Set Loadout Item",[](MenuType type){}}},
|
||||||
|
{game->KEY_BACK,{"Back",[](MenuType type){
|
||||||
|
Menu::CloseMenu();
|
||||||
|
}}},
|
||||||
|
}
|
||||||
|
,{ //Button Navigation Rules
|
||||||
|
{"inventory",{
|
||||||
|
.up="Quit Game Button",
|
||||||
|
.down="Load Game Button",}},
|
||||||
|
{"Load Game Button",{
|
||||||
|
.up="New Game Button",
|
||||||
|
.down="Quit Game Button",}},
|
||||||
|
{"Quit Game Button",{
|
||||||
|
.up=[](MenuType type,Data&returnData){
|
||||||
|
auto&selection=Menu::menus[type]->GetSelection();
|
||||||
|
auto&itemsList=Component<InventoryScrollableWindowComponent>(type,"inventory")->GetComponents();
|
||||||
|
auto itemsWindow=Component<InventoryScrollableWindowComponent>(type,"inventory")
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();});
|
||||||
|
if(itemsList.size()>0){
|
||||||
|
if(component==itemsList.end()){
|
||||||
|
//Set the selected button to the last element in the list.
|
||||||
|
returnData=itemsList.back();
|
||||||
|
}else{
|
||||||
|
int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding));
|
||||||
|
std::weak_ptr<MenuItemButton>selectedButton=DYNAMIC_POINTER_CAST<MenuItemButton>(component);
|
||||||
|
int newRowIndex=selectedButton.lock()->inventoryIndex-invWidth; //Moving up moves the cursor up an entire row.
|
||||||
|
if(newRowIndex<0){
|
||||||
|
//This means we have to wrap around.
|
||||||
|
newRowIndex+=itemsList.size();
|
||||||
|
}
|
||||||
|
if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
//Select the component that matches this new number.
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST<MenuItemButton>(comp).lock()->inventoryIndex==newRowIndex;});
|
||||||
|
if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
returnData=component;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
returnData="OK Button";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.right=[](MenuType type,Data&returnData){
|
||||||
|
auto&selection=Menu::menus[type]->GetSelection();
|
||||||
|
auto&itemsList=Component<InventoryScrollableWindowComponent>(type,"inventory")->GetComponents();
|
||||||
|
auto itemsWindow=Component<InventoryScrollableWindowComponent>(type,"inventory")
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();});
|
||||||
|
if(itemsList.size()>0){
|
||||||
|
if(component==itemsList.end()){
|
||||||
|
//Set the selected button to the first element in the list.
|
||||||
|
returnData=itemsList.front();
|
||||||
|
}else{
|
||||||
|
int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding));
|
||||||
|
std::weak_ptr<MenuItemButton>selectedButton=DYNAMIC_POINTER_CAST<MenuItemButton>(component);
|
||||||
|
int newRowIndex=std::clamp(selectedButton.lock()->inventoryIndex+1,(selectedButton.lock()->inventoryIndex/invWidth)*invWidth,std::min(itemsList.size(),(selectedButton.lock()->inventoryIndex/invWidth+1)*invWidth-1)); //Moving right, we need to wrap around if we get to the edge.
|
||||||
|
if(newRowIndex>=itemsList.size()){
|
||||||
|
//This means we have to wrap around.
|
||||||
|
newRowIndex-=itemsList.size();
|
||||||
|
}
|
||||||
|
if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
//Select the component that matches this new number.
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST<MenuItemButton>(comp).lock()->inventoryIndex==newRowIndex;});
|
||||||
|
if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
returnData=component;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
returnData="OK Button";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.down=[](MenuType type,Data&returnData){
|
||||||
|
auto&selection=Menu::menus[type]->GetSelection();
|
||||||
|
auto&itemsList=Component<InventoryScrollableWindowComponent>(type,"inventory")->GetComponents();
|
||||||
|
auto itemsWindow=Component<InventoryScrollableWindowComponent>(type,"inventory")
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();});
|
||||||
|
if(itemsList.size()>0){
|
||||||
|
if(component==itemsList.end()){
|
||||||
|
//Set the selected button to the first element in the list.
|
||||||
|
returnData=itemsList.front();
|
||||||
|
}else{
|
||||||
|
int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding));
|
||||||
|
std::weak_ptr<MenuItemButton>selectedButton=DYNAMIC_POINTER_CAST<MenuItemButton>(component);
|
||||||
|
int newRowIndex=selectedButton.lock()->inventoryIndex+invWidth; //Moving down moves the cursor down an entire row.
|
||||||
|
if(newRowIndex>=itemsList.size()){
|
||||||
|
//This means we have to wrap around.
|
||||||
|
newRowIndex-=itemsList.size();
|
||||||
|
}
|
||||||
|
if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
//Select the component that matches this new number.
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST<MenuItemButton>(comp).lock()->inventoryIndex==newRowIndex;});
|
||||||
|
if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
returnData=component;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
returnData="OK Button";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.left=[](MenuType type,Data&returnData){
|
||||||
|
auto&selection=Menu::menus[type]->GetSelection();
|
||||||
|
auto&itemsList=Component<InventoryScrollableWindowComponent>(type,"inventory")->GetComponents();
|
||||||
|
auto itemsWindow=Component<InventoryScrollableWindowComponent>(type,"inventory")
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();});
|
||||||
|
if(itemsList.size()>0){
|
||||||
|
if(component==itemsList.end()){
|
||||||
|
//Set the selected button to the last element in the list.
|
||||||
|
returnData=itemsList.back();
|
||||||
|
}else{
|
||||||
|
int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding));
|
||||||
|
std::weak_ptr<MenuItemButton>selectedButton=DYNAMIC_POINTER_CAST<MenuItemButton>(component);
|
||||||
|
|
||||||
|
int newRowIndex=std::clamp(selectedButton.lock()->inventoryIndex-1,(selectedButton.lock()->inventoryIndex/invWidth)*invWidth,std::min(itemsList.size(),(selectedButton.lock()->inventoryIndex/invWidth+1)*invWidth-1)); //Moving left, we need to wrap around if we get to the edge.
|
||||||
|
if(newRowIndex<0){
|
||||||
|
//This means we have to wrap around.
|
||||||
|
newRowIndex+=itemsList.size();
|
||||||
|
}
|
||||||
|
if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
//Select the component that matches this new number.
|
||||||
|
auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST<MenuItemButton>(comp).lock()->inventoryIndex==newRowIndex;});
|
||||||
|
if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex));
|
||||||
|
returnData=component;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
returnData="OK Button";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
});
|
||||||
}
|
}
|
@ -77,6 +77,7 @@ class MenuComponent:public IAttributable{
|
|||||||
friend class EncountersSpawnListScrollableWindowComponent;
|
friend class EncountersSpawnListScrollableWindowComponent;
|
||||||
friend class MenuItemItemButton;
|
friend class MenuItemItemButton;
|
||||||
friend class RowItemDisplay;
|
friend class RowItemDisplay;
|
||||||
|
friend class InventoryConsumableWindow;
|
||||||
MenuType menuDest;
|
MenuType menuDest;
|
||||||
MenuFunc onHover=[](MenuFuncData dat){return true;};
|
MenuFunc onHover=[](MenuFuncData dat){return true;};
|
||||||
MenuFunc onMouseOut=[](MenuFuncData dat){return true;};
|
MenuFunc onMouseOut=[](MenuFuncData dat){return true;};
|
||||||
|
@ -41,30 +41,32 @@ enum MenuType{
|
|||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
/*DO NOT REMOVE!!*/ENUM_START,///////////////////////////////
|
/*DO NOT REMOVE!!*/ENUM_START,///////////////////////////////
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
INVENTORY_CONSUMABLES,
|
// 13% Controller Compatibility. (100 total items, 4 items per menu * 25 menus)
|
||||||
CLASS_INFO,
|
INVENTORY_CONSUMABLES, //100% Controller Compatibility
|
||||||
CLASS_SELECTION,
|
CLASS_INFO, //0% Controller Compatibility
|
||||||
MAIN_MENU,
|
CLASS_SELECTION, //0% Controller Compatibility
|
||||||
OVERWORLD_LEVEL_SELECT,
|
MAIN_MENU, //100% Controller Compatibility
|
||||||
ITEM_LOADOUT,
|
OVERWORLD_LEVEL_SELECT, //100% Controller Compatibility
|
||||||
LEVEL_COMPLETE,
|
ITEM_LOADOUT, //0% Controller Compatibility
|
||||||
OVERWORLD_MENU,
|
LEVEL_COMPLETE, //0% Controller Compatibility
|
||||||
CHARACTER_MENU,
|
OVERWORLD_MENU, //0% Controller Compatibility
|
||||||
INVENTORY,
|
CHARACTER_MENU, //0% Controller Compatibility
|
||||||
MERCHANT,
|
INVENTORY, //0% Controller Compatibility
|
||||||
BUY_ITEM,
|
MERCHANT, //0% Controller Compatibility
|
||||||
SELL_ITEM,
|
BUY_ITEM, //0% Controller Compatibility
|
||||||
BLACKSMITH,
|
SELL_ITEM, //0% Controller Compatibility
|
||||||
CRAFT_ITEM,
|
BLACKSMITH, //0% Controller Compatibility
|
||||||
CRAFT_CONSUMABLE,
|
CRAFT_ITEM, //0% Controller Compatibility
|
||||||
CONSUMABLE_CRAFT_ITEM,
|
CRAFT_CONSUMABLE, //0% Controller Compatibility
|
||||||
SAVE_FILE_NAME,
|
CONSUMABLE_CRAFT_ITEM, //0% Controller Compatibility
|
||||||
LOAD_GAME,
|
SAVE_FILE_NAME, //0% Controller Compatibility
|
||||||
USER_ID,
|
LOAD_GAME, //0% Controller Compatibility
|
||||||
SETTINGS,
|
USER_ID, //0% Controller Compatibility
|
||||||
SHERMAN,
|
SETTINGS, //0% Controller Compatibility
|
||||||
INPUT_KEY_DISPLAY,
|
SHERMAN, //0% Controller Compatibility
|
||||||
NEW_INPUT,
|
INPUT_KEY_DISPLAY, //25% Controller Compatibility
|
||||||
|
NEW_INPUT, //100% Controller Compatibility
|
||||||
|
PAUSE, //0% Controller Compatibility
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
/*DO NOT REMOVE!!*/ENUM_END////////////////////////////////
|
/*DO NOT REMOVE!!*/ENUM_END////////////////////////////////
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
Loading…
x
Reference in New Issue
Block a user