#include "views/gamelist/BasicGameListView.h" #include "views/ViewController.h" #include "Renderer.h" #include "Window.h" #include "ThemeData.h" #include "SystemData.h" #include "Settings.h" BasicGameListView::BasicGameListView(Window* window, FileData* root) : ISimpleGameListView(window, root), mList(window) { mList.setSize(mSize.x(), mSize.y() * 0.8f); mList.setPosition(0, mSize.y() * 0.2f); addChild(&mList); populateList(root->getChildren()); } void BasicGameListView::onThemeChanged(const std::shared_ptr& theme) { ISimpleGameListView::onThemeChanged(theme); using namespace ThemeFlags; mList.applyTheme(theme, getName(), "gamelist", ALL); } void BasicGameListView::onFileChanged(FileData* file, FileChangeType change) { if(change == FILE_METADATA_CHANGED) { // might switch to a detailed view ViewController::get()->reloadGameListView(this); return; } ISimpleGameListView::onFileChanged(file, change); } void BasicGameListView::populateList(const std::vector& files) { mList.clear(); // file list can be empty if direct launch item if (files.size()==0) { return; } mHeaderText.setText(files.at(0)->getSystem()->getFullName()); for(auto it = files.begin(); it != files.end(); it++) { mList.add((*it)->getName(), *it, ((*it)->getType() == FOLDER)); } } FileData* BasicGameListView::getCursor() { return mList.getSelected(); } void BasicGameListView::setCursor(FileData* cursor) { if(!mList.setCursor(cursor)) { populateList(cursor->getParent()->getChildren()); 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 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(); while(!tmp.empty()) { mCursorStack.push(tmp.top()); tmp.pop(); } } } } void BasicGameListView::launch(FileData* game) { ViewController::get()->launch(game); } void BasicGameListView::remove(FileData *game) { boost::filesystem::remove(game->getPath()); // actually delete the file on the filesystem if (getCursor() == game) // Select next element in list, or prev if none { std::vector siblings = game->getParent()->getChildren(); auto gameIter = std::find(siblings.begin(), siblings.end(), game); auto gamePos = std::distance(siblings.begin(), gameIter); if (gameIter != siblings.end()) { if ((gamePos + 1) < siblings.size()) { setCursor(siblings.at(gamePos + 1)); } else if ((gamePos - 1) > 0) { setCursor(siblings.at(gamePos - 1)); } } } delete game; // remove before repopulating (removes from parent) onFileChanged(game, FILE_REMOVED); // update the view, with game removed } std::vector BasicGameListView::getHelpPrompts() { std::vector prompts; if(Settings::getInstance()->getBool("QuickSystemSelect")) prompts.push_back(HelpPrompt("left/right", "system")); prompts.push_back(HelpPrompt("up/down", "choose")); prompts.push_back(HelpPrompt("a", "launch")); prompts.push_back(HelpPrompt("b", "back")); prompts.push_back(HelpPrompt("select", "options")); return prompts; }