diff --git a/RetroFE/Source/Graphics/Component/Component.cpp b/RetroFE/Source/Graphics/Component/Component.cpp
index 31b03ce..3fcb79f 100644
--- a/RetroFE/Source/Graphics/Component/Component.cpp
+++ b/RetroFE/Source/Graphics/Component/Component.cpp
@@ -1,460 +1,466 @@
-/* This file is part of RetroFE.
- *
- * RetroFE is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * RetroFE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with RetroFE. If not, see .
- */
-#include "Component.h"
-#include "../Animate/Tween.h"
-#include "../../Graphics/ViewInfo.h"
-#include "../../Utility/Log.h"
-#include "../../SDL.h"
-
-Component::Component()
-{
- tweens_ = NULL;
- selectedItem_ = NULL;
- newItemSelectedSinceEnter = false;
- backgroundTexture_ = NULL;
- freeGraphicsMemory();
-
-}
-
-Component::Component(const Component ©)
-{
- tweens_ = NULL;
- selectedItem_ = NULL;
- newItemSelectedSinceEnter = false;
- backgroundTexture_ = NULL;
- freeGraphicsMemory();
-
+/* This file is part of RetroFE.
+ *
+ * RetroFE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RetroFE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RetroFE. If not, see .
+ */
+#include "Component.h"
+#include "../Animate/Tween.h"
+#include "../../Graphics/ViewInfo.h"
+#include "../../Utility/Log.h"
+#include "../../SDL.h"
+
+Component::Component()
+{
+ tweens_ = NULL;
+ selectedItem_ = NULL;
+ newItemSelectedSinceEnter = false;
+ backgroundTexture_ = NULL;
+ freeGraphicsMemory();
+
+}
+
+Component::Component(const Component ©)
+{
+ tweens_ = NULL;
+ selectedItem_ = NULL;
+ newItemSelectedSinceEnter = false;
+ backgroundTexture_ = NULL;
+ freeGraphicsMemory();
+
if(copy.tweens_)
{
AnimationEvents *tweens = new AnimationEvents(*copy.tweens_);
setTweens(tweens);
- }
-
-
-}
-
-Component::~Component()
-{
- freeGraphicsMemory();
-}
-
-void Component::freeGraphicsMemory()
-{
- currentAnimationState = HIDDEN;
- enterRequested = false;
- exitRequested = false;
- menuEnterRequested = false;
- menuEnterIndex = -1;
- menuScrollRequested = false;
- menuExitRequested = false;
- menuExitIndex = -1;
-
- newItemSelected = false;
- highlightExitComplete = false;
- currentTweens_ = NULL;
- currentTweenIndex_ = 0;
- currentTweenComplete_ = false;
- elapsedTweenTime_ = 0;
- scrollActive = false;
-
- if(backgroundTexture_)
- {
- SDL_LockMutex(SDL::getMutex());
- SDL_DestroyTexture(backgroundTexture_);
- SDL_UnlockMutex(SDL::getMutex());
-
- backgroundTexture_ = NULL;
- }
-}
-void Component::allocateGraphicsMemory()
-{
- if(!backgroundTexture_)
- {
- // make a 4x4 pixel wide surface to be stretched during rendering, make it a white background so we can use
- // color later
- SDL_Surface *surface = SDL_CreateRGBSurface(0, 4, 4, 32, 0, 0, 0, 0);
- SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));
-
- SDL_LockMutex(SDL::getMutex());
- backgroundTexture_ = SDL_CreateTextureFromSurface(SDL::getRenderer(), surface);
- SDL_UnlockMutex(SDL::getMutex());
-
- SDL_FreeSurface(surface);
- SDL_SetTextureBlendMode(backgroundTexture_, SDL_BLENDMODE_BLEND);
- }
-}
-
-Item *Component::getSelectedItem()
-{
- return selectedItem_;
-}
-
-void Component::triggerEnterEvent()
-{
- enterRequested = true;
-}
-
-void Component::triggerExitEvent()
-{
- exitRequested = true;
-}
-
-
-
-void Component::triggerMenuEnterEvent(int menuIndex)
-{
- menuEnterRequested = true;
- menuEnterIndex = menuIndex;
-}
-
-void Component::triggerMenuScrollEvent()
-{
- menuScrollRequested = true;
-}
-
-
-void Component::triggerMenuExitEvent(int menuIndex)
-{
- menuExitRequested = true;
- menuExitIndex = menuIndex;
-}
-void Component::triggerHighlightEvent(Item *selectedItem)
-{
- newItemSelected = true;
- this->selectedItem_ = selectedItem;
-}
-
-
-bool Component::isIdle()
-{
- return (currentAnimationState == IDLE);
-}
-
-bool Component::isHidden()
-{
- return (currentAnimationState == HIDDEN);
-}
-bool Component::isWaiting()
-{
- return (currentAnimationState == HIGHLIGHT_WAIT);
-}
-
-bool Component::isMenuScrolling()
-{
- return (currentAnimationState == MENU_ENTER || currentAnimationState == MENU_SCROLL || currentAnimationState == MENU_EXIT || menuScrollRequested);
-}
-
-void Component::setTweens(AnimationEvents *set)
-{
- tweens_ = set;
- forceIdle();
-}
-
-void Component::forceIdle()
-{
- currentAnimationState = IDLE;
- currentTweenIndex_ = 0;
- currentTweenComplete_ = false;
- elapsedTweenTime_ = 0;
- currentTweens_ = NULL;
-}
-
-
-void Component::update(float dt)
-{
- elapsedTweenTime_ += dt;
- highlightExitComplete = false;
- if(isHidden() || isWaiting() || (isIdle() && exitRequested))
- {
- currentTweenComplete_ = true;
- }
-
- if(currentTweenComplete_)
- {
- currentTweens_ = NULL;
-
- // There was no request to override our state path. Continue on as normal.
- std::stringstream ss;
- switch(currentAnimationState)
- {
- case MENU_ENTER:
- currentTweens_ = NULL;
- currentAnimationState = IDLE;
- break;
-
- case MENU_SCROLL:
- currentTweens_ = NULL;
- currentAnimationState = IDLE;
- break;
-
- case MENU_EXIT:
- currentTweens_ = NULL;
- currentAnimationState = IDLE;
- break;
-
-
- case ENTER:
- currentTweens_ = tweens_->getAnimation("enter", menuEnterIndex);
- currentAnimationState = HIGHLIGHT_ENTER;
- break;
-
- case EXIT:
- currentTweens_ = NULL;
- currentAnimationState = HIDDEN;
- break;
-
- case HIGHLIGHT_ENTER:
- currentTweens_ = tweens_->getAnimation("idle", menuEnterIndex);
- currentAnimationState = IDLE;
- break;
-
- case IDLE:
- // prevent us from automatically jumping to the exit tween upon enter
- if(enterRequested)
- {
- enterRequested = false;
- newItemSelected = false;
- }
- else if(menuExitRequested && (!menuEnterRequested || menuExitRequested <= menuEnterRequested))
- {
- currentTweens_ = tweens_->getAnimation("menuExit", menuExitIndex);
- currentAnimationState = MENU_EXIT;
- menuExitRequested = false;
- }
- else if(menuEnterRequested && (!menuExitRequested || menuExitRequested > menuEnterRequested))
- {
- currentTweens_ = tweens_->getAnimation("menuEnter", menuEnterIndex);
- currentAnimationState = MENU_ENTER;
- menuEnterRequested = false;
-
- }
- else if(menuScrollRequested)
- {
- menuScrollRequested = false;
- currentTweens_ = tweens_->getAnimation("menuScroll", menuEnterIndex);
- currentAnimationState = MENU_SCROLL;
- }
- else if(scrollActive || newItemSelected || exitRequested)
- {
- currentTweens_ = tweens_->getAnimation("highlightExit", menuEnterIndex);
- currentAnimationState = HIGHLIGHT_EXIT;
- }
- else
- {
- currentTweens_ = tweens_->getAnimation("idle", menuEnterIndex);
- currentAnimationState = IDLE;
- }
- break;
-
- case HIGHLIGHT_EXIT:
-
- // intentionally break down
- case HIGHLIGHT_WAIT:
-
- if(exitRequested && (currentAnimationState == HIGHLIGHT_WAIT))
- {
- currentTweens_ = tweens_->getAnimation("highlightExit", menuEnterIndex);
- currentAnimationState = HIGHLIGHT_EXIT;
-
- }
- else if(exitRequested && (currentAnimationState == HIGHLIGHT_EXIT))
- {
-
- currentTweens_ = tweens_->getAnimation("exit", menuEnterIndex);
- currentAnimationState = EXIT;
- exitRequested = false;
- }
- else if(scrollActive)
- {
- currentTweens_ = NULL;
- currentAnimationState = HIGHLIGHT_WAIT;
- }
- else if(newItemSelected)
- {
- currentTweens_ = tweens_->getAnimation("highlightEnter", menuEnterIndex);
- currentAnimationState = HIGHLIGHT_ENTER;
- highlightExitComplete = true;
- newItemSelected = false;
- }
- else
- {
- currentTweens_ = NULL;
- currentAnimationState = HIGHLIGHT_WAIT;
- }
- break;
-
- case HIDDEN:
- if(enterRequested || exitRequested)
- {
- currentTweens_ = tweens_->getAnimation("enter", menuEnterIndex);
- currentAnimationState = ENTER;
- }
-
- else if(menuExitRequested && (!menuEnterRequested || menuExitRequested <= menuEnterRequested))
- {
- currentTweens_ = tweens_->getAnimation("menuExit", menuExitIndex);
- currentAnimationState = MENU_EXIT;
- menuExitRequested = false;
- }
- else if(menuEnterRequested && (!menuExitRequested || menuExitRequested > menuEnterRequested))
- {
- currentTweens_ = tweens_->getAnimation("menuEnter", menuEnterIndex);
- currentAnimationState = MENU_ENTER;
- menuEnterRequested = false;
-
- }
- else if(menuScrollRequested)
- {
- menuScrollRequested = false;
- currentTweens_ = tweens_->getAnimation("menuScroll", menuEnterIndex);
- currentAnimationState = MENU_SCROLL;
- }
- else
- {
- currentTweens_ = NULL;
- currentAnimationState = HIDDEN;
- }
- }
-
- currentTweenIndex_ = 0;
- currentTweenComplete_ = false;
-
- elapsedTweenTime_ = 0;
- }
-
- currentTweenComplete_ = animate(isIdle());
-}
-
-void Component::draw()
-{
-
- if(backgroundTexture_)
- {
- SDL_Rect rect;
- rect.h = static_cast(baseViewInfo.ScaledHeight());
- rect.w = static_cast(baseViewInfo.ScaledWidth());
- rect.x = static_cast(baseViewInfo.XRelativeToOrigin());
- rect.y = static_cast(baseViewInfo.YRelativeToOrigin());
-
-
- SDL_SetTextureColorMod(backgroundTexture_,
- static_cast(baseViewInfo.BackgroundRed*255),
- static_cast(baseViewInfo.BackgroundGreen*255),
- static_cast(baseViewInfo.BackgroundBlue*255));
-
- SDL::renderCopy(backgroundTexture_, static_cast(baseViewInfo.BackgroundAlpha*255), NULL, &rect, baseViewInfo.Angle);
- }
-}
-
-bool Component::animate(bool loop)
-{
- bool completeDone = false;
- if(!currentTweens_ || currentTweenIndex_ >= currentTweens_->size())
- {
- completeDone = true;
- }
- else if(currentTweens_)
- {
- bool currentDone = true;
- TweenSet *tweens = currentTweens_->tweenSet(currentTweenIndex_);
-
- for(unsigned int i = 0; i < tweens->size(); i++)
- {
- Tween *tween = tweens->tweens()->at(i);
- double elapsedTime = elapsedTweenTime_;
-
- //todo: too many levels of nesting
- if(elapsedTime < tween->duration)
- {
- currentDone = false;
- }
- else
- {
- elapsedTime = static_cast(tween->duration);
- }
-
- float value = tween->animate(elapsedTime);
-
- switch(tween->property)
- {
- case TWEEN_PROPERTY_X:
- baseViewInfo.X = value;
- break;
-
- case TWEEN_PROPERTY_Y:
- baseViewInfo.Y = value;
- break;
-
- case TWEEN_PROPERTY_HEIGHT:
- baseViewInfo.Height = value;
- break;
-
- case TWEEN_PROPERTY_WIDTH:
- baseViewInfo.Width = value;
- break;
-
- case TWEEN_PROPERTY_ANGLE:
- baseViewInfo.Angle = value;
- break;
-
- case TWEEN_PROPERTY_ALPHA:
- baseViewInfo.Alpha = value;
- break;
-
- case TWEEN_PROPERTY_X_ORIGIN:
- baseViewInfo.XOrigin = value;
- break;
-
- case TWEEN_PROPERTY_Y_ORIGIN:
- baseViewInfo.YOrigin = value;
- break;
-
- case TWEEN_PROPERTY_X_OFFSET:
- baseViewInfo.XOffset = value;
- break;
-
- case TWEEN_PROPERTY_Y_OFFSET:
- baseViewInfo.YOffset = value;
- break;
-
- case TWEEN_PROPERTY_FONT_SIZE:
- baseViewInfo.FontSize = value;
- break;
-
- case TWEEN_PROPERTY_BACKGROUND_ALPHA:
- baseViewInfo.BackgroundAlpha = value;
- break;
- }
- }
-
- if(currentDone)
- {
- currentTweenIndex_++;
- elapsedTweenTime_ = 0;
- }
- }
-
- if(!currentTweens_ || currentTweenIndex_ >= currentTweens_->tweenSets()->size())
- {
- if(loop)
- {
- currentTweenIndex_ = 0;
- }
- completeDone = true;
- }
-
- return completeDone;
-}
+ }
+
+
+}
+
+Component::~Component()
+{
+ freeGraphicsMemory();
+}
+
+void Component::freeGraphicsMemory()
+{
+ currentAnimationState = HIDDEN;
+ enterRequested = false;
+ exitRequested = false;
+ menuEnterRequested = false;
+ menuEnterIndex = -1;
+ menuScrollRequested = false;
+ menuExitRequested = false;
+ menuExitIndex = -1;
+
+ newItemSelected = false;
+ playlistChanged = false;
+ highlightExitComplete = false;
+ currentTweens_ = NULL;
+ currentTweenIndex_ = 0;
+ currentTweenComplete_ = false;
+ elapsedTweenTime_ = 0;
+ scrollActive = false;
+
+ if(backgroundTexture_)
+ {
+ SDL_LockMutex(SDL::getMutex());
+ SDL_DestroyTexture(backgroundTexture_);
+ SDL_UnlockMutex(SDL::getMutex());
+
+ backgroundTexture_ = NULL;
+ }
+}
+void Component::allocateGraphicsMemory()
+{
+ if(!backgroundTexture_)
+ {
+ // make a 4x4 pixel wide surface to be stretched during rendering, make it a white background so we can use
+ // color later
+ SDL_Surface *surface = SDL_CreateRGBSurface(0, 4, 4, 32, 0, 0, 0, 0);
+ SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));
+
+ SDL_LockMutex(SDL::getMutex());
+ backgroundTexture_ = SDL_CreateTextureFromSurface(SDL::getRenderer(), surface);
+ SDL_UnlockMutex(SDL::getMutex());
+
+ SDL_FreeSurface(surface);
+ SDL_SetTextureBlendMode(backgroundTexture_, SDL_BLENDMODE_BLEND);
+ }
+}
+
+Item *Component::getSelectedItem()
+{
+ return selectedItem_;
+}
+
+void Component::triggerEnterEvent()
+{
+ enterRequested = true;
+}
+
+void Component::triggerExitEvent()
+{
+ exitRequested = true;
+}
+
+
+
+void Component::triggerMenuEnterEvent(int menuIndex)
+{
+ menuEnterRequested = true;
+ menuEnterIndex = menuIndex;
+}
+
+void Component::triggerMenuScrollEvent()
+{
+ menuScrollRequested = true;
+}
+
+
+void Component::triggerMenuExitEvent(int menuIndex)
+{
+ menuExitRequested = true;
+ menuExitIndex = menuIndex;
+}
+void Component::triggerHighlightEvent(Item *selectedItem)
+{
+ newItemSelected = true;
+ this->selectedItem_ = selectedItem;
+}
+
+void Component::triggerPlaylistChangeEvent(std::string name)
+{
+ playlistChanged = true;
+ this->playlistName = name;
+}
+
+bool Component::isIdle()
+{
+ return (currentAnimationState == IDLE);
+}
+
+bool Component::isHidden()
+{
+ return (currentAnimationState == HIDDEN);
+}
+bool Component::isWaiting()
+{
+ return (currentAnimationState == HIGHLIGHT_WAIT);
+}
+
+bool Component::isMenuScrolling()
+{
+ return (currentAnimationState == MENU_ENTER || currentAnimationState == MENU_SCROLL || currentAnimationState == MENU_EXIT || menuScrollRequested);
+}
+
+void Component::setTweens(AnimationEvents *set)
+{
+ tweens_ = set;
+ forceIdle();
+}
+
+void Component::forceIdle()
+{
+ currentAnimationState = IDLE;
+ currentTweenIndex_ = 0;
+ currentTweenComplete_ = false;
+ elapsedTweenTime_ = 0;
+ currentTweens_ = NULL;
+}
+
+
+void Component::update(float dt)
+{
+ elapsedTweenTime_ += dt;
+ highlightExitComplete = false;
+ if(isHidden() || isWaiting() || (isIdle() && exitRequested))
+ {
+ currentTweenComplete_ = true;
+ }
+
+ if(currentTweenComplete_)
+ {
+ currentTweens_ = NULL;
+
+ // There was no request to override our state path. Continue on as normal.
+ std::stringstream ss;
+ switch(currentAnimationState)
+ {
+ case MENU_ENTER:
+ currentTweens_ = NULL;
+ currentAnimationState = IDLE;
+ break;
+
+ case MENU_SCROLL:
+ currentTweens_ = NULL;
+ currentAnimationState = IDLE;
+ break;
+
+ case MENU_EXIT:
+ currentTweens_ = NULL;
+ currentAnimationState = IDLE;
+ break;
+
+
+ case ENTER:
+ currentTweens_ = tweens_->getAnimation("enter", menuEnterIndex);
+ currentAnimationState = HIGHLIGHT_ENTER;
+ break;
+
+ case EXIT:
+ currentTweens_ = NULL;
+ currentAnimationState = HIDDEN;
+ break;
+
+ case HIGHLIGHT_ENTER:
+ currentTweens_ = tweens_->getAnimation("idle", menuEnterIndex);
+ currentAnimationState = IDLE;
+ break;
+
+ case IDLE:
+ // prevent us from automatically jumping to the exit tween upon enter
+ if(enterRequested)
+ {
+ enterRequested = false;
+ newItemSelected = false;
+ }
+ else if(menuExitRequested && (!menuEnterRequested || menuExitRequested <= menuEnterRequested))
+ {
+ currentTweens_ = tweens_->getAnimation("menuExit", menuExitIndex);
+ currentAnimationState = MENU_EXIT;
+ menuExitRequested = false;
+ }
+ else if(menuEnterRequested && (!menuExitRequested || menuExitRequested > menuEnterRequested))
+ {
+ currentTweens_ = tweens_->getAnimation("menuEnter", menuEnterIndex);
+ currentAnimationState = MENU_ENTER;
+ menuEnterRequested = false;
+
+ }
+ else if(menuScrollRequested)
+ {
+ menuScrollRequested = false;
+ currentTweens_ = tweens_->getAnimation("menuScroll", menuEnterIndex);
+ currentAnimationState = MENU_SCROLL;
+ }
+ else if(scrollActive || newItemSelected || exitRequested)
+ {
+ currentTweens_ = tweens_->getAnimation("highlightExit", menuEnterIndex);
+ currentAnimationState = HIGHLIGHT_EXIT;
+ }
+ else
+ {
+ currentTweens_ = tweens_->getAnimation("idle", menuEnterIndex);
+ currentAnimationState = IDLE;
+ }
+ break;
+
+ case HIGHLIGHT_EXIT:
+
+ // intentionally break down
+ case HIGHLIGHT_WAIT:
+
+ if(exitRequested && (currentAnimationState == HIGHLIGHT_WAIT))
+ {
+ currentTweens_ = tweens_->getAnimation("highlightExit", menuEnterIndex);
+ currentAnimationState = HIGHLIGHT_EXIT;
+
+ }
+ else if(exitRequested && (currentAnimationState == HIGHLIGHT_EXIT))
+ {
+
+ currentTweens_ = tweens_->getAnimation("exit", menuEnterIndex);
+ currentAnimationState = EXIT;
+ exitRequested = false;
+ }
+ else if(scrollActive)
+ {
+ currentTweens_ = NULL;
+ currentAnimationState = HIGHLIGHT_WAIT;
+ }
+ else if(newItemSelected)
+ {
+ currentTweens_ = tweens_->getAnimation("highlightEnter", menuEnterIndex);
+ currentAnimationState = HIGHLIGHT_ENTER;
+ highlightExitComplete = true;
+ newItemSelected = false;
+ }
+ else
+ {
+ currentTweens_ = NULL;
+ currentAnimationState = HIGHLIGHT_WAIT;
+ }
+ break;
+
+ case HIDDEN:
+ if(enterRequested || exitRequested)
+ {
+ currentTweens_ = tweens_->getAnimation("enter", menuEnterIndex);
+ currentAnimationState = ENTER;
+ }
+
+ else if(menuExitRequested && (!menuEnterRequested || menuExitRequested <= menuEnterRequested))
+ {
+ currentTweens_ = tweens_->getAnimation("menuExit", menuExitIndex);
+ currentAnimationState = MENU_EXIT;
+ menuExitRequested = false;
+ }
+ else if(menuEnterRequested && (!menuExitRequested || menuExitRequested > menuEnterRequested))
+ {
+ currentTweens_ = tweens_->getAnimation("menuEnter", menuEnterIndex);
+ currentAnimationState = MENU_ENTER;
+ menuEnterRequested = false;
+
+ }
+ else if(menuScrollRequested)
+ {
+ menuScrollRequested = false;
+ currentTweens_ = tweens_->getAnimation("menuScroll", menuEnterIndex);
+ currentAnimationState = MENU_SCROLL;
+ }
+ else
+ {
+ currentTweens_ = NULL;
+ currentAnimationState = HIDDEN;
+ }
+ }
+
+ currentTweenIndex_ = 0;
+ currentTweenComplete_ = false;
+
+ elapsedTweenTime_ = 0;
+ }
+
+ currentTweenComplete_ = animate(isIdle());
+}
+
+void Component::draw()
+{
+
+ if(backgroundTexture_)
+ {
+ SDL_Rect rect;
+ rect.h = static_cast(baseViewInfo.ScaledHeight());
+ rect.w = static_cast(baseViewInfo.ScaledWidth());
+ rect.x = static_cast(baseViewInfo.XRelativeToOrigin());
+ rect.y = static_cast(baseViewInfo.YRelativeToOrigin());
+
+
+ SDL_SetTextureColorMod(backgroundTexture_,
+ static_cast(baseViewInfo.BackgroundRed*255),
+ static_cast(baseViewInfo.BackgroundGreen*255),
+ static_cast(baseViewInfo.BackgroundBlue*255));
+
+ SDL::renderCopy(backgroundTexture_, static_cast(baseViewInfo.BackgroundAlpha*255), NULL, &rect, baseViewInfo.Angle);
+ }
+}
+
+bool Component::animate(bool loop)
+{
+ bool completeDone = false;
+ if(!currentTweens_ || currentTweenIndex_ >= currentTweens_->size())
+ {
+ completeDone = true;
+ }
+ else if(currentTweens_)
+ {
+ bool currentDone = true;
+ TweenSet *tweens = currentTweens_->tweenSet(currentTweenIndex_);
+
+ for(unsigned int i = 0; i < tweens->size(); i++)
+ {
+ Tween *tween = tweens->tweens()->at(i);
+ double elapsedTime = elapsedTweenTime_;
+
+ //todo: too many levels of nesting
+ if(elapsedTime < tween->duration)
+ {
+ currentDone = false;
+ }
+ else
+ {
+ elapsedTime = static_cast(tween->duration);
+ }
+
+ float value = tween->animate(elapsedTime);
+
+ switch(tween->property)
+ {
+ case TWEEN_PROPERTY_X:
+ baseViewInfo.X = value;
+ break;
+
+ case TWEEN_PROPERTY_Y:
+ baseViewInfo.Y = value;
+ break;
+
+ case TWEEN_PROPERTY_HEIGHT:
+ baseViewInfo.Height = value;
+ break;
+
+ case TWEEN_PROPERTY_WIDTH:
+ baseViewInfo.Width = value;
+ break;
+
+ case TWEEN_PROPERTY_ANGLE:
+ baseViewInfo.Angle = value;
+ break;
+
+ case TWEEN_PROPERTY_ALPHA:
+ baseViewInfo.Alpha = value;
+ break;
+
+ case TWEEN_PROPERTY_X_ORIGIN:
+ baseViewInfo.XOrigin = value;
+ break;
+
+ case TWEEN_PROPERTY_Y_ORIGIN:
+ baseViewInfo.YOrigin = value;
+ break;
+
+ case TWEEN_PROPERTY_X_OFFSET:
+ baseViewInfo.XOffset = value;
+ break;
+
+ case TWEEN_PROPERTY_Y_OFFSET:
+ baseViewInfo.YOffset = value;
+ break;
+
+ case TWEEN_PROPERTY_FONT_SIZE:
+ baseViewInfo.FontSize = value;
+ break;
+
+ case TWEEN_PROPERTY_BACKGROUND_ALPHA:
+ baseViewInfo.BackgroundAlpha = value;
+ break;
+ }
+ }
+
+ if(currentDone)
+ {
+ currentTweenIndex_++;
+ elapsedTweenTime_ = 0;
+ }
+ }
+
+ if(!currentTweens_ || currentTweenIndex_ >= currentTweens_->tweenSets()->size())
+ {
+ if(loop)
+ {
+ currentTweenIndex_ = 0;
+ }
+ completeDone = true;
+ }
+
+ return completeDone;
+}
diff --git a/RetroFE/Source/Graphics/Component/Component.h b/RetroFE/Source/Graphics/Component/Component.h
index 78d20e9..d8b8a26 100644
--- a/RetroFE/Source/Graphics/Component/Component.h
+++ b/RetroFE/Source/Graphics/Component/Component.h
@@ -40,6 +40,7 @@ public:
void triggerMenuExitEvent(int menuIndex = -1);
void triggerMenuScrollEvent();
void triggerHighlightEvent(Item *selectedItem);
+ void triggerPlaylistChangeEvent(std::string name);
bool isIdle();
bool isHidden();
bool isWaiting();
@@ -78,6 +79,8 @@ protected:
bool menuExitRequested;
int menuExitIndex;
bool newItemSelected;
+ bool playlistChanged;
+ std::string playlistName;
bool highlightExitComplete;
bool newItemSelectedSinceEnter;
private:
diff --git a/RetroFE/Source/Graphics/Component/ReloadableText.cpp b/RetroFE/Source/Graphics/Component/ReloadableText.cpp
index ceab954..b8454d1 100644
--- a/RetroFE/Source/Graphics/Component/ReloadableText.cpp
+++ b/RetroFE/Source/Graphics/Component/ReloadableText.cpp
@@ -59,6 +59,10 @@ ReloadableText::ReloadableText(std::string type, Font *font, std::string layoutK
{
type_ = TextTypeGenre;
}
+ else if(type == "playlist")
+ {
+ type_ = TextTypePlaylist;
+ }
allocateGraphicsMemory();
}
@@ -75,7 +79,8 @@ ReloadableText::~ReloadableText()
void ReloadableText::update(float dt)
{
- if(newItemSelected)
+ if((type_ != TextTypePlaylist && newItemSelected) ||
+ (type_ == TextTypePlaylist && playlistChanged))
{
reloadRequested_ = true;
}
@@ -154,6 +159,9 @@ void ReloadableText::ReloadTexture()
case TextTypeGenre:
ss << selectedItem->genre;
break;
+ case TextTypePlaylist:
+ ss << playlistName;
+ break;
default:
break;
}
diff --git a/RetroFE/Source/Graphics/Component/ReloadableText.h b/RetroFE/Source/Graphics/Component/ReloadableText.h
index 161ccb9..578ad9f 100644
--- a/RetroFE/Source/Graphics/Component/ReloadableText.h
+++ b/RetroFE/Source/Graphics/Component/ReloadableText.h
@@ -43,6 +43,7 @@ private:
TextTypeTitle,
TextTypeManufacturer,
TextTypeGenre,
+ TextTypePlaylist,
};
void ReloadTexture();
diff --git a/RetroFE/Source/Graphics/Page.cpp b/RetroFE/Source/Graphics/Page.cpp
index 9054507..5e9693e 100644
--- a/RetroFE/Source/Graphics/Page.cpp
+++ b/RetroFE/Source/Graphics/Page.cpp
@@ -34,6 +34,7 @@ Page::Page(Configuration &config)
, selectedItem_(NULL)
, textStatusComponent_(NULL)
, selectedItemChanged_(false)
+ , playlistChanged_(false)
, loadSoundChunk_(NULL)
, unloadSoundChunk_(NULL)
, highlightSoundChunk_(NULL)
@@ -315,25 +316,39 @@ float Page::getMinShowTime()
return minShowTime_;
}
+void Page::playlistChange()
+{
+ if(activeMenu_)
+ {
+ activeMenu_->triggerPlaylistChangeEvent(playlist_->first);
+ }
+
+ for(unsigned int i = 0; i < NUM_LAYERS; ++i)
+ {
+ for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
+ {
+ (*it)->triggerPlaylistChangeEvent(playlist_->first);
+ }
+ }
+}
+
void Page::highlight()
{
Item *item = selectedItem_;
- if(item)
+ if(!item) return;
+ if(activeMenu_)
{
- if(activeMenu_)
- {
- activeMenu_->triggerHighlightEvent(item);
- activeMenu_->scrollActive = scrollActive_;
- }
+ activeMenu_->triggerHighlightEvent(item);
+ activeMenu_->scrollActive = scrollActive_;
+ }
- for(unsigned int i = 0; i < NUM_LAYERS; ++i)
+ for(unsigned int i = 0; i < NUM_LAYERS; ++i)
+ {
+ for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
{
- for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
- {
- (*it)->triggerHighlightEvent(item);
- (*it)->scrollActive = scrollActive_;
- }
+ (*it)->triggerHighlightEvent(item);
+ (*it)->scrollActive = scrollActive_;
}
}
}
@@ -447,6 +462,7 @@ bool Page::pushCollection(CollectionInfo *collection)
collections_.push_back(info);
playlist_ = info.playlist;
+ playlistChanged_ = true;
if(menuDepth_ < menus_.size())
{
@@ -491,6 +507,7 @@ bool Page::popCollection()
collections_.pop_back();
info = collections_.back();
playlist_ = info.playlist;
+ playlistChanged_ = true;
if(activeMenu_)
{
@@ -544,6 +561,7 @@ void Page::nextPlaylist()
activeMenu_->setItems(playlist_->second);
activeMenu_->triggerMenuEnterEvent();
+ playlistChanged_ = true;
}
void Page::update(float dt)
@@ -554,6 +572,12 @@ void Page::update(float dt)
menu->update(dt);
}
+
+ if(playlistChanged_)
+ {
+ playlistChange();
+ playlistChanged_ = false;
+ }
if(selectedItemChanged_ && !scrollActive_)
{
diff --git a/RetroFE/Source/Graphics/Page.h b/RetroFE/Source/Graphics/Page.h
index cbf6406..69ba80a 100644
--- a/RetroFE/Source/Graphics/Page.h
+++ b/RetroFE/Source/Graphics/Page.h
@@ -82,6 +82,7 @@ public:
private:
void highlight();
+ void playlistChange();
std::string collectionName_;
Configuration &config_;
@@ -111,6 +112,7 @@ private:
Item *selectedItem_;
Text *textStatusComponent_;
bool selectedItemChanged_;
+ bool playlistChanged_;
Sound *loadSoundChunk_;
Sound *unloadSoundChunk_;
Sound *highlightSoundChunk_;