summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authornat-goodspeed <nat@lindenlab.com>2024-08-02 09:41:48 -0400
committerGitHub <noreply@github.com>2024-08-02 09:41:48 -0400
commit3591afb2a8eba2599d76f3f41d413c882634f017 (patch)
treeea55aac81fd391c0b13e71928d3db9967e775d68 /indra/newview
parentb0208049fe5e1d84589f994dcd66571f92730305 (diff)
parent6396db7d83c36456e34812deff9e89850f0d9df2 (diff)
Merge pull request #2174 from secondlife/lua-callables
Add UI.callables() and corresponding entry point.
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/lluilistener.cpp43
-rw-r--r--indra/newview/lluilistener.h1
-rw-r--r--indra/newview/scripts/lua/require/UI.lua6
-rw-r--r--indra/newview/scripts/lua/test_callables.lua6
4 files changed, 56 insertions, 0 deletions
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index c73c93859a..2b2187a73b 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -55,6 +55,13 @@ LLUIListener::LLUIListener():
&LLUIListener::call,
llsd::map("function", LLSD(), "reply", LLSD()));
+ add("callables",
+ "Return a list [\"callables\"] of dicts {name, access} of functions registered to\n"
+ "invoke with \"call\".\n"
+ "access has values \"allow\", \"block\" or \"throttle\".",
+ &LLUIListener::callables,
+ llsd::map("reply", LLSD::String()));
+
add("getValue",
"For the UI control identified by the path in [\"path\"], return the control's\n"
"current value as [\"value\"] reply.",
@@ -131,6 +138,42 @@ void LLUIListener::call(const LLSD& event)
(info->callback_func)(NULL, event["parameter"]);
}
+void LLUIListener::callables(const LLSD& event) const
+{
+ Response response(LLSD(), event);
+
+ using Registry = LLUICtrl::CommitCallbackRegistry;
+ using Method = Registry::Registrar& (*)();
+ static Method registrars[] =
+ {
+ &Registry::defaultRegistrar,
+ &Registry::currentRegistrar,
+ };
+ LLSD list;
+ for (auto method : registrars)
+ {
+ auto& registrar{ (*method)() };
+ for (auto it = registrar.beginItems(), end = registrar.endItems(); it != end; ++it)
+ {
+ LLSD entry{ llsd::map("name", it->first) };
+ switch (it->second.handle_untrusted)
+ {
+ case LLUICtrl::CommitCallbackInfo::UNTRUSTED_ALLOW:
+ entry["access"] = "allow";
+ break;
+ case LLUICtrl::CommitCallbackInfo::UNTRUSTED_BLOCK:
+ entry["access"] = "block";
+ break;
+ case LLUICtrl::CommitCallbackInfo::UNTRUSTED_THROTTLE:
+ entry["access"] = "throttle";
+ break;
+ }
+ list.append(entry);
+ }
+ }
+ response["callables"] = list;
+}
+
void LLUIListener::getValue(const LLSD&event) const
{
Response response(LLSD(), event);
diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h
index cbb5014300..c90253ab59 100644
--- a/indra/newview/lluilistener.h
+++ b/indra/newview/lluilistener.h
@@ -41,6 +41,7 @@ public:
private:
void call(const LLSD& event);
+ void callables(const LLSD& event) const;
void getValue(const LLSD&event) const;
void addMenu(const LLSD&event) const;
diff --git a/indra/newview/scripts/lua/require/UI.lua b/indra/newview/scripts/lua/require/UI.lua
index 28488ff3e1..06b49c6269 100644
--- a/indra/newview/scripts/lua/require/UI.lua
+++ b/indra/newview/scripts/lua/require/UI.lua
@@ -14,6 +14,10 @@ function UI.call(func, parameter)
leap.request('UI', {op='call', ['function']=func, parameter=parameter})
end
+function UI.callables()
+ return leap.request('UI', {op='callables'}).callables
+end
+
function UI.getValue(path)
return leap.request('UI', {op='getValue', path=path})['value']
end
@@ -152,6 +156,7 @@ function UI.addMenuBranch(...)
return leap.request('UI', args)
end
+-- see UI.callables() for valid values of 'func'
function UI.addMenuItem(...)
local args = mapargs('name,label,parent_menu,func,param', ...)
args.op = 'addMenuItem'
@@ -163,4 +168,5 @@ function UI.addMenuSeparator(...)
args.op = 'addMenuSeparator'
return leap.request('UI', args)
end
+
return UI
diff --git a/indra/newview/scripts/lua/test_callables.lua b/indra/newview/scripts/lua/test_callables.lua
new file mode 100644
index 0000000000..1bee062db8
--- /dev/null
+++ b/indra/newview/scripts/lua/test_callables.lua
@@ -0,0 +1,6 @@
+startup=require 'startup'
+UI=require 'UI'
+startup.wait('STATE_LOGIN_WAIT')
+for _, cbl in pairs(UI.callables()) do
+ print(`{cbl.name} ({cbl.access})`)
+end