mirror of
https://github.com/britzl/monarch.git
synced 2025-11-26 19:00:53 +01:00
Compare commits
2 Commits
3.4.0
...
dev-back-t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1314b43633 | ||
|
|
4927d6e766 |
@@ -151,3 +151,61 @@ embedded_instances {
|
||||
z: 1.0
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "screen3"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.script\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" }\n"
|
||||
" rotation {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"screen3\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/basic/screen3.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" }\n"
|
||||
" rotation {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
""
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale3 {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,124 @@ background_color {
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
x: 519.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "showscreen3"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "SHOW 3"
|
||||
font: "example"
|
||||
id: "text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "showscreen3"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 132.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
@@ -98,7 +215,7 @@ nodes {
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "BACK"
|
||||
font: "example"
|
||||
id: "text"
|
||||
id: "text1"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
|
||||
@@ -6,7 +6,9 @@ end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.pressed then
|
||||
if gui.pick_node(gui.get_node("backbutton"), action.x, action.y) then
|
||||
if gui.pick_node(gui.get_node("showscreen3"), action.x, action.y) then
|
||||
monarch.show(hash("screen3"))
|
||||
elseif gui.pick_node(gui.get_node("backbutton"), action.x, action.y) then
|
||||
monarch.back()
|
||||
end
|
||||
end
|
||||
|
||||
37
example/basic/screen3.collection
Normal file
37
example/basic/screen3.collection
Normal file
@@ -0,0 +1,37 @@
|
||||
name: "screen3"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"screen3\"\n"
|
||||
" component: \"/example/basic/screen3.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" }\n"
|
||||
" rotation {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
""
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale3 {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
}
|
||||
}
|
||||
248
example/basic/screen3.gui
Normal file
248
example/basic/screen3.gui
Normal file
@@ -0,0 +1,248 @@
|
||||
script: "/example/basic/screen3.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 137.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "backbutton"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "BACK"
|
||||
font: "example"
|
||||
id: "text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "backbutton"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 525.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "tostart"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "TOSTART"
|
||||
font: "example"
|
||||
id: "text1"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "tostart"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
||||
15
example/basic/screen3.gui_script
Normal file
15
example/basic/screen3.gui_script
Normal file
@@ -0,0 +1,15 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.pressed then
|
||||
if gui.pick_node(gui.get_node("backbutton"), action.x, action.y) then
|
||||
monarch.back()
|
||||
elseif gui.pick_node(gui.get_node("tostart"), action.x, action.y) then
|
||||
monarch.back_to(hash("screen1"))
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,7 +1,7 @@
|
||||
[project]
|
||||
title = Monarch
|
||||
version = 0.9
|
||||
dependencies = https://github.com/britzl/deftest/archive/2.7.0.zip
|
||||
dependencies#0 = https://github.com/britzl/deftest/archive/2.7.0.zip
|
||||
|
||||
[bootstrap]
|
||||
main_collection = /example/advanced/advanced.collectionc
|
||||
|
||||
@@ -185,7 +185,7 @@ function M.is_visible(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
|
||||
return screens[id].visible
|
||||
end
|
||||
|
||||
|
||||
@@ -570,6 +570,7 @@ local function show_out(screen, next_screen, wait_for_transition, cb)
|
||||
local current_is_popup = screen.popup
|
||||
if (not next_is_popup and not current_is_popup) or (current_is_popup) then
|
||||
transition(screen, M.TRANSITION.SHOW_OUT, { next_screen = next_screen.id }, wait_for_transition)
|
||||
screen.visible = false
|
||||
unload(screen)
|
||||
elseif next_is_popup then
|
||||
change_timestep(screen)
|
||||
@@ -590,9 +591,15 @@ local function show_in(screen, previous_screen, reload, add_to_stack, wait_for_t
|
||||
log("show_in() reloading", screen.id)
|
||||
unload(screen, reload)
|
||||
end
|
||||
if add_to_stack then
|
||||
stack[#stack + 1] = screen
|
||||
end
|
||||
local ok, err = load(screen)
|
||||
if not ok then
|
||||
log("show_in()", err)
|
||||
if add_to_stack then
|
||||
stack[#stack] = nil
|
||||
end
|
||||
active_transition_count = active_transition_count - 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_FAILED, { screen = screen.id })
|
||||
return
|
||||
@@ -600,11 +607,9 @@ local function show_in(screen, previous_screen, reload, add_to_stack, wait_for_t
|
||||
-- wait until screen has had a chance to render
|
||||
cowait(0)
|
||||
cowait(0)
|
||||
if add_to_stack then
|
||||
stack[#stack + 1] = screen
|
||||
end
|
||||
reset_timestep(screen)
|
||||
transition(screen, M.TRANSITION.SHOW_IN, { previous_screen = previous_screen and previous_screen.id }, wait_for_transition)
|
||||
screen.visible = true
|
||||
acquire_input(screen)
|
||||
focus_gained(screen, previous_screen)
|
||||
active_transition_count = active_transition_count - 1
|
||||
@@ -633,6 +638,7 @@ local function back_in(screen, previous_screen, wait_for_transition, cb)
|
||||
if previous_screen and not previous_screen.popup then
|
||||
transition(screen, M.TRANSITION.BACK_IN, { previous_screen = previous_screen.id }, wait_for_transition)
|
||||
end
|
||||
screen.visible = true
|
||||
acquire_input(screen)
|
||||
focus_gained(screen, previous_screen)
|
||||
active_transition_count = active_transition_count - 1
|
||||
@@ -653,6 +659,7 @@ local function back_out(screen, next_screen, wait_for_transition, cb)
|
||||
reset_timestep(next_screen)
|
||||
end
|
||||
transition(screen, M.TRANSITION.BACK_OUT, { next_screen = next_screen and next_screen.id }, wait_for_transition)
|
||||
screen.visible = false
|
||||
unload(screen)
|
||||
active_transition_count = active_transition_count - 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_OUT_FINISHED, { screen = screen.id, next_screen = next_screen and next_screen.id })
|
||||
@@ -862,51 +869,86 @@ function M.hide(id, cb)
|
||||
end
|
||||
|
||||
|
||||
local function internal_back(to, data, cb)
|
||||
if #stack == 0 then
|
||||
cb()
|
||||
return
|
||||
end
|
||||
|
||||
if not to then
|
||||
if #stack > 1 then
|
||||
to = stack[#stack - 1]
|
||||
end
|
||||
end
|
||||
|
||||
queue_action(function(action_done)
|
||||
local co
|
||||
co = coroutine.create(function()
|
||||
local callbacks = callback_tracker()
|
||||
if not to then
|
||||
back_out(table.remove(stack), nil, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
else
|
||||
if data then
|
||||
to.data = data
|
||||
end
|
||||
|
||||
-- close visible screens until target screen is below top screen
|
||||
while to ~= stack[#stack - 1] do
|
||||
local top = table.remove(stack)
|
||||
local below = stack[#stack]
|
||||
if top.visible then
|
||||
back_out(top, below, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
callbacks.yield_until_done()
|
||||
end
|
||||
end
|
||||
|
||||
local top = table.remove(stack)
|
||||
if to == top then
|
||||
-- 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
|
||||
back_out(to, to, WAIT_FOR_TRANSITION, function()
|
||||
back_in(to, to, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end)
|
||||
else
|
||||
back_in(to, top, DO_NOT_WAIT_FOR_TRANSITION, function()
|
||||
if top.visible then
|
||||
back_out(top, to, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
callbacks.when_done(function()
|
||||
pcallfn(cb)
|
||||
pcallfn(action_done)
|
||||
end)
|
||||
end)
|
||||
assert(coroutine.resume(co))
|
||||
end)
|
||||
end
|
||||
|
||||
-- Go back to the previous screen in the stack.
|
||||
-- @param data (*) - Optional data to set for the previous screen
|
||||
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again
|
||||
function M.back(data, cb)
|
||||
log("back() queuing action")
|
||||
|
||||
queue_action(function(action_done)
|
||||
local callbacks = callback_tracker()
|
||||
local screen = table.remove(stack)
|
||||
if screen then
|
||||
log("back()", screen.id)
|
||||
local top = stack[#stack]
|
||||
-- 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
|
||||
if top and screen.id == top.id then
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, function()
|
||||
if data then
|
||||
top.data = data
|
||||
end
|
||||
back_in(top, screen, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end)
|
||||
else
|
||||
if top then
|
||||
if data then
|
||||
top.data = data
|
||||
end
|
||||
back_in(top, screen, DO_NOT_WAIT_FOR_TRANSITION, function()
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end)
|
||||
else
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
callbacks.when_done(function()
|
||||
pcallfn(cb)
|
||||
pcallfn(action_done)
|
||||
end)
|
||||
end)
|
||||
|
||||
return true -- return true for legacy reasons (before queue existed)
|
||||
internal_back(nil, data, cb)
|
||||
end
|
||||
|
||||
|
||||
-- Go back to the previous screen in the stack.
|
||||
-- @param data (*) - Optional data to set for the previous screen
|
||||
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again
|
||||
function M.back_to(id, data, cb)
|
||||
log("back_to() queuing action")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
local screen = screens[id]
|
||||
internal_back(screen, data, cb)
|
||||
end
|
||||
|
||||
|
||||
|
||||
--- Check if a screen is preloading via monarch.preload() or automatically
|
||||
-- via the Preload screen option
|
||||
-- @param id Screen id
|
||||
|
||||
@@ -39,7 +39,7 @@ return function()
|
||||
|
||||
local screens_instances = {}
|
||||
|
||||
local function is_shown(screen_id)
|
||||
local function is_visible(screen_id)
|
||||
return monarch.is_visible(screen_id)
|
||||
end
|
||||
|
||||
@@ -65,9 +65,6 @@ return function()
|
||||
local function wait_until_visible(screen_id)
|
||||
return wait_timeout(is_visible, screen_id)
|
||||
end
|
||||
local function wait_until_shown(screen_id)
|
||||
return wait_timeout(is_shown, screen_id)
|
||||
end
|
||||
local function wait_until_hidden(screen_id)
|
||||
return wait_timeout(is_hidden, screen_id)
|
||||
end
|
||||
@@ -145,23 +142,23 @@ return function()
|
||||
assert(not monarch.is_visible(SCREEN1))
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(monarch.is_visible(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(not monarch.is_visible(SCREEN1))
|
||||
assert(monarch.is_visible(SCREEN2))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN2))
|
||||
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 }))
|
||||
assert(not monarch.is_visible(SCREEN1))
|
||||
assert(monarch.is_visible(SCREEN2))
|
||||
assert(monarch.is_visible(POPUP1))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN2))
|
||||
assert(wait_until_visible(POPUP1))
|
||||
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_shown(BACKGROUND), "Background was never shown")
|
||||
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
||||
assert(wait_until_stack({ }))
|
||||
|
||||
monarch.show(SCREEN1)
|
||||
@@ -175,7 +172,7 @@ return function()
|
||||
|
||||
monarch.show(BACKGROUND, { no_stack = true })
|
||||
assert(wait_until_not_busy())
|
||||
assert(wait_until_shown(BACKGROUND))
|
||||
assert(wait_until_visible(BACKGROUND))
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
@@ -184,13 +181,13 @@ return function()
|
||||
|
||||
monarch.back()
|
||||
assert(wait_until_not_busy())
|
||||
assert(wait_until_shown(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
end)
|
||||
|
||||
it("should be able to hide a screen not added to the stack", function()
|
||||
monarch.show(BACKGROUND, { no_stack = true })
|
||||
assert(wait_until_shown(BACKGROUND), "Background was never shown")
|
||||
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
||||
assert_stack({ })
|
||||
|
||||
monarch.hide(BACKGROUND)
|
||||
@@ -213,18 +210,18 @@ return function()
|
||||
it("should be able to pass data to a screen when showing it or going back to it", function()
|
||||
local data1 = { foo = "bar" }
|
||||
monarch.show(SCREEN1, nil, data1)
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert(wait_until_visible(SCREEN1), "Screen1 was never shown")
|
||||
|
||||
local data2 = { boo = "car" }
|
||||
monarch.show(SCREEN2, nil, data2)
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert(wait_until_visible(SCREEN2), "Screen2 was never shown")
|
||||
|
||||
assert(monarch.data(SCREEN1) == data1, "Expected data on screen1 doesn't match actual data")
|
||||
assert(monarch.data(SCREEN2) == data2, "Expected data on screen2 doesn't match actual data")
|
||||
|
||||
local data_back = { going = "back" }
|
||||
monarch.back(data_back)
|
||||
assert(wait_until_shown(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
|
||||
assert(monarch.data(SCREEN1) == data_back, "Expected data on screen1 doesn't match actual data")
|
||||
end)
|
||||
@@ -368,7 +365,7 @@ return function()
|
||||
it("should be busy while transition is running", function()
|
||||
monarch.show(TRANSITION1)
|
||||
assert(monarch.is_busy())
|
||||
assert(wait_until_shown(TRANSITION1), "Transition1 was never shown")
|
||||
assert(wait_until_visible(TRANSITION1), "Transition1 was never shown")
|
||||
assert(wait_until_not_busy())
|
||||
end)
|
||||
|
||||
@@ -386,7 +383,7 @@ return function()
|
||||
-- previously a call to preload() while also showing a screen would
|
||||
-- lock up monarch. See issue #32
|
||||
monarch.preload(TRANSITION1)
|
||||
assert(wait_until_shown(TRANSITION1), "Transition1 was never shown")
|
||||
assert(wait_until_visible(TRANSITION1), "Transition1 was never shown")
|
||||
end)
|
||||
|
||||
it("should be able to notify listeners of navigation events", function()
|
||||
@@ -438,12 +435,12 @@ return function()
|
||||
|
||||
it("should be able to show a screen even while it is preloading", function()
|
||||
monarch.show(SCREEN_PRELOAD, nil, { count = 1 })
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
end)
|
||||
|
||||
it("should be able to preload a screen and always keep it loaded", function()
|
||||
monarch.show(SCREEN_PRELOAD)
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
monarch.back()
|
||||
assert(wait_until_hidden(SCREEN_PRELOAD), "Screen_preload was never hidden")
|
||||
assert(monarch.is_preloaded(SCREEN_PRELOAD))
|
||||
@@ -451,12 +448,12 @@ return function()
|
||||
|
||||
it("should be able to reload a preloaded screen", function()
|
||||
monarch.show(SCREEN_PRELOAD, nil, { count = 1 })
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
-- first time the screen gets loaded it will increment the count
|
||||
assert(monarch.data(SCREEN_PRELOAD).count == 2)
|
||||
|
||||
monarch.show(SCREEN_PRELOAD, { clear = true, reload = true }, { count = 1 })
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
-- second time the screen gets shown it will be reloaded and increment the count
|
||||
assert(monarch.data(SCREEN_PRELOAD).count == 2)
|
||||
end)
|
||||
@@ -470,9 +467,11 @@ return function()
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
monarch.show(FOCUS1)
|
||||
assert(wait_until_stack({ SCREEN1, FOCUS1 }))
|
||||
assert(wait_until_visible(FOCUS1))
|
||||
assert(_G.focus1_gained)
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1, FOCUS1, SCREEN1 }))
|
||||
assert(wait_until_hidden(FOCUS1))
|
||||
assert(_G.focus1_lost)
|
||||
end)
|
||||
|
||||
@@ -483,14 +482,14 @@ return function()
|
||||
|
||||
-- proxy screen
|
||||
monarch.show(SCREEN1)
|
||||
wait_until_shown(SCREEN1)
|
||||
wait_until_visible(SCREEN1)
|
||||
assert(monarch.post(SCREEN1, "foobar"), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen1_foobar, "Screen1 never received a message")
|
||||
|
||||
-- factory screen
|
||||
monarch.show(SCREEN2)
|
||||
wait_until_shown(SCREEN2)
|
||||
wait_until_visible(SCREEN2)
|
||||
assert(monarch.post(SCREEN2, "foobar"), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen2_foobar, "Screen2 never received a message")
|
||||
@@ -503,7 +502,7 @@ return function()
|
||||
|
||||
-- proxy screen
|
||||
monarch.show(SCREEN1)
|
||||
wait_until_shown(SCREEN1)
|
||||
wait_until_visible(SCREEN1)
|
||||
assert(monarch.post(SCREEN1, "foobar", { foo = "bar" }), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen1_foobar, "Screen1 never received a message")
|
||||
@@ -511,7 +510,7 @@ return function()
|
||||
|
||||
-- factory screen
|
||||
monarch.show(SCREEN2)
|
||||
wait_until_shown(SCREEN2)
|
||||
wait_until_visible(SCREEN2)
|
||||
assert(monarch.post(SCREEN2, "foobar", { foo = "bar" }), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen2_foobar, "Screen2 never received a message")
|
||||
@@ -525,6 +524,7 @@ return function()
|
||||
monarch.show(SCREEN1)
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
local ok, err = monarch.post(SCREEN1, "foobar")
|
||||
assert(not ok and err, "Expected monarch.post() to return false plus an error message")
|
||||
cowait(0.1)
|
||||
@@ -534,7 +534,7 @@ return function()
|
||||
|
||||
it("should not be able to post messages to proxy screens without a receiver url", function()
|
||||
monarch.show(POPUP1)
|
||||
wait_until_shown(POPUP1)
|
||||
wait_until_visible(POPUP1)
|
||||
local ok, err = monarch.post(POPUP1, "foobar")
|
||||
assert(not ok and err, "Expected monarch.post() to return false plus an error message")
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user