3
0
mirror of https://github.com/britzl/monarch.git synced 2025-06-27 10:27:49 +02:00

Merge pull request #8 from AGulev/master

Replace strings with constants / new type of transactions / information for the focus messages
This commit is contained in:
Björn Ritzl 2017-11-27 21:21:46 +01:00 committed by GitHub
commit 62684f9795
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 142 additions and 68 deletions

42
.luacheckrc Normal file
View File

@ -0,0 +1,42 @@
std = "max"
files['.luacheckrc'].global = false
unused_args = false
globals = {
"sys",
"go",
"gui",
"label",
"render",
"crash",
"sprite",
"sound",
"tilemap",
"spine",
"particlefx",
"physics",
"factory",
"collectionfactory",
"iac",
"msg",
"vmath",
"url",
"http",
"image",
"json",
"zlib",
"iap",
"push",
"facebook",
"hash",
"hash_to_hex",
"pprint",
"init",
"final",
"update",
"on_input",
"on_message",
"on_reload",
"window",
"unityads"
}

View File

@ -8,10 +8,10 @@ function init(self)
gui.set_render_order(15) gui.set_render_order(15)
self.transition = transitions.create(gui.get_node("root")) self.transition = transitions.create(gui.get_node("root"))
.show_in(transitions.slide_in_top, gui.EASING_OUTQUAD, 0.6, 0) .show_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0)
.show_out(transitions.slide_out_top, gui.EASING_INQUAD, 0.6, 0) .show_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0)
.back_in(transitions.slide_in_top, gui.EASING_OUTQUAD, 0.6, 0) .back_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0)
.back_out(transitions.slide_out_top, gui.EASING_INQUAD, 0.6, 0) .back_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0)
end end
function on_input(self, action_id, action) function on_input(self, action_id, action)

View File

@ -8,13 +8,25 @@ local CONTEXT = hash("monarch_context")
local PROXY_LOADED = hash("proxy_loaded") local PROXY_LOADED = hash("proxy_loaded")
local PROXY_UNLOADED = hash("proxy_unloaded") local PROXY_UNLOADED = hash("proxy_unloaded")
M.TRANSITION_DONE = hash("transition_done") local RELEASE_INPUT_FOCUS = hash("release_input_focus")
local ACQUIRE_INPUT_FOCUS = hash("acquire_input_focus")
local ASYNC_LOAD = hash("async_load")
local UNLOAD = hash("unload")
local ENABLE = hash("enable")
M.TRANSITION = {}
M.TRANSITION.DONE = hash("transition_done")
M.TRANSITION.SHOW_IN = hash("transition_show_in")
M.TRANSITION.SHOW_OUT = hash("transition_show_out")
M.TRANSITION.BACK_IN = hash("transition_back_in")
M.TRANSITION.BACK_OUT = hash("transition_back_out")
M.FOCUS_GAINED = hash("monarch_focus_gained") M.FOCUS_GAINED = hash("monarch_focus_gained")
M.FOCUS_LOST = hash("monarch_focus_lost") M.FOCUS_LOST = hash("monarch_focus_lost")
local function screen_from_proxy(proxy) local function screen_from_proxy(proxy)
for _,screen in pairs(screens) do for _, screen in pairs(screens) do
if screen.proxy == proxy then if screen.proxy == proxy then
return screen return screen
end end
@ -23,7 +35,7 @@ end
local function screen_from_script() local function screen_from_script()
local url = msg.url() local url = msg.url()
for _,screen in pairs(screens) do for _, screen in pairs(screens) do
if screen.script == url then if screen.script == url then
return screen return screen
end end
@ -31,7 +43,7 @@ local function screen_from_script()
end end
local function in_stack(id) local function in_stack(id)
for i=1,#stack do for i = 1, #stack do
if stack[i].id == id then if stack[i].id == id then
return true return true
end end
@ -60,18 +72,18 @@ local function show_out(screen, next_screen, cb)
local co local co
co = coroutine.create(function() co = coroutine.create(function()
screen.co = co screen.co = co
msg.post(screen.script, "release_input_focus") msg.post(screen.script, RELEASE_INPUT_FOCUS)
msg.post(screen.script, CONTEXT) msg.post(screen.script, CONTEXT)
coroutine.yield() coroutine.yield()
if not next_screen.popup then if not next_screen.popup then
msg.post(screen.transition_url, "transition_show_out") msg.post(screen.transition_url, M.TRANSITION.SHOW_OUT)
coroutine.yield() coroutine.yield()
msg.post(screen.proxy, "unload") msg.post(screen.proxy, UNLOAD)
coroutine.yield() coroutine.yield()
screen.loaded = false screen.loaded = false
end end
if screen.focus_url then if screen.focus_url then
msg.post(screen.focus_url, M.FOCUS_LOST) msg.post(screen.focus_url, M.FOCUS_LOST, {id = next_screen.id})
end end
screen.co = nil screen.co = nil
if cb then cb() end if cb then cb() end
@ -86,7 +98,7 @@ local function show_in(screen, reload, cb)
msg.post(screen.script, CONTEXT) msg.post(screen.script, CONTEXT)
coroutine.yield() coroutine.yield()
if reload and screen.loaded then if reload and screen.loaded then
msg.post(screen.proxy, "unload") msg.post(screen.proxy, UNLOAD)
coroutine.yield() coroutine.yield()
screen.loaded = false screen.loaded = false
end end
@ -94,17 +106,17 @@ local function show_in(screen, reload, cb)
-- and the popup asked to show this screen again -- and the popup asked to show this screen again
-- in that case we shouldn't attempt to load it again -- in that case we shouldn't attempt to load it again
if not screen.loaded then if not screen.loaded then
msg.post(screen.proxy, "async_load") msg.post(screen.proxy, ASYNC_LOAD)
coroutine.yield() coroutine.yield()
msg.post(screen.proxy, "enable") msg.post(screen.proxy, ENABLE)
screen.loaded = true screen.loaded = true
end end
stack[#stack + 1] = screen stack[#stack + 1] = screen
msg.post(screen.transition_url, "transition_show_in") msg.post(screen.transition_url, M.TRANSITION.SHOW_IN)
coroutine.yield() coroutine.yield()
msg.post(screen.script, "acquire_input_focus") msg.post(screen.script, ACQUIRE_INPUT_FOCUS)
if screen.focus_url then if screen.focus_url then
msg.post(screen.focus_url, M.FOCUS_GAINED) msg.post(screen.focus_url, M.FOCUS_GAINED, {id = screen.id})
end end
screen.co = nil screen.co = nil
if cb then cb() end if cb then cb() end
@ -119,16 +131,16 @@ local function back_in(screen, previous_screen, cb)
msg.post(screen.script, CONTEXT) msg.post(screen.script, CONTEXT)
coroutine.yield() coroutine.yield()
if not previous_screen.popup then if not previous_screen.popup then
msg.post(screen.proxy, "async_load") msg.post(screen.proxy, ASYNC_LOAD)
coroutine.yield() coroutine.yield()
msg.post(screen.proxy, "enable") msg.post(screen.proxy, ENABLE)
screen.loaded = true screen.loaded = true
msg.post(screen.transition_url, "transition_back_in") msg.post(screen.transition_url, M.TRANSITION.BACK_IN)
coroutine.yield() coroutine.yield()
end end
msg.post(screen.script, "acquire_input_focus") msg.post(screen.script, ACQUIRE_INPUT_FOCUS)
if screen.focus_url then if screen.focus_url then
msg.post(screen.focus_url, M.FOCUS_GAINED) msg.post(screen.focus_url, M.FOCUS_GAINED, {id = previous_screen.id})
end end
screen.co = nil screen.co = nil
if cb then cb() end if cb then cb() end
@ -140,16 +152,16 @@ local function back_out(screen, cb)
local co local co
co = coroutine.create(function() co = coroutine.create(function()
screen.co = co screen.co = co
msg.post(screen.script, "release_input_focus") msg.post(screen.script, RELEASE_INPUT_FOCUS)
msg.post(screen.script, CONTEXT) msg.post(screen.script, CONTEXT)
coroutine.yield() coroutine.yield()
msg.post(screen.transition_url, "transition_back_out") msg.post(screen.transition_url, M.TRANSITION.BACK_OUT)
coroutine.yield() coroutine.yield()
msg.post(screen.proxy, "unload") msg.post(screen.proxy, UNLOAD)
coroutine.yield() coroutine.yield()
screen.loaded = false screen.loaded = false
if screen.focus_url then if screen.focus_url then
msg.post(screen.focus_url, M.FOCUS_LOST) msg.post(screen.focus_url, M.FOCUS_LOST, {id = screen.id})
end end
screen.co = nil screen.co = nil
if cb then cb() end if cb then cb() end
@ -254,7 +266,7 @@ function M.on_message(message_id, message, sender)
local screen = screen_from_script() local screen = screen_from_script()
assert(screen, "Unable to find screen for current script url") assert(screen, "Unable to find screen for current script url")
coroutine.resume(screen.co) coroutine.resume(screen.co)
elseif message_id == M.TRANSITION_DONE then elseif message_id == M.TRANSITION.DONE then
local screen = screen_from_script() local screen = screen_from_script()
assert(screen, "Unable to find screen for current script url") assert(screen, "Unable to find screen for current script url")
coroutine.resume(screen.co) coroutine.resume(screen.co)
@ -263,7 +275,7 @@ end
function M.dump_stack() function M.dump_stack()
local s = "" local s = ""
for i,screen in ipairs(stack) do for i, screen in ipairs(stack) do
s = s .. ("%d = %s\n"):format(i, tostring(screen.id)) s = s .. ("%d = %s\n"):format(i, tostring(screen.id))
end end
return s return s

View File

@ -22,12 +22,12 @@ function on_message(self, message_id, message, sender)
monarch.back() monarch.back()
elseif message_id == hash("back") then elseif message_id == hash("back") then
monarch.back() monarch.back()
elseif message_id == hash("transition_show_in") elseif message_id == monarch.TRANSITION.SHOW_IN
or message_id == hash("transition_show_out") or message_id == monarch.TRANSITION.SHOW_OUT
or message_id == hash("transition_back_in") or message_id == monarch.TRANSITION.BACK_IN
or message_id == hash("transition_back_out") then or message_id == monarch.TRANSITION.BACK_OUT then
msg.post(sender, "transition_done") msg.post(sender, monarch.TRANSITION.DONE)
else else
monarch.on_message(message_id, message, sender) monarch.on_message(message_id, message, sender)
end
end end
end

View File

@ -1,3 +1,5 @@
local monarch = require "monarch.monarch"
local M = {} local M = {}
local WIDTH = tonumber(sys.get_config("display.width")) local WIDTH = tonumber(sys.get_config("display.width"))
@ -6,34 +8,36 @@ local HEIGHT = tonumber(sys.get_config("display.height"))
local LEFT = vmath.vector3(-WIDTH * 2, 0, 0) local LEFT = vmath.vector3(-WIDTH * 2, 0, 0)
local RIGHT = vmath.vector3(WIDTH * 2, 0, 0) local RIGHT = vmath.vector3(WIDTH * 2, 0, 0)
local TOP = vmath.vector3(0, HEIGHT * 2, 0) local TOP = vmath.vector3(0, HEIGHT * 2, 0)
local BOTTOM = vmath.vector3(0, -HEIGHT * 2, 0) local BOTTOM = vmath.vector3(0, - HEIGHT * 2, 0)
local ZERO_SCALE = vmath.vector3(0, 0, 1)
function M.instant(node, to, easing, duration, delay, url) function M.instant(node, to, easing, duration, delay, url)
msg.post(url, "transition_done") msg.post(url, monarch.TRANSITION.DONE)
end end
local function slide_in(direction, node, to, easing, duration, delay, url) local function slide_in(direction, node, to, easing, duration, delay, url)
local from = to + direction local from = to + direction
gui.set_position(node, from) gui.set_position(node, from)
gui.animate(node, gui.PROP_POSITION, to, easing, duration, delay, function() gui.animate(node, gui.PROP_POSITION, to, easing, duration, delay, function()
msg.post(url, "transition_done") msg.post(url, monarch.TRANSITION.DONE)
end) end)
end end
function M.slide_in_left(node, to, easing, duration, delay, url) function M.slide_in_left(node, to, easing, duration, delay, url)
return slide_in(LEFT, node, to, easing, duration, delay, url) return slide_in(LEFT, node, to.pos, easing, duration, delay, url)
end end
function M.slide_in_right(node, to, easing, duration, delay, url) function M.slide_in_right(node, to, easing, duration, delay, url)
slide_in(RIGHT, node, to, easing, duration, delay, url) slide_in(RIGHT, node, to.pos, easing, duration, delay, url)
end end
function M.slide_in_top(node, to, easing, duration, delay, url) function M.slide_in_top(node, to, easing, duration, delay, url)
slide_in(TOP, node, to, easing, duration, delay, url) slide_in(TOP, node, to.pos, easing, duration, delay, url)
end end
function M.slide_in_bottom(node, to, easing, duration, delay, url) function M.slide_in_bottom(node, to, easing, duration, delay, url)
slide_in(BOTTOM, node, to, easing, duration, delay, url) slide_in(BOTTOM, node, to.pos, easing, duration, delay, url)
end end
@ -41,24 +45,38 @@ local function slide_out(direction, node, from, easing, duration, delay, url)
local to = from + direction local to = from + direction
gui.set_position(node, from) gui.set_position(node, from)
gui.animate(node, gui.PROP_POSITION, to, easing, duration, delay, function() gui.animate(node, gui.PROP_POSITION, to, easing, duration, delay, function()
msg.post(url, "transition_done") msg.post(url, monarch.TRANSITION.DONE)
end) end)
end end
function M.slide_out_left(node, from, easing, duration, delay, url) function M.slide_out_left(node, from, easing, duration, delay, url)
slide_out(LEFT, node, from, easing, duration, delay, url) slide_out(LEFT, node, from.pos, easing, duration, delay, url)
end end
function M.slide_out_right(node, from, easing, duration, delay, url) function M.slide_out_right(node, from, easing, duration, delay, url)
slide_out(RIGHT, node, from, easing, duration, delay, url) slide_out(RIGHT, node, from.pos, easing, duration, delay, url)
end end
function M.slide_out_top(node, from, easing, duration, delay, url) function M.slide_out_top(node, from, easing, duration, delay, url)
slide_out(TOP, node, from, easing, duration, delay, url) slide_out(TOP, node, from.pos, easing, duration, delay, url)
end end
function M.slide_out_bottom(node, from, easing, duration, delay, url) function M.slide_out_bottom(node, from, easing, duration, delay, url)
slide_out(BOTTOM, node, from, easing, duration, delay, url) slide_out(BOTTOM, node, from.pos, easing, duration, delay, url)
end
function M.scale_in(node, to, easing, duration, delay, url)
gui.set_scale(node, ZERO_SCALE)
gui.animate(node, gui.PROP_SCALE, to.scale, easing, duration, delay, function()
msg.post(url, monarch.TRANSITION.DONE)
end)
end
function M.scale_out(node, from, easing, duration, delay, url)
gui.set_scale(node, from.scale)
gui.animate(node, gui.PROP_SCALE, ZERO_SCALE, easing, duration, delay, function()
msg.post(url, monarch.TRANSITION.DONE)
end)
end end
--- Create a transition for a node --- Create a transition for a node
@ -67,23 +85,25 @@ function M.create(node)
assert(node, "You must provide a node") assert(node, "You must provide a node")
local instance = {} local instance = {}
local transitions = { local transitions = {
[hash("transition_show_in")] = M.instant, [monarch.TRANSITION.SHOW_IN] = M.instant,
[hash("transition_show_out")] = M.instant, [monarch.TRANSITION.SHOW_OUT] = M.instant,
[hash("transition_back_in")] = M.instant, [monarch.TRANSITION.BACK_IN] = M.instant,
[hash("transition_back_out")] = M.instant, [monarch.TRANSITION.BACK_OUT] = M.instant,
} }
local initial_position = gui.get_position(node) local initial_data = {}
initial_data.pos = gui.get_position(node)
initial_data.scale = gui.get_scale(node)
-- Forward on_message calls here -- Forward on_message calls here
function instance.handle(message_id, message, sender) function instance.handle(message_id, message, sender)
if transitions[message_id] then if transitions[message_id] then
transitions[message_id](sender) transitions[message_id](sender)
end end
end end
-- Specify the transition function when this node is transitioned -- Specify the transition function when this node is transitioned
-- to -- to
-- @param fn Transition function (see slide_in_left and other above) -- @param fn Transition function (see slide_in_left and other above)
@ -91,8 +111,8 @@ function M.create(node)
-- @param duration Transition duration -- @param duration Transition duration
-- @param delay Transition delay -- @param delay Transition delay
function instance.show_in(fn, easing, duration, delay) function instance.show_in(fn, easing, duration, delay)
transitions[hash("transition_show_in")] = function(url) transitions[monarch.TRANSITION.SHOW_IN] = function(url)
fn(node, initial_position, easing, duration, delay or 0, url) fn(node, initial_data, easing, duration, delay or 0, url)
end end
return instance return instance
end end
@ -100,8 +120,8 @@ function M.create(node)
-- Specify the transition function when this node is transitioned -- Specify the transition function when this node is transitioned
-- from when showing another screen -- from when showing another screen
function instance.show_out(fn, easing, duration, delay) function instance.show_out(fn, easing, duration, delay)
transitions[hash("transition_show_out")] = function(url) transitions[monarch.TRANSITION.SHOW_OUT] = function(url)
fn(node, initial_position, easing, duration, delay or 0, url) fn(node, initial_data, easing, duration, delay or 0, url)
end end
return instance return instance
end end
@ -109,8 +129,8 @@ function M.create(node)
--- Specify the transition function when this node is transitioned --- Specify the transition function when this node is transitioned
-- to when navigating back in the screen stack -- to when navigating back in the screen stack
function instance.back_in(fn, easing, duration, delay) function instance.back_in(fn, easing, duration, delay)
transitions[hash("transition_back_in")] = function(url) transitions[monarch.TRANSITION.BACK_IN] = function(url)
fn(node, initial_position, easing, duration, delay or 0, url) fn(node, initial_data, easing, duration, delay or 0, url)
end end
return instance return instance
end end
@ -118,13 +138,13 @@ function M.create(node)
--- Specify the transition function when this node is transitioned --- Specify the transition function when this node is transitioned
-- from when navigating back in the screen stack -- from when navigating back in the screen stack
function instance.back_out(fn, easing, duration, delay) function instance.back_out(fn, easing, duration, delay)
transitions[hash("transition_back_out")] = function(url) transitions[monarch.TRANSITION.BACK_OUT] = function(url)
fn(node, initial_position, easing, duration, delay or 0, url) fn(node, initial_data, easing, duration, delay or 0, url)
end end
return instance return instance
end end
return instance return instance
end end
return M return M