summaryrefslogtreecommitdiff
path: root/indra/newview/llviewercontrol.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewercontrol.h')
-rw-r--r--indra/newview/llviewercontrol.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/indra/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h
index 954454fbd1..c2522d6bba 100644
--- a/indra/newview/llviewercontrol.h
+++ b/indra/newview/llviewercontrol.h
@@ -65,4 +65,114 @@ extern LLControlGroup gCrashSettings;
extern std::string gLastRunVersion;
extern std::string gCurrentVersion;
+//! Helper function for LLCachedControl
+template <class T>
+eControlType get_control_type(const T& in, LLSD& out)
+{
+ llerrs << "Usupported control type: " << typeid(T).name() << "." << llendl;
+ return TYPE_COUNT;
+}
+
+//! Publish/Subscribe object to interact with LLControlGroups.
+
+//! An LLCachedControl instance to connect to a LLControlVariable
+//! without have to manually create and bind a listener to a local
+//! object.
+template <class T>
+class LLCachedControl
+{
+ T mCachedValue;
+ LLPointer<LLControlVariable> mControl;
+ boost::signals::connection mConnection;
+
+public:
+ LLCachedControl(const std::string& name,
+ const T& default_value,
+ const std::string& comment = "Declared In Code")
+ {
+ mControl = gSavedSettings.getControl(name);
+ if(mControl.isNull())
+ {
+ declareTypedControl(gSavedSettings, name, default_value, comment);
+ mControl = gSavedSettings.getControl(name);
+ if(mControl.isNull())
+ {
+ llerrs << "The control could not be created!!!" << llendl;
+ }
+
+ mCachedValue = default_value;
+ }
+ else
+ {
+ mCachedValue = (const T&)mControl->getValue();
+ }
+
+ // Add a listener to the controls signal...
+ mControl->getSignal()->connect(
+ boost::bind(&LLCachedControl<T>::handleValueChange, this, _1)
+ );
+ }
+
+ ~LLCachedControl()
+ {
+ if(mConnection.connected())
+ {
+ mConnection.disconnect();
+ }
+ }
+
+ LLCachedControl& operator =(const T& newvalue)
+ {
+ setTypeValue(*mControl, newvalue);
+ }
+
+ operator const T&() { return mCachedValue; }
+
+private:
+ void declareTypedControl(LLControlGroup& group,
+ const std::string& name,
+ const T& default_value,
+ const std::string& comment)
+ {
+ LLSD init_value;
+ eControlType type = get_control_type<T>(default_value, init_value);
+ if(type < TYPE_COUNT)
+ {
+ group.declareControl(name, type, init_value, comment, FALSE);
+ }
+ }
+
+ bool handleValueChange(const LLSD& newvalue)
+ {
+ mCachedValue = (const T &)newvalue;
+ return true;
+ }
+
+ void setTypeValue(LLControlVariable& c, const T& v)
+ {
+ // Implicit conversion from T to LLSD...
+ c.set(v);
+ }
+};
+
+template <> eControlType get_control_type<U32>(const U32& in, LLSD& out);
+template <> eControlType get_control_type<S32>(const S32& in, LLSD& out);
+template <> eControlType get_control_type<F32>(const F32& in, LLSD& out);
+template <> eControlType get_control_type<bool> (const bool& in, LLSD& out);
+// Yay BOOL, its really an S32.
+//template <> eControlType get_control_type<BOOL> (const BOOL& in, LLSD& out)
+template <> eControlType get_control_type<std::string>(const std::string& in, LLSD& out);
+template <> eControlType get_control_type<LLVector3>(const LLVector3& in, LLSD& out);
+template <> eControlType get_control_type<LLVector3d>(const LLVector3d& in, LLSD& out);
+template <> eControlType get_control_type<LLRect>(const LLRect& in, LLSD& out);
+template <> eControlType get_control_type<LLColor4>(const LLColor4& in, LLSD& out);
+template <> eControlType get_control_type<LLColor3>(const LLColor3& in, LLSD& out);
+template <> eControlType get_control_type<LLColor4U>(const LLColor4U& in, LLSD& out);
+template <> eControlType get_control_type<LLSD>(const LLSD& in, LLSD& out);
+
+//#define TEST_CACHED_CONTROL 1
+#ifdef TEST_CACHED_CONTROL
+void test_cached_control();
+#endif // TEST_CACHED_CONTROL
+
#endif // LL_LLVIEWERCONTROL_H