summaryrefslogtreecommitdiff
path: root/indra/llui/llui.h
diff options
context:
space:
mode:
authorAaron Brashears <aaronb@lindenlab.com>2007-06-13 18:02:37 +0000
committerAaron Brashears <aaronb@lindenlab.com>2007-06-13 18:02:37 +0000
commitf118e7c80b95d8c0a0c8abb14ff379b6697e01b6 (patch)
treedb55a74f8d18b3c366608a537e2a32f6d089d56f /indra/llui/llui.h
parent680667d4bdca7e2a6df15cd6f16f34c12c97da8e (diff)
result of merge manually performed through diff and patch. svn diff svn+ssh://svn/svn/linden/release@63615 svn+ssh://svn/svn/linden/branches/release-candidate@63637 | patch -p0 in release
Diffstat (limited to 'indra/llui/llui.h')
-rw-r--r--indra/llui/llui.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index c8c244072e..dbe79338e5 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -255,4 +255,95 @@ typedef enum e_widget_type
WIDGET_TYPE_COUNT
} EWidgetType;
+// Manages generation of UI elements by LLSD, such that there is
+// only one instance per uniquely identified LLSD parameter
+// Class T is the instance type being managed, and INSTANCE_ADDAPTOR
+// wraps an instance of the class with handlers for show/hide semantics, etc.
+template <class T, class INSTANCE_ADAPTOR = T>
+class LLUIInstanceMgr
+{
+public:
+ LLUIInstanceMgr()
+ {
+ }
+
+ virtual ~LLUIInstanceMgr()
+ {
+ }
+
+ // default show and hide methods
+ static T* showInstance(const LLSD& seed)
+ {
+ T* instance = INSTANCE_ADAPTOR::getInstance(seed);
+ INSTANCE_ADAPTOR::show(instance);
+ return instance;
+ }
+
+ static void hideInstance(const LLSD& seed)
+ {
+ T* instance = INSTANCE_ADAPTOR::getInstance(seed);
+ INSTANCE_ADAPTOR::hide(instance);
+ }
+
+ static void toggleInstance(const LLSD& seed)
+ {
+ if (!INSTANCE_ADAPTOR::instanceVisible(seed))
+ {
+ INSTANCE_ADAPTOR::showInstance(seed);
+ }
+ else
+ {
+ INSTANCE_ADAPTOR::hideInstance(seed);
+ }
+ }
+
+ static BOOL instanceVisible(const LLSD& seed)
+ {
+ T* instance = INSTANCE_ADAPTOR::findInstance(seed);
+ return instance != NULL && INSTANCE_ADAPTOR::visible(instance);
+ }
+
+ static T* getInstance(const LLSD& seed)
+ {
+ T* instance = INSTANCE_ADAPTOR::findInstance(seed);
+ if (instance == NULL)
+ {
+ instance = INSTANCE_ADAPTOR::createInstance(seed);
+ }
+ return instance;
+ }
+};
+
+// Creates a UI singleton by ignoring the identifying parameter
+// and always generating the same instance via the LLUIInstanceMgr interface.
+// Note that since UI elements can be destroyed by their hierarchy, this singleton
+// pattern uses a static pointer to an instance that will be re-created as needed.
+template <class T, class INSTANCE_ADAPTOR = T>
+class LLUISingleton: public LLUIInstanceMgr<T, INSTANCE_ADAPTOR>
+{
+public:
+ // default constructor assumes T is derived from LLUISingleton (a true singleton)
+ LLUISingleton() : LLUIInstanceMgr<T, INSTANCE_ADAPTOR>() { sInstance = (T*)this; }
+ ~LLUISingleton() { sInstance = NULL; }
+
+ static T* findInstance(const LLSD& seed)
+ {
+ return sInstance;
+ }
+
+ static T* createInstance(const LLSD& seed)
+ {
+ if (sInstance == NULL)
+ {
+ sInstance = new T(seed);
+ }
+ return sInstance;
+ }
+
+protected:
+ static T* sInstance;
+};
+
+template <class T, class U> T* LLUISingleton<T,U>::sInstance = NULL;
+
#endif