mirror of
https://github.com/britzl/monarch.git
synced 2025-11-26 10:50:55 +01:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc4260d72a | ||
|
|
07eacc7a5f | ||
|
|
5ee6ea5982 | ||
|
|
f590c75b9e |
@@ -162,6 +162,8 @@ The predefined transitions provided by ```monarch.transitions.gui``` are:
|
||||
* ```slide_out_bottom```
|
||||
* ```scale_in```
|
||||
* ```scale_out```
|
||||
* ```fade_in``` - Set node alpha to fully transparent (i.e. 0.0) and fade to fully opaque (i.e. 1.0)
|
||||
* ```fade_out``` - Set node alpha to fully opaque (i.e. 1.0) and fade to fully transparent (i.e. 0.0)
|
||||
|
||||
Additionally there's functionality to create a full set of transitions for common transition styles:
|
||||
|
||||
@@ -169,6 +171,7 @@ Additionally there's functionality to create a full set of transitions for commo
|
||||
* ```transitions.in_left_out_right(node, duration, [delay], [easing])```
|
||||
* ```transitions.in_left_out_left(node, duration, [delay], [easing])```
|
||||
* ```transitions.in_right_out_right(node, duration, [delay], [easing])```
|
||||
* ```transitions.fade_in_out(node, duration, [delay], [easing])```
|
||||
|
||||
**PARAMETERS**
|
||||
* ```node``` (node) - Gui node to animate.
|
||||
|
||||
@@ -6,7 +6,7 @@ function init(self)
|
||||
|
||||
gui.set_text(gui.get_node("timestamp"), os.date())
|
||||
|
||||
self.transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
self.transition = transitions.fade_in_out(gui.get_node("root"), 0.6, 0)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
local callback_tracker = require "monarch.utils.callback_tracker"
|
||||
|
||||
local M = {}
|
||||
|
||||
local CONTEXT = hash("monarch_context")
|
||||
@@ -310,7 +312,6 @@ end
|
||||
|
||||
local function back_in(screen, previous_screen, cb)
|
||||
log("back_in()", screen.id)
|
||||
print("back_in()", screen.id)
|
||||
local co
|
||||
co = coroutine.create(function()
|
||||
active_transition_count = active_transition_count + 1
|
||||
@@ -341,7 +342,6 @@ end
|
||||
|
||||
local function back_out(screen, next_screen, cb)
|
||||
log("back_out()", screen.id)
|
||||
print("back_out()", screen.id)
|
||||
local co
|
||||
co = coroutine.create(function()
|
||||
notify_listeners(M.SCREEN_TRANSITION_OUT_STARTED, { screen = screen.id, next_screen = next_screen.id })
|
||||
@@ -401,8 +401,11 @@ end
|
||||
function M.show(id, options, data, cb)
|
||||
assert(id, "You must provide a screen id")
|
||||
if M.is_busy() then
|
||||
log("show() monarch is busy, ignoring request")
|
||||
return false
|
||||
end
|
||||
|
||||
local callbacks = callback_tracker()
|
||||
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
@@ -424,13 +427,13 @@ function M.show(id, options, data, cb)
|
||||
-- close all popups
|
||||
while top.popup do
|
||||
stack[#stack] = nil
|
||||
show_out(top, screen)
|
||||
show_out(top, screen, callbacks.track())
|
||||
top = stack[#stack]
|
||||
end
|
||||
-- unload and transition out from top
|
||||
-- unless we're showing the same screen as is already visible
|
||||
if top and top.id ~= screen.id then
|
||||
show_out(top, screen)
|
||||
show_out(top, screen, callbacks.track())
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -447,7 +450,9 @@ function M.show(id, options, data, cb)
|
||||
end
|
||||
|
||||
-- show screen
|
||||
show_in(screen, top, options and options.reload, cb)
|
||||
show_in(screen, top, options and options.reload, callbacks.track())
|
||||
|
||||
if cb then callbacks.when_done(cb) end
|
||||
|
||||
return true
|
||||
end
|
||||
@@ -459,9 +464,12 @@ end
|
||||
-- @return true if successfully going back, false if busy performing another operation
|
||||
function M.back(data, cb)
|
||||
if M.is_busy() then
|
||||
log("back() monarch is busy, ignoring request")
|
||||
return false
|
||||
end
|
||||
|
||||
local callbacks = callback_tracker()
|
||||
|
||||
local screen = table.remove(stack)
|
||||
if screen then
|
||||
log("back()", screen.id)
|
||||
@@ -473,7 +481,7 @@ function M.back(data, cb)
|
||||
if data then
|
||||
top.data = data
|
||||
end
|
||||
back_in(top, screen, cb)
|
||||
back_in(top, screen, callbacks.track())
|
||||
end)
|
||||
else
|
||||
back_out(screen, top)
|
||||
@@ -481,12 +489,13 @@ function M.back(data, cb)
|
||||
if data then
|
||||
top.data = data
|
||||
end
|
||||
back_in(top, screen, cb)
|
||||
back_in(top, screen, callbacks.track())
|
||||
end
|
||||
end
|
||||
elseif cb then
|
||||
cb()
|
||||
end
|
||||
|
||||
if cb then callbacks.when_done(cb) end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
@@ -88,6 +88,22 @@ function M.scale_out(node, from, easing, duration, delay, cb)
|
||||
gui.animate(node, gui.PROP_SCALE, ZERO_SCALE, easing, duration, delay, cb)
|
||||
end
|
||||
|
||||
function M.fade_out(node, from, easing, duration, delay, cb)
|
||||
local to = gui.get_color(node)
|
||||
to.w = 1
|
||||
gui.set_color(node, to)
|
||||
to.w = 0
|
||||
gui.animate(node, gui.PROP_COLOR, to, easing, duration, delay, cb)
|
||||
end
|
||||
|
||||
function M.fade_in(node, from, easing, duration, delay, cb)
|
||||
local to = gui.get_color(node)
|
||||
to.w = 0
|
||||
gui.set_color(node, to)
|
||||
to.w = 1
|
||||
gui.animate(node, gui.PROP_COLOR, to, easing, duration, delay, cb)
|
||||
end
|
||||
|
||||
--- Create a transition for a node
|
||||
-- @return Transition instance
|
||||
function M.create(node)
|
||||
@@ -255,4 +271,16 @@ function M.in_left_out_left(node, duration, delay, easing)
|
||||
end
|
||||
|
||||
|
||||
function M.fade_in_out(node, duration, delay, easing)
|
||||
assert(node, "You must provide a node")
|
||||
assert(duration, "You must provide a duration")
|
||||
easing = easing or easings.QUAD()
|
||||
return M.create(node)
|
||||
.show_in(M.fade_in, easing.OUT, duration, delay or 0)
|
||||
.show_out(M.fade_out, easing.IN, duration, delay or 0)
|
||||
.back_in(M.fade_in, easing.OUT, duration, delay or 0)
|
||||
.back_out(M.fade_out, easing.IN, duration, delay or 0)
|
||||
end
|
||||
|
||||
|
||||
return M
|
||||
|
||||
39
monarch/utils/callback_tracker.lua
Normal file
39
monarch/utils/callback_tracker.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
local M = {}
|
||||
|
||||
|
||||
function M.create()
|
||||
local instance = {}
|
||||
|
||||
local callback = nil
|
||||
local callback_count = 0
|
||||
|
||||
--- Create a callback function and track when it is done
|
||||
-- @return Callback function
|
||||
function instance.track()
|
||||
callback_count = callback_count + 1
|
||||
return function()
|
||||
callback_count = callback_count - 1
|
||||
if callback_count == 0 and callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Call a function when all callbacks have been triggered
|
||||
-- @param cb Function to call when all
|
||||
function instance.when_done(cb)
|
||||
callback = cb
|
||||
if callback_count == 0 then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
|
||||
return setmetatable(M, {
|
||||
__call = function(_, ...)
|
||||
return M.create(...)
|
||||
end
|
||||
})
|
||||
Reference in New Issue
Block a user