From d6959f179f326a5b1846b7498b439dab496e8350 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Wed, 8 Sep 2021 22:11:57 -0400
Subject: [PATCH] More cleanup to graphics preset system. Make largely
 independent of preference floater

---
 indra/newview/llfloaterpreference.cpp |  6 --
 indra/newview/llpresetsmanager.cpp    | 81 +++++++++++++++++++++++----
 indra/newview/llpresetsmanager.h      | 11 ++--
 3 files changed, 77 insertions(+), 21 deletions(-)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 0c5919a1a90..fea41bbe04d 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1100,8 +1100,6 @@ void LLFloaterPreference::setHardwareDefaults()
 	LLAvatarComplexityControls::setIndirectControls(); 
 
 	refreshEnabledGraphics();
-	gSavedSettings.setString("PresetGraphicActive", "");
-	LLPresetsManager::getInstance()->triggerChangeSignal();
 
 	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
 	child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
@@ -2894,11 +2892,7 @@ void LLPanelPreferenceGraphics::setPresetText()
 
     if (hasDirtyChilds() && !preset_graphic_active.empty())
 	{
-		gSavedSettings.setString("PresetGraphicActive", "");
 		preset_graphic_active.clear();
-		// This doesn't seem to cause an infinite recursion.  This trigger is needed to cause the pulldown
-		// panel to update.
-		LLPresetsManager::getInstance()->triggerChangeSignal();
 	}
 
 	if (!preset_graphic_active.empty())
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index 3e948625ae9..07d36503d13 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -44,14 +44,25 @@
 
 LLPresetsManager::LLPresetsManager()
 {
-	// Start watching camera controls as soon as the preset
-	// manager gets initialized
+	// Connect preset signals
+	startWatching(PRESETS_GRAPHIC);
 	startWatching(PRESETS_CAMERA);
 }
 
 LLPresetsManager::~LLPresetsManager()
 {
-	mCameraChangedSignal.disconnect();
+	for (auto& signal : mGraphicsChangedSignals)
+	{
+		signal.disconnect();
+	}
+	mGraphicsChangedSignals.clear();
+
+
+	for (auto& signal : mCameraChangedSignals)
+	{
+		signal.disconnect();
+	}
+	mCameraChangedSignals.clear();
 }
 
 void LLPresetsManager::triggerChangeCameraSignal()
@@ -120,7 +131,43 @@ void LLPresetsManager::startWatching(const std::string& subdirectory)
 				}
 				else
 				{
-					mCameraChangedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&settingChanged));
+					mCameraChangedSignals.push_back(cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPresetsManager::cameraSettingChanged, this)));
+				}
+			}
+		}
+	}
+	else if (PRESETS_GRAPHIC == subdirectory)
+	{
+		std::vector<std::string> name_list;
+		getGraphicsControlNames(name_list);
+
+		for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
+		{
+			std::string ctrl_name = *it;
+			if (gSavedSettings.controlExists(ctrl_name))
+			{
+				LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(ctrl_name);
+				if (cntrl_ptr.isNull())
+				{
+					LL_WARNS("Init") << "Unable to set signal on global setting '" << ctrl_name
+						<< "'" << LL_ENDL;
+				}
+				else
+				{
+					mGraphicsChangedSignals.push_back(cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPresetsManager::graphicsSettingChanged, this)));
+				}
+			}
+			else if (gSavedPerAccountSettings.controlExists(ctrl_name))
+			{
+				LLPointer<LLControlVariable> cntrl_ptr = gSavedPerAccountSettings.getControl(ctrl_name);
+				if (cntrl_ptr.isNull())
+				{
+					LL_WARNS("Init") << "Unable to set signal on global setting '" << ctrl_name
+						<< "'" << LL_ENDL;
+				}
+				else
+				{
+					mGraphicsChangedSignals.push_back(cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPresetsManager::graphicsSettingChanged, this)));
 				}
 			}
 		}
@@ -219,26 +266,36 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& subdirectory, p
 	presets = mPresetNames;
 }
 
-bool LLPresetsManager::mCameraDirty = false;
-bool LLPresetsManager::mIgnoreChangedSignal = false;
+bool LLPresetsManager::sCameraDirty = false;
 
 void LLPresetsManager::setCameraDirty(bool dirty)
 {
-	mCameraDirty = dirty;
+	sCameraDirty = dirty;
 }
 
 bool LLPresetsManager::isCameraDirty()
 {
-	return mCameraDirty;
+	return sCameraDirty;
+}
+
+void LLPresetsManager::graphicsSettingChanged()
+{
+	static LLCachedControl<std::string> graphic_preset_active(gSavedSettings, "PresetGraphicActive", "");
+	if (!graphic_preset_active().empty() && !mIgnoreChangedSignal)
+	{
+		gSavedSettings.setString("PresetGraphicActive", "");
+
+		// Hack call because this is a static routine
+		LLPresetsManager::getInstance()->triggerChangeSignal();
+	}
 }
 
-void LLPresetsManager::settingChanged()
+void LLPresetsManager::cameraSettingChanged()
 {
 	setCameraDirty(true);
 
 	static LLCachedControl<std::string> preset_camera_active(gSavedSettings, "PresetCameraActive", "");
-	std::string preset_name = preset_camera_active;
-	if (!preset_name.empty() && !mIgnoreChangedSignal)
+	if (!preset_camera_active().empty() && !mIgnoreChangedSignal)
 	{
 		gSavedSettings.setString("PresetCameraActive", "");
 
@@ -360,8 +417,10 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
 		paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap();
 		if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0)
 		{
+			mIgnoreChangedSignal = true;
 			// use the recommended setting as an initial one (MAINT-6435)
 			gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger());
+			mIgnoreChangedSignal = false;
 		}
 
 		// Add dynamic controls to default preset 
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
index fac8a1725ef..33a243ed2de 100644
--- a/indra/newview/llpresetsmanager.h
+++ b/indra/newview/llpresetsmanager.h
@@ -99,12 +99,15 @@ class LLPresetsManager final : public LLSingleton<LLPresetsManager>
 
 	void getGraphicsControlNames(std::vector<std::string>& names);
 	void getCameraControlNames(std::vector<std::string>& names);
-	static void settingChanged();
+	void graphicsSettingChanged();
+	void cameraSettingChanged();
 
-	boost::signals2::connection	mCameraChangedSignal;
+	std::vector<boost::signals2::connection> mGraphicsChangedSignals;
+	std::vector<boost::signals2::connection> mCameraChangedSignals;
 
-	static bool	mCameraDirty;
-	static bool mIgnoreChangedSignal;
+	bool mIgnoreChangedSignal = false;
+
+	static bool	sCameraDirty;
 };
 
 #endif // LL_PRESETSMANAGER_H
-- 
GitLab