3
0
mirror of https://github.com/britzl/monarch.git synced 2025-11-26 19:00:53 +01:00

Compare commits

..

2 Commits
3.5.0 ... 3.6.1

Author SHA1 Message Date
Björn Ritzl
286a270a1c Check if screen was loaded before trying to unload 2022-07-05 22:54:40 +02:00
Björn Ritzl
c0d45c3d5c Added keep_loaded option to preload()
Fixes #88
2022-07-04 22:43:25 +02:00
3 changed files with 37 additions and 5 deletions

View File

@@ -48,13 +48,18 @@ Go back to a previous Monarch screen. This operation will be added to the queue
* `callback` (function) - Optional function to call when the previous screen is visible. * `callback` (function) - Optional function to call when the previous screen is visible.
## monarch.preload(screen_id, [callback]) ## monarch.preload(screen_id, [options], [callback])
Preload a Monarch screen. This will load but not enable the screen. This is useful for content heavy screens that you wish to be able to show without having to wait for it load. This operation will be added to the queue if Monarch is busy. Preload a Monarch screen. This will load but not enable the screen. This is useful for content heavy screens that you wish to be able to show without having to wait for it load. This operation will be added to the queue if Monarch is busy.
**PARAMETERS** **PARAMETERS**
* `screen_id` (string|hash) - Id of the screen to preload. * `screen_id` (string|hash) - Id of the screen to preload.
* `options` (table)
* `callback` (function) - Optional function to call when the screen is preloaded. * `callback` (function) - Optional function to call when the screen is preloaded.
The options table can contain the following fields:
* `keep_loaded` (boolean) - If the `keep_loaded` flag is set Monarch will keep the screen preloaded even after a `hide()` or `back()` navigation event that normally would unload the screen.
## monarch.is_preloading(screen_id) ## monarch.is_preloading(screen_id)
Check if a Monarch screen is preloading (via monarch.preload() or the Preload screen setting). Check if a Monarch screen is preloading (via monarch.preload() or the Preload screen setting).

View File

@@ -354,8 +354,10 @@ local function unload(screen, force)
if screen.proxy then if screen.proxy then
log("unload() proxy", screen.id) log("unload() proxy", screen.id)
if screen.auto_preload and not force then if screen.auto_preload and not force then
msg.post(screen.proxy, DISABLE) if screen.loaded then
screen.loaded = false msg.post(screen.proxy, DISABLE)
screen.loaded = false
end
screen.preloaded = true screen.preloaded = true
else else
screen.wait_for = PROXY_UNLOADED screen.wait_for = PROXY_UNLOADED
@@ -996,12 +998,19 @@ end
--- Preload a screen. This will load but not enable and show a screen. Useful for "heavier" screens --- Preload a screen. This will load but not enable and show a screen. Useful for "heavier" screens
-- that you wish to show without any delay. -- that you wish to show without any delay.
-- @param id (string|hash) - Id of the screen to preload -- @param id (string|hash) - Id of the screen to preload
-- @param options (table)
-- @param cb (function) - Optional callback to invoke when screen is loaded -- @param cb (function) - Optional callback to invoke when screen is loaded
function M.preload(id, cb) function M.preload(id, options, cb)
assert(id, "You must provide a screen id") assert(id, "You must provide a screen id")
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)))
-- support old function signature (id, cb)
if type(options) == "function" and not cb then
cb = options
options = nil
end
log("preload() queuing action", id) log("preload() queuing action", id)
queue_action(function(action_done, action_error) queue_action(function(action_done, action_error)
log("preload()", id) log("preload()", id)
@@ -1012,6 +1021,10 @@ function M.preload(id, cb)
return return
end end
-- keep_loaded is an option for monarch.preload()
-- use it to get the same behavior as the auto preload checkbox
screen.auto_preload = screen.auto_preload or options and options.keep_loaded
if screen.preloaded or screen.loaded then if screen.preloaded or screen.loaded then
pcallfn(cb) pcallfn(cb)
pcallfn(action_done) pcallfn(action_done)

View File

@@ -377,7 +377,21 @@ return function()
end) end)
assert(not monarch.is_preloading(TRANSITION1)) assert(not monarch.is_preloading(TRANSITION1))
end) end)
it("should be able to preload a screen and keep it loaded", function()
assert(not monarch.is_preloading(TRANSITION1))
monarch.preload(TRANSITION1, { keep_loaded = true })
wait_until_done(function(done)
monarch.when_preloaded(TRANSITION1, done)
end)
monarch.show(TRANSITION1)
assert(wait_until_visible(TRANSITION1), "Transition1 was never shown")
monarch.back()
assert(wait_until_hidden(TRANSITION1), "Transition1 was never hidden")
assert(monarch.is_preloaded(TRANSITION1))
end)
it("should ignore any preload calls while busy", function() it("should ignore any preload calls while busy", function()
monarch.show(TRANSITION1) monarch.show(TRANSITION1)
-- previously a call to preload() while also showing a screen would -- previously a call to preload() while also showing a screen would