Supporting favorites

This commit is contained in:
Don Honerbrink 2015-08-06 13:17:40 -05:00
parent 3fc64ed01d
commit 8fdc7ece64
8 changed files with 129 additions and 60 deletions

View File

@ -51,6 +51,18 @@ CollectionInfo::~CollectionInfo()
} }
Playlists_T::iterator pit = playlists.begin();
while(pit != playlists.end())
{
if(pit->second != &items)
{
delete pit->second;
}
playlists.erase(pit);
pit = playlists.begin();
}
std::vector<Item *>::iterator it = items.begin(); std::vector<Item *>::iterator it = items.begin();
while(it != items.end()) while(it != items.end())
{ {

View File

@ -37,7 +37,7 @@ public:
std::string launcher; std::string launcher;
std::vector<Item *> items; std::vector<Item *> items;
typedef std::map<std::string, std::vector <Item *> > Playlists_T; typedef std::map<std::string, std::vector <Item *> *> Playlists_T;
Playlists_T playlists; Playlists_T playlists;
private: private:

View File

@ -279,6 +279,8 @@ bool CollectionInfoBuilder::ImportDirectory(CollectionInfo *info, std::string me
std::vector<std::string>::iterator extensionsIt; std::vector<std::string>::iterator extensionsIt;
info->extensionList(extensions); info->extensionList(extensions);
info->playlists["all"] = &info->items;
info->playlists["favorites"] = new std::vector<Item *>();
dp = opendir(path.c_str()); dp = opendir(path.c_str());
@ -300,10 +302,11 @@ bool CollectionInfoBuilder::ImportDirectory(CollectionInfo *info, std::string me
} }
} }
} }
for(std::map<std::string, Item *>::iterator it = favoritesFilter.begin(); it != favoritesFilter.end(); it++) // add the favorites list
{ for(std::map<std::string, Item *>::iterator it = favoritesFilter.begin(); it != favoritesFilter.end(); it++)
info->playlists["favorites"].push_back(it->second); {
} info->playlists["favorites"]->push_back(it->second);
}
while((dirp = readdir(dp)) != NULL) while((dirp = readdir(dp)) != NULL)
{ {
@ -334,7 +337,6 @@ bool CollectionInfoBuilder::ImportDirectory(CollectionInfo *info, std::string me
i->collectionInfo = info; i->collectionInfo = info;
info->items.push_back(i); info->items.push_back(i);
info->playlists["include"].push_back(i);
} }
} }
} }

View File

@ -149,9 +149,6 @@ bool MenuParser::buildLegacyXmlMenu(CollectionInfo *collection, bool sort)
} }
std::sort( collection->items.begin(), collection->items.end(), VectorSort);
// todo: sorting should occur within the collection itself, not externally
if(sort) if(sort)
{ {
// sort the menu if requested // sort the menu if requested

View File

@ -124,15 +124,12 @@ ScrollingList::~ScrollingList()
} }
void ScrollingList::setItems(CollectionInfo *info) void ScrollingList::setItems(std::vector<Item *> *items)
{ {
deallocateSpritePoints(); deallocateSpritePoints();
collection_ = info; items_ = items;
items_ = &collection_->items;
itemIndex_ = 0; itemIndex_ = 0;
componentIndex_ = 0;
allocateSpritePoints(); allocateSpritePoints();
@ -175,7 +172,10 @@ void ScrollingList::deallocateSpritePoints()
void ScrollingList::allocateSpritePoints() void ScrollingList::allocateSpritePoints()
{ {
for(unsigned int i = 0; items_ && i < scrollPoints_->size(); ++i) if(!items_ || items_->size() == 0) return;
if(!scrollPoints_) return;
for(unsigned int i = 0; i < scrollPoints_->size(); ++i)
{ {
componentIndex_ = 0; componentIndex_ = 0;
unsigned int index = loopIncrement(itemIndex_, i, items_->size()); unsigned int index = loopIncrement(itemIndex_, i, items_->size());
@ -210,10 +210,11 @@ void ScrollingList::setPoints(std::vector<ViewInfo *> *scrollPoints, std::vector
// empty out the list as we will resize it // empty out the list as we will resize it
components_.clear(); components_.clear();
if(scrollPoints && scrollPoints_->size() > components_.size()) int size = 0;
{
components_.resize(scrollPoints_->size(), NULL); if(scrollPoints) size = scrollPoints_->size();
} components_.resize(size);
allocateSpritePoints(); allocateSpritePoints();
} }
@ -378,12 +379,13 @@ void ScrollingList::update(float dt)
bool scrollRequested = false; bool scrollRequested = false;
bool scrollStopped = false; bool scrollStopped = false;
// validate all scroll points are done tweening to the next position if(components_.size() == 0) return;
for(unsigned int i = 0; i < components_.size(); i++) if(!items_ || items_->size() == 0) return;
{
Component *c = components_.at(i);
if(c && c->isMenuScrolling()) // validate all scroll points are done tweening to the next position
for(std::vector<Component *>::iterator c = components_.begin(); c != components_.end(); c++)
{
if(*c && (*c)->isMenuScrolling())
{ {
readyToScroll = false; readyToScroll = false;
break; break;
@ -630,6 +632,8 @@ void ScrollingList::draw()
void ScrollingList::draw(unsigned int layer) void ScrollingList::draw(unsigned int layer)
{ {
if(components_.size() == 0) return;
for(unsigned int i = 0; i < components_.size(); ++i) for(unsigned int i = 0; i < components_.size(); ++i)
{ {
Component *c = components_.at(i); Component *c = components_.at(i);
@ -666,7 +670,15 @@ void ScrollingList::removeComponentForNotifications(MenuNotifierInterface *c)
bool ScrollingList::isIdle() bool ScrollingList::isIdle()
{ {
return (Component::isIdle() && currentScrollState_ == ScrollStateIdle); if(!Component::isIdle() || currentScrollState_ != ScrollStateIdle) return false;
for(unsigned int i = 0; i < components_.size(); ++i)
{
Component *c = components_.at(i);
if(c && !c->isIdle()) return false;
}
return true;
} }

View File

@ -56,7 +56,7 @@ public:
bool allocateTexture(unsigned int index, Item *i); bool allocateTexture(unsigned int index, Item *i);
void deallocateTexture(unsigned int index); void deallocateTexture(unsigned int index);
void setItems(CollectionInfo *info); void setItems(std::vector<Item *> *items);
void destroyItems(); void destroyItems();
void setPoints(std::vector<ViewInfo *> *scrollPoints, std::vector<AnimationEvents *> *tweenPoints); void setPoints(std::vector<ViewInfo *> *scrollPoints, std::vector<AnimationEvents *> *tweenPoints);
void setScrollDirection(ScrollDirection direction); void setScrollDirection(ScrollDirection direction);
@ -123,11 +123,11 @@ private:
Font *fontInst_; Font *fontInst_;
std::string layoutKey_; std::string layoutKey_;
std::string imageType_; std::string imageType_;
CollectionInfo *collection_;
std::vector<Item *> *items_; std::vector<Item *> *items_;
std::vector<Component *> components_; std::vector<Component *> components_;
}; };

View File

@ -23,13 +23,13 @@
#include "Component/ScrollingList.h" #include "Component/ScrollingList.h"
#include "../Sound/Sound.h" #include "../Sound/Sound.h"
#include "ComponentItemBindingBuilder.h" #include "ComponentItemBindingBuilder.h"
#include <algorithm>
#include <sstream> #include <sstream>
Page::Page(Configuration &config) Page::Page(Configuration &config)
: config_(config) : config_(config)
, activeMenu_(NULL) , activeMenu_(NULL)
, menuDepth_(0) , menuDepth_(0)
, items_(NULL)
, scrollActive_(false) , scrollActive_(false)
, selectedItem_(NULL) , selectedItem_(NULL)
, textStatusComponent_(NULL) , textStatusComponent_(NULL)
@ -410,7 +410,6 @@ void Page::letterScroll(ScrollDirection direction)
bool Page::pushCollection(CollectionInfo *collection) bool Page::pushCollection(CollectionInfo *collection)
{ {
collections_.push_back(collection);
int menuExitIndex = -1; int menuExitIndex = -1;
int menuEnterIndex = -1; int menuEnterIndex = -1;
@ -425,6 +424,7 @@ bool Page::pushCollection(CollectionInfo *collection)
menuExitIndex = menuDepth_ - 1; menuExitIndex = menuDepth_ - 1;
} }
// grow the menu as needed
if(menus_.size() >= menuDepth_ && activeMenu_) if(menus_.size() >= menuDepth_ && activeMenu_)
{ {
ScrollingList *newList = new ScrollingList(*activeMenu_); ScrollingList *newList = new ScrollingList(*activeMenu_);
@ -432,12 +432,21 @@ bool Page::pushCollection(CollectionInfo *collection)
pushMenu(newList); pushMenu(newList);
} }
activeMenu_ = menus_[menuDepth_]; activeMenu_ = menus_[menuDepth_];
activeMenu_->collectionName = collection->name; activeMenu_->collectionName = collection->name;
activeMenu_->destroyItems(); activeMenu_->setItems(&collection->items);
activeMenu_->setItems(collection);
activeMenu_->triggerMenuEnterEvent(); activeMenu_->triggerMenuEnterEvent();
playlist_ = collection->playlists.begin();
// build the collection info instance
MenuInfo_S info;
info.collection = collection;
info.menu = activeMenu_;
info.playlist = collection->playlists.begin();
info.queueDelete = false;
collections_.push_back(info);
playlist_ = info.playlist;
if(menuDepth_ < menus_.size()) if(menuDepth_ < menus_.size())
{ {
@ -469,18 +478,19 @@ bool Page::popCollection()
{ {
int menuExitIndex = -1; int menuExitIndex = -1;
int menuEnterIndex = -1; int menuEnterIndex = -1;
CollectionInfo *collection = NULL;
if(menuDepth_ <= 1)
{
return false;
}
if(collections_.size() <= 1)
{
return false;
}
if(!activeMenu_) return false;
if(menuDepth_ <= 1) return false;
if(collections_.size() <= 1) return false;
// queue the collection for deletion
MenuInfo_S &info = collections_.back();
info.queueDelete = true;
// get the next collection off of the stack
collections_.pop_back(); collections_.pop_back();
collection = collections_.back(); info = collections_.back();
playlist_ = info.playlist;
if(activeMenu_) if(activeMenu_)
{ {
@ -500,7 +510,7 @@ bool Page::popCollection()
{ {
for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
{ {
(*it)->collectionName = collection->name; (*it)->collectionName = info.collection->name;
if(menuEnterIndex >= 0) if(menuEnterIndex >= 0)
{ {
@ -514,18 +524,25 @@ bool Page::popCollection()
} }
} }
return true; return true;
} }
void Page::nextPlaylist() void Page::nextPlaylist()
{ {
CollectionInfo *collection = collections_.back(); MenuInfo_S &info = collections_.back();
playlist_++; unsigned int numlists = info.collection->playlists.size();
if(playlist_ == collection->playlists.end()) playlist_ = collection->playlists.begin();
activeMenu_->destroyItems(); for(unsigned int i = 0; i <= numlists; ++i)
activeMenu_->setItems(collection); {
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(); activeMenu_->triggerMenuEnterEvent();
} }
@ -555,7 +572,28 @@ void Page::update(float dt)
{ {
for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
{ {
(*it)->update(dt); if(*it) (*it)->update(dt);
}
}
// many nodes still have handles on the collection info. We need to delete
// them once everything is done using them
std::list<MenuInfo_S>::iterator del = collections_.begin();
while(del != collections_.end())
{
MenuInfo_S &info = *del;
if(info.queueDelete && info.menu && info.menu->isIdle())
{
std::list<MenuInfo_S>::iterator next = del;
++next;
if(info.collection) delete info.collection;
collections_.erase(del);
}
else
{
++del;
} }
} }
} }
@ -566,7 +604,7 @@ void Page::draw()
{ {
for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it) for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
{ {
(*it)->draw(); if(*it) (*it)->draw();
} }
for(MenuVector_T::iterator it = menus_.begin(); it != menus_.end(); it++) for(MenuVector_T::iterator it = menus_.begin(); it != menus_.end(); it++)
@ -580,14 +618,11 @@ void Page::draw()
std::string Page::getCollectionName() std::string Page::getCollectionName()
{ {
CollectionInfo *info = collections_.back(); if(collections_.size() == 0) return "";
if(info) MenuInfo_S &info = collections_.back();
{ return info.collection->name;
return info->name;
}
return "";
} }
void Page::freeGraphicsMemory() void Page::freeGraphicsMemory()

View File

@ -84,17 +84,28 @@ private:
void highlight(); void highlight();
std::string collectionName_; std::string collectionName_;
Configuration &config_; Configuration &config_;
struct MenuInfo_S
{
CollectionInfo *collection;
ScrollingList *menu;
CollectionInfo::Playlists_T::iterator playlist;
bool queueDelete;
};
typedef std::vector<ScrollingList *> MenuVector_T; typedef std::vector<ScrollingList *> MenuVector_T;
typedef std::vector<CollectionInfo *> CollectionInfo_T; typedef std::list<MenuInfo_S> CollectionVector_T;
ScrollingList *activeMenu_; ScrollingList *activeMenu_;
unsigned int menuDepth_; unsigned int menuDepth_;
MenuVector_T menus_; MenuVector_T menus_;
CollectionInfo_T collections_; CollectionVector_T collections_;
static const unsigned int NUM_LAYERS = 8; static const unsigned int NUM_LAYERS = 8;
std::vector<Component *> LayerComponents[NUM_LAYERS]; std::vector<Component *> LayerComponents[NUM_LAYERS];
std::vector<Item *> *items_; std::list<ScrollingList *> deleteMenuList_;
std::list<CollectionInfo *> deleteCollectionList_;
bool scrollActive_; bool scrollActive_;
Item *selectedItem_; Item *selectedItem_;