summaryrefslogtreecommitdiff
path: root/indra/newview/scripts/lua/require/UI
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-08-23 22:39:30 -0400
committerNat Goodspeed <nat@lindenlab.com>2024-08-23 22:39:30 -0400
commite6d8379744b08f9a52af6734ba1f0e1b50fb5906 (patch)
treec882e265b9f060bfb24ce21f98b613b06305b907 /indra/newview/scripts/lua/require/UI
parent2e815acb529159f5b6f0a4365a2eaf64d35330cc (diff)
Massage results from UI.popup() for ease of use.
In particular, where the raw leap.request().response call would return {OK_okcancelbuttons=true}, just return the string 'OK' or 'Cancel'. Update existing consumer scripts.
Diffstat (limited to 'indra/newview/scripts/lua/require/UI')
-rw-r--r--indra/newview/scripts/lua/require/UI/popup.lua77
1 files changed, 53 insertions, 24 deletions
diff --git a/indra/newview/scripts/lua/require/UI/popup.lua b/indra/newview/scripts/lua/require/UI/popup.lua
index 3aaadf85ba..8ccf3b87f3 100644
--- a/indra/newview/scripts/lua/require/UI/popup.lua
+++ b/indra/newview/scripts/lua/require/UI/popup.lua
@@ -1,53 +1,82 @@
local leap = require 'leap'
local mapargs = require 'mapargs'
+local util = require 'util'
-- notification is any name defined in notifications.xml as
-- <notification name=>
-- vars is a table providing values for [VAR] substitution keys in the
-- notification body
-- payload prepopulates the response table
--- wait=false means fire and forget, otherwise wait for user response
-local popup_meta = {
- -- setting this function as getmetatable(popup).__call() means this gets
- -- called when a consumer calls popup(notification, vars, payload)
+-- wait=false means fire and forget, returning nil
+-- wait=true waits for user response:
+-- * If the viewer returns a table containing exactly one key=true pair,
+-- popup() returns just that key. If the key is a string containing an
+-- underscore, e.g. 'OK_okcancelbuttons', it's truncated at the first
+-- underscore, e.g. 'OK'.
+-- * Otherwise the viewer's response is returned unchanged. To suppress the
+-- above transformations, pass a non-empty payload table; this will cause
+-- the viewer to return a table with at least two keys.
+local popup = util.setmetamethods{
+ -- this gets called when a consumer calls popup(notification, vars, payload)
__call = function(self, ...)
local args = mapargs('notification,vars,payload,wait', ...)
-- we use convenience argument names different from 'LLNotifications'
-- listener
- args.name = args.notification
- args.notification = nil
- args.substitutions = args.vars
- args.vars = nil
- local wait = args.wait
- args.wait = nil
- args.op = 'requestAdd'
+ newargs = {op='requestAdd',
+ name=args.notification,
+ substitutions=args.vars,
+ payload=args.payload}
-- Specifically test (wait == false), NOT (not wait), because we treat
-- nil (omitted, default true) differently than false (explicitly
-- DON'T wait).
- if wait == false then
- leap.send('LLNotifications', args)
+ if args.wait == false then
+ leap.send('LLNotifications', newargs)
else
- return leap.request('LLNotifications', args).response
+ local response = leap.request('LLNotifications', newargs).response
+ -- response is typically a table. It might have multiple keys,
+ -- e.g. if caller passed non-empty payload. In that case, just
+ -- return the whole thing.
+ if type(response) ~= 'table' then
+ return response
+ end
+ -- get first key=value pair, if any
+ local key, value = next(response)
+ if (not key) or next(response, key) then
+ -- key == nil means response is empty
+ -- next(response, non-nil first key) ~= nil means at least two keys
+ return response
+ end
+ -- Here response is a table containing exactly one key. The
+ -- notifications system typically returns a table of the form
+ -- {OK_okcancelbuttons=true}, which is tricky to test for because it
+ -- varies with each set of buttons.
+ if value == true then
+ -- change {key=true} to plain key
+ response = key
+ if type(response) == 'string' then
+ -- change 'OK_okcancelbuttons' to plain 'OK'
+ response = string.split(response, '_')[1]
+ end
+ end
+ return response
end
end
}
-local popup = setmetatable({}, popup_meta)
-
-function popup:alert(message)
- return self('GenericAlert', {MESSAGE=message})
+function popup:alert(message, payload)
+ return self('GenericAlert', {MESSAGE=message, payload=payload})
end
-function popup:alertOK(message)
- return self('GenericAlertOK', {MESSAGE=message})
+function popup:alertOK(message, payload)
+ return self('GenericAlertOK', {MESSAGE=message, payload=payload})
end
-function popup:alertYesCancel(message)
- return self('GenericAlertYesCancel', {MESSAGE=message})
+function popup:alertYesCancel(message, payload)
+ return self('GenericAlertYesCancel', {MESSAGE=message, payload=payload})
end
-function popup:tip(message)
- self{'SystemMessageTip', {MESSAGE=message}, wait=false}
+function popup:tip(message, payload)
+ self{'SystemMessageTip', {MESSAGE=message, payload=payload}, wait=false}
end
return popup