diff --git a/Package/Environment/Common/controls.conf b/Package/Environment/Common/controls.conf index 6e8b4c1..a315ed2 100644 --- a/Package/Environment/Common/controls.conf +++ b/Package/Environment/Common/controls.conf @@ -6,6 +6,7 @@ pageUp = A pageDown = B letterUp = N letterDown = M +nextPlaylist = P select = Space back = Escape quit = Q diff --git a/RetroFE/Source/Collection/CollectionInfoBuilder.cpp b/RetroFE/Source/Collection/CollectionInfoBuilder.cpp index 39e8d13..9ccf444 100644 --- a/RetroFE/Source/Collection/CollectionInfoBuilder.cpp +++ b/RetroFE/Source/Collection/CollectionInfoBuilder.cpp @@ -153,7 +153,7 @@ bool CollectionInfoBuilder::createCollectionDirectory(std::string name) return true; } -CollectionInfo *CollectionInfoBuilder::buildCollection(std::string name) +CollectionInfo *CollectionInfoBuilder::buildCollection(std::string name, std::string listname) { std::string listItemsPathKey = "collections." + name + ".list.path"; std::string listFilterKey = "collections." + name + ".list.filter"; @@ -192,7 +192,7 @@ CollectionInfo *CollectionInfoBuilder::buildCollection(std::string name) (void)conf_.getProperty("collections." + collection->name + ".launcher", collection->launcher); - ImportDirectory(collection); + ImportDirectory(collection, listname); return collection; } @@ -231,14 +231,14 @@ bool CollectionInfoBuilder::ImportBasicList(CollectionInfo *info, std::string fi return true; } -bool CollectionInfoBuilder::ImportDirectory(CollectionInfo *info) +bool CollectionInfoBuilder::ImportDirectory(CollectionInfo *info, std::string listname) { DIR *dp; struct dirent *dirp; std::string path = info->listpath; std::map includeFilter; std::map excludeFilter; - std::string includeFile = Utils::combinePath(Configuration::absolutePath, "collections", info->name, "include.txt"); + std::string includeFile = Utils::combinePath(Configuration::absolutePath, "collections", info->name, listname + ".txt"); std::string excludeFile = Utils::combinePath(Configuration::absolutePath, "collections", info->name, "exclude.txt"); std::string launcher; bool showMissing = false; diff --git a/RetroFE/Source/Collection/CollectionInfoBuilder.h b/RetroFE/Source/Collection/CollectionInfoBuilder.h index 5bd5221..b015fa6 100644 --- a/RetroFE/Source/Collection/CollectionInfoBuilder.h +++ b/RetroFE/Source/Collection/CollectionInfoBuilder.h @@ -29,12 +29,12 @@ class CollectionInfoBuilder public: CollectionInfoBuilder(Configuration &c, MetadataDatabase &mdb); virtual ~CollectionInfoBuilder(); - CollectionInfo *buildCollection(std::string collectionName); + CollectionInfo *buildCollection(std::string collectionName, std::string listname); static bool createCollectionDirectory(std::string collectionName); private: Configuration &conf_; MetadataDatabase &metaDB_; bool ImportBasicList(CollectionInfo *info, std::string file, std::map &list); - bool ImportDirectory(CollectionInfo *info); + bool ImportDirectory(CollectionInfo *info, std::string listname); }; diff --git a/RetroFE/Source/Collection/MenuParser.cpp b/RetroFE/Source/Collection/MenuParser.cpp index b07beb3..0649181 100644 --- a/RetroFE/Source/Collection/MenuParser.cpp +++ b/RetroFE/Source/Collection/MenuParser.cpp @@ -103,7 +103,7 @@ bool MenuParser::buildMenuItems(CollectionInfo *collection, bool sort, Collectio std::string collectionName = collectionAttribute->value(); Logger::write(Logger::ZONE_INFO, "Menu", "Loading collection into menu: " + collectionName); - CollectionInfo *subcollection = builder.buildCollection(collectionName); + CollectionInfo *subcollection = builder.buildCollection(collectionName, "include"); collection->addSubcollection(subcollection); } } diff --git a/RetroFE/Source/Control/UserInput.cpp b/RetroFE/Source/Control/UserInput.cpp index 7574252..712ddeb 100644 --- a/RetroFE/Source/Control/UserInput.cpp +++ b/RetroFE/Source/Control/UserInput.cpp @@ -67,6 +67,7 @@ bool UserInput::initialize() retVal = MapKey("select", KeyCodeSelect) && retVal; retVal = MapKey("back", KeyCodeBack) && retVal; retVal = MapKey("quit", KeyCodeQuit) && retVal; + MapKey("nextPlaylist", KeyCodeNextPlaylist); // these features will need to be implemented at a later time // retVal = MapKey("admin", KeyCodeAdminMode) && retVal; // retVal = MapKey("remove", KeyCodeHideItem) && retVal; diff --git a/RetroFE/Source/Control/UserInput.h b/RetroFE/Source/Control/UserInput.h index 4fbb66a..34ed4ab 100644 --- a/RetroFE/Source/Control/UserInput.h +++ b/RetroFE/Source/Control/UserInput.h @@ -38,6 +38,7 @@ public: KeyCodePageUp, KeyCodeLetterDown, KeyCodeLetterUp, + KeyCodeNextPlaylist, KeyCodeAdminMode, KeyCodeHideItem, KeyCodeQuit, diff --git a/RetroFE/Source/Graphics/Page.cpp b/RetroFE/Source/Graphics/Page.cpp index eb7392e..778d523 100644 --- a/RetroFE/Source/Graphics/Page.cpp +++ b/RetroFE/Source/Graphics/Page.cpp @@ -408,7 +408,7 @@ void Page::letterScroll(ScrollDirection direction) } -bool Page::pushCollection(CollectionInfo *collection) +bool Page::pushCollection(CollectionInfo *collection, bool discardCurrent) { collections_.push_back(collection); std::vector *sprites = ComponentItemBindingBuilder::buildCollectionItems(&collection->items); @@ -430,6 +430,16 @@ bool Page::pushCollection(CollectionInfo *collection) { ScrollingList *newList = new ScrollingList(*activeMenu_); newList->forceIdle(); + if(discardCurrent) + { + if(menus_.size() > 0) + { + ScrollingList *old = menus_.back(); + menus_.pop_back(); + delete old; + menuDepth_--; + } + } pushMenu(newList); } diff --git a/RetroFE/Source/Graphics/Page.h b/RetroFE/Source/Graphics/Page.h index 617fa76..afb990b 100644 --- a/RetroFE/Source/Graphics/Page.h +++ b/RetroFE/Source/Graphics/Page.h @@ -44,7 +44,7 @@ public: Page(Configuration &c); virtual ~Page(); virtual void onNewItemSelected(Item *); - bool pushCollection(CollectionInfo *collection); + bool pushCollection(CollectionInfo *collection, bool discardCurrent); bool popCollection(); void pushMenu(ScrollingList *s); bool isMenusFull(); diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index 868e28a..091a789 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -282,13 +282,13 @@ void RetroFE::run() currentPage_->start(); config_.setProperty("currentCollection", firstCollection); - CollectionInfo *info = getCollection(firstCollection); + CollectionInfo *info = getCollection(firstCollection, "include"); MenuParser mp; CollectionInfoBuilder cib(config_, *metadb_); mp.buildMenuItems(info, menuSort, cib); - currentPage_->pushCollection(info); + currentPage_->pushCollection(info, false); } else { @@ -466,12 +466,15 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page *page) config_.setProperty("currentCollection", nextPageItem_->name); config_.getProperty("collections." + nextPageItem_->name + ".list.menuSort", menuSort); - CollectionInfo *info = getCollection(nextPageItem_->name); + CollectionInfo *info = getCollection(nextPageItem_->name, "include"); MenuParser mp; CollectionInfoBuilder cib(config_, *metadb_); mp.buildMenuItems(info, menuSort, cib); - page->pushCollection(info); + page->pushCollection(info, false); + listnames_.push_back("include"); + listnames_.push_back("favorites"); + listnameit_ = listnames_.begin(); if(rememberMenu && lastMenuOffsets_.find(nextPageItem_->name) != lastMenuOffsets_.end()) { @@ -482,6 +485,32 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page *page) } } } + if(input_.keystate(UserInput::KeyCodeNextPlaylist) && page->isMenuIdle()) + { + nextPageItem_ = page->getSelectedItem(); + + bool menuSort = true; + config_.setProperty("currentCollection", nextPageItem_->name); + config_.getProperty("collections." + nextPageItem_->name + ".list.menuSort", menuSort); + + listnameit_++; + if(listnameit_ == listnames_.end()) listnameit_ = listnames_.begin(); + + CollectionInfo *info = getCollection(currentPage_->getCollectionName(), *listnameit_); + + MenuParser mp; + CollectionInfoBuilder cib(config_, *metadb_); + mp.buildMenuItems(info, menuSort, cib); + page->pushCollection(info, true); + + if(rememberMenu && lastMenuOffsets_.find(nextPageItem_->name) != lastMenuOffsets_.end()) + { + page->setScrollOffsetIndex(lastMenuOffsets_[nextPageItem_->name]); + } + + state = RETROFE_NEXT_PAGE_REQUEST; + + } if (input_.keystate(UserInput::KeyCodeBack) && page->isMenuIdle()) { @@ -544,12 +573,12 @@ Page *RetroFE::loadSplashPage() } -CollectionInfo *RetroFE::getCollection(std::string collectionName) +CollectionInfo *RetroFE::getCollection(std::string collectionName, std::string listname) { // the page will deallocate this once its done CollectionInfoBuilder cib(config_, *metadb_); - CollectionInfo *collection = cib.buildCollection(collectionName); + CollectionInfo *collection = cib.buildCollection(collectionName, listname); return collection; } diff --git a/RetroFE/Source/RetroFE.h b/RetroFE/Source/RetroFE.h index d853b18..15cc1b1 100644 --- a/RetroFE/Source/RetroFE.h +++ b/RetroFE/Source/RetroFE.h @@ -68,7 +68,7 @@ private: RETROFE_STATE processUserInput(Page *page); void update(float dt, bool scrollActive); std::string getLayout(std::string collectionName); - CollectionInfo *getCollection(std::string collectionName); + CollectionInfo *getCollection(std::string collectionName, std::string listname); Configuration &config_; DB *db_; MetadataDatabase *metadb_; @@ -80,5 +80,7 @@ private: FontCache fontcache_; AttractMode attract_; std::map lastMenuOffsets_; + std::list listnames_; + std::list::iterator listnameit_; };