diff --git a/RetroFE/Source/Graphics/Animate/TweenSet.cpp b/RetroFE/Source/Graphics/Animate/TweenSet.cpp index 877e441..b7d0174 100644 --- a/RetroFE/Source/Graphics/Animate/TweenSet.cpp +++ b/RetroFE/Source/Graphics/Animate/TweenSet.cpp @@ -16,6 +16,26 @@ #include "TweenSet.h" +TweenSet::~TweenSet() +{ + std::map::iterator it; + + it = OnMenuEnterTweens.begin(); + while(it != OnMenuEnterTweens.end()) + { + delete it->second; + OnMenuEnterTweens.erase(it); + it = OnMenuEnterTweens.begin(); + } + + it = OnMenuExitTweens.begin(); + while(it != OnMenuExitTweens.end()) + { + delete it->second; + OnMenuExitTweens.erase(it); + it = OnMenuExitTweens.begin(); + } +} TweenSet::TweenSets *TweenSet::GetOnEnterTweens() { @@ -37,16 +57,64 @@ TweenSet::TweenSets *TweenSet::GetOnHighlightExitTweens() { return &OnHighlightExitTweens; } + TweenSet::TweenSets *TweenSet::GetOnMenuEnterTweens() { - return &OnMenuEnterTweens; + return GetOnMenuEnterTweens(-1); } + + +TweenSet::TweenSets *TweenSet::GetOnMenuEnterTweens(int index) +{ + if(OnMenuEnterTweens.find(index) == OnMenuEnterTweens.end()) + { + index = -1; + + if(OnMenuEnterTweens.find(index) == OnMenuEnterTweens.end()) + { + TweenSets *set = new TweenSets(); + OnMenuEnterTweens[index] = set; + } + } + + return OnMenuEnterTweens[index]; +} + TweenSet::TweenSets *TweenSet::GetOnMenuScrollTweens() { return &OnMenuScrollTweens; } + TweenSet::TweenSets *TweenSet::GetOnMenuExitTweens() { - return &OnMenuExitTweens; + return GetOnMenuExitTweens(-1); } + +TweenSet::TweenSets *TweenSet::GetOnMenuExitTweens(int index) +{ + if(OnMenuExitTweens.find(index) == OnMenuExitTweens.end()) + { + index = -1; + + if(OnMenuExitTweens.find(index) == OnMenuExitTweens.end()) + { + TweenSets *set = new TweenSets(); + OnMenuExitTweens[index] = set; + } + } + + return OnMenuExitTweens[index]; +} + +void TweenSet::SetOnMenuEnterTweens(int index, TweenSets *set) +{ + OnMenuEnterTweens[index] = set; +} + +void TweenSet::SetOnMenuExitTweens(int index, TweenSets *set) +{ + OnMenuExitTweens[index] = set; +} + + diff --git a/RetroFE/Source/Graphics/Animate/TweenSet.h b/RetroFE/Source/Graphics/Animate/TweenSet.h index c95ff80..a62dcc1 100644 --- a/RetroFE/Source/Graphics/Animate/TweenSet.h +++ b/RetroFE/Source/Graphics/Animate/TweenSet.h @@ -18,24 +18,29 @@ #include "Tween.h" #include #include +#include class TweenSet { public: + ~TweenSet(); typedef std::vector *> TweenSets; //todo: delete the tweens in a destructor - TweenSets *GetOnEnterTweens(); TweenSets *GetOnExitTweens(); TweenSets *GetOnIdleTweens(); TweenSets *GetOnHighlightEnterTweens(); TweenSets *GetOnHighlightExitTweens(); - TweenSets *GetOnMenuEnterTweens(); TweenSets *GetOnMenuScrollTweens(); + TweenSets *GetOnMenuEnterTweens(); TweenSets *GetOnMenuExitTweens(); + TweenSets *GetOnMenuEnterTweens(int index); + TweenSets *GetOnMenuExitTweens(int index); + void SetOnMenuEnterTweens(int index, TweenSets *set); + void SetOnMenuExitTweens(int index, TweenSets *set); private: TweenSets OnEnterTweens; @@ -43,8 +48,8 @@ private: TweenSets OnIdleTweens; TweenSets OnHighlightEnterTweens; TweenSets OnHighlightExitTweens; - TweenSets OnMenuEnterTweens; TweenSets OnMenuScrollTweens; - TweenSets OnMenuExitTweens; + std::map OnMenuEnterTweens; + std::map OnMenuExitTweens; }; diff --git a/RetroFE/Source/Graphics/Component/Component.cpp b/RetroFE/Source/Graphics/Component/Component.cpp index 65c9ba4..0733773 100644 --- a/RetroFE/Source/Graphics/Component/Component.cpp +++ b/RetroFE/Source/Graphics/Component/Component.cpp @@ -40,8 +40,10 @@ void Component::FreeGraphicsMemory() EnterRequested = false; ExitRequested = false; MenuEnterRequested = false; + MenuEnterIndex = -1; MenuScrollRequested = false; MenuExitRequested = false; + MenuExitIndex = -1; NewItemSelected = false; HighlightExitComplete = false; @@ -90,9 +92,10 @@ void Component::TriggerExitEvent() -void Component::TriggerMenuEnterEvent() +void Component::TriggerMenuEnterEvent(int menuIndex) { MenuEnterRequested = true; + MenuEnterIndex = menuIndex; } void Component::TriggerMenuScrollEvent() @@ -101,9 +104,10 @@ void Component::TriggerMenuScrollEvent() } -void Component::TriggerMenuExitEvent() +void Component::TriggerMenuExitEvent(int menuIndex) { MenuExitRequested = true; + MenuExitIndex = menuIndex; } void Component::TriggerHighlightEvent(Item *selectedItem) { @@ -200,7 +204,7 @@ void Component::Update(float dt) else if(MenuEnterRequested) { MenuEnterRequested = false; - CurrentTweens = Tweens->GetOnMenuEnterTweens(); + CurrentTweens = Tweens->GetOnMenuEnterTweens(MenuEnterIndex); CurrentAnimationState = MENU_ENTER; } else if(MenuScrollRequested) @@ -212,7 +216,7 @@ void Component::Update(float dt) else if(MenuExitRequested) { MenuExitRequested = false; - CurrentTweens = Tweens->GetOnMenuExitTweens(); + CurrentTweens = Tweens->GetOnMenuExitTweens(MenuExitIndex); CurrentAnimationState = MENU_EXIT; } else if(IsScrollActive() || NewItemSelected || ExitRequested) diff --git a/RetroFE/Source/Graphics/Component/Component.h b/RetroFE/Source/Graphics/Component/Component.h index 25555b0..caad418 100644 --- a/RetroFE/Source/Graphics/Component/Component.h +++ b/RetroFE/Source/Graphics/Component/Component.h @@ -35,8 +35,8 @@ public: virtual void LaunchExit() {} void TriggerEnterEvent(); void TriggerExitEvent(); - void TriggerMenuEnterEvent(); - void TriggerMenuExitEvent(); + void TriggerMenuEnterEvent(int menuIndex = -1); + void TriggerMenuExitEvent(int menuIndex = -1); void TriggerMenuScrollEvent(); void TriggerHighlightEvent(Item *selectedItem); bool IsIdle(); @@ -107,8 +107,10 @@ protected: bool EnterRequested; bool ExitRequested; bool MenuEnterRequested; + int MenuEnterIndex; bool MenuScrollRequested; bool MenuExitRequested; + int MenuExitIndex; bool NewItemSelected; bool HighlightExitComplete; bool NewItemSelectedSinceEnter; diff --git a/RetroFE/Source/Graphics/Page.cpp b/RetroFE/Source/Graphics/Page.cpp index 7a9aa23..046ce4f 100644 --- a/RetroFE/Source/Graphics/Page.cpp +++ b/RetroFE/Source/Graphics/Page.cpp @@ -329,13 +329,20 @@ bool Page::PushCollection(CollectionInfo *collection) Collections.push_back(collection); std::vector *sprites = ComponentItemBindingBuilder::BuildCollectionItems(collection->GetItems()); + int menuExitIndex = -1; + int menuEnterIndex = -1; + if(ActiveMenu) { ActiveMenu->TriggerMenuExitEvent(); } + + if(MenuDepth > 0) + { + menuExitIndex = MenuDepth - 1; + } ActiveMenu = Menus[MenuDepth]; - ActiveMenu->SetCollectionName(collection->GetName()); ActiveMenu->DestroyItems(); ActiveMenu->SetItems(sprites); @@ -343,6 +350,7 @@ bool Page::PushCollection(CollectionInfo *collection) if(MenuDepth < Menus.size()) { + menuEnterIndex = MenuDepth; MenuDepth++; } @@ -351,6 +359,15 @@ bool Page::PushCollection(CollectionInfo *collection) for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) { (*it)->SetCollectionName(collection->GetName()); + if(menuEnterIndex >= 0) + { + (*it)->TriggerMenuEnterEvent(menuEnterIndex); + } + + if(menuExitIndex >= 0) + { + (*it)->TriggerMenuExitEvent(menuExitIndex); + } } } @@ -359,6 +376,9 @@ bool Page::PushCollection(CollectionInfo *collection) bool Page::PopCollection() { + int menuExitIndex = -1; + int menuEnterIndex = -1; + if(MenuDepth > 1) { if(Collections.size() > 1) @@ -372,15 +392,34 @@ bool Page::PopCollection() } MenuDepth--; - + menuExitIndex = MenuDepth; + menuEnterIndex = menuExitIndex - 1; ActiveMenu = Menus[MenuDepth - 1]; if(ActiveMenu) { ActiveMenu->TriggerMenuEnterEvent(); } + for(unsigned int i = 0; i < NUM_LAYERS; ++i) + { + for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) + { + if(menuEnterIndex >= 0) + { + (*it)->TriggerMenuEnterEvent(menuEnterIndex); + } + + if(menuExitIndex >= 0) + { + (*it)->TriggerMenuExitEvent(menuExitIndex); + } + } + } + + return true; } + return false; } diff --git a/RetroFE/Source/Graphics/PageBuilder.cpp b/RetroFE/Source/Graphics/PageBuilder.cpp index 01adf7b..0069d05 100644 --- a/RetroFE/Source/Graphics/PageBuilder.cpp +++ b/RetroFE/Source/Graphics/PageBuilder.cpp @@ -465,8 +465,27 @@ TweenSet *PageBuilder::CreateTweenInstance(xml_node<> *componentXml) GetTweenSets(componentXml->first_node("onIdle"), tweens->GetOnIdleTweens()); GetTweenSets(componentXml->first_node("onHighlightEnter"), tweens->GetOnHighlightEnterTweens()); GetTweenSets(componentXml->first_node("onHighlightExit"), tweens->GetOnHighlightExitTweens()); - GetTweenSets(componentXml->first_node("onMenuEnter"), tweens->GetOnMenuEnterTweens()); - GetTweenSets(componentXml->first_node("onMenuExit"), tweens->GetOnMenuExitTweens()); + + for(xml_node<> *menuEnter = componentXml->first_node("onMenuEnter"); menuEnter; menuEnter = menuEnter->next_sibling("onMenuEnter")) + { + xml_attribute<> *indexXml = menuEnter->first_attribute("menuIndex"); + int index = (indexXml) ? Utils::ConvertInt(indexXml->value()) : -1; + + TweenSet::TweenSets *sets = new TweenSet::TweenSets(); + GetTweenSets(menuEnter, sets); + tweens->SetOnMenuEnterTweens(index, sets); + } + + for(xml_node<> *menuExit = componentXml->first_node("onMenuExit"); menuExit; menuExit = menuExit->next_sibling("onMenuExit")) + { + xml_attribute<> *indexXml = menuExit->first_attribute("menuIndex"); + int index = (indexXml) ? Utils::ConvertInt(indexXml->value()) : -1; + + TweenSet::TweenSets *sets = new TweenSet::TweenSets(); + GetTweenSets(menuExit, sets); + tweens->SetOnMenuExitTweens(index, sets); + } + return tweens; } @@ -725,7 +744,6 @@ void PageBuilder::BuildViewInfo(xml_node<> *componentXml, ViewInfo *info, xml_no info->SetX(GetHorizontalAlignment(x, 0)); info->SetY(GetVerticalAlignment(y, 0)); - info->SetXOffset( GetHorizontalAlignment(xOffset, 0)); info->SetYOffset( GetVerticalAlignment(yOffset, 0)); float xOriginRelative = GetHorizontalAlignment(xOrigin, 0);