diff --git a/RetroFE/Source/Graphics/Component/Component.cpp b/RetroFE/Source/Graphics/Component/Component.cpp index ae934a2..e6f6880 100644 --- a/RetroFE/Source/Graphics/Component/Component.cpp +++ b/RetroFE/Source/Graphics/Component/Component.cpp @@ -22,9 +22,8 @@ Component::Component(Page &p) : page(p) { - tweens_ = NULL; - newItemSelectedSinceEnter = false; - backgroundTexture_ = NULL; + tweens_ = NULL; + backgroundTexture_ = NULL; freeGraphicsMemory(); } @@ -33,7 +32,6 @@ Component::Component(const Component ©) : page(copy.page) { tweens_ = NULL; - newItemSelectedSinceEnter = false; backgroundTexture_ = NULL; freeGraphicsMemory(); @@ -53,23 +51,16 @@ Component::~Component() void Component::freeGraphicsMemory() { - currentAnimationState = HIDDEN; - enterRequested = false; - exitRequested = false; - menuEnterRequested = false; - menuEnterIndex = -1; - menuScrollRequested = false; - menuExitRequested = false; - menuExitIndex = -1; + animationRequestedType_ = ""; + animationType_ = ""; + animationRequested_ = false; + newItemSelected = false; + menuIndex_ = -1; - newItemSelected = false; - playlistChanged = false; - highlightExitComplete = false; - currentTweens_ = NULL; - currentTweenIndex_ = 0; - currentTweenComplete_ = false; - elapsedTweenTime_ = 0; - scrollActive = false; + currentTweens_ = NULL; + currentTweenIndex_ = 0; + currentTweenComplete_ = true; + elapsedTweenTime_ = 0; if(backgroundTexture_) { @@ -98,244 +89,71 @@ void Component::allocateGraphicsMemory() } } -void Component::triggerEnterEvent() +void Component::triggerEvent(std::string event, int menuIndex) { - enterRequested = true; + animationRequestedType_ = event; + animationRequested_ = true; + menuIndex_ = menuIndex; } -void Component::triggerExitEvent() +void Component::setPlaylist(std::string name) { - 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() -{ - newItemSelected = true; -} - -void Component::triggerPlaylistChangeEvent(std::string name) -{ - playlistChanged = true; this->playlistName = name; } +void Component::setNewItemSelected() +{ + newItemSelected = true; +} + bool Component::isIdle() { - return (currentAnimationState == IDLE); -} - -bool Component::isHidden() -{ - return (currentAnimationState == HIDDEN); -} -bool Component::isWaiting() -{ - return (currentAnimationState == HIGHLIGHT_WAIT); + return (currentTweenComplete_ || animationType_ == "idle"); } bool Component::isMenuScrolling() { - return (currentAnimationState == MENU_ENTER || currentAnimationState == MENU_SCROLL || currentAnimationState == MENU_EXIT || menuScrollRequested); + return (!currentTweenComplete_ && animationType_ == "menuScroll"); } 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 || menuExitRequested || enterRequested || menuEnterRequested))) + + if(animationRequested_ && animationRequestedType_ != "") { - currentTweenComplete_ = true; + Animation *newTweens = tweens_->getAnimation( animationRequestedType_, menuIndex_ ); + if (newTweens) + { + animationType_ = animationRequestedType_; + currentTweens_ = newTweens; + currentTweenIndex_ = 0; + elapsedTweenTime_ = 0; + currentTweenComplete_ = false; + } + animationRequested_ = false; + } + else if (tweens_ && currentTweenComplete_) + { + animationType_ = "idle"; + currentTweens_ = tweens_->getAnimation( "idle", menuIndex_ ); + currentTweenIndex_ = 0; + elapsedTweenTime_ = 0; + currentTweenComplete_ = false; + animationRequested_ = false; } + currentTweenComplete_ = animate(); 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; + currentTweens_ = NULL; + currentTweenIndex_ = 0; } - - currentTweenComplete_ = animate(isIdle()); } void Component::draw() @@ -359,7 +177,7 @@ void Component::draw() } } -bool Component::animate(bool loop) +bool Component::animate() { bool completeDone = false; if(!currentTweens_ || currentTweenIndex_ >= currentTweens_->size()) @@ -449,10 +267,6 @@ bool Component::animate(bool loop) if(!currentTweens_ || currentTweenIndex_ >= currentTweens_->tweenSets()->size()) { - if(loop) - { - currentTweenIndex_ = 0; - } completeDone = true; } diff --git a/RetroFE/Source/Graphics/Component/Component.h b/RetroFE/Source/Graphics/Component/Component.h index 495961e..4f28847 100644 --- a/RetroFE/Source/Graphics/Component/Component.h +++ b/RetroFE/Source/Graphics/Component/Component.h @@ -34,59 +34,26 @@ public: virtual void allocateGraphicsMemory(); virtual void launchEnter() {} virtual void launchExit() {} - void triggerEnterEvent(); - void triggerExitEvent(); - void triggerMenuEnterEvent(int menuIndex = -1); - void triggerMenuExitEvent(int menuIndex = -1); - void triggerMenuScrollEvent(); - void triggerHighlightEvent(); - void triggerPlaylistChangeEvent(std::string name); + void triggerEvent(std::string event, int menuIndex = -1); + void setPlaylist(std::string name ); + void setNewItemSelected(); bool isIdle(); - bool isHidden(); - bool isWaiting(); bool isMenuScrolling(); + bool newItemSelected; virtual void update(float dt); virtual void draw(); void setTweens(AnimationEvents *set); - void forceIdle(); ViewInfo baseViewInfo; std::string collectionName; - bool scrollActive; protected: Page &page; - enum AnimationState - { - IDLE, - ENTER, - HIGHLIGHT_EXIT, - HIGHLIGHT_WAIT, - HIGHLIGHT_ENTER, - EXIT, - MENU_ENTER, - MENU_SCROLL, - MENU_EXIT, - HIDDEN - }; - - AnimationState currentAnimationState; - bool enterRequested; - bool exitRequested; - bool menuEnterRequested; - int menuEnterIndex; - bool menuScrollRequested; - bool menuExitRequested; - int menuExitIndex; - bool newItemSelected; - bool playlistChanged; std::string playlistName; - bool highlightExitComplete; - bool newItemSelectedSinceEnter; private: - bool animate(bool loop); + bool animate(); bool tweenSequencingComplete(); AnimationEvents *tweens_; @@ -94,6 +61,10 @@ private: SDL_Texture *backgroundTexture_; unsigned int currentTweenIndex_; - bool currentTweenComplete_; - float elapsedTweenTime_; + bool currentTweenComplete_; + float elapsedTweenTime_; + std::string animationRequestedType_; + std::string animationType_; + bool animationRequested_; + int menuIndex_; }; diff --git a/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp b/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp index e927835..679f0af 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp +++ b/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp @@ -33,8 +33,6 @@ ReloadableMedia::ReloadableMedia(Configuration &config, bool systemMode, std::st , config_(config) , systemMode_(systemMode) , loadedComponent_(NULL) - , reloadRequested_(false) - , firstLoad_(true) , videoInst_(NULL) , isVideo_(isVideo) , FfntInst_(font) @@ -63,23 +61,11 @@ void ReloadableMedia::enableTextFallback_(bool value) void ReloadableMedia::update(float dt) { - if(newItemSelected) - { - std::string collection; - config_.getProperty("currentCollection", collection); - - if(!systemMode_ || (systemMode_ && currentCollection_ != collection)) - { - reloadRequested_ = true; - } - } - // wait for the right moment to reload the image - if (reloadRequested_ && (highlightExitComplete || firstLoad_)) + if (newItemSelected) { reloadTexture(); - reloadRequested_ = false; - firstLoad_ = false; + newItemSelected = false; } if(loadedComponent_) @@ -102,8 +88,6 @@ void ReloadableMedia::update(float dt) void ReloadableMedia::allocateGraphicsMemory() { - firstLoad_ = true; - if(loadedComponent_) { loadedComponent_->allocateGraphicsMemory(); diff --git a/RetroFE/Source/Graphics/Component/ReloadableMedia.h b/RetroFE/Source/Graphics/Component/ReloadableMedia.h index 2f5683d..8639666 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableMedia.h +++ b/RetroFE/Source/Graphics/Component/ReloadableMedia.h @@ -44,8 +44,6 @@ private: Configuration &config_; bool systemMode_; Component *loadedComponent_; - bool reloadRequested_; - bool firstLoad_; IVideo *videoInst_; bool isVideo_; Font *FfntInst_; diff --git a/RetroFE/Source/Graphics/Component/ReloadableText.cpp b/RetroFE/Source/Graphics/Component/ReloadableText.cpp index 2dd6db0..e0a6d54 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableText.cpp +++ b/RetroFE/Source/Graphics/Component/ReloadableText.cpp @@ -30,8 +30,6 @@ ReloadableText::ReloadableText(std::string type, Page &page, Configuration &conf , imageInst_(NULL) , type_(type) , layoutKey_(layoutKey) - , reloadRequested_(false) - , firstLoad_(true) , fontInst_(font) , timeFormat_(timeFormat) , scaleX_(scaleX) @@ -52,18 +50,10 @@ ReloadableText::~ReloadableText() void ReloadableText::update(float dt) { - if((type_ != "playlist" && newItemSelected) || - (type_ == "playlist" && playlistChanged) || - (type_ == "time")) - { - reloadRequested_ = true; - } - // wait for the right moment to reload the image - if (reloadRequested_ && (type_ == "time" || highlightExitComplete || firstLoad_)) + if (newItemSelected || type_ == "time") { ReloadTexture(); - reloadRequested_ = false; - firstLoad_ = false; + newItemSelected = false; } // needs to be ran at the end to prevent the NewItemSelected flag from being detected @@ -73,8 +63,6 @@ void ReloadableText::update(float dt) void ReloadableText::allocateGraphicsMemory() { - firstLoad_ = true; - ReloadTexture(); // NOTICE! needs to be done last to prevent flags from being missed diff --git a/RetroFE/Source/Graphics/Component/ReloadableText.h b/RetroFE/Source/Graphics/Component/ReloadableText.h index 2d5ae19..82303a2 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableText.h +++ b/RetroFE/Source/Graphics/Component/ReloadableText.h @@ -41,8 +41,6 @@ private: Text *imageInst_; std::string type_; std::string layoutKey_; - bool reloadRequested_; - bool firstLoad_; Font *fontInst_; std::string timeFormat_; diff --git a/RetroFE/Source/Graphics/Component/ScrollingList.cpp b/RetroFE/Source/Graphics/Component/ScrollingList.cpp index 42bbeb1..83acea2 100644 --- a/RetroFE/Source/Graphics/Component/ScrollingList.cpp +++ b/RetroFE/Source/Graphics/Component/ScrollingList.cpp @@ -381,7 +381,7 @@ void ScrollingList::freeGraphicsMemory() deallocateSpritePoints(); } -void ScrollingList::triggerMenuEnterEvent() +void ScrollingList::triggerMenuEnterEvent( int menuIndex ) { focus_ = true; notifyAllRequested_ = true; @@ -389,11 +389,11 @@ void ScrollingList::triggerMenuEnterEvent() for(unsigned int i = 0; i < components_.size(); ++i) { Component *c = components_.at(i); - if(c) c->triggerMenuEnterEvent(); + if(c) c->triggerEvent( "menuEnter", menuIndex ); } } -void ScrollingList::triggerMenuExitEvent() +void ScrollingList::triggerMenuExitEvent( int menuIndex ) { focus_ = false; notifyAllRequested_ = true; @@ -401,7 +401,7 @@ void ScrollingList::triggerMenuExitEvent() for(unsigned int i = 0; i < components_.size(); ++i) { Component *c = components_.at(i); - if(c) c->triggerMenuExitEvent(); + if(c) c->triggerEvent( "menuExit", menuIndex ); } } @@ -500,7 +500,7 @@ void ScrollingList::update(float dt) resetTweens(c, tweenPoints_->at(i), currentvi, nextvi, scrollPeriod_); c->baseViewInfo.font = nextvi->font; // Use the font settings of the next index - c->triggerMenuScrollEvent(); + c->triggerEvent( "menuScroll" ); } if(c) c->update(dt); @@ -534,17 +534,17 @@ void ScrollingList::update(float dt) notifyAllRequested_ = false; } -unsigned int ScrollingList::getSelectedIndex() -{ +unsigned int ScrollingList::getSelectedIndex() +{ if(!items_) return 0; return loopIncrement(itemIndex_, selectedOffsetIndex_, items_->size()); -} - -unsigned int ScrollingList::getSize() -{ - if(!items_) return 0; - - return items_->size(); +} + +unsigned int ScrollingList::getSize() +{ + if(!items_) return 0; + + return items_->size(); } void ScrollingList::resetTweens(Component *c, AnimationEvents *sets, ViewInfo *currentViewInfo, ViewInfo *nextViewInfo, double scrollTime) diff --git a/RetroFE/Source/Graphics/Component/ScrollingList.h b/RetroFE/Source/Graphics/Component/ScrollingList.h index 4dafc51..6c97004 100644 --- a/RetroFE/Source/Graphics/Component/ScrollingList.h +++ b/RetroFE/Source/Graphics/Component/ScrollingList.h @@ -53,8 +53,8 @@ public: ScrollingList(const ScrollingList ©); virtual ~ScrollingList(); - void triggerMenuEnterEvent(); - void triggerMenuExitEvent(); + void triggerMenuEnterEvent(int menuIndex = -1); + void triggerMenuExitEvent(int menuIndex = -1); bool allocateTexture(unsigned int index, Item *i); void deallocateTexture(unsigned int index); diff --git a/RetroFE/Source/Graphics/Page.cpp b/RetroFE/Source/Graphics/Page.cpp index b889fff..9e7c9a0 100644 --- a/RetroFE/Source/Graphics/Page.cpp +++ b/RetroFE/Source/Graphics/Page.cpp @@ -33,8 +33,6 @@ Page::Page(Configuration &config) , scrollActive_(false) , selectedItem_(NULL) , textStatusComponent_(NULL) - , selectedItemChanged_(false) - , playlistChanged_(false) , loadSoundChunk_(NULL) , unloadSoundChunk_(NULL) , highlightSoundChunk_(NULL) @@ -97,7 +95,7 @@ void Page::DeInitialize() } CollectionVector_T::iterator itc = collections_.begin(); - while(itc != collections_.end()) + while(itc != collections_.end()) { itc->collection->Save(); @@ -132,12 +130,34 @@ void Page::setSelectSound(Sound *chunk) { selectSoundChunk_ = chunk; } + + void Page::onNewItemSelected(Item *item) { selectedItem_ = item; - selectedItemChanged_ = true; + + for(MenuVector_T::iterator it = menus_.begin(); it != menus_.end(); it++) + { + ScrollingList *menu = *it; + menu->setNewItemSelected(); + } + + if(unloadSoundChunk_) + { + unloadSoundChunk_->play(); + } + + for(unsigned int i = 0; i < NUM_LAYERS; ++i) + { + for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) + { + (*it)->setNewItemSelected(); + } + } + } + void Page::pushMenu(ScrollingList *s) { menus_.push_back(s); @@ -201,7 +221,7 @@ bool Page::isMenuIdle() bool Page::isIdle() { bool idle = isMenuIdle(); - + for(unsigned int i = 0; i < NUM_LAYERS && idle; ++i) { for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end() && idle; ++it) @@ -214,39 +234,12 @@ bool Page::isIdle() } -bool Page::isHidden() -{ - bool hidden = true; - - for(MenuVector_T::iterator it = menus_.begin(); it != menus_.end(); it++) - { - ScrollingList *menu = *it; - - if(!menu->isHidden()) - { - hidden = false; - break; - } - } - - - for(unsigned int i = 0; hidden && i < NUM_LAYERS; ++i) - { - for(std::vector::iterator it = LayerComponents[i].begin(); hidden && it != LayerComponents[i].end(); ++it) - { - hidden = (*it)->isHidden(); - } - } - - return hidden; -} - void Page::start() { for(MenuVector_T::iterator it = menus_.begin(); it != menus_.end(); it++) { ScrollingList *menu = *it; - menu->triggerEnterEvent(); + menu->triggerEvent( "enter" ); } if(loadSoundChunk_) @@ -264,7 +257,7 @@ void Page::startComponents() { for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) { - (*it)->triggerEnterEvent(); + (*it)->triggerEvent( "enter" ); } } } @@ -274,7 +267,7 @@ void Page::stop() for(MenuVector_T::iterator it = menus_.begin(); it != menus_.end(); it++) { ScrollingList *menu = *it; - menu->triggerExitEvent(); + menu->triggerEvent( "exit" ); } if(unloadSoundChunk_) @@ -286,12 +279,32 @@ void Page::stop() { for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) { - (*it)->triggerExitEvent(); + (*it)->triggerEvent( "exit" ); } } } +void Page::setNewItemSelected() +{ + + if(activeMenu_) + { + activeMenu_->setNewItemSelected(); + } + + for(unsigned int i = 0; i < NUM_LAYERS; ++i) + { + for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) + { + (*it)->setNewItemSelected(); + } + } + + return; +} + + Item *Page::getSelectedItem() { return selectedItem_; @@ -344,35 +357,54 @@ void Page::playlistChange() { if(activeMenu_) { - activeMenu_->triggerPlaylistChangeEvent(playlist_->first); + activeMenu_->setPlaylist(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); + (*it)->setPlaylist(playlist_->first); } } } -void Page::highlight() + +void Page::highlightEnter() { Item *item = selectedItem_; if(!item) return; if(activeMenu_) { - activeMenu_->triggerHighlightEvent(); - activeMenu_->scrollActive = scrollActive_; + activeMenu_->triggerEvent( "highlightEnter" ); } for(unsigned int i = 0; i < NUM_LAYERS; ++i) { for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) { - (*it)->triggerHighlightEvent(); - (*it)->scrollActive = scrollActive_; + (*it)->triggerEvent( "highlightEnter" ); + } + } +} + + +void Page::highlightExit() +{ + Item *item = selectedItem_; + + if(!item) return; + if(activeMenu_) + { + activeMenu_->triggerEvent( "highlightExit" ); + } + + for(unsigned int i = 0; i < NUM_LAYERS; ++i) + { + for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) + { + (*it)->triggerEvent( "highlightExit" ); } } } @@ -433,7 +465,7 @@ void Page::pageScroll(ScrollDirection direction) void Page::selectRandom() { - if(activeMenu_) activeMenu_->random(); + if(activeMenu_) activeMenu_->random(); } void Page::letterScroll(ScrollDirection direction) @@ -465,28 +497,13 @@ unsigned int Page::getSelectedIndex() bool Page::pushCollection(CollectionInfo *collection) { - int menuExitIndex = -1; - int menuEnterIndex = -1; - - if(activeMenu_) - { - activeMenu_->triggerMenuExitEvent(); - } - - if(menuDepth_ > 0) - { - menuExitIndex = menuDepth_ - 1; - } - // grow the menu as needed if(menus_.size() >= menuDepth_ && activeMenu_) { activeMenu_ = new ScrollingList(*activeMenu_); - activeMenu_->forceIdle(); pushMenu(activeMenu_); } - activeMenu_ = menus_[menuDepth_]; activeMenu_->collectionName = collection->name; activeMenu_->setItems(&collection->items); @@ -501,11 +518,10 @@ bool Page::pushCollection(CollectionInfo *collection) collections_.push_back(info); playlist_ = info.playlist; - playlistChanged_ = true; + playlistChange(); if(menuDepth_ < menus_.size()) { - menuEnterIndex = menuDepth_; menuDepth_++; } @@ -514,15 +530,6 @@ bool Page::pushCollection(CollectionInfo *collection) for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) { (*it)->collectionName = collection->name; - if(menuEnterIndex >= 0) - { - (*it)->triggerMenuEnterEvent(menuEnterIndex); - } - - if(menuExitIndex >= 0) - { - (*it)->triggerMenuExitEvent(menuExitIndex); - } } } @@ -531,8 +538,6 @@ bool Page::pushCollection(CollectionInfo *collection) bool Page::popCollection() { - int menuExitIndex = -1; - int menuEnterIndex = -1; if(!activeMenu_) return false; if(menuDepth_ <= 1) return false; @@ -547,44 +552,63 @@ bool Page::popCollection() collections_.pop_back(); info = &collections_.back(); playlist_ = info->playlist; - playlistChanged_ = true; - - if(activeMenu_) - { - activeMenu_->triggerMenuExitEvent(); - - } + playlistChange(); 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) { (*it)->collectionName = info->collection->name; - - if(menuEnterIndex >= 0) - { - (*it)->triggerMenuEnterEvent(menuEnterIndex); - } - - if(menuExitIndex >= 0) - { - (*it)->triggerMenuExitEvent(menuExitIndex); - } } } return true; } + +void Page::enterMenu() +{ + + if(activeMenu_) + { + activeMenu_->triggerMenuEnterEvent( menuDepth_ - 1 ); + } + + for(unsigned int i = 0; i < NUM_LAYERS; ++i) + { + for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) + { + (*it)->triggerEvent( "menuEnter", menuDepth_ - 1 ); + } + } + + return; +} + + +void Page::exitMenu() +{ + + if(activeMenu_) + { + activeMenu_->triggerMenuExitEvent( menuDepth_ - 1 ); + } + + for(unsigned int i = 0; i < NUM_LAYERS; ++i) + { + for(std::vector::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) + { + (*it)->triggerEvent( "menuExit", menuDepth_ - 1 ); + } + } + + return; +} + + void Page::nextPlaylist() { MenuInfo_S &info = collections_.back(); @@ -596,14 +620,14 @@ void Page::nextPlaylist() playlist_++; // wrap if(playlist_ == info.collection->playlists.end()) playlist_ = info.collection->playlists.begin(); - + // find the first playlist if(playlist_->second->size() != 0) break; } activeMenu_->setItems(playlist_->second); activeMenu_->triggerMenuEnterEvent(); - playlistChanged_ = true; + playlistChange(); } void Page::favPlaylist() @@ -620,7 +644,7 @@ void Page::favPlaylist() playlist_++; // wrap if(playlist_ == info.collection->playlists.end()) playlist_ = info.collection->playlists.begin(); - + // find the first playlist if(playlist_->second->size() != 0 && playlist_->first == "favorites") break; } @@ -631,7 +655,7 @@ void Page::favPlaylist() activeMenu_->setItems(playlist_->second); activeMenu_->triggerMenuEnterEvent(); - playlistChanged_ = true; + playlistChange(); } void Page::update(float dt) @@ -642,18 +666,6 @@ void Page::update(float dt) menu->update(dt); } - - if(playlistChanged_) - { - playlistChange(); - playlistChanged_ = false; - } - - if(selectedItemChanged_ && !scrollActive_) - { - highlight(); - selectedItemChanged_ = false; - } if(textStatusComponent_) { @@ -678,11 +690,11 @@ void Page::update(float dt) { MenuInfo_S &info = *del; if(info.queueDelete && info.menu && info.menu->isIdle()) - { + { std::list::iterator next = del; ++next; - if(info.collection) + if(info.collection) { info.collection->Save(); delete info.collection; @@ -731,7 +743,7 @@ void Page::removePlaylist() items->erase(it); collection->saveRequest = true; - if(activeMenu_) + if(activeMenu_) { activeMenu_->deallocateSpritePoints(); activeMenu_->allocateSpritePoints(); @@ -752,7 +764,7 @@ void Page::addPlaylist() { items->push_back(selectedItem_); collection->saveRequest = true; - if(activeMenu_) + if(activeMenu_) { activeMenu_->deallocateSpritePoints(); activeMenu_->allocateSpritePoints(); diff --git a/RetroFE/Source/Graphics/Page.h b/RetroFE/Source/Graphics/Page.h index a53e28c..d52d3f5 100644 --- a/RetroFE/Source/Graphics/Page.h +++ b/RetroFE/Source/Graphics/Page.h @@ -47,6 +47,8 @@ public: virtual void onNewItemSelected(Item *); bool pushCollection(CollectionInfo *collection); bool popCollection(); + void enterMenu(); + void exitMenu(); void nextPlaylist(); void favPlaylist(); void pushMenu(ScrollingList *s); @@ -67,6 +69,7 @@ public: void setScrolling(ScrollDirection direction); bool isHorizontalScroll(); unsigned int getMenuDepth(); + void setNewItemSelected(); Item *getSelectedItem(); Item *getSelectedItem(int offset); void removeSelectedItem(); @@ -74,7 +77,6 @@ public: unsigned int getScrollOffsetIndex(); bool isIdle(); bool isMenuIdle(); - bool isHidden(); void setStatusTextComponent(Text *t); void update(float dt); void draw(); @@ -89,7 +91,8 @@ public: void removePlaylist(); private: - void highlight(); + void highlightEnter(); + void highlightExit(); void playlistChange(); std::string collectionName_; Configuration &config_; @@ -120,8 +123,6 @@ private: Item *selectedItem_; Text *textStatusComponent_; - bool selectedItemChanged_; - bool playlistChanged_; Sound *loadSoundChunk_; Sound *unloadSoundChunk_; Sound *highlightSoundChunk_; diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index ca26ed6..27c4e7f 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -60,7 +60,7 @@ RetroFE::RetroFE(Configuration &c) , currentTime_(0) , lastLaunchReturnTime_(0) , keyLastTime_(0) - , keyDelayTime_(.3f) + , keyDelayTime_(.3f) { } @@ -90,8 +90,8 @@ int RetroFE::initialize(void *context) Logger::write(Logger::ZONE_INFO, "RetroFE", "Initializing"); - if(!instance->input_.initialize()) - { + if(!instance->input_.initialize()) + { Logger::write(Logger::ZONE_ERROR, "RetroFE", "Could not initialize user controls"); instance->initializeError = true; return -1; @@ -167,7 +167,6 @@ void RetroFE::allocateGraphicsMemory() if(currentPage_) { currentPage_->allocateGraphicsMemory(); - currentPage_->start(); } } @@ -239,7 +238,8 @@ void RetroFE::run() int initializeStatus = 0; // load the initial splash screen, unload it once it is complete - currentPage_ = loadSplashPage(); + currentPage_ = loadSplashPage(); + state = RETROFE_ENTER; bool splashMode = true; Launcher l(*this, config_); @@ -270,9 +270,9 @@ void RetroFE::run() if(currentPage_ && !splashMode) { - // account for when returning from a menu and the previous key was still "stuck" + // account for when returning from a menu and the previous key was still "stuck" if(lastLaunchReturnTime_ == 0 || (currentTime_ - lastLaunchReturnTime_ > .3)) - { + { state = processUserInput(currentPage_); lastLaunchReturnTime_ = 0; } @@ -288,6 +288,22 @@ void RetroFE::run() break; } + currentPage_->stop(); + state = RETROFE_EXIT; + + } + break; + + case RETROFE_ENTER: + if(currentPage_->isIdle()) + { + state = RETROFE_IDLE; + } + break; + + case RETROFE_EXIT: + if(currentPage_->isIdle()) + { // delete the splash screen and use the standard menu currentPage_->DeInitialize(); delete currentPage_; @@ -301,8 +317,6 @@ void RetroFE::run() config_.getProperty("firstCollection", firstCollection); config_.getProperty("collections." + firstCollection + ".list.menuSort", menuSort); - - currentPage_->start(); config_.setProperty("currentCollection", firstCollection); CollectionInfo *info = getCollection(firstCollection); MenuParser mp; @@ -310,22 +324,62 @@ void RetroFE::run() mp.buildMenuItems(info, menuSort); currentPage_->pushCollection(info); + + state = RETROFE_ENTER; } else { state = RETROFE_QUIT_REQUEST; } - } - break; case RETROFE_NEXT_PAGE_REQUEST: + currentPage_->exitMenu(); + state = RETROFE_NEXT_PAGE_MENU_EXIT; + break; + + case RETROFE_NEXT_PAGE_MENU_EXIT: if(currentPage_->isIdle()) { - state = RETROFE_NEW; - } - break; + bool menuSort = true; + config_.setProperty("currentCollection", nextPageItem_->name); + config_.getProperty("collections." + nextPageItem_->name + ".list.menuSort", menuSort); + + CollectionInfo *info = getCollection(nextPageItem_->name); + + MenuParser mp; + mp.buildMenuItems(info, menuSort); + currentPage_->pushCollection(info); + + bool rememberMenu = false; + config_.getProperty("rememberMenu", rememberMenu); + + if(rememberMenu && lastMenuOffsets_.find(nextPageItem_->name) != lastMenuOffsets_.end()) + { + currentPage_->setScrollOffsetIndex(lastMenuOffsets_[nextPageItem_->name]); + } + + bool autoFavorites = true; + config_.getProperty("autoFavorites", autoFavorites); + + if (autoFavorites) + currentPage_->favPlaylist(); // Switch to favorites if it exists + + currentPage_->setNewItemSelected(); + currentPage_->enterMenu(); + + state = RETROFE_NEXT_PAGE_MENU_ENTER; + + } + break; + + case RETROFE_NEXT_PAGE_MENU_ENTER: + if(currentPage_->isIdle()) + { + state = RETROFE_IDLE; + } + break; case RETROFE_LAUNCH_REQUEST: nextPageItem_ = currentPage_->getSelectedItem(); @@ -334,14 +388,28 @@ void RetroFE::run() break; case RETROFE_BACK_REQUEST: + currentPage_->exitMenu(); + state = RETROFE_BACK_MENU_EXIT; + break; + case RETROFE_BACK_MENU_EXIT: + if(currentPage_->isIdle()) + { lastMenuOffsets_[currentPage_->getCollectionName()] = currentPage_->getScrollOffsetIndex(); currentPage_->popCollection(); config_.setProperty("currentCollection", currentPage_->getCollectionName()); + currentPage_->setNewItemSelected(); + currentPage_->enterMenu(); + state = RETROFE_BACK_MENU_ENTER; + } + break; - state = RETROFE_NEW; - - break; + case RETROFE_BACK_MENU_ENTER: + if(currentPage_->isIdle()) + { + state = RETROFE_IDLE; + } + break; case RETROFE_NEW: if(currentPage_->isIdle()) @@ -356,11 +424,10 @@ void RetroFE::run() break; case RETROFE_QUIT: - if(currentPage_->isHidden()) + if(currentPage_->isIdle()) { - running = false; + running = false; } - break; } @@ -419,9 +486,6 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page *page) bool exit = false; RETROFE_STATE state = RETROFE_IDLE; - bool rememberMenu = false; - config_.getProperty("rememberMenu", rememberMenu); - if(page->isHorizontalScroll()) { if (input_.keystate(UserInput::KeyCodeLeft)) @@ -431,17 +495,17 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page *page) if (input_.keystate(UserInput::KeyCodeRight)) { page->setScrolling(Page::ScrollDirectionForward); - } + } } else - { + { if (input_.keystate(UserInput::KeyCodeUp)) { page->setScrolling(Page::ScrollDirectionBack); } if (input_.keystate(UserInput::KeyCodeDown)) { - page->setScrolling(Page::ScrollDirectionForward); + page->setScrolling(Page::ScrollDirectionForward); } } @@ -463,7 +527,7 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page *page) keyLastTime_ = currentTime_; keyDelayTime_-= .05f; if(keyDelayTime_< 0.1f) keyDelayTime_= 0.1f; - + if (input_.keystate(UserInput::KeyCodePageUp)) { page->pageScroll(Page::ScrollDirectionBack); @@ -514,27 +578,6 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page *page) } else { - bool menuSort = true; - config_.setProperty("currentCollection", nextPageItem_->name); - config_.getProperty("collections." + nextPageItem_->name + ".list.menuSort", menuSort); - - CollectionInfo *info = getCollection(nextPageItem_->name); - - MenuParser mp; - mp.buildMenuItems(info, menuSort); - page->pushCollection(info); - - if(rememberMenu && lastMenuOffsets_.find(nextPageItem_->name) != lastMenuOffsets_.end()) - { - page->setScrollOffsetIndex(lastMenuOffsets_[nextPageItem_->name]); - } - - bool autoFavorites = true; - config_.getProperty("autoFavorites", autoFavorites); - - if (autoFavorites) - page->favPlaylist(); // Switch to favorites if it exists - state = RETROFE_NEXT_PAGE_REQUEST; } } diff --git a/RetroFE/Source/RetroFE.h b/RetroFE/Source/RetroFE.h index f00d529..962f4c5 100644 --- a/RetroFE/Source/RetroFE.h +++ b/RetroFE/Source/RetroFE.h @@ -52,9 +52,15 @@ private: enum RETROFE_STATE { RETROFE_IDLE, + RETROFE_ENTER, + RETROFE_EXIT, RETROFE_NEXT_PAGE_REQUEST, + RETROFE_NEXT_PAGE_MENU_EXIT, + RETROFE_NEXT_PAGE_MENU_ENTER, RETROFE_LAUNCH_REQUEST, RETROFE_BACK_REQUEST, + RETROFE_BACK_MENU_EXIT, + RETROFE_BACK_MENU_ENTER, RETROFE_NEW, RETROFE_QUIT_REQUEST, RETROFE_QUIT,