3
0
mirror of https://github.com/britzl/monarch.git synced 2025-11-27 03:10:54 +01:00

Compare commits

..

10 Commits
4.5.0 ... 5.1.1

Author SHA1 Message Date
Pawel
6ba3064749 Fixed an error that appears when trying to delete an instance that is already deleted. (#109)
* Prevent deleting already removed instances.

* Prehashed empty hash.

* Use go.exists instead of pcall, when detecting non existing instances.
2024-03-04 16:06:56 +01:00
Björn Ritzl
b78b896ada Update README_API.md 2024-01-30 11:08:38 +01:00
SalavatR
679482f84d Add a check for missing resources in collection proxies. (#107)
* Update monarch.lua

* Update monarch.lua

* Update monarch.lua
2024-01-30 11:03:37 +01:00
Björn Ritzl
4c6e26fd71 Removed backward comp fix for monarch.back() 2024-01-12 08:31:48 +01:00
bedryck
00c30792a9 fix a problem of sequential in back function (#104) 2024-01-12 08:22:43 +01:00
Björn Ritzl
b01f5d28c3 Update monarch.lua 2023-12-27 15:54:09 +01:00
Pete Garcin
43e847dacc Guard DEPRECATED transition_id overwriting transition_url (#100) 2023-12-27 15:52:36 +01:00
Björn Ritzl
ce5ca26b6c Update README_TRANSITIONS.md
Fixes #102
2023-12-27 15:51:38 +01:00
Björn Ritzl
742779d749 Allow monarch.post() to loaded screens
Fixes #98
2023-10-26 13:54:14 +02:00
Björn Ritzl
84944f3f22 Added monarch.is_loaded() 2023-10-26 11:43:19 +02:00
7 changed files with 65 additions and 26 deletions

View File

@@ -222,6 +222,13 @@ IMPORTANT! If you provide a function you must also make sure to call `monarch.on
* `fn_or_url` (function) - The function to call or URL to send message to * `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() ## monarch.debug()
Enable verbose logging of the internals of Monarch. Enable verbose logging of the internals of Monarch.

View File

@@ -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
``` ```

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
@@ -419,7 +430,9 @@ local function unload(screen, force)
elseif screen.factory then elseif screen.factory then
log("unload() factory", screen.id) log("unload() factory", screen.id)
for id, instance in pairs(screen.factory_ids) do for id, instance in pairs(screen.factory_ids) do
go.delete(instance) if go.exists(instance) then
go.delete(instance)
end
end end
screen.factory_ids = nil screen.factory_ids = nil
if screen.auto_preload and not force then if screen.auto_preload and not force then
@@ -451,8 +464,7 @@ local function preload(screen)
screen.preloading = true screen.preloading = true
if screen.proxy then if screen.proxy then
log("preload() proxy") log("preload() proxy")
local missing_resources = collectionproxy.missing_resources(screen.proxy) if M.has_missing_resources(screen.id) then
if #missing_resources > 0 then
local error_message = ("preload() collection proxy %s is missing resources"):format(tostring(screen.id)) local error_message = ("preload() collection proxy %s is missing resources"):format(tostring(screen.id))
log(error_message) log(error_message)
screen.preloading = false screen.preloading = false
@@ -509,8 +521,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 +925,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,17 +987,6 @@ 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()
@@ -1127,6 +1132,20 @@ function M.preload(id, options, cb)
return true -- return true for legacy reasons (before queue existed) return true -- return true for legacy reasons (before queue existed)
end 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 --- Unload a preloaded monarch screen
-- @param id (string|hash) - Id of the screen to unload -- @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 -- @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")
@@ -1357,8 +1376,10 @@ function M.on_post(id, fn_or_url)
end end
end end
local empty_hash = hash("")
local function url_to_key(url) 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 end

View File

@@ -142,12 +142,12 @@ return function()
monarch.show(SCREEN1) monarch.show(SCREEN1)
assert(wait_until_stack({ SCREEN1 })) assert(wait_until_stack({ SCREEN1 }))
assert(wait_until_visible(SCREEN1)) assert(wait_until_visible(SCREEN1))
monarch.show(SCREEN2) monarch.show(SCREEN2)
assert(wait_until_stack({ SCREEN1, SCREEN2 })) assert(wait_until_stack({ SCREEN1, SCREEN2 }))
assert(wait_until_hidden(SCREEN1)) assert(wait_until_hidden(SCREEN1))
assert(wait_until_visible(SCREEN2)) assert(wait_until_visible(SCREEN2))
monarch.show(POPUP1) monarch.show(POPUP1)
assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 })) assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 }))
assert(wait_until_hidden(SCREEN1)) assert(wait_until_hidden(SCREEN1))
@@ -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")