summaryrefslogtreecommitdiff
path: root/indra/newview/lluilistener.cpp
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2011-02-22 20:13:07 -0500
committerNat Goodspeed <nat@lindenlab.com>2011-02-22 20:13:07 -0500
commit1362a3e117dadbc5b1de18487314d4af57ce850f (patch)
tree84dd5e85d7d727e6e1f4fb9760c70050853c8ea4 /indra/newview/lluilistener.cpp
parentdbaef6ef1fa6461373cd7117f20f5b8fd4e8db6c (diff)
Move Josh's resolvePath() function to LLUI.
Use boost::split_iterator to split LLView pathname on slashes.
Diffstat (limited to 'indra/newview/lluilistener.cpp')
-rw-r--r--indra/newview/lluilistener.cpp89
1 files changed, 4 insertions, 85 deletions
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index d02d126cb5..6b2cd71d40 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -32,10 +32,9 @@
#include "lluilistener.h"
// STL headers
// std headers
-#include <sstream>
// external library headers
// other Linden headers
-#include "llviewerwindow.h" // to get root view
+#include "llui.h" // getRootView(), resolvePath()
#include "lluictrl.h"
#include "llerror.h"
@@ -55,7 +54,7 @@ LLUIListener::LLUIListener():
"For the UI control identified by the path in [\"path\"], return the control's\n"
"current value as [\"value\"] reply.",
&LLUIListener::getValue,
- LLSD().with("path", LLSD()));
+ LLSDMap("path", LLSD())("reply", LLSD()));
}
void LLUIListener::call(const LLSD& event) const
@@ -81,92 +80,12 @@ void LLUIListener::call(const LLSD& event) const
}
}
-// Split string given a single character delimiter.
-// Note that this returns empty strings for leading, trailing, and adjacent
-// delimiters, such as "/foo/bar//baz/" -> ["", "foo", "bar", "", "baz", "" ]
-std::vector<std::string> split(const std::string& s, char delim)
-{
- std::stringstream ss(s);
- std::string item;
- std::vector<std::string> items;
- while (std::getline(ss, item, delim))
- {
- items.push_back(item);
- }
- return items;
-}
-
-// Walk the LLView tree to resolve a path
-// Paths can be discovered using Develop > XUI > Show XUI Paths
-//
-// A leading "/" indicates the root of the tree is the starting
-// position of the search, (otherwise the context node is used)
-//
-// Adjacent "//" mean that the next level of the search is done
-// recursively ("descendant" rather than "child").
-//
-// Return values: If no match is found, NULL is returned,
-// otherwise the matching LLView* is returned.
-//
-// Examples:
-//
-// "/" -> return the root view
-// "/foo" -> find "foo" as a direct child of the root
-// "foo" -> find "foo" as a direct child of the context node
-// "//foo" -> find the first "foo" child anywhere in the tree
-// "/foo/bar" -> find "foo" as direct child of the root, and
-// "bar" as a direct child of "foo"
-// "//foo//bar/baz" -> find the first "foo" anywhere in the
-// tree, the first "bar" anywhere under it, and "baz"
-// as a direct child of that
-//
-const LLView* resolve_path(const LLView* context, const std::string path)
-{
- std::vector<std::string> parts = split(path, '/');
-
- if (parts.size() == 0)
- {
- return context;
- }
-
- std::vector<std::string>::iterator it = parts.begin();
-
- // leading / means "start at root"
- if ((*it).length() == 0)
- {
- context = (LLView*)(gViewerWindow->getRootView());
- it++;
- }
-
- bool recurse = false;
- for (; it != parts.end() && context; it++)
- {
- std::string part = *it;
-
- if (part.length() == 0)
- {
- recurse = true;
- }
- else
- {
- const LLView* found = context->findChildView(part, recurse);
- if (!found)
- return NULL;
-
- context = found;
- recurse = false;
- }
- }
-
- return context;
-}
-
void LLUIListener::getValue(const LLSD&event) const
{
LLSD reply = LLSD::emptyMap();
- const LLView* root = (LLView*)(gViewerWindow->getRootView());
- const LLView* view = resolve_path(root, event["path"].asString());
+ const LLView* root = LLUI::getRootView();
+ const LLView* view = LLUI::resolvePath(root, event["path"].asString());
const LLUICtrl* ctrl(dynamic_cast<const LLUICtrl*>(view));
if (ctrl)