Add in input helper text when navigating using keyboard/gamepads. Fix scrollwheel navigation for ScrollingWindowComponent referencing the wrong variable to add to (after the targeted scroll destination change).
parent
a97bc7b2f0
commit
9dc2a0a4c2
@ -0,0 +1,125 @@ |
|||||||
|
#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 © 2023 The FreeType |
||||||
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information. |
||||||
|
All rights reserved. |
||||||
|
*/ |
||||||
|
#pragma endregion |
||||||
|
#include "InputHelper.h" |
||||||
|
#include "AdventuresInLestoria.h" |
||||||
|
#include "Menu.h" |
||||||
|
|
||||||
|
INCLUDE_game |
||||||
|
INCLUDE_GFX |
||||||
|
INCLUDE_WINDOW_SIZE |
||||||
|
|
||||||
|
InputHelper::InputHelper(){} |
||||||
|
|
||||||
|
void InputHelper::Initialize(MenuInputGroups&inputGroups){ |
||||||
|
for(auto&data:inputGroups){ |
||||||
|
this->inputGroups[data.first.GetGroup()]=data.second.first; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const InputType InputHelper::InputMode()const{ |
||||||
|
if(Input::UsingGamepad())return CONTROLLER; |
||||||
|
if(!Menu::stack.back()->UsingMouseNavigation())return KEY; |
||||||
|
return MOUSE; |
||||||
|
} |
||||||
|
|
||||||
|
void InputHelper::Draw(){ |
||||||
|
InputType mode=InputMode(); |
||||||
|
if(mode==MOUSE)mode=KEY; //We're going to make it so the keyboard controls always show up when navigating using a mouse.
|
||||||
|
switch(mode){ |
||||||
|
case CONTROLLER: |
||||||
|
case KEY:{ |
||||||
|
float buttonImgWidth=0.f; |
||||||
|
float buttonDescriptionWidth=0.f; |
||||||
|
std::vector<std::variant<Decal*,std::string>>buttonImgs; //Store decals for buttons that actually have images, and strings for buttons that have labels.
|
||||||
|
std::vector<std::string>buttonDescriptions; |
||||||
|
#pragma region Populate all buttons to display |
||||||
|
for(auto&[group,displayName]:inputGroups){ |
||||||
|
auto&primaryKey=group.GetPrimaryKey(mode); |
||||||
|
if(primaryKey.has_value()){ |
||||||
|
if(primaryKey.value().HasIcon()){ |
||||||
|
buttonImgWidth+=primaryKey.value().GetIcon().Sprite()->width+"Interface.InputHelperSpacing"_I; |
||||||
|
buttonImgs.push_back(primaryKey.value().GetIcon().Decal()); |
||||||
|
}else{ |
||||||
|
buttonImgs.push_back(primaryKey.value().GetDisplayName()); |
||||||
|
} |
||||||
|
|
||||||
|
vf2d descriptionSize=game->GetTextSizeProp(displayName); |
||||||
|
buttonDescriptionWidth+=descriptionSize.x+"Interface.InputHelperSpacing"_I; |
||||||
|
buttonDescriptions.push_back(displayName); |
||||||
|
} |
||||||
|
} |
||||||
|
#pragma endregion |
||||||
|
|
||||||
|
float buttonDescriptionScaleX=1.0f; |
||||||
|
|
||||||
|
if(buttonImgWidth+buttonDescriptionWidth>WINDOW_SIZE.x){ |
||||||
|
buttonDescriptionScaleX=(WINDOW_SIZE.x-buttonImgWidth)/buttonDescriptionWidth; |
||||||
|
} |
||||||
|
|
||||||
|
#pragma region Draw all button inputs and descriptions |
||||||
|
float xOffset="Interface.InputHelperSpacing"_I; |
||||||
|
for(size_t index=0;auto&button:buttonImgs){ |
||||||
|
if(std::holds_alternative<Decal*>(button)){ |
||||||
|
Decal*img=std::get<Decal*>(button); |
||||||
|
game->DrawDecal(vf2d{xOffset,float(WINDOW_SIZE.y-img->sprite->height)-8},img); |
||||||
|
xOffset+=img->sprite->width+"Interface.InputHelperSpacing"_I; |
||||||
|
}else |
||||||
|
if(std::holds_alternative<std::string>(button)){ |
||||||
|
std::string label=std::get<std::string>(button); |
||||||
|
vf2d textSize=game->GetTextSizeProp(label); |
||||||
|
game->FillRectDecal(vf2d{xOffset-2,float(WINDOW_SIZE.y-textSize.y-10)},vf2d{textSize.x+4,textSize.y},"Interface.InputButtonBackCol"_Pixel); |
||||||
|
game->FillRectDecal(vf2d{xOffset-1,float(WINDOW_SIZE.y-textSize.y-10)-1.f},vf2d{textSize.x+2,textSize.y},"Interface.InputButtonBackCol"_Pixel); |
||||||
|
game->FillRectDecal(vf2d{xOffset-1,float(WINDOW_SIZE.y-textSize.y-10)},vf2d{textSize.x+2,textSize.y+1.f},"Interface.InputButtonBackCol"_Pixel); |
||||||
|
game->DrawStringPropDecal(vf2d{xOffset,float(WINDOW_SIZE.y-textSize.y-10)},label,"Interface.InputButtonTextCol"_Pixel); |
||||||
|
xOffset+=textSize.x+"Interface.InputHelperSpacing"_I; |
||||||
|
}else [[unlikely]]ERR("WARNING! Hit a state where no data is inside of the button! THIS SHOULD NOT BE HAPPENING!"); |
||||||
|
|
||||||
|
std::string_view description=buttonDescriptions[index]; |
||||||
|
vf2d descriptionTextSize=game->GetTextSizeProp(description)*vf2d{buttonDescriptionScaleX,1.f}; |
||||||
|
game->DrawShadowStringPropDecal(vf2d{xOffset,float(WINDOW_SIZE.y-descriptionTextSize.y-10)},description,WHITE,BLACK,vf2d{buttonDescriptionScaleX,1.f}); |
||||||
|
xOffset+=descriptionTextSize.x+"Interface.InputHelperSpacing"_I; |
||||||
|
|
||||||
|
index++; |
||||||
|
} |
||||||
|
#pragma endregion |
||||||
|
}break; |
||||||
|
[[unlikely]]default:{ |
||||||
|
ERR(std::format("Invalid Input Mode detected: {}! THIS SHOULD NOT BE HAPPENING!",int(mode))) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,58 @@ |
|||||||
|
#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 © 2023 The FreeType |
||||||
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information. |
||||||
|
All rights reserved. |
||||||
|
*/ |
||||||
|
#pragma endregion |
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <variant> |
||||||
|
#include <functional> |
||||||
|
#include "Key.h" |
||||||
|
#include "MenuType.h" |
||||||
|
|
||||||
|
using InputGroupActionDisplayName=std::string; |
||||||
|
using ButtonName=std::string; |
||||||
|
using MenuInputGroups=std::map<InputEngageGroup,std::pair<InputGroupActionDisplayName,std::variant<ButtonName,std::function<void(MenuType)>>>>; |
||||||
|
|
||||||
|
class InputHelper{ |
||||||
|
std::map<InputGroup,InputGroupActionDisplayName>inputGroups; |
||||||
|
|
||||||
|
const InputType InputMode()const; |
||||||
|
|
||||||
|
public: |
||||||
|
InputHelper(); |
||||||
|
void Initialize(MenuInputGroups&inputGroups); |
||||||
|
void Draw(); |
||||||
|
}; |
@ -0,0 +1,67 @@ |
|||||||
|
#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 © 2023 The FreeType |
||||||
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information. |
||||||
|
All rights reserved. |
||||||
|
*/ |
||||||
|
#pragma endregion |
||||||
|
#pragma once |
||||||
|
|
||||||
|
enum MenuType{ |
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
/*DO NOT REMOVE!!*/ENUM_START,///////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
INVENTORY_CONSUMABLES, |
||||||
|
CLASS_INFO, |
||||||
|
CLASS_SELECTION, |
||||||
|
MAIN_MENU, |
||||||
|
OVERWORLD_LEVEL_SELECT, |
||||||
|
ITEM_LOADOUT, |
||||||
|
LEVEL_COMPLETE, |
||||||
|
OVERWORLD_MENU, |
||||||
|
CHARACTER_MENU, |
||||||
|
INVENTORY, |
||||||
|
MERCHANT, |
||||||
|
BUY_ITEM, |
||||||
|
SELL_ITEM, |
||||||
|
BLACKSMITH, |
||||||
|
CRAFT_ITEM, |
||||||
|
CRAFT_CONSUMABLE, |
||||||
|
CONSUMABLE_CRAFT_ITEM, |
||||||
|
SAVE_FILE_NAME, |
||||||
|
LOAD_GAME, |
||||||
|
USER_ID, |
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
/*DO NOT REMOVE!!*/ENUM_END////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
}; |
Loading…
Reference in new issue