mirror of
https://github.com/britzl/monarch.git
synced 2025-11-26 19:00:53 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ba3064749 | ||
|
|
b78b896ada | ||
|
|
679482f84d | ||
|
|
4c6e26fd71 | ||
|
|
00c30792a9 | ||
|
|
b01f5d28c3 | ||
|
|
43e847dacc | ||
|
|
ce5ca26b6c | ||
|
|
742779d749 | ||
|
|
84944f3f22 | ||
|
|
c473aa053c | ||
|
|
169236acbd |
@@ -212,12 +212,21 @@ IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from
|
||||
* `fn` (function) - The function to call screen focus changes
|
||||
|
||||
|
||||
## monarch.on_post(screen_id, fn)
|
||||
Set a function to be called when `msg.post()` is called on a specific screen. IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from the same script as this function was called.
|
||||
## monarch.on_post(screen_id, fn_or_url)
|
||||
Set either a function to be called when `msg.post()` is called on a specific screen or a URL where the message is sent.
|
||||
|
||||
IMPORTANT! If you provide a function you must also make sure to call `monarch.on_message(message_id, message, sender)` from the same script as this function was called.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen
|
||||
* `fn` (function) - The function to call when the screen receives a message using `msg.post`
|
||||
* `fn_or_url` (function) - The function to call or URL to send message to
|
||||
|
||||
|
||||
## monarch.has_missing_resources(screen_id)
|
||||
Check if a screen has any missing resources. If the screen is loaded by a collection proxy with Load Dynamically this will use `collectionproxy.missing_resources()`. For other cases this function will always return false.
|
||||
|
||||
**RETURN**
|
||||
* `result` (boolean) - true if the screen has missing resources
|
||||
|
||||
|
||||
## monarch.debug()
|
||||
|
||||
@@ -114,7 +114,7 @@ end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
if message_id == hash("my_resize_message") then
|
||||
self.transition.window_resized(message.width, message.height)
|
||||
transition.window_resized(message.width, message.height)
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
@@ -29,7 +29,7 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
elseif gui.pick_node(self.no, action.x, action.y) then
|
||||
print("no")
|
||||
monarch.back(function()
|
||||
monarch.back(nil, nil, function()
|
||||
print("back from popup done")
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -27,7 +27,7 @@ function on_input(self, action_id, action)
|
||||
end)
|
||||
elseif gui.pick_node(self.cancel, action.x, action.y) then
|
||||
print("cancel")
|
||||
monarch.back(function()
|
||||
monarch.back(nil, nil, function()
|
||||
print("back from popup done")
|
||||
end)
|
||||
elseif gui.pick_node(self.about, action.x, action.y) then
|
||||
|
||||
@@ -19,7 +19,7 @@ function on_input(self, action_id, action)
|
||||
end)
|
||||
elseif gui.pick_node(self.back, action.x, action.y) then
|
||||
print("back")
|
||||
monarch.back(function()
|
||||
monarch.back(nil, nil, function()
|
||||
print("back from pregame done")
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -228,6 +228,17 @@ function M.is_visible(id)
|
||||
end
|
||||
|
||||
|
||||
--- Check if a screen is loaded
|
||||
-- @param id (string|hash)
|
||||
-- @return true if the screen is loaded
|
||||
function M.is_loaded(id)
|
||||
assert(id, "You must provide a screen id")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
return screens[id].loaded
|
||||
end
|
||||
|
||||
|
||||
--- Check if a screen is a popup
|
||||
-- @param id Screen id
|
||||
-- @return true if the screen is a popup
|
||||
@@ -419,7 +430,9 @@ local function unload(screen, force)
|
||||
elseif screen.factory then
|
||||
log("unload() factory", screen.id)
|
||||
for id, instance in pairs(screen.factory_ids) do
|
||||
go.delete(instance)
|
||||
if go.exists(instance) then
|
||||
go.delete(instance)
|
||||
end
|
||||
end
|
||||
screen.factory_ids = nil
|
||||
if screen.auto_preload and not force then
|
||||
@@ -451,8 +464,7 @@ local function preload(screen)
|
||||
screen.preloading = true
|
||||
if screen.proxy then
|
||||
log("preload() proxy")
|
||||
local missing_resources = collectionproxy.missing_resources(screen.proxy)
|
||||
if #missing_resources > 0 then
|
||||
if M.has_missing_resources(screen.id) then
|
||||
local error_message = ("preload() collection proxy %s is missing resources"):format(tostring(screen.id))
|
||||
log(error_message)
|
||||
screen.preloading = false
|
||||
@@ -509,8 +521,12 @@ local function load(screen)
|
||||
msg.post(screen.proxy, MSG_ENABLE)
|
||||
elseif screen.factory then
|
||||
screen.factory_ids = collectionfactory.create(screen.factory)
|
||||
screen.transition_url = screen.factory_ids[screen.transition_id]
|
||||
screen.focus_url = screen.factory_ids[screen.focus_id]
|
||||
if screen.transition_id then
|
||||
screen.transition_url = screen.factory_ids[screen.transition_id]
|
||||
end
|
||||
if screen.focus_id then
|
||||
screen.focus_url = screen.factory_ids[screen.focus_id]
|
||||
end
|
||||
end
|
||||
screen.loaded = true
|
||||
screen.preloaded = false
|
||||
@@ -909,7 +925,7 @@ function M.hide(id, cb)
|
||||
log("hide() you can only hide the screen at the top of the stack", id)
|
||||
return false
|
||||
end
|
||||
return M.back(id, cb)
|
||||
return M.back(nil, nil, cb)
|
||||
else
|
||||
log("hide() queuing action", id)
|
||||
queue_action(function(action_done, action_error)
|
||||
@@ -971,17 +987,6 @@ end
|
||||
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again
|
||||
function M.back(options, data, cb)
|
||||
log("back() queuing action")
|
||||
-- backwards compatibility with old version M.back(data, cb)
|
||||
-- case when back(data, cb)
|
||||
if type(data) == "function" then
|
||||
cb = data
|
||||
data = options
|
||||
options = nil
|
||||
-- case when back(data, nil)
|
||||
elseif options ~= nil and data == nil and cb == nil then
|
||||
data = options
|
||||
options = nil
|
||||
end
|
||||
|
||||
queue_action(function(action_done)
|
||||
local callbacks = callback_tracker()
|
||||
@@ -1127,6 +1132,20 @@ function M.preload(id, options, cb)
|
||||
return true -- return true for legacy reasons (before queue existed)
|
||||
end
|
||||
|
||||
--- Check if a screen has missing resources, always returns false for factory
|
||||
-- @param id (string|hash) - Id of the screen to preload
|
||||
function M.has_missing_resources(id)
|
||||
assert(id, "You must provide a screen id")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
|
||||
local screen = screens[id]
|
||||
if screen.proxy then
|
||||
local missing_resources = collectionproxy.missing_resources(screen.proxy)
|
||||
return #missing_resources > 0
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
--- Unload a preloaded monarch screen
|
||||
-- @param id (string|hash) - Id of the screen to unload
|
||||
@@ -1178,8 +1197,8 @@ end
|
||||
-- @return error (string|nil) Error message if unable to send message
|
||||
function M.post(id, message_id, message)
|
||||
assert(id, "You must provide a screen id")
|
||||
if not M.is_visible(id) then
|
||||
return false, "Unable to post message to screen if it isn't visible"
|
||||
if not M.is_loaded(id) then
|
||||
return false, "Unable to post message to screen if it isn't loaded"
|
||||
end
|
||||
|
||||
assert(message_id, "You must provide a message_id")
|
||||
@@ -1331,24 +1350,36 @@ function M.on_focus_changed(id, fn)
|
||||
end
|
||||
|
||||
---
|
||||
-- Set a function to call when a screen is sent a message using monarch.post()
|
||||
-- The function will receive (message_id, message, sender)
|
||||
-- IMPORTANT! You must call monarch.on_message() from the same script as
|
||||
-- this function was called
|
||||
-- Set either a function to be called when msg.post() is called on a specific
|
||||
-- screen or a URL where the message is sent.
|
||||
-- IMPORTANT! If you provide a function you must also make sure to call
|
||||
-- monarch.on_message(message_id, message, sender) from the same script as
|
||||
-- this function was called.
|
||||
-- @param id Screen id to associate the message listener function with
|
||||
-- @param fn Message listener function
|
||||
function M.on_post(id, fn)
|
||||
-- @param fn_or_url The function to call or URL to send message to
|
||||
function M.on_post(id, fn_or_url)
|
||||
assert(id, "You must provide a screen id")
|
||||
assert(fn, "You must provide a post receiver function")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
local screen = screens[id]
|
||||
screen.receiver_url = msg.url()
|
||||
screen.receiver_fn = fn
|
||||
|
||||
local t = type(fn_or_url)
|
||||
if t == "function" then
|
||||
screen.receiver_fn = fn_or_url
|
||||
screen.receiver_url = msg.url()
|
||||
elseif t == "userdata" or t == "string" then
|
||||
screen.receiver_fn = nil
|
||||
screen.receiver_url = fn_or_url
|
||||
else
|
||||
screen.receiver_fn = nil
|
||||
screen.receiver_url = msg.url()
|
||||
end
|
||||
end
|
||||
|
||||
local empty_hash = hash("")
|
||||
|
||||
local function url_to_key(url)
|
||||
return (url.socket or hash("")) .. (url.path or hash("")) .. (url.fragment or hash(""))
|
||||
return (url.socket or empty_hash) .. (url.path or empty_hash) .. (url.fragment or empty_hash)
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -142,12 +142,12 @@ return function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN2))
|
||||
|
||||
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 }))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
@@ -155,6 +155,17 @@ return function()
|
||||
assert(wait_until_visible(POPUP1))
|
||||
end)
|
||||
|
||||
it("should be able to tell if a screen is loaded or not", function()
|
||||
assert(not monarch.is_loaded(SCREEN1))
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
assert(monarch.is_loaded(SCREEN1))
|
||||
|
||||
monarch.hide(SCREEN1)
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(not monarch.is_loaded(SCREEN1))
|
||||
end)
|
||||
|
||||
it("should be able to show a screen without adding it to the stack", function()
|
||||
monarch.show(BACKGROUND, { no_stack = true })
|
||||
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
||||
|
||||
Reference in New Issue
Block a user