Continue fixing up new menu navigation structure

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
pull/35/head
sigonasr2, Sig, Sigo 11 months ago
parent 21965b3c90
commit 210a46a5f9
  1. 33
      Adventures in Lestoria/LoadGameWindow.cpp
  2. 13
      Adventures in Lestoria/MainMenuWindow.cpp
  3. 16
      Adventures in Lestoria/Menu.cpp
  4. 7
      Adventures in Lestoria/Menu.h
  5. 9
      Adventures in Lestoria/SaveFileWindow.cpp

@ -30,7 +30,7 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE. SUCH DAMAGE.
Portions of this software are copyright © 2023 The FreeType Portions of this software are copyright <EFBFBD> 2023 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information. Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved. All rights reserved.
*/ */
@ -45,4 +45,35 @@ void Menu::InitializeLoadGameWindow(){
loadGameWindow->ADD("Game Files Label",MenuLabel)(geom2d::rect<float>{{-8,-12},{112,12}},"Load Game",1.0f,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; loadGameWindow->ADD("Game Files Label",MenuLabel)(geom2d::rect<float>{{-8,-12},{112,12}},"Load Game",1.0f,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
loadGameWindow->ADD("Game Files List",ScrollableWindowComponent)(geom2d::rect<float>{{-8,4},{112,116}})END; loadGameWindow->ADD("Game Files List",ScrollableWindowComponent)(geom2d::rect<float>{{-8,4},{112,116}})END;
loadGameWindow->ADD("Go Back Button",MenuComponent)(geom2d::rect<float>{{24,124},{48,12}},"Back",[](MenuFuncData menu){Menu::CloseMenu();return true;})END; loadGameWindow->ADD("Go Back Button",MenuComponent)(geom2d::rect<float>{{24,124},{48,12}},"Back",[](MenuFuncData menu){Menu::CloseMenu();return true;})END;
loadGameWindow->SetupKeyboardNavigation(
[](MenuType type){ //On Open
if(SaveFile::GetSaveFileCount()>0){
Menu::menus[type]->SetSelection(Component<ScrollableWindowComponent>(type,"Game Files List")->GetComponents()[0]);
}else{
Menu::menus[type]->SetSelection("Go Back Button");
}
},
{ //Button Key
{game->KEY_START,{"Load File",[](MenuType type){
Menu::menus[type]->GetSelection().lock()->Click();
}}},
{game->KEY_SELECT,{"Return to Title Screen",[](MenuType type){
Component<MenuComponent>(type,"Back Button")->Click();
}}},
}
,{ //Button Navigation Rules
{"Game Files List",{
.up=[](MenuType type){
auto&selection=Menu::menus[type]->GetSelection();
auto&gameFilesList=Component<ScrollableWindowComponent>(type,"Game Files List")->GetComponents();
if(std::find_if(gameFilesList.begin(),gameFilesList.end(),[&](auto&comp){return comp.lock()==selection.lock();})==gameFilesList.begin()){
}
},
.down="Back Button",}},
{"Go Back Button",{
.left="Continue Button",
.right="Continue Button",}},
});
} }

@ -82,18 +82,19 @@ void Menu::InitializeMainMenuWindow(){
return true; return true;
})END; })END;
mainMenuWindow->SetupKeyboardNavigation(
[](MenuType type){ //On Open
if(SaveFile::GetSaveFileCount()>0){ if(SaveFile::GetSaveFileCount()>0){
mainMenuWindow->SetDefaultButton(loadGameButton); Menu::menus[type]->SetSelection("Load Game Button");
}else{ }else{
mainMenuWindow->SetDefaultButton(newGameButton); Menu::menus[type]->SetSelection("New Game Button");
} }
},
mainMenuWindow->SetupKeyboardNavigation( { //Button Key
{
{game->KEY_CONFIRM,{"Select",[](MenuType type){}}}, {game->KEY_CONFIRM,{"Select",[](MenuType type){}}},
{game->KEY_BACK,{"Back",[](MenuType type){}}}, {game->KEY_BACK,{"Back",[](MenuType type){}}},
} }
,{ ,{ //Button Navigation Rules
{"New Game Button",{ {"New Game Button",{
.up="Quit Game Button", .up="Quit Game Button",
.down="Load Game Button",}}, .down="Load Game Button",}},

@ -150,7 +150,7 @@ void Menu::CheckClickAndPerformMenuSelect(AiL*game){
} }
void Menu::HoverMenuSelect(AiL*game){ void Menu::HoverMenuSelect(AiL*game){
if(!game->IsFocused()||selection.expired()||selection.lock()->disabled)return; if(!game->IsFocused()||selection.expired()||selection.lock()->disabled||selection.lock()->grayedOut)return;
if(selection.lock()->draggable){ if(selection.lock()->draggable){
if(buttonHoldTime<"ThemeGlobal.MenuHoldTime"_F){ if(buttonHoldTime<"ThemeGlobal.MenuHoldTime"_F){
@ -311,7 +311,7 @@ void Menu::Draw(AiL*game){
void Menu::OpenMenu(MenuType menu,bool cover){ void Menu::OpenMenu(MenuType menu,bool cover){
menus[menu]->cover=cover; menus[menu]->cover=cover;
menus[menu]->selection=menus[menu]->defaultButton; menus[menu]->onOpenFunc(menu);
stack.push_back(menus[menu]); stack.push_back(menus[menu]);
} }
@ -324,6 +324,10 @@ void Menu::KeyboardButtonNavigation(AiL*game,vf2d menuPos){
if(!selection.expired()){ if(!selection.expired()){
std::string selectionButtonName=selection.lock()->GetName(); std::string selectionButtonName=selection.lock()->GetName();
if(!selection.lock()->parentComponent.expired()){ //If a component has a parent, then we use the parent as the identifier for what should happen next.
selectionButtonName=selection.lock()->parentComponent.lock()->GetName();
}
if(navigationGroups.count(selectionButtonName)){ if(navigationGroups.count(selectionButtonName)){
Navigation nav=navigationGroups[selectionButtonName]; Navigation nav=navigationGroups[selectionButtonName];
@ -613,7 +617,8 @@ void Menu::SetSelection(std::weak_ptr<MenuComponent>button){
selection=button; selection=button;
} }
void Menu::SetupKeyboardNavigation(MenuInputGroups inputGroups,ButtonNavigationGroups navigationGroups){ void Menu::SetupKeyboardNavigation(MenuDataFunc onOpen,MenuInputGroups inputGroups,ButtonNavigationGroups navigationGroups){
this->onOpenFunc=onOpen;
this->inputGroups=inputGroups; this->inputGroups=inputGroups;
this->navigationGroups=navigationGroups; this->navigationGroups=navigationGroups;
} }
@ -621,3 +626,8 @@ void Menu::SetupKeyboardNavigation(MenuInputGroups inputGroups,ButtonNavigationG
const std::weak_ptr<MenuComponent>Menu::GetSelection()const{ const std::weak_ptr<MenuComponent>Menu::GetSelection()const{
return selection; return selection;
} }
void Menu::SetSelection(std::string_view button){
selection=Component<MenuComponent>(type,button);
}

@ -141,7 +141,6 @@ class Menu:public IAttributable{
friend class EntityStats; friend class EntityStats;
float buttonHoldTime=0; float buttonHoldTime=0;
std::weak_ptr<MenuComponent>selection;
vi2d lastActiveMousePos={}; vi2d lastActiveMousePos={};
int componentCount=0; int componentCount=0;
@ -217,12 +216,11 @@ public:
static Renderable&GetPatchPart(int x,int y); static Renderable&GetPatchPart(int x,int y);
void RecalculateComponentCount(); void RecalculateComponentCount();
void SetDefaultButton(std::weak_ptr<MenuComponent>button); void SetSelection(std::string_view button);
void SetSelection(std::weak_ptr<MenuComponent>button); void SetSelection(std::weak_ptr<MenuComponent>button);
const std::weak_ptr<MenuComponent>GetSelection()const; const std::weak_ptr<MenuComponent>GetSelection()const;
private: private:
Menu(vf2d pos,vf2d size); Menu(vf2d pos,vf2d size);
std::weak_ptr<MenuComponent>defaultButton;
static MenuType lastMenuTypeCreated; static MenuType lastMenuTypeCreated;
static std::string lastRegisteredComponent; static std::string lastRegisteredComponent;
void HoverMenuSelect(AiL*game); void HoverMenuSelect(AiL*game);
@ -231,7 +229,7 @@ private:
//Mandatory before any menu operations! This creates and sets up the menu in memory. //Mandatory before any menu operations! This creates and sets up the menu in memory.
static Menu*CreateMenu(MenuType type,vf2d pos,vf2d size); static Menu*CreateMenu(MenuType type,vf2d pos,vf2d size);
void SetupKeyboardNavigation(MenuInputGroups inputGroups,ButtonNavigationGroups navigationGroups); void SetupKeyboardNavigation(MenuDataFunc onOpen,MenuInputGroups inputGroups,ButtonNavigationGroups navigationGroups);
void KeyboardButtonNavigation(AiL*game,vf2d menuPos); void KeyboardButtonNavigation(AiL*game,vf2d menuPos);
static void DrawScaledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor); static void DrawScaledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor);
static void DrawTiledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor); static void DrawTiledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor);
@ -245,6 +243,7 @@ private:
MenuType type; MenuType type;
MenuInputGroups inputGroups; MenuInputGroups inputGroups;
ButtonNavigationGroups navigationGroups; ButtonNavigationGroups navigationGroups;
MenuOpenFunc onOpenFunc;
static bool MOUSE_NAVIGATION; static bool MOUSE_NAVIGATION;
bool cover; //A black cover for when a menu pops up to fade out the stuff behind it. bool cover; //A black cover for when a menu pops up to fade out the stuff behind it.

@ -55,15 +55,18 @@ void Menu::InitializeSaveFileWindow(){
saveFileWindow->SetupKeyboardNavigation( saveFileWindow->SetupKeyboardNavigation(
{ [](MenuType type){ //On Open
{game->KEY_START,{"Confirm Name",[](MenuType type){ Menu::menus[type]->SetSelection("Continue Button");
},
{ //Button Key
{game->KEY_START,{"Confirm Filename",[](MenuType type){
Component<MenuComponent>(type,"Continue Button")->Click(); Component<MenuComponent>(type,"Continue Button")->Click();
}}}, }}},
{game->KEY_SELECT,{"Return to Title Screen",[](MenuType type){ {game->KEY_SELECT,{"Return to Title Screen",[](MenuType type){
Component<MenuComponent>(type,"Back Button")->Click(); Component<MenuComponent>(type,"Back Button")->Click();
}}}, }}},
} }
,{ ,{ //Button Navigation Rules
{"Continue Button",{ {"Continue Button",{
.left="Back Button", .left="Back Button",
.right="Back Button",}}, .right="Back Button",}},

Loading…
Cancel
Save