From 5790f76f4e94a2a6f6ec9c223ca0206bb92c03e6 Mon Sep 17 00:00:00 2001 From: emb <> Date: Mon, 2 Feb 2015 22:08:34 -0600 Subject: [PATCH] Support for other tweens to trigger only when specific menu is selected (using menuIndex attribute). --- RetroFE/Source/Graphics/Animate/TweenSet.cpp | 124 ++++++------------ RetroFE/Source/Graphics/Animate/TweenSet.h | 29 +--- .../Source/Graphics/Component/Component.cpp | 28 ++-- .../Graphics/Component/ScrollingList.cpp | 2 +- RetroFE/Source/Graphics/PageBuilder.cpp | 46 +++---- RetroFE/Source/Graphics/PageBuilder.h | 1 + 6 files changed, 82 insertions(+), 148 deletions(-) diff --git a/RetroFE/Source/Graphics/Animate/TweenSet.cpp b/RetroFE/Source/Graphics/Animate/TweenSet.cpp index b7d0174..5964c24 100644 --- a/RetroFE/Source/Graphics/Animate/TweenSet.cpp +++ b/RetroFE/Source/Graphics/Animate/TweenSet.cpp @@ -18,103 +18,57 @@ TweenSet::~TweenSet() { - std::map::iterator it; - - it = OnMenuEnterTweens.begin(); - while(it != OnMenuEnterTweens.end()) - { - delete it->second; - OnMenuEnterTweens.erase(it); - it = OnMenuEnterTweens.begin(); - } + DestroyTweens(); +} + +void TweenSet::DestroyTweens() +{ + std::map>::iterator it = TweenMap.begin(); - it = OnMenuExitTweens.begin(); - while(it != OnMenuExitTweens.end()) + while(it != TweenMap.end()) { - delete it->second; - OnMenuExitTweens.erase(it); - it = OnMenuExitTweens.begin(); + std::map::iterator it2 = (it->second).begin(); + + while(it2 != (it->second).end()) + { + delete it2->second; + (it->second).erase(it2); + it2 = (it->second).begin(); + } + + it =TweenMap.begin(); } } -TweenSet::TweenSets *TweenSet::GetOnEnterTweens() +TweenSet::TweenSets *TweenSet::GetTween(std::string tween) { - return &OnEnterTweens; -} -TweenSet::TweenSets *TweenSet::GetOnExitTweens() -{ - return &OnExitTweens; -} -TweenSet::TweenSets *TweenSet::GetOnIdleTweens() -{ - return &OnIdleTweens; -} -TweenSet::TweenSets *TweenSet::GetOnHighlightEnterTweens() -{ - return &OnHighlightEnterTweens; -} -TweenSet::TweenSets *TweenSet::GetOnHighlightExitTweens() -{ - return &OnHighlightExitTweens; + return GetTween(tween, -1); } -TweenSet::TweenSets *TweenSet::GetOnMenuEnterTweens() +TweenSet::TweenSets *TweenSet::GetTween(std::string tween, int index) { - return GetOnMenuEnterTweens(-1); + return FindTween(TweenMap[tween], index); } - - -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 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) +void TweenSet::SetTween(std::string tween, int index, TweenSets *set) { - OnMenuExitTweens[index] = set; + TweenMap[tween][index] = set; +} + +TweenSet::TweenSets *TweenSet::FindTween(std::map &tweens, int index) +{ + if(tweens.find(index) == tweens.end()) + { + index = -1; + + if(tweens.find(index) == tweens.end()) + { + TweenSets *set = new TweenSets(); + tweens[index] = set; + } + } + + return tweens[index]; } diff --git a/RetroFE/Source/Graphics/Animate/TweenSet.h b/RetroFE/Source/Graphics/Animate/TweenSet.h index a62dcc1..bdc1f83 100644 --- a/RetroFE/Source/Graphics/Animate/TweenSet.h +++ b/RetroFE/Source/Graphics/Animate/TweenSet.h @@ -27,29 +27,14 @@ 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 *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); + TweenSets *GetTween(std::string tween); + TweenSets *GetTween(std::string tween, int index); + void SetTween(std::string tween, int index, TweenSets *set); private: - TweenSets OnEnterTweens; - TweenSets OnExitTweens; - TweenSets OnIdleTweens; - TweenSets OnHighlightEnterTweens; - TweenSets OnHighlightExitTweens; - TweenSets OnMenuScrollTweens; - std::map OnMenuEnterTweens; - std::map OnMenuExitTweens; - + TweenSets *FindTween(std::map &tweens, int index); +void TweenSet::DestroyTweens(); + + std::map> TweenMap; }; diff --git a/RetroFE/Source/Graphics/Component/Component.cpp b/RetroFE/Source/Graphics/Component/Component.cpp index 0733773..a56621c 100644 --- a/RetroFE/Source/Graphics/Component/Component.cpp +++ b/RetroFE/Source/Graphics/Component/Component.cpp @@ -180,7 +180,7 @@ void Component::Update(float dt) case ENTER: - CurrentTweens = Tweens->GetOnHighlightEnterTweens(); + CurrentTweens = Tweens->GetTween("enter", MenuEnterIndex); CurrentAnimationState = HIGHLIGHT_ENTER; break; @@ -190,7 +190,7 @@ void Component::Update(float dt) break; case HIGHLIGHT_ENTER: - CurrentTweens = Tweens->GetOnIdleTweens(); + CurrentTweens = Tweens->GetTween("idle", MenuEnterIndex); CurrentAnimationState = IDLE; break; @@ -204,29 +204,29 @@ void Component::Update(float dt) else if(MenuEnterRequested) { MenuEnterRequested = false; - CurrentTweens = Tweens->GetOnMenuEnterTweens(MenuEnterIndex); + CurrentTweens = Tweens->GetTween("menuEnter", MenuEnterIndex); CurrentAnimationState = MENU_ENTER; } else if(MenuScrollRequested) { MenuScrollRequested = false; - CurrentTweens = Tweens->GetOnMenuScrollTweens(); + CurrentTweens = Tweens->GetTween("menuScroll", MenuEnterIndex); CurrentAnimationState = MENU_SCROLL; } else if(MenuExitRequested) { MenuExitRequested = false; - CurrentTweens = Tweens->GetOnMenuExitTweens(MenuExitIndex); + CurrentTweens = Tweens->GetTween("menuExit", MenuEnterIndex); CurrentAnimationState = MENU_EXIT; } else if(IsScrollActive() || NewItemSelected || ExitRequested) { - CurrentTweens = Tweens->GetOnHighlightExitTweens(); + CurrentTweens = Tweens->GetTween("highlightExit", MenuEnterIndex); CurrentAnimationState = HIGHLIGHT_EXIT; } else { - CurrentTweens = Tweens->GetOnIdleTweens(); + CurrentTweens = Tweens->GetTween("idle", MenuEnterIndex); CurrentAnimationState = IDLE; } break; @@ -238,14 +238,14 @@ void Component::Update(float dt) if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_WAIT)) { - CurrentTweens = Tweens->GetOnHighlightExitTweens(); + CurrentTweens = Tweens->GetTween("highlightExit", MenuEnterIndex); CurrentAnimationState = HIGHLIGHT_EXIT; } else if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_EXIT)) { - CurrentTweens = Tweens->GetOnExitTweens(); + CurrentTweens = Tweens->GetTween("exit", MenuEnterIndex); CurrentAnimationState = EXIT; ExitRequested = false; } @@ -256,7 +256,7 @@ void Component::Update(float dt) } else if(NewItemSelected) { - CurrentTweens = Tweens->GetOnHighlightEnterTweens(); + CurrentTweens = Tweens->GetTween("highlightEnter", MenuEnterIndex); CurrentAnimationState = HIGHLIGHT_ENTER; HighlightExitComplete = true; NewItemSelected = false; @@ -271,18 +271,18 @@ void Component::Update(float dt) case HIDDEN: if(EnterRequested || ExitRequested) { - CurrentTweens = Tweens->GetOnEnterTweens(); + CurrentTweens = Tweens->GetTween("enter", MenuEnterIndex); CurrentAnimationState = ENTER; } else if(MenuExitRequested) { - CurrentTweens = Tweens->GetOnMenuExitTweens(); + CurrentTweens = Tweens->GetTween("menuExit", MenuEnterIndex); CurrentAnimationState = MENU_EXIT; MenuExitRequested = false; } else if(MenuEnterRequested) { - CurrentTweens = Tweens->GetOnMenuEnterTweens(); + CurrentTweens = Tweens->GetTween("menuEnter", MenuEnterIndex); CurrentAnimationState = MENU_ENTER; MenuEnterRequested = false; @@ -290,7 +290,7 @@ void Component::Update(float dt) else if(MenuScrollRequested) { MenuScrollRequested = false; - CurrentTweens = Tweens->GetOnMenuScrollTweens(); + CurrentTweens = Tweens->GetTween("menuScroll", MenuEnterIndex); CurrentAnimationState = MENU_SCROLL; } else diff --git a/RetroFE/Source/Graphics/Component/ScrollingList.cpp b/RetroFE/Source/Graphics/Component/ScrollingList.cpp index 34829ae..e224b6d 100644 --- a/RetroFE/Source/Graphics/Component/ScrollingList.cpp +++ b/RetroFE/Source/Graphics/Component/ScrollingList.cpp @@ -522,7 +522,7 @@ void ScrollingList::ResetTweens(Component *c, TweenSet *sets, ViewInfo *currentV //todo: delete properly, memory leak (big), proof of concept c->SetTweens(sets); - TweenSets *scrollTween = sets->GetOnMenuScrollTweens(); + TweenSets *scrollTween = sets->GetTween("menuScroll"); TweenSets::iterator it = scrollTween->begin(); while(it != scrollTween->end()) diff --git a/RetroFE/Source/Graphics/PageBuilder.cpp b/RetroFE/Source/Graphics/PageBuilder.cpp index 132accf..b91e55c 100644 --- a/RetroFE/Source/Graphics/PageBuilder.cpp +++ b/RetroFE/Source/Graphics/PageBuilder.cpp @@ -460,36 +460,30 @@ TweenSet *PageBuilder::CreateTweenInstance(xml_node<> *componentXml) { TweenSet *tweens = new TweenSet(); - GetTweenSets(componentXml->first_node("onEnter"), tweens->GetOnEnterTweens()); - GetTweenSets(componentXml->first_node("onExit"), tweens->GetOnExitTweens()); - GetTweenSets(componentXml->first_node("onIdle"), tweens->GetOnIdleTweens()); - GetTweenSets(componentXml->first_node("onHighlightEnter"), tweens->GetOnHighlightEnterTweens()); - GetTweenSets(componentXml->first_node("onHighlightExit"), tweens->GetOnHighlightExitTweens()); - - 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); - } - + BuildTweenSets(tweens, componentXml, "onEnter", "enter"); + BuildTweenSets(tweens, componentXml, "onExit", "exit"); + BuildTweenSets(tweens, componentXml, "onIdle", "idle"); + BuildTweenSets(tweens, componentXml, "onHighlightEnter", "highlightEnter"); + BuildTweenSets(tweens, componentXml, "onHighlightExit", "highlightExit"); + BuildTweenSets(tweens, componentXml, "onMenuEnter", "menuEnter"); + BuildTweenSets(tweens, componentXml, "onMenuExit", "menuExit"); return tweens; } +void PageBuilder::BuildTweenSets(TweenSet *tweens, xml_node<> *componentXml, std::string tagName, std::string tweenName) +{ + for(componentXml = componentXml->first_node(tagName.c_str()); componentXml; componentXml = componentXml->next_sibling(tweenName.c_str())) + { + xml_attribute<> *indexXml = componentXml->first_attribute("menuIndex"); + int index = (indexXml) ? Utils::ConvertInt(indexXml->value()) : -1; + + TweenSet::TweenSets *sets = new TweenSet::TweenSets(); + GetTweenSets(componentXml, sets); + tweens->SetTween(tweenName, index, sets); + } +} + ScrollingList * PageBuilder::BuildMenu(xml_node<> *menuXml) { diff --git a/RetroFE/Source/Graphics/PageBuilder.h b/RetroFE/Source/Graphics/PageBuilder.h index 8ead3e2..c5e12a9 100644 --- a/RetroFE/Source/Graphics/PageBuilder.h +++ b/RetroFE/Source/Graphics/PageBuilder.h @@ -54,6 +54,7 @@ private: bool BuildComponents(rapidxml::xml_node<> *layout, Page *page); void LoadTweens(Component *c, rapidxml::xml_node<> *componentXml); TweenSet *CreateTweenInstance(rapidxml::xml_node<> *componentXml); + void BuildTweenSets(TweenSet *tweens, rapidxml::xml_node<> *componentXml, std::string tagName, std::string tweenName); ScrollingList * BuildMenu(rapidxml::xml_node<> *menuXml); void BuildCustomMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults); void BuildVerticalMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults);