61 lines
1.7 KiB
Lua
61 lines
1.7 KiB
Lua
|
--- States stack
|
||
|
--- @class StateManager
|
||
|
StateManager = {
|
||
|
states = {},
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
new = function(self, o)
|
||
|
o = o or {}
|
||
|
setmetatable(o, self)
|
||
|
self.__index = self
|
||
|
return o
|
||
|
end,
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
---@return unknown
|
||
|
_get_current_state = function(self)
|
||
|
return self.states[#self.states]
|
||
|
end,
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
---@param state any
|
||
|
_set_current_state = function(self, state)
|
||
|
if #self.states == 0 then
|
||
|
self.states = { state }
|
||
|
else
|
||
|
local last = self.states[#self.states]
|
||
|
if last._leave then last:_leave() end
|
||
|
self.states[#self.states] = state
|
||
|
end
|
||
|
end,
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
---@param state any
|
||
|
change_state = function(self, state, ...)
|
||
|
local current = self:_get_current_state()
|
||
|
if current and current._leave then current:_leave() end
|
||
|
self:_set_current_state(state)
|
||
|
if state._enter then state:_enter(...) end
|
||
|
end,
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
push_state = function(self, state, data)
|
||
|
table.insert(self.states, state)
|
||
|
if state._enter then state:_enter(data) end
|
||
|
end,
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
pop_state = function(self)
|
||
|
local state = table.remove(self.states)
|
||
|
if #self.states == 0 then trace("No state left", 2) end
|
||
|
if state._leave then state:_leave() end
|
||
|
end,
|
||
|
---
|
||
|
---@param self StateManager
|
||
|
update = function(self)
|
||
|
local current = self:_get_current_state()
|
||
|
if not current then return end
|
||
|
if current.update then current:update() end
|
||
|
end,
|
||
|
}
|