bool ISimpleGameListView::input(InputConfig* config, Input input) { if(input.value != 0) { if(config->isMappedTo("a", input)) { FileData* cursor = getCursor(); if(cursor->getType() == GAME) { Sound::getFromTheme(getTheme(), getName(), "launch")->play(); launch(cursor); }else{ // it's a folder if(cursor->getChildren().size() > 0) { mCursorStack.push(cursor); populateList(cursor->getChildren()); } } return true; }else if(config->isMappedTo("b", input)) { if(mCursorStack.size()) { populateList(mCursorStack.top()->getParent()->getChildren()); setCursor(mCursorStack.top()); mCursorStack.pop(); Sound::getFromTheme(getTheme(), getName(), "back")->play(); }else{ onFocusLost(); ViewController::get()->goToSystemView(getCursor()->getSystem()); } return true; }else if(config->isMappedTo("right", input) || config->isMappedTo("righttop", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); ViewController::get()->goToNextGameList(); return true; } }else if(config->isMappedTo("left", input) || config->isMappedTo("lefttop", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); ViewController::get()->goToPrevGameList(); return true; } } } return IGameListView::input(config, input); }
FileData* findOrCreateFile(SystemData* system, const boost::filesystem::path& path, FileType type) { // first, verify that path is within the system's root folder FileData* root = system->getRootFolder(); bool contains = false; fs::path relative = removeCommonPath(path, root->getPath(), contains); if(!contains) { LOG(LogError) << "File path \"" << path << "\" is outside system path \"" << system->getStartPath() << "\""; return NULL; } auto path_it = relative.begin(); FileData* treeNode = root; bool found = false; while(path_it != relative.end()) { const std::vector<FileData*>& children = treeNode->getChildren(); found = false; for(auto child_it = children.begin(); child_it != children.end(); child_it++) { if((*child_it)->getPath().filename() == *path_it) { treeNode = *child_it; found = true; break; } } // this is the end if(path_it == --relative.end()) { if(found) return treeNode; if(type == FOLDER) { LOG(LogWarning) << "gameList: folder doesn't already exist, won't create"; return NULL; } //LOG(LogInfo) << "File type" << type << " File path \"" << path << "System " << system; FileData* file = new FileData(type, path, system); treeNode->addChild(file); return file; } if(!found) { // don't create folders unless it's leading up to a game // if type is a folder it's gonna be empty, so don't bother if(type == FOLDER) { LOG(LogWarning) << "gameList: folder doesn't already exist, won't create"; return NULL; } // create missing folder FileData* folder = new FileData(FOLDER, treeNode->getPath().stem() / *path_it, system); treeNode->addChild(folder); treeNode = folder; } path_it++; } return NULL; }
bool ISimpleGameListView::input(InputConfig* config, Input input) { if(input.value != 0) { if(config->isMappedTo("a", input)) { LOG(LogDebug) << "ISimpleGameListView::input(): a detected!"; FileData* cursor = getCursor(); if(cursor->getType() == GAME) { Sound::getFromTheme(getTheme(), getName(), "launch")->play(); launch(cursor); }else{ // it's a folder if(cursor->getChildren().size() > 0) { mCursorStack.push(cursor); populateList(cursor->getChildren()); } } return true; }else if(config->isMappedTo("b", input)) { LOG(LogDebug) << "ISimpleGameListView::input(): b detected!"; if(mCursorStack.size()) { populateList(mCursorStack.top()->getParent()->getChildren()); setCursor(mCursorStack.top()); mCursorStack.pop(); Sound::getFromTheme(getTheme(), getName(), "back")->play(); }else{ onFocusLost(); if (mFavoriteChange || mKidGameChange) { ViewController::get()->setInvalidGamesList(getCursor()->getSystem()); mFavoriteChange = false; mKidGameChange = false; } ViewController::get()->goToSystemView(getCursor()->getSystem()); } return true; }else if (config->isMappedTo("x", input)) { FileData* cursor = getCursor(); LOG(LogDebug) << "ISimpleGameListView::input(): x detected!"; if (cursor->getSystem()->getHasFavorites()) { if (cursor->getType() == GAME) { mFavoriteChange = true; MetaDataList* md = &cursor->metadata; std::string value = md->get("favorite"); LOG(LogDebug) << "Favorite = "<< value; if (value.compare("false") == 0) { md->set("favorite", "true"); }else { md->set("favorite", "false"); } LOG(LogDebug) << "New Favorite value set to: "<< md->get("favorite"); updateInfoPanel(); } } }else if (config->isMappedTo("y", input)) { LOG(LogDebug) << "ISimpleGameListView::input(): y detected!"; FileData* cursor = getCursor(); if (cursor->getSystem()->getHasKidGames() && !mFilterHidden) // only when kidgames are supported by system+theme, and when in UImode=full { if (cursor->getType() == GAME) { mKidGameChange = true; MetaDataList* md = &cursor->metadata; std::string value = md->get("kidgame"); LOG(LogDebug) << "kidgame = "<< value; if (value.compare("false") == 0) { md->set("kidgame", "true"); } else { md->set("kidgame", "false"); } LOG(LogDebug) << "New kidgame value set to: "<< md->get("kidgame"); updateInfoPanel(); } } }else if(config->isMappedTo("right", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); if (mFavoriteChange || mKidGameChange) { ViewController::get()->setInvalidGamesList(getCursor()->getSystem()); mFavoriteChange = false; mKidGameChange = false; } ViewController::get()->goToNextGameList(mFilterHidden, mFilterFav, mFilterKid); return true; } }else if(config->isMappedTo("left", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); if (mFavoriteChange || mKidGameChange) { ViewController::get()->setInvalidGamesList(getCursor()->getSystem()); mFavoriteChange = false; mKidGameChange = false; } ViewController::get()->goToPrevGameList(mFilterHidden, mFilterFav, mFilterKid); return true; } } } return IGameListView::input(config, input); }
//Handles the input for the game views. bool ISimpleGameListView::input(InputConfig* config, Input input) { if (input.value != 0) //Redirect input if keyboard is open. { if (config->isMappedTo("a", input) && !mKeyboard->isOpen()) { FileData* cursor = getCursor(); if(cursor->getType() == GAME) { Sound::getFromTheme(getTheme(), getName(), "launch")->play(); launch(cursor); }else{ // it's a folder if(cursor->getChildren().size() > 0) { mCursorStack.push(cursor); populateList(cursor->getChildren()); } } return true; }else if(config->isMappedTo("b", input) && !mKeyboard->isOpen()) { if(mCursorStack.size()) { populateList(mCursorStack.top()->getParent()->getChildren()); setCursor(mCursorStack.top()); mCursorStack.pop(); Sound::getFromTheme(getTheme(), getName(), "back")->play(); }else{ onFocusLost(); ViewController::get()->goToSystemView(getCursor()->getSystem()); } return true; } else if (config->isMappedTo("y", input)) //User has opened up the keyboard. { mKeyboard->setKeyboardIsOpen(true); return true; //Return like other inputs. } else if(config->isMappedTo("right", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); ViewController::get()->goToNextGameList(); return true; } }else if(config->isMappedTo("left", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); ViewController::get()->goToPrevGameList(); return true; } } } //Redirect input to keyboard. //There needs to be a sleep timer on the y option. //THERE IS ALREADY A JUMP TO LETTER FUNCTION IN GUIGAMELISTOPTIONS.cpp if (mKeyboard->isOpen()) { //Close keyboard. if (config->isMappedTo("b", input) && input.value || config->isMappedTo("y", input) && input.value) { mKeyboard->setKeyboardIsOpen(false); } else if (config->isMappedTo("left", input) && input.value) { mKeyboard->iterateLeft(); mKeyboardText.setText(mKeyboard->getKeys()); } else if (config->isMappedTo("right", input) && input.value) { mKeyboard->iterateRight(); mKeyboardText.setText(mKeyboard->getKeys()); } else if (config->isMappedTo("a", input) && input.value) { if (mKeyboard->goToKey(mRoot) && mKeyboard->getPrevChoice() != getCursor()->getCleanName()[0]) { //Not nullptr setCursor(mKeyboard->goToKey(mRoot)); } else { FileData* cursor = getCursor(); if (cursor->getType() == GAME) { Sound::getFromTheme(getTheme(), getName(), "launch")->play(); launch(cursor); } else{ // it's a folder if (cursor->getChildren().size() > 0) { mCursorStack.push(cursor); populateList(cursor->getChildren()); } } } } } return IGameListView::input(config, input); }
void SystemData::populateFolder(FileData* folder) { const fs::path& folderPath = folder->getPath(); if(!fs::is_directory(folderPath)) { LOG(LogWarning) << "Error - folder with path \"" << folderPath << "\" is not a directory!"; return; } const std::string folderStr = folderPath.generic_string(); //make sure that this isn't a symlink to a thing we already have if(fs::is_symlink(folderPath)) { //if this symlink resolves to somewhere that's at the beginning of our path, it's gonna recurse if(folderStr.find(fs::canonical(folderPath).generic_string()) == 0) { LOG(LogWarning) << "Skipping infinitely recursive symlink \"" << folderPath << "\""; return; } } fs::path filePath; std::string extension; bool isGame; for(fs::directory_iterator end, dir(folderPath); dir != end; ++dir) { filePath = (*dir).path(); if(filePath.stem().empty()) continue; //this is a little complicated because we allow a list of extensions to be defined (delimited with a space) //we first get the extension of the file itself: extension = filePath.extension().string(); //fyi, folders *can* also match the extension and be added as games - this is mostly just to support higan //see issue #75: https://github.com/Aloshi/EmulationStation/issues/75 isGame = false; if(std::find(mSearchExtensions.begin(), mSearchExtensions.end(), extension) != mSearchExtensions.end()) { FileData* newGame = new FileData(GAME, filePath.generic_string(), this); folder->addChild(newGame); isGame = true; } //add directories that also do not match an extension as folders if(!isGame && fs::is_directory(filePath)) { FileData* newFolder = new FileData(FOLDER, filePath.generic_string(), this); populateFolder(newFolder); //ignore folders that do not contain games if(newFolder->getChildren().size() == 0) delete newFolder; else folder->addChild(newFolder); } } }
bool ISimpleGameListView::input(InputConfig* config, Input input) { if(input.value != 0) { if(config->isMappedTo("a", input)) { FileData* cursor = getCursor(); if(cursor->getType() == GAME) { //Sound::getFromTheme(getTheme(), getName(), "launch")->play(); launch(cursor); }else{ // it's a folder if(cursor->getChildren().size() > 0) { mCursorStack.push(cursor); populateList(cursor->getChildren()); } } return true; }else if(config->isMappedTo("b", input)) { if(mCursorStack.size()) { populateList(mCursorStack.top()->getParent()->getChildren()); setCursor(mCursorStack.top()); mCursorStack.pop(); //Sound::getFromTheme(getTheme(), getName(), "back")->play(); }else{ onFocusLost(); if (mFavoriteChange) { ViewController::get()->setInvalidGamesList(getCursor()->getSystem()); mFavoriteChange = false; } ViewController::get()->goToSystemView(getCursor()->getSystem()); } return true; }else if (config->isMappedTo("y", input)) { FileData* cursor = getCursor(); if (cursor->getSystem()->getHasFavorites()) { if (cursor->getType() == GAME) { mFavoriteChange = true; MetaDataList* md = &cursor->metadata; std::string value = md->get("favorite"); if (value.compare("no") == 0) { md->set("favorite", "yes"); } else { md->set("favorite", "no"); } FileData* cursor = getCursor(); populateList(cursor->getParent()->getChildren()); setCursor(cursor); updateInfoPanel(); } } }else if(config->isMappedTo("right", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); if (mFavoriteChange) { ViewController::get()->setInvalidGamesList(getCursor()->getSystem()); mFavoriteChange = false; } ViewController::get()->goToNextGameList(); return true; } }else if(config->isMappedTo("left", input)) { if(Settings::getInstance()->getBool("QuickSystemSelect")) { onFocusLost(); if (mFavoriteChange) { ViewController::get()->setInvalidGamesList(getCursor()->getSystem()); mFavoriteChange = false; } ViewController::get()->goToPrevGameList(); return true; } } } return IGameListView::input(config, input); }