2019-03-25 21:13:47 +01:00

93 lines
2.7 KiB
Lua

--[[ Single tab screen module. Assumed to be used with Tab Bar module.
-- Create tab screen with parental gui node:
self.tab = tab.create "tab_bkg"
-- Show and hide tab manually:
self.tab.slide_in(self, vmath.vector3(0, -540, 0))
self.tab.slide_out(self, vmath.vector3(0, -540, 0))
-- Or receive show and hide messages:
function on_message(self, message_id, message, sender)
self.tab.on_message(self, message_id, message)
end
]]
local M = {}
M.T_SLIDE_IN = hash("t_slide_in")
M.T_SLIDE_OUT = hash("t_slide_out")
M.STATE_START = hash("state_start")
M.STATE_FINISH = hash("state_finish")
local ENABLE = hash("enable")
local DISABLE = hash("disable")
local PATH_COMP = "#"
M.DEFAULT_EASING = gui.EASING_INOUTQUAD
M.DEFAULT_DURATION = 0.3
function M.slide_in(instance, out_pos, is_force)
msg.post(PATH_COMP, ENABLE)
if instance.callback then
instance.callback(instance.parent.parent, instance, M.T_SLIDE_IN, M.STATE_START)
end
if is_force then
gui.set_position(instance.node, instance.in_pos)
if instance.callback then
instance.callback(instance.parent.parent, instance, M.T_SLIDE_IN, M.STATE_FINISH)
end
else
instance.in_action = true
out_pos = out_pos or instance.put_pos
gui.set_position(instance.node, out_pos or instance.out_pos)
gui.animate(instance.node, gui.PROP_POSITION, instance.in_pos, instance.easing, instance.duration, 0,
function()
instance.in_action = false
if instance.callback then
instance.callback(instance.parent.parent, instance, M.T_SLIDE_IN, M.STATE_FINISH)
end
end
)
end
end
function M.slide_out(instance, out_pos, is_force)
out_pos = out_pos or instance.put_pos
if instance.callback then
instance.callback(instance.parent.parent, instance, M.T_SLIDE_OUT, M.STATE_START)
end
if is_force then
gui.set_position(instance.node, out_pos)
if instance.callback then
instance.callback(instance.parent.parent, instance, M.T_SLIDE_OUT, M.STATE_FINISH)
end
msg.post(PATH_COMP, DISABLE)
else
instance.in_action = true
gui.set_position(instance.node, instance.in_pos)
gui.animate(instance.node, gui.PROP_POSITION, out_pos, instance.easing, instance.duration, 0,
function()
instance.in_action = false
if instance.callback then
instance.callback(instance.parent.parent, instance, M.T_SLIDE_OUT, M.STATE_FINISH)
end
msg.post(PATH_COMP, DISABLE)
end
)
end
end
function M.on_message(instance, message_id, message, sender)
if message_id == M.T_SLIDE_IN then
M.slide_in(instance, message.out_pos, message.is_force)
return true
elseif message_id == M.T_SLIDE_OUT then
M.slide_out(instance, message.out_pos, message.is_force)
return true
end
end
return M