From 003d9edbf962a58ad98fd80c661c4dc21d47d466 Mon Sep 17 00:00:00 2001
From: "D. Polders" <zigurana@gmail.com>
Date: Fri, 24 Mar 2017 20:30:20 +0100
Subject: [PATCH] Add Explicit Gamelist Type selection to GUI menu. Currently
 supports Basic, Detailed, Video, and Automatic types. The Automatic type
 checks for the availability of first video's, then screenshots, defaulting to
 Basic view if none are present.

---
 es-app/src/guis/GuiMenu.cpp         | 18 ++++++++
 es-app/src/views/ViewController.cpp | 64 ++++++++++++++++++-----------
 es-app/src/views/ViewController.h   |  9 ++++
 es-core/src/Settings.cpp            |  1 +
 4 files changed, 69 insertions(+), 23 deletions(-)

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>