mirror of
https://github.com/britzl/monarch.git
synced 2025-11-26 19:00:53 +01:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c6e26fd71 | ||
|
|
00c30792a9 | ||
|
|
b01f5d28c3 | ||
|
|
43e847dacc | ||
|
|
ce5ca26b6c | ||
|
|
742779d749 | ||
|
|
84944f3f22 | ||
|
|
c473aa053c | ||
|
|
169236acbd | ||
|
|
b7053d2ce4 |
@@ -212,12 +212,14 @@ IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from
|
|||||||
* `fn` (function) - The function to call screen focus changes
|
* `fn` (function) - The function to call screen focus changes
|
||||||
|
|
||||||
|
|
||||||
## monarch.on_post(screen_id, fn)
|
## monarch.on_post(screen_id, fn_or_url)
|
||||||
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.
|
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**
|
**PARAMETERS**
|
||||||
* `screen_id` (string|hash) - Id of the screen
|
* `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.debug()
|
## monarch.debug()
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ end
|
|||||||
|
|
||||||
function on_message(self, message_id, message, sender)
|
function on_message(self, message_id, message, sender)
|
||||||
if message_id == hash("my_resize_message") then
|
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
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function on_input(self, action_id, action)
|
|||||||
end
|
end
|
||||||
elseif gui.pick_node(self.no, action.x, action.y) then
|
elseif gui.pick_node(self.no, action.x, action.y) then
|
||||||
print("no")
|
print("no")
|
||||||
monarch.back(function()
|
monarch.back(nil, nil, function()
|
||||||
print("back from popup done")
|
print("back from popup done")
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ function on_input(self, action_id, action)
|
|||||||
end)
|
end)
|
||||||
elseif gui.pick_node(self.cancel, action.x, action.y) then
|
elseif gui.pick_node(self.cancel, action.x, action.y) then
|
||||||
print("cancel")
|
print("cancel")
|
||||||
monarch.back(function()
|
monarch.back(nil, nil, function()
|
||||||
print("back from popup done")
|
print("back from popup done")
|
||||||
end)
|
end)
|
||||||
elseif gui.pick_node(self.about, action.x, action.y) then
|
elseif gui.pick_node(self.about, action.x, action.y) then
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ function on_input(self, action_id, action)
|
|||||||
end)
|
end)
|
||||||
elseif gui.pick_node(self.back, action.x, action.y) then
|
elseif gui.pick_node(self.back, action.x, action.y) then
|
||||||
print("back")
|
print("back")
|
||||||
monarch.back(function()
|
monarch.back(nil, nil, function()
|
||||||
print("back from pregame done")
|
print("back from pregame done")
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -228,6 +228,17 @@ function M.is_visible(id)
|
|||||||
end
|
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
|
--- Check if a screen is a popup
|
||||||
-- @param id Screen id
|
-- @param id Screen id
|
||||||
-- @return true if the screen is a popup
|
-- @return true if the screen is a popup
|
||||||
@@ -509,8 +520,12 @@ local function load(screen)
|
|||||||
msg.post(screen.proxy, MSG_ENABLE)
|
msg.post(screen.proxy, MSG_ENABLE)
|
||||||
elseif screen.factory then
|
elseif screen.factory then
|
||||||
screen.factory_ids = collectionfactory.create(screen.factory)
|
screen.factory_ids = collectionfactory.create(screen.factory)
|
||||||
screen.transition_url = screen.factory_ids[screen.transition_id]
|
if screen.transition_id then
|
||||||
screen.focus_url = screen.factory_ids[screen.focus_id]
|
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
|
end
|
||||||
screen.loaded = true
|
screen.loaded = true
|
||||||
screen.preloaded = false
|
screen.preloaded = false
|
||||||
@@ -909,7 +924,7 @@ function M.hide(id, cb)
|
|||||||
log("hide() you can only hide the screen at the top of the stack", id)
|
log("hide() you can only hide the screen at the top of the stack", id)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
return M.back(id, cb)
|
return M.back(nil, nil, cb)
|
||||||
else
|
else
|
||||||
log("hide() queuing action", id)
|
log("hide() queuing action", id)
|
||||||
queue_action(function(action_done, action_error)
|
queue_action(function(action_done, action_error)
|
||||||
@@ -971,29 +986,18 @@ end
|
|||||||
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again
|
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again
|
||||||
function M.back(options, data, cb)
|
function M.back(options, data, cb)
|
||||||
log("back() queuing action")
|
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)
|
queue_action(function(action_done)
|
||||||
local callbacks = callback_tracker()
|
local callbacks = callback_tracker()
|
||||||
local screen = table.remove(stack)
|
local screen = table.remove(stack)
|
||||||
if screen then
|
if screen then
|
||||||
log("back()", screen.id)
|
log("back()", screen.id)
|
||||||
local back_cb = callbacks.track()
|
|
||||||
local top = stack[#stack]
|
local top = stack[#stack]
|
||||||
-- if we go back to the same screen we need to first hide it
|
-- if we go back to the same screen we need to first hide it
|
||||||
-- and wait until it is hidden before we show it again
|
-- and wait until it is hidden before we show it again
|
||||||
local same_screen = top and top.id == screen.id
|
local same_screen = top and top.id == screen.id
|
||||||
if same_screen or (options and options.sequential) then
|
if same_screen or (options and options.sequential) then
|
||||||
|
local back_cb = callbacks.track()
|
||||||
back_out(screen, top, WAIT_FOR_TRANSITION, function()
|
back_out(screen, top, WAIT_FOR_TRANSITION, function()
|
||||||
if data then
|
if data then
|
||||||
top.data = data
|
top.data = data
|
||||||
@@ -1178,8 +1182,8 @@ end
|
|||||||
-- @return error (string|nil) Error message if unable to send message
|
-- @return error (string|nil) Error message if unable to send message
|
||||||
function M.post(id, message_id, message)
|
function M.post(id, message_id, message)
|
||||||
assert(id, "You must provide a screen id")
|
assert(id, "You must provide a screen id")
|
||||||
if not M.is_visible(id) then
|
if not M.is_loaded(id) then
|
||||||
return false, "Unable to post message to screen if it isn't visible"
|
return false, "Unable to post message to screen if it isn't loaded"
|
||||||
end
|
end
|
||||||
|
|
||||||
assert(message_id, "You must provide a message_id")
|
assert(message_id, "You must provide a message_id")
|
||||||
@@ -1331,20 +1335,30 @@ function M.on_focus_changed(id, fn)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
-- Set a function to call when a screen is sent a message using monarch.post()
|
-- Set either a function to be called when msg.post() is called on a specific
|
||||||
-- The function will receive (message_id, message, sender)
|
-- screen or a URL where the message is sent.
|
||||||
-- IMPORTANT! You must call monarch.on_message() from the same script as
|
-- IMPORTANT! If you provide a function you must also make sure to call
|
||||||
-- this function was called
|
-- 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 id Screen id to associate the message listener function with
|
||||||
-- @param fn Message listener function
|
-- @param fn_or_url The function to call or URL to send message to
|
||||||
function M.on_post(id, fn)
|
function M.on_post(id, fn_or_url)
|
||||||
assert(id, "You must provide a screen id")
|
assert(id, "You must provide a screen id")
|
||||||
assert(fn, "You must provide a post receiver function")
|
|
||||||
id = tohash(id)
|
id = tohash(id)
|
||||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||||
local screen = screens[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
|
end
|
||||||
|
|
||||||
local function url_to_key(url)
|
local function url_to_key(url)
|
||||||
|
|||||||
@@ -155,6 +155,17 @@ return function()
|
|||||||
assert(wait_until_visible(POPUP1))
|
assert(wait_until_visible(POPUP1))
|
||||||
end)
|
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()
|
it("should be able to show a screen without adding it to the stack", function()
|
||||||
monarch.show(BACKGROUND, { no_stack = true })
|
monarch.show(BACKGROUND, { no_stack = true })
|
||||||
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
||||||
@@ -424,10 +435,10 @@ return function()
|
|||||||
assert(#mock_msg.messages(URL2) == 2)
|
assert(#mock_msg.messages(URL2) == 2)
|
||||||
assert(mock_msg.messages(URL1)[3].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
assert(mock_msg.messages(URL1)[3].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||||
assert(mock_msg.messages(URL1)[3].message.screen == SCREEN2)
|
assert(mock_msg.messages(URL1)[3].message.screen == SCREEN2)
|
||||||
assert(mock_msg.messages(URL1)[4].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
assert(mock_msg.messages(URL1)[4].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
||||||
assert(mock_msg.messages(URL1)[4].message.screen == SCREEN2)
|
assert(mock_msg.messages(URL1)[4].message.screen == SCREEN1)
|
||||||
assert(mock_msg.messages(URL1)[5].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
assert(mock_msg.messages(URL1)[5].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||||
assert(mock_msg.messages(URL1)[5].message.screen == SCREEN1)
|
assert(mock_msg.messages(URL1)[5].message.screen == SCREEN2)
|
||||||
assert(mock_msg.messages(URL1)[6].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
assert(mock_msg.messages(URL1)[6].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
||||||
assert(mock_msg.messages(URL1)[6].message.screen == SCREEN1)
|
assert(mock_msg.messages(URL1)[6].message.screen == SCREEN1)
|
||||||
|
|
||||||
@@ -438,10 +449,10 @@ return function()
|
|||||||
assert(#mock_msg.messages(URL2) == 2)
|
assert(#mock_msg.messages(URL2) == 2)
|
||||||
assert(mock_msg.messages(URL1)[7].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
assert(mock_msg.messages(URL1)[7].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||||
assert(mock_msg.messages(URL1)[7].message.screen == SCREEN1)
|
assert(mock_msg.messages(URL1)[7].message.screen == SCREEN1)
|
||||||
assert(mock_msg.messages(URL1)[8].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
assert(mock_msg.messages(URL1)[8].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
||||||
assert(mock_msg.messages(URL1)[8].message.screen == SCREEN1)
|
assert(mock_msg.messages(URL1)[8].message.screen == SCREEN2)
|
||||||
assert(mock_msg.messages(URL1)[9].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
assert(mock_msg.messages(URL1)[9].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||||
assert(mock_msg.messages(URL1)[9].message.screen == SCREEN2)
|
assert(mock_msg.messages(URL1)[9].message.screen == SCREEN1)
|
||||||
assert(mock_msg.messages(URL1)[10].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
assert(mock_msg.messages(URL1)[10].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
||||||
assert(mock_msg.messages(URL1)[10].message.screen == SCREEN2)
|
assert(mock_msg.messages(URL1)[10].message.screen == SCREEN2)
|
||||||
end)
|
end)
|
||||||
|
|||||||
Reference in New Issue
Block a user