mirror of
https://github.com/linux-man/LoveFrames.git
synced 2024-11-18 16:04:22 +00:00
Added State Change Callback Functions
Each state now has an OnOpen and OnClose callback function. These are available to be set by the client but not required. If not set, they will be ignored.
This commit is contained in:
parent
eae3c6edbe
commit
5e86bbb0b6
@ -5,19 +5,75 @@
|
|||||||
|
|
||||||
return function(loveframes)
|
return function(loveframes)
|
||||||
---------- module start ----------
|
---------- module start ----------
|
||||||
|
|
||||||
-- util library
|
-- util library
|
||||||
--local util = {}
|
--local util = {}
|
||||||
|
|
||||||
|
local statecallbacks = {};
|
||||||
|
|
||||||
--[[---------------------------------------------------------
|
--[[---------------------------------------------------------
|
||||||
- func: SetState(name)
|
- func: SetState(name)
|
||||||
- desc: sets the current state
|
- desc: sets the current state
|
||||||
--]]---------------------------------------------------------
|
--]]---------------------------------------------------------
|
||||||
function loveframes.SetState(name)
|
function loveframes.SetState(name)
|
||||||
|
|
||||||
loveframes.state = name
|
if (loveframes.state ~= name) then
|
||||||
loveframes.base.state = name
|
|
||||||
|
--fire the closing function of the soon-to-be-closed state
|
||||||
|
if (type(statecallbacks[loveframes.state]) == "table" and
|
||||||
|
type(statecallbacks[loveframes.state].onclose) == "function") then
|
||||||
|
--callback must accept the name of the current state and soon-to-be-opened state as args
|
||||||
|
statecallbacks[loveframes.state].onclose(loveframes.state, name);
|
||||||
|
end
|
||||||
|
|
||||||
|
local oldstate = loveframes.state;
|
||||||
|
loveframes.state = name
|
||||||
|
loveframes.base.state = name
|
||||||
|
|
||||||
|
--fire the opening function of the newly-opened state
|
||||||
|
if (type(statecallbacks[loveframes.state]) == "table" and
|
||||||
|
type(statecallbacks[loveframes.state].onopen) == "function") then
|
||||||
|
--callback must accept the name of the current state and previous state as args
|
||||||
|
statecallbacks[loveframes.state].onopen(name, oldstate);
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[---------------------------------------------------------
|
||||||
|
- func: SetStateOnOpenCallback(name, func)
|
||||||
|
- desc: sets a state's opening callback function
|
||||||
|
--]]---------------------------------------------------------
|
||||||
|
function loveframes.SetStateOnOpenCallback(name, func)
|
||||||
|
|
||||||
|
if (type(name) == "string" and name:gsub("%s", '') ~= '' and
|
||||||
|
type(func) == "function") then
|
||||||
|
|
||||||
|
if (not (statecallbacks[name])) then
|
||||||
|
statecallbacks[name] = {};
|
||||||
|
end
|
||||||
|
|
||||||
|
statecallbacks[name].onopen = func;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[---------------------------------------------------------
|
||||||
|
- func: SetStateOnOpenCallback(name, func)
|
||||||
|
- desc: sets a state's closing callback function
|
||||||
|
--]]---------------------------------------------------------
|
||||||
|
function loveframes.SetStateOnCloseCallback(name, func)
|
||||||
|
|
||||||
|
if (type(name) == "string" and name:gsub("%s", '') ~= '' and
|
||||||
|
type(func) == "function") then
|
||||||
|
|
||||||
|
if (not (statecallbacks[name])) then
|
||||||
|
statecallbacks[name] = {};
|
||||||
|
end
|
||||||
|
|
||||||
|
statecallbacks[name].onclose = func;
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[---------------------------------------------------------
|
--[[---------------------------------------------------------
|
||||||
@ -27,7 +83,7 @@ end
|
|||||||
function loveframes.GetState()
|
function loveframes.GetState()
|
||||||
|
|
||||||
return loveframes.state
|
return loveframes.state
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[---------------------------------------------------------
|
--[[---------------------------------------------------------
|
||||||
@ -37,7 +93,7 @@ end
|
|||||||
function loveframes.SetActiveSkin(name)
|
function loveframes.SetActiveSkin(name)
|
||||||
local skin = name and loveframes.skins[name]
|
local skin = name and loveframes.skins[name]
|
||||||
if not skin then print("SetActiveSkin: no such skin") return end
|
if not skin then print("SetActiveSkin: no such skin") return end
|
||||||
|
|
||||||
loveframes.config["ACTIVESKIN"] = name
|
loveframes.config["ACTIVESKIN"] = name
|
||||||
local object = loveframes.base
|
local object = loveframes.base
|
||||||
object:SetSkin(name)
|
object:SetSkin(name)
|
||||||
@ -78,7 +134,7 @@ function loveframes.GetCollisions(object, t)
|
|||||||
local internals = object.internals
|
local internals = object.internals
|
||||||
local objectstate = object.state
|
local objectstate = object.state
|
||||||
local t = t or {}
|
local t = t or {}
|
||||||
|
|
||||||
if objectstate == curstate and visible then
|
if objectstate == curstate and visible then
|
||||||
local objectx = object.x
|
local objectx = object.x
|
||||||
local objecty = object.y
|
local objecty = object.y
|
||||||
@ -115,7 +171,7 @@ function loveframes.GetCollisions(object, t)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -128,21 +184,21 @@ function loveframes.GetAllObjects(object, t)
|
|||||||
local internals = object.internals
|
local internals = object.internals
|
||||||
local children = object.children
|
local children = object.children
|
||||||
local t = t or {}
|
local t = t or {}
|
||||||
|
|
||||||
table.insert(t, object)
|
table.insert(t, object)
|
||||||
|
|
||||||
if internals then
|
if internals then
|
||||||
for k, v in ipairs(internals) do
|
for k, v in ipairs(internals) do
|
||||||
loveframes.GetAllObjects(v, t)
|
loveframes.GetAllObjects(v, t)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if children then
|
if children then
|
||||||
for k, v in ipairs(children) do
|
for k, v in ipairs(children) do
|
||||||
loveframes.GetAllObjects(v, t)
|
loveframes.GetAllObjects(v, t)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return t
|
return t
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -157,7 +213,7 @@ function loveframes.GetDirectoryContents(dir, t)
|
|||||||
local t = t or {}
|
local t = t or {}
|
||||||
local dirs = {}
|
local dirs = {}
|
||||||
local files = love.filesystem.getDirectoryItems(dir)
|
local files = love.filesystem.getDirectoryItems(dir)
|
||||||
|
|
||||||
for k, v in ipairs(files) do
|
for k, v in ipairs(files) do
|
||||||
local isdir = love.filesystem.getInfo(dir.. "/" ..v) ~= nil and love.filesystem.getInfo(dir.. "/" ..v)["type"] == "directory" --love.filesystem.isDirectory(dir.. "/" ..v)
|
local isdir = love.filesystem.getInfo(dir.. "/" ..v) ~= nil and love.filesystem.getInfo(dir.. "/" ..v)["type"] == "directory" --love.filesystem.isDirectory(dir.. "/" ..v)
|
||||||
if isdir == true then
|
if isdir == true then
|
||||||
@ -170,19 +226,19 @@ function loveframes.GetDirectoryContents(dir, t)
|
|||||||
end
|
end
|
||||||
local name = table.concat(parts, ".")
|
local name = table.concat(parts, ".")
|
||||||
table.insert(t, {
|
table.insert(t, {
|
||||||
path = dir,
|
path = dir,
|
||||||
fullpath = dir.. "/" ..v,
|
fullpath = dir.. "/" ..v,
|
||||||
requirepath = loveframes.utf8.gsub(dir, "/", ".") .. "." ..name,
|
requirepath = loveframes.utf8.gsub(dir, "/", ".") .. "." ..name,
|
||||||
name = name,
|
name = name,
|
||||||
extension = extension
|
extension = extension
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for k, v in ipairs(dirs) do
|
for k, v in ipairs(dirs) do
|
||||||
t = loveframes.GetDirectoryContents(v, t)
|
t = loveframes.GetDirectoryContents(v, t)
|
||||||
end
|
end
|
||||||
|
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -194,11 +250,11 @@ end
|
|||||||
--]]---------------------------------------------------------
|
--]]---------------------------------------------------------
|
||||||
function loveframes.Round(num, idp)
|
function loveframes.Round(num, idp)
|
||||||
local mult = 10^(idp or 0)
|
local mult = 10^(idp or 0)
|
||||||
|
|
||||||
if num >= 0 then
|
if num >= 0 then
|
||||||
return math.floor(num * mult + 0.5) / mult
|
return math.floor(num * mult + 0.5) / mult
|
||||||
else
|
else
|
||||||
return math.ceil(num * mult - 0.5) / mult
|
return math.ceil(num * mult - 0.5) / mult
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -209,7 +265,7 @@ end
|
|||||||
--]]---------------------------------------------------------
|
--]]---------------------------------------------------------
|
||||||
function loveframes.SplitString(str, pat)
|
function loveframes.SplitString(str, pat)
|
||||||
local t = {} -- NOTE: use {n = 0} in Lua-5.0
|
local t = {} -- NOTE: use {n = 0} in Lua-5.0
|
||||||
|
|
||||||
if pat == " " then
|
if pat == " " then
|
||||||
local fpat = "(.-)" .. pat
|
local fpat = "(.-)" .. pat
|
||||||
local last_end = 1
|
local last_end = 1
|
||||||
@ -244,7 +300,7 @@ function loveframes.SplitString(str, pat)
|
|||||||
table.insert(t, cap)
|
table.insert(t, cap)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -255,7 +311,7 @@ end
|
|||||||
function loveframes.RemoveAll()
|
function loveframes.RemoveAll()
|
||||||
loveframes.base.children = {}
|
loveframes.base.children = {}
|
||||||
loveframes.base.internals = {}
|
loveframes.base.internals = {}
|
||||||
|
|
||||||
loveframes.hoverobject = false
|
loveframes.hoverobject = false
|
||||||
loveframes.downobject = false
|
loveframes.downobject = false
|
||||||
loveframes.modalobject = false
|
loveframes.modalobject = false
|
||||||
@ -273,7 +329,7 @@ function loveframes.TableHasValue(table, value)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -283,7 +339,7 @@ end
|
|||||||
--]]---------------------------------------------------------
|
--]]---------------------------------------------------------
|
||||||
function loveframes.TableHasKey(table, key)
|
function loveframes.TableHasKey(table, key)
|
||||||
return table[key] ~= nil
|
return table[key] ~= nil
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[---------------------------------------------------------
|
--[[---------------------------------------------------------
|
||||||
@ -348,9 +404,9 @@ end
|
|||||||
- desc: returns loveframes.hoverobject
|
- desc: returns loveframes.hoverobject
|
||||||
--]]---------------------------------------------------------
|
--]]---------------------------------------------------------
|
||||||
function loveframes.GetHoverObject()
|
function loveframes.GetHoverObject()
|
||||||
|
|
||||||
return loveframes.hoverobject
|
return loveframes.hoverobject
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[---------------------------------------------------------
|
--[[---------------------------------------------------------
|
||||||
@ -388,11 +444,11 @@ function loveframes.DebugDraw()
|
|||||||
local fps = love.timer.getFPS()
|
local fps = love.timer.getFPS()
|
||||||
local deltatime = love.timer.getDelta()
|
local deltatime = love.timer.getDelta()
|
||||||
local font = loveframes.basicfontsmall
|
local font = loveframes.basicfontsmall
|
||||||
|
|
||||||
if hoverobject then
|
if hoverobject then
|
||||||
topcol = hoverobject
|
topcol = hoverobject
|
||||||
end
|
end
|
||||||
|
|
||||||
-- show frame docking zones
|
-- show frame docking zones
|
||||||
if topcol.type == "frame" then
|
if topcol.type == "frame" then
|
||||||
for k, v in pairs(topcol.dockzones) do
|
for k, v in pairs(topcol.dockzones) do
|
||||||
@ -403,12 +459,12 @@ function loveframes.DebugDraw()
|
|||||||
love.graphics.rectangle("line", v.x, v.y, v.width, v.height)
|
love.graphics.rectangle("line", v.x, v.y, v.width, v.height)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- outline the object that the mouse is hovering over
|
-- outline the object that the mouse is hovering over
|
||||||
love.graphics.setColor(255/255, 204/255, 51/255, 255/255)
|
love.graphics.setColor(255/255, 204/255, 51/255, 255/255)
|
||||||
love.graphics.setLineWidth(2)
|
love.graphics.setLineWidth(2)
|
||||||
love.graphics.rectangle("line", topcol.x - 1, topcol.y - 1, topcol.width + 2, topcol.height + 2)
|
love.graphics.rectangle("line", topcol.x - 1, topcol.y - 1, topcol.width + 2, topcol.height + 2)
|
||||||
|
|
||||||
-- draw main debug box
|
-- draw main debug box
|
||||||
love.graphics.setFont(font)
|
love.graphics.setFont(font)
|
||||||
love.graphics.setColor(0, 0, 0, 200/255)
|
love.graphics.setColor(0, 0, 0, 200/255)
|
||||||
@ -420,7 +476,7 @@ function loveframes.DebugDraw()
|
|||||||
love.graphics.print("FPS: " ..fps, infox + 10, infoy + 30)
|
love.graphics.print("FPS: " ..fps, infox + 10, infoy + 30)
|
||||||
love.graphics.print("Delta Time: " ..deltatime, infox + 10, infoy + 40)
|
love.graphics.print("Delta Time: " ..deltatime, infox + 10, infoy + 40)
|
||||||
love.graphics.print("Total Objects: " ..loveframes.objectcount, infox + 10, infoy + 50)
|
love.graphics.print("Total Objects: " ..loveframes.objectcount, infox + 10, infoy + 50)
|
||||||
|
|
||||||
-- draw object information if needed
|
-- draw object information if needed
|
||||||
if topcol.type ~= "base" then
|
if topcol.type ~= "base" then
|
||||||
love.graphics.setColor(0, 0, 0, 200/255)
|
love.graphics.setColor(0, 0, 0, 200/255)
|
||||||
|
Loading…
Reference in New Issue
Block a user