diff options
Diffstat (limited to 'indra/newview/llviewercontrol.h')
-rw-r--r-- | indra/newview/llviewercontrol.h | 110 |
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 |