From c9caa217a9ee9b7f192d23a00bc783870bb7d9b8 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Thu, 9 Jul 2009 18:41:45 -0700
Subject: [PATCH] Added LLDispatchListener implementation for gSavedSettings.

---
 indra/newview/CMakeLists.txt              |   2 +
 indra/newview/llviewercontrollistener.cpp | 105 ++++++++++++++++++++++
 indra/newview/llviewercontrollistener.h   |  33 +++++++
 3 files changed, 140 insertions(+)
 create mode 100644 indra/newview/llviewercontrollistener.cpp
 create mode 100644 indra/newview/llviewercontrollistener.h

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 53a59031edb..aaaa8ac5a68 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -378,6 +378,7 @@ set(viewer_SOURCE_FILES
     llvieweraudio.cpp
     llviewercamera.cpp
     llviewercontrol.cpp
+    llviewercontrollistener.cpp
     llviewerdisplay.cpp
     llviewerfloaterreg.cpp
     llviewergenericmessage.cpp
@@ -801,6 +802,7 @@ set(viewer_HEADER_FILES
     llviewerbuild.h
     llviewercamera.h
     llviewercontrol.h
+    llviewercontrollistener.h
     llviewerdisplay.h
     llviewerfloaterreg.h
     llviewergenericmessage.h
diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp
new file mode 100644
index 00000000000..a29ead1e84e
--- /dev/null
+++ b/indra/newview/llviewercontrollistener.cpp
@@ -0,0 +1,105 @@
+/**
+ * @file   llviewercontrollistener.cpp
+ * @author Nat Goodspeed
+ * @date   2009-06-30
+ * @brief  Implementation for llviewercontrollistener.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewercontrollistener.h"
+
+#include "llviewercontrol.h"
+
+LLViewerControlListener gSavedSettingsListener;
+
+LLViewerControlListener::LLViewerControlListener()
+	: LLDispatchListener("LLViewerControl",  "group")
+{
+	add("Global", boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
+	add("Skin", boost::bind(&LLViewerControlListener::set, &gSavedSkinSettings, _1));
+	add("PerAccount", boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
+	add("Warning", boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
+	add("Crash", boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
+
+#if 0
+	add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1));
+	add(/*"toggleControl",*/ "Skin", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSkinSettings, _1));
+	add(/*"toggleControl",*/ "PerAccount", boost::bind(&LLViewerControlListener::toggleControl, &gSavedPerAccountSettings, _1));
+	add(/*"toggleControl",*/ "Warning", boost::bind(&LLViewerControlListener::toggleControl, &gWarningSettings, _1));
+	add(/*"toggleControl",*/ "Crash", boost::bind(&LLViewerControlListener::toggleControl, &gCrashSettings, _1));
+
+	add(/*"setDefault",*/ "Global", boost::bind(&LLViewerControlListener::setDefault, &gSavedSettings, _1));
+	add(/*"setDefault",*/ "Skin", boost::bind(&LLViewerControlListener::setDefault, &gSavedSkinSettings, _1));
+	add(/*"setDefault",*/ "PerAccount", boost::bind(&LLViewerControlListener::setDefault, &gSavedPerAccountSettings, _1));
+	add(/*"setDefault",*/ "Warning", boost::bind(&LLViewerControlListener::setDefault, &gWarningSettings, _1));
+	add(/*"setDefault",*/ "Crash", boost::bind(&LLViewerControlListener::setDefault, &gCrashSettings, _1));
+#endif // 0
+}
+
+//static
+void LLViewerControlListener::set(LLControlGroup * controls, LLSD const & event_data)
+{
+	if(event_data.has("key"))
+	{
+		std::string key(event_data["key"]);
+
+		if(controls->controlExists(key))
+		{
+			controls->setUntypedValue(key, event_data["value"]);
+		}
+		else
+		{
+			llwarns << "requested unknown control: \"" << key << '\"' << llendl;
+		}
+	}
+}
+
+//static
+void LLViewerControlListener::toggleControl(LLControlGroup * controls, LLSD const & event_data)
+{
+	if(event_data.has("key"))
+	{
+		std::string key(event_data["key"]);
+
+		if(controls->controlExists(key))
+		{
+			LLControlVariable * control = controls->getControl(key);
+			if(control->isType(TYPE_BOOLEAN))
+			{
+				control->set(!control->get().asBoolean());
+			}
+			else
+			{
+				llwarns << "requested toggle of non-boolean control: \"" << key << "\", type is " << control->type() << llendl;
+			}
+		}
+		else
+		{
+			llwarns << "requested unknown control: \"" << key << '\"' << llendl;
+		}
+	}
+}
+
+//static
+void LLViewerControlListener::setDefault(LLControlGroup * controls, LLSD const & event_data)
+{
+	if(event_data.has("key"))
+	{
+		std::string key(event_data["key"]);
+
+		if(controls->controlExists(key))
+		{
+			LLControlVariable * control = controls->getControl(key);
+			control->resetToDefault();
+		}
+		else
+		{
+			llwarns << "requested unknown control: \"" << key << '\"' << llendl;
+		}
+	}
+}
diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h
new file mode 100644
index 00000000000..6c69059d16f
--- /dev/null
+++ b/indra/newview/llviewercontrollistener.h
@@ -0,0 +1,33 @@
+/**
+ * @file   llviewercontrollistener.h
+ * @author Brad Kittenbrink
+ * @date   2009-07-09
+ * @brief  Event API for subset of LLViewerControl methods
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERCONTROLLISTENER_H
+#define LL_LLVIEWERCONTROLLISTENER_H
+
+#include "lleventdispatcher.h"
+
+class LLControlGroup;
+class LLSD;
+
+class  LLViewerControlListener : public LLDispatchListener
+{
+public:
+	LLViewerControlListener();
+
+private:
+	static void set(LLControlGroup *controls, LLSD const & event_data);
+	static void toggleControl(LLControlGroup *controls, LLSD const & event_data);
+	static void setDefault(LLControlGroup *controls, LLSD const & event_data);
+};
+
+extern LLViewerControlListener gSavedSettingsListener;
+
+#endif // LL_LLVIEWERCONTROLLISTENER_H
-- 
GitLab