From 4c6edc9fd450eb55361d6f61408247eb857d230e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= <peterix@gmail.com>
Date: Tue, 5 May 2015 01:09:28 +0200
Subject: [PATCH] GH-907 fix location/java override for java detection

---
 logic/minecraft/MinecraftInstance.cpp | 33 ++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/logic/minecraft/MinecraftInstance.cpp b/logic/minecraft/MinecraftInstance.cpp
index 2813a609..71bec71e 100644
--- a/logic/minecraft/MinecraftInstance.cpp
+++ b/logic/minecraft/MinecraftInstance.cpp
@@ -1,22 +1,47 @@
 #include "MinecraftInstance.h"
+#include <settings/Setting.h>
 #include "settings/SettingsObject.h"
 #include <pathutils.h>
 #include "Env.h"
 #include "minecraft/MinecraftVersionList.h"
 
+// all of this because keeping things compatible with deprecated old settings
+// if either of the settings {a, b} is true, this also resolves to true
+class OrSetting : public Setting
+{
+	Q_OBJECT
+public:
+	OrSetting(QString id, std::shared_ptr<Setting> a, std::shared_ptr<Setting> b)
+	:Setting({id}, false), m_a(a), m_b(b)
+	{
+	}
+	virtual QVariant get() const
+	{
+		bool a = m_a->get().toBool();
+		bool b = m_b->get().toBool();
+		return a || b;
+	}
+	virtual void reset() {}
+	virtual void set(QVariant value) {}
+private:
+	std::shared_ptr<Setting> m_a;
+	std::shared_ptr<Setting> m_b;
+};
+
 MinecraftInstance::MinecraftInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir)
 	: BaseInstance(globalSettings, settings, rootDir)
 {
 	// Java Settings
-	m_settings->registerSetting("OverrideJava", false);
+	auto javaOverride = m_settings->registerSetting("OverrideJava", false);
 	auto locationOverride = m_settings->registerSetting("OverrideJavaLocation", false);
+	auto javaOrLocation = std::make_shared<OrSetting>("JavaOrLocationOverride", javaOverride, locationOverride);
 	m_settings->registerSetting("OverrideJavaArgs", false);
 	m_settings->registerOverride(globalSettings->getSetting("JavaPath"));
 	m_settings->registerOverride(globalSettings->getSetting("JvmArgs"));
 
 	// special!
-	m_settings->registerPassthrough(globalSettings->getSetting("JavaTimestamp"), locationOverride);
-	m_settings->registerPassthrough(globalSettings->getSetting("JavaVersion"), locationOverride);
+	m_settings->registerPassthrough(globalSettings->getSetting("JavaTimestamp"), javaOrLocation);
+	m_settings->registerPassthrough(globalSettings->getSetting("JavaVersion"), javaOrLocation);
 
 	// Window Size
 	m_settings->registerSetting("OverrideWindow", false);
@@ -46,3 +71,5 @@ std::shared_ptr< BaseVersionList > MinecraftInstance::versionList() const
 {
 	return ENV.getVersionList("net.minecraft");
 }
+
+#include "MinecraftInstance.moc"