diff --git a/es-app/src/guis/GuiMenu.cpp b/es-app/src/guis/GuiMenu.cpp index 68b1a355d..b210c283b 100644 --- a/es-app/src/guis/GuiMenu.cpp +++ b/es-app/src/guis/GuiMenu.cpp @@ -160,6 +160,24 @@ GuiMenu::GuiMenu(Window* window) : GuiComponent(window), mMenu(window, "MAIN MEN }); } + // GameList view style + auto gamelist_style = std::make_shared< OptionListComponent<std::string> >(mWindow, "GAMELIST VIEW STYLE", false); + std::vector<std::string> styles; + styles.push_back("automatic"); + styles.push_back("basic"); + styles.push_back("detailed"); + styles.push_back("video"); + for (auto it = styles.begin(); it != styles.end(); it++) + gamelist_style->add(*it, *it, Settings::getInstance()->getString("GamelistViewStyle") == *it); + s->addWithLabel("GAMELIST VIEW STYLE", gamelist_style); + s->addSaveFunc([gamelist_style] { + bool needReload = false; + if (Settings::getInstance()->getString("GamelistViewStyle") != gamelist_style->getSelected()) + needReload = true; + Settings::getInstance()->setString("GamelistViewStyle", gamelist_style->getSelected()); + if (needReload) + ViewController::get()->reloadAll(); + }); mWindow->pushGui(s); }); diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp index cc83eece5..294f953cd 100644 --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -231,33 +231,51 @@ std::shared_ptr<IGameListView> ViewController::getGameListView(SystemData* syste bool themeHasVideoView = system->getTheme()->hasView("video"); //decide type - bool detailed = false; - bool video = false; - std::vector<FileData*> files = system->getRootFolder()->getFilesRecursive(GAME | FOLDER); - for(auto it = files.begin(); it != files.end(); it++) + GameListViewType selectedViewType = AUTOMATIC; + + std::string viewPreference = Settings::getInstance()->getString("GamelistViewStyle"); + if (viewPreference.compare("basic") == 0) + selectedViewType = BASIC; + if (viewPreference.compare("detailed") == 0) + selectedViewType = DETAILED; + if (viewPreference.compare("video") == 0) + selectedViewType = VIDEO; + + if (selectedViewType == AUTOMATIC) { - if(themeHasVideoView && !(*it)->getVideoPath().empty()) + std::vector<FileData*> files = system->getRootFolder()->getFilesRecursive(GAME | FOLDER); + for (auto it = files.begin(); it != files.end(); it++) { - video = true; - break; - } - else if(!(*it)->getThumbnailPath().empty()) - { - detailed = true; - // Don't break out in case any subsequent files have video + if (themeHasVideoView && !(*it)->getVideoPath().empty()) + { + selectedViewType = VIDEO; + break; + } + else if (!(*it)->getThumbnailPath().empty()) + { + selectedViewType = DETAILED; + // Don't break out in case any subsequent files have video + } } } - - if (video) - // Create the view - view = std::shared_ptr<IGameListView>(new VideoGameListView(mWindow, system->getRootFolder())); - else if(detailed) - view = std::shared_ptr<IGameListView>(new DetailedGameListView(mWindow, system->getRootFolder())); - else - view = std::shared_ptr<IGameListView>(new BasicGameListView(mWindow, system->getRootFolder())); - - // uncomment for experimental "image grid" view - //view = std::shared_ptr<IGameListView>(new GridGameListView(mWindow, system->getRootFolder())); + + // Create the view + switch (selectedViewType) + { + case VIDEO: + view = std::shared_ptr<IGameListView>(new VideoGameListView(mWindow, system->getRootFolder())); + break; + case DETAILED: + view = std::shared_ptr<IGameListView>(new DetailedGameListView(mWindow, system->getRootFolder())); + break; + // case GRID placeholder for future implementation. + // view = std::shared_ptr<IGameListView>(new GridGameListView(mWindow, system->getRootFolder())); + // break; + case BASIC: + default: + view = std::shared_ptr<IGameListView>(new BasicGameListView(mWindow, system->getRootFolder())); + break; + } view->setTheme(system->getTheme()); diff --git a/es-app/src/views/ViewController.h b/es-app/src/views/ViewController.h index 2658f44a9..78051650f 100644 --- a/es-app/src/views/ViewController.h +++ b/es-app/src/views/ViewController.h @@ -49,6 +49,15 @@ public: GAME_LIST }; + enum GameListViewType + { + AUTOMATIC, + BASIC, + DETAILED, + VIDEO + // GRID TODO! + }; + struct State { ViewMode viewing; diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp index df90ba7b6..0c4305dfe 100644 --- a/es-core/src/Settings.cpp +++ b/es-core/src/Settings.cpp @@ -75,6 +75,7 @@ void Settings::setDefaults() mStringMap["ThemeSet"] = ""; mStringMap["ScreenSaverBehavior"] = "dim"; mStringMap["Scraper"] = "TheGamesDB"; + mStringMap["GamelistViewStyle"] = "automatic"; } template <typename K, typename V>