void BasicGameListView::setCursor(FileData* cursor) { if (cursor->isPlaceHolder()) return; if(!mList.setCursor(cursor)) { populateList(cursor->getParent()->getChildrenListToDisplay()); mList.setCursor(cursor); // update our cursor stack in case our cursor just got set to some folder we weren't in before if(mCursorStack.empty() || mCursorStack.top() != cursor->getParent()) { std::stack<FileData*> tmp; FileData* ptr = cursor->getParent(); while(ptr && ptr != mRoot) { tmp.push(ptr); ptr = ptr->getParent(); } // flip the stack and put it in mCursorStack mCursorStack = std::stack<FileData*>(); while(!tmp.empty()) { mCursorStack.push(tmp.top()); tmp.pop(); } } } }
void ISimpleGameListView::onFileChanged(FileData* file, FileChangeType change) { // we could be tricky here to be efficient; // but this shouldn't happen very often so we'll just always repopulate FileData* cursor = getCursor(); populateList(cursor->getParent()->getChildren()); setCursor(cursor); }
void GuiGamelistOptions::openMetaDataEd() { // open metadata editor FileData* file = getGamelist()->getCursor(); ScraperSearchParams p; p.game = file; p.system = file->getSystem(); mWindow->pushGui(new GuiMetaDataEd(mWindow, &file->metadata, file->metadata.getMDD(), p, file->getPath().filename().string(), std::bind(&IGameListView::onFileChanged, getGamelist(), file, FILE_METADATA_CHANGED), [this, file] { boost::filesystem::remove(file->getPath()); //actually delete the file on the filesystem file->getParent()->removeChild(file); //unlink it so list repopulations triggered from onFileChanged won't see it getGamelist()->onFileChanged(file, FILE_REMOVED); //tell the view delete file; //free it })); }
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); }