summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authornat-goodspeed <nat@lindenlab.com>2024-09-09 17:14:35 -0400
committerGitHub <noreply@github.com>2024-09-09 17:14:35 -0400
commit0c451a60b7fe859f9deeaefb6360e96ec9af630f (patch)
tree6c1bfbbef656b818f026a371136d345e88a41c71 /indra/newview
parent04568da18d2261f3f7b851cf5341b766c9648204 (diff)
parent0c42147fabaef31a2c577fc009dec354447c2e7f (diff)
Merge pull request #2523 from secondlife/lua-feature-flag
Put viewer's Lua functionality behind a feature flag, default off.
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/lluilistener.cpp41
-rw-r--r--indra/newview/scripts/lua/auto/menus.lua51
-rw-r--r--indra/newview/scripts/lua/require/UI.lua4
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml21
-rw-r--r--indra/newview/tests/cppfeatures_test.cpp2
6 files changed, 101 insertions, 29 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 248992fd07..c6946d1ec1 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3999,6 +3999,17 @@
<string>scripts/lua</string>
</array>
</map>
+ <key>LuaFeature</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewer's Lua script engine.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>LuaRequirePath</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index c389d04443..44eb8461f1 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -90,12 +90,14 @@ LLUIListener::LLUIListener():
add("addMenuItem",
"Add new menu item [\"name\"] with displayed [\"label\"]\n"
"and call-on-click UI function [\"func\"] with optional [\"param\"]\n"
- "to the [\"parent_menu\"] within the Top menu.",
+ "to the [\"parent_menu\"] within the Top menu.\n"
+ "If [\"pos\"] is present, insert at specified 0-relative position.",
&LLUIListener::addMenuItem,
required_args.with("func", LLSD()));
add("addMenuSeparator",
- "Add menu separator to the [\"parent_menu\"] within the Top menu.",
+ "Add menu separator to the [\"parent_menu\"] within the Top menu.\n"
+ "If [\"pos\"] is present, insert at specified 0-relative position.",
&LLUIListener::addMenuSeparator,
llsd::map("parent_menu", LLSD(), "reply", LLSD()));
@@ -264,6 +266,13 @@ LLMenuGL* get_parent_menu(LLEventAPI::Response& response, const LLSD&event)
return parent_menu;
}
+// Return event["pos"].asInteger() if passed, but clamp (0 <= pos <= size).
+// Reserve -1 return to mean event has no "pos" key.
+S32 get_pos(const LLSD& event, U32 size)
+{
+ return event["pos"].isInteger()? llclamp(event["pos"].asInteger(), 0, size) : -1;
+}
+
void LLUIListener::addMenu(const LLSD&event) const
{
Response response(LLSD(), event);
@@ -302,9 +311,19 @@ void LLUIListener::addMenuItem(const LLSD&event) const
item_params.on_click = item_func;
if(LLMenuGL* parent_menu = get_parent_menu(response, event))
{
- if(!parent_menu->append(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params)))
+ auto item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
+ // Clamp pos to getItemCount(), meaning append. If pos exceeds that,
+ // insert() will silently ignore the request.
+ auto pos = get_pos(event, parent_menu->getItemCount());
+ if (pos >= 0)
{
- response.error(stringize("Menu item ", std::quoted(event["name"].asString()), " was not added"));
+ // insert() returns void: we just have to assume it worked.
+ parent_menu->insert(pos, item);
+ }
+ else if (! parent_menu->append(item))
+ {
+ response.error(stringize("Menu item ", std::quoted(event["name"].asString()),
+ " was not added"));
}
}
}
@@ -314,7 +333,19 @@ void LLUIListener::addMenuSeparator(const LLSD&event) const
Response response(LLSD(), event);
if(LLMenuGL* parent_menu = get_parent_menu(response, event))
{
- if(!parent_menu->addSeparator())
+ // Clamp pos to getItemCount(), meaning append. If pos exceeds that,
+ // insert() will silently ignore the request.
+ auto pos = get_pos(event, parent_menu->getItemCount());
+ if (pos >= 0)
+ {
+ // Even though addSeparator() does not accept a position,
+ // LLMenuItemSeparatorGL isa LLMenuItemGL, so we can use insert().
+ LLMenuItemSeparatorGL::Params p;
+ LLMenuItemGL* separator = LLUICtrlFactory::create<LLMenuItemSeparatorGL>(p);
+ // insert() returns void: we just have to assume it worked.
+ parent_menu->insert(pos, separator);
+ }
+ else if (! parent_menu->addSeparator())
{
response.error("Separator was not added");
}
diff --git a/indra/newview/scripts/lua/auto/menus.lua b/indra/newview/scripts/lua/auto/menus.lua
new file mode 100644
index 0000000000..b2f54d83df
--- /dev/null
+++ b/indra/newview/scripts/lua/auto/menus.lua
@@ -0,0 +1,51 @@
+-- Inject Lua-related menus into the top menu structure. Run this as a Lua
+-- script so that turning off the Lua feature also disables these menus.
+
+-- Under Develop -> Consoles, want to present the equivalent of:
+-- <menu_item_separator/>
+-- <menu_item_check
+-- label="LUA Debug Console"
+-- name="LUA Debug Console">
+-- <menu_item_check.on_check
+-- function="Floater.Visible"
+-- parameter="lua_debug" />
+-- <menu_item_check.on_click
+-- function="Floater.Toggle"
+-- parameter="lua_debug" />
+-- </menu_item_check>
+-- <menu_item_check
+-- label="LUA Scripts Info"
+-- name="LUA Scripts">
+-- <menu_item_check.on_check
+-- function="Floater.Visible"
+-- parameter="lua_scripts" />
+-- <menu_item_check.on_click
+-- function="Floater.Toggle"
+-- parameter="lua_scripts" />
+-- </menu_item_check>
+
+local startup = require 'startup'
+local UI = require 'UI'
+
+-- Don't mess with the viewer's menu structure until we've logged in.
+startup.wait('STATE_STARTED')
+
+-- Add LUA Debug Console to Develop->Consoles
+local pos = 9
+UI.addMenuSeparator{
+ parent_menu='Consoles', pos=pos,
+}
+pos += 1
+UI.addMenuItem{
+ parent_menu='Consoles', pos=pos,
+ name='lua_debug', label='LUA Debug Console',
+ func='Floater.ToggleOrBringToFront', param='lua_debug',
+}
+pos += 1
+
+-- Add LUA Scripts Info to Develop->Consoles
+UI.addMenuItem{
+ parent_menu='Consoles', pos=pos,
+ name='lua_scripts', label='LUA Scripts Info',
+ func='Floater.ToggleOrBringToFront', param='lua_scripts',
+}
diff --git a/indra/newview/scripts/lua/require/UI.lua b/indra/newview/scripts/lua/require/UI.lua
index 73a76fa6b8..cf2695917e 100644
--- a/indra/newview/scripts/lua/require/UI.lua
+++ b/indra/newview/scripts/lua/require/UI.lua
@@ -170,13 +170,13 @@ end
-- see UI.callables() for valid values of 'func'
function UI.addMenuItem(...)
- local args = mapargs('name,label,parent_menu,func,param', ...)
+ local args = mapargs('name,label,parent_menu,func,param,pos', ...)
args.op = 'addMenuItem'
return leap.request('UI', args)
end
function UI.addMenuSeparator(...)
- local args = mapargs('parent_menu', ...)
+ local args = mapargs('parent_menu,pos', ...)
args.op = 'addMenuSeparator'
return leap.request('UI', args)
end
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 8999797049..7fe9d0efe5 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2565,27 +2565,6 @@ function="World.EnvPreset"
parameter="scene monitor" />
</menu_item_check>
<menu_item_separator/>
- <menu_item_check
- label="LUA Debug Console"
- name="LUA Debug Console">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="lua_debug" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="lua_debug" />
- </menu_item_check>
- <menu_item_check
- label="LUA Scripts Info"
- name="LUA Scripts">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="lua_scripts" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="lua_scripts" />
- </menu_item_check>
- <menu_item_separator/>
<menu_item_call
label="Region Info to Debug Console"
diff --git a/indra/newview/tests/cppfeatures_test.cpp b/indra/newview/tests/cppfeatures_test.cpp
index f5ea3a522b..ca94dcfc95 100644
--- a/indra/newview/tests/cppfeatures_test.cpp
+++ b/indra/newview/tests/cppfeatures_test.cpp
@@ -283,7 +283,7 @@ void cpp_features_test_object_t::test<8>()
ensure("init member inline 1", ii.mFoo==10);
InitInlineWithConstructor iici;
- ensure("init member inline 2", iici.mFoo=10);
+ ensure("init member inline 2", iici.mFoo==10);
ensure("init member inline 3", iici.mBar==25);
}