Pop.Box/init.moon

612 lines
20 KiB
Plaintext
Raw Permalink Normal View History

2016-06-21 05:52:44 +00:00
--- The Pop.Box GUI itself.
--- @module pop
--- @copyright Paul Liverman III (2015-2016)
--- @license The MIT License (MIT)
2016-08-02 23:30:59 +00:00
--- @release 0.0.0
2016-06-21 05:52:44 +00:00
2016-04-18 06:22:40 +00:00
pop = {
2017-08-28 08:49:12 +00:00
_VERSION: '0.0.0'
_DESCRIPTION: 'GUI library for LOVE, designed for ease of use'
_URL: 'http://github.com/Guard13007/Pop.Box'
_LICENSE: 'The MIT License (MIT)'
_AUTHOR: 'Paul Liverman III'
2016-04-18 06:22:40 +00:00
}
log = (...) ->
2017-08-28 08:49:12 +00:00
print "[Pop.Box]", ...
unless love.getVersion
2017-08-28 08:49:12 +00:00
error "Pop.Box only supports LOVE versions >= 0.9.1"
path = (...)\gsub "%.", "/"
2016-06-21 05:52:44 +00:00
2016-08-21 05:29:16 +00:00
if (...)\sub(-4) == "init"
2017-08-28 08:49:12 +00:00
path = (...)\sub 1, -5
unless path
path = "."
2016-08-21 05:29:16 +00:00
log "Require path detected: \"#{path}\""
import filesystem, graphics from love
import insert from table
2016-08-02 23:30:59 +00:00
import inheritsFromElement from require "#{path}/util"
import dumps, loads from require "#{path}/lib/bitser/bitser"
2016-06-21 05:52:44 +00:00
--- @table pop
--- @tfield constants For now, just stores values to be used with mouse clicks
--- for compatibility with differing LOVE versions.
2016-08-21 07:49:16 +00:00
--- @tfield table elements All GUI classes are stored here.
--- @tfield table skins All skins are stored here.
--- @tfield table extensions All extensions are loaded here.
--- @tfield Element screen The top level GUI element. Represents the game
--- screen. Initialized in `pop.load()`
--- @tfield ?Element|false focused The currently focused GUI element (or `false`
--- if none is focused).
2017-04-09 00:10:44 +00:00
--- @tfield ?Element|false hovered The GUI element the mouse is hovering over
--- (or `false` if none is hovered over).
2016-06-21 05:52:44 +00:00
--- @see pop.load
2016-08-21 07:49:16 +00:00
--- @see Element
2016-06-21 05:52:44 +00:00
major, minor, revision = love.getVersion!
if major == 0 and minor == 9
2017-08-28 08:49:12 +00:00
pop.constants = {
left_mouse: "l"
middle_mouse: "m"
right_mouse: "r"
button_4: "x1"
button_5: "x2"
-- note: these should not be used
mouse_wheel_down: "wd"
mouse_wheel_up: "wu"
}
elseif major == 0 and minor == 10
2017-08-28 08:49:12 +00:00
pop.constants = {
left_mouse: 1
middle_mouse: 3
right_mouse: 2
button_4: 4
button_5: 5
-- no mouse wheel, may lead to problems?
}
else
2017-08-28 08:49:12 +00:00
pop.constants = {} -- this would be an unsupported version currently
2016-02-25 01:02:56 +00:00
pop.elements = {}
pop.skins = {}
2016-08-21 05:29:16 +00:00
pop.extensions = {}
2017-08-14 02:28:32 +00:00
pop.states = {}
pop.state = false
2016-06-21 05:52:44 +00:00
pop.screen = false
2016-03-30 17:50:33 +00:00
pop.focused = false
2017-04-09 00:10:44 +00:00
pop.hovered = false
pop.log = log
2016-06-21 05:52:44 +00:00
--- Loads elements, skins, extensions from a specified path. Initializes
--- `pop.screen` on first call.
2016-08-21 05:29:16 +00:00
---
--- Automatically called when you require Pop.Box for its internals. Subsequent
--- calls can be used to add more elements/skins/extensions.
2016-06-21 05:52:44 +00:00
--- @function load
--- @tparam string[opt] The path to load from. Within this path should be
--- elements, skins, and extensions directories, containing whatever items you
--- want to load.
2016-08-21 07:49:16 +00:00
--- @see Element
--- @todo @ see Skins, see Extensions
2016-06-21 05:52:44 +00:00
pop.load = (load_path=path) ->
2017-08-28 08:49:12 +00:00
log "Loading elements from \"#{load_path}/elements\""
elements = filesystem.getDirectoryItems "#{load_path}/elements"
for i = 1, #elements
-- ignore non-Lua files
unless elements[i]\sub(-4) == ".lua"
log "Ignored non-Lua file \"#{load_path}/elements/#{elements[i]}\""
continue
2017-08-28 08:49:12 +00:00
-- require into pop.elements table by filename
name = elements[i]\sub 1, -5
log "Requiring \"#{name}\" from \"#{load_path}/elements/#{name}\""
pop.elements[name] = require "#{load_path}/elements/#{name}"
2016-04-03 07:27:15 +00:00
2017-08-28 08:49:12 +00:00
-- call the element's load function if it exists
if pop.elements[name].load
pop.elements[name].load pop
2016-04-03 07:27:15 +00:00
2017-08-28 08:49:12 +00:00
log "Element loaded: \"#{name}\""
2017-08-28 08:49:12 +00:00
-- create "pop.element()" function wrapper if possible
unless pop[name]
if pop.elements[name].wrap
pop[name] = pop.elements[name].wrap pop
else
pop[name] = (...) ->
return pop.create(name, ...)
2016-02-25 01:02:56 +00:00
2017-08-28 08:49:12 +00:00
log "Wrapper created: \"pop.#{name}()\""
2016-02-25 01:02:56 +00:00
2017-08-28 08:49:12 +00:00
skins = filesystem.getDirectoryItems "#{load_path}/skins"
for i = 1, #skins
-- ignore non-Lua files
unless skins[i]\sub(-4) == ".lua"
log "Ignored non-Lua file \"#{load_path}/skins/#{skins[i]}\""
continue
2017-08-28 08:49:12 +00:00
-- require into pop.skins table by filename
name = skins[i]\sub 1, -5
log "Requiring \"#{name}\" from \"#{load_path}/skins/#{name}\""
pop.skins[name] = require "#{load_path}/skins/#{name}"
2017-08-28 08:49:12 +00:00
-- call the skin's load function if it exists
if pop.skins[name].load
pop.skins[name].load pop
2016-06-21 05:52:44 +00:00
2017-08-28 08:49:12 +00:00
log "Skin loaded: \"#{name}\""
2016-02-25 01:02:56 +00:00
2016-04-01 21:14:24 +00:00
2017-08-28 08:49:12 +00:00
extensions = filesystem.getDirectoryItems "#{load_path}/extensions"
for i = 1, #extensions
-- ignore non-Lua files
unless extensions[i]\sub(-4) == ".lua"
log "Ignored non-Lua file \"#{load_path}/extensions/#{extensions[i]}\""
continue
2016-04-01 21:14:24 +00:00
2017-08-28 08:49:12 +00:00
-- require into pop.extensions by filename
name = extensions[i]\sub 1, -5
log "Requiring \"#{name}\" from \"#{load_path}/extensions/#{name}\""
pop.extensions[name] = require "#{load_path}/extensions/#{name}"
2016-08-21 05:29:16 +00:00
2017-08-28 08:49:12 +00:00
-- call the extension's load function if it exists
if type(pop.extensions[name]) == "table" and pop.extensions[name].load
pop.extensions[name].load pop
2016-04-01 21:14:24 +00:00
2017-08-28 08:49:12 +00:00
log "Extension loaded: \"#{name}\""
2016-06-21 05:52:44 +00:00
2017-08-28 08:49:12 +00:00
-- Initialize pop.screen (top element, GUI area)
unless pop.screen
pop.setState(pop.newState())
2017-08-14 02:28:32 +00:00
pop.newState = (name) ->
2017-08-28 08:49:12 +00:00
screen = pop.create("element", false)\setSize(graphics.getWidth!, graphics.getHeight!)
screen.data.update = true
unless name
if pop.states.default
name = #pop.states + 1
else
name = "default"
2017-08-14 02:28:32 +00:00
2017-08-28 08:49:12 +00:00
pop.states[name] = {
screen: screen
focused: false
hovered: false
}
2017-08-14 02:28:32 +00:00
2017-08-28 08:49:12 +00:00
log "Created state: \"#{name}\""
return name
2017-08-14 02:28:32 +00:00
pop.setState = (name=default) ->
2017-08-28 08:49:12 +00:00
if state = pop.states[name]
pop.state = name
pop.screen = state.screen
pop.focused = state.focused
pop.hovered = state.hovered
return true
else
error "Invalid state: \"#{name}\""
2016-02-25 01:02:56 +00:00
2016-06-21 05:52:44 +00:00
--- Creates an element.
--- @function create
2016-08-21 07:49:16 +00:00
--- @tparam string element The element class to use.
--- @tparam ?Element|false|nil parent[opt] The parent element. If `false`, an
--- element is created with no parent. If `nil`, defaults to `pop.screen`.
--- @param ...[opt] Any number of parameters can be passed to the constructor
--- for the element.
2016-08-21 05:29:16 +00:00
---
2016-08-21 07:49:16 +00:00
--- (**Note**: An element with no parent will not be handled by Pop.Box's event
--- handlers unless you handle it explicitly.)
2016-06-21 05:52:44 +00:00
--- @see pop
2016-08-21 07:49:16 +00:00
--- @see Element
2016-06-21 05:52:44 +00:00
pop.create = (element, parent=pop.screen, data, ...) ->
2017-08-28 08:49:12 +00:00
-- if valid parent element, use it
if inheritsFromElement parent
if type(data) == "table"
element = pop.elements[element](parent, data, ...)
else
element = pop.elements[element](parent, {}, data, ...)
insert parent.child, element
insert parent.data.child, element.data
element.parent = parent
element.data.parent = parent.data
-- if explicitly no parent, just create the element
elseif parent == false
if type(data) == "table"
element = pop.elements[element](false, data, ...)
2016-04-01 01:59:16 +00:00
else
2017-08-28 08:49:12 +00:00
element = pop.elements[element](false, {}, data, ...)
element.parent = false
element.data.parent = false
-- else use pop.screen (and "parent" is actually the first argument)
else
if type(parent) == "table" -- then parent must be data table
element = pop.elements[element](pop.screen, parent, data, ...)
else -- parent must be an argument
element = pop.elements[element](pop.screen, {}, parent, data, ...)
insert pop.screen.child, element
insert pop.screen.data.child, element.data
element.parent = pop.screen
element.data.parent = pop.screen.data
2017-08-28 08:49:12 +00:00
if element.parent and element.parent.childAdded
print "working?"
element.parent\childAdded element
2017-08-28 08:49:12 +00:00
return element
2016-06-21 05:52:44 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.update()`.
2016-06-21 05:52:44 +00:00
--- @function update
2016-08-21 07:49:16 +00:00
--- @tparam number dt The amount of time passed since the last call to update,
--- in seconds.
--- @tparam Element element[opt] The element to update (will update all its
--- children as well). Defaults to `pop.screen`.
--- @see Element
2016-06-21 05:52:44 +00:00
pop.update = (dt, element=pop.screen) ->
2017-08-28 08:49:12 +00:00
--- @todo Define Elements and @ see that documentation from here. Generic documentation, not specifically element!
-- data.update boolean controls an element and its children being updated
if element.data.update
if element.update
element\update dt
for i = 1, #element.child
pop.update dt, element.child[i]
2016-06-21 05:52:44 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.draw()`.
2016-06-21 05:52:44 +00:00
--- @function draw
2016-08-21 07:49:16 +00:00
--- @tparam Element element[opt] The element to draw (will draw all its children
--- as well). Defaults to `pop.screen`.
--- @see Element
2016-06-21 05:52:44 +00:00
pop.draw = (element=pop.screen) ->
2017-08-28 08:49:12 +00:00
-- data.draw boolean controls an element and its children being drawn
if element.data.draw
local drawChildren
if element.draw
drawChildren = element\draw!
if drawChildren != false
for i = 1, #element.child
pop.draw element.child[i]
2016-02-25 01:02:56 +00:00
2016-06-21 05:52:44 +00:00
2016-08-21 07:49:16 +00:00
--- Event handler for `love.mousemoved()`. (LÖVE >= 0.10.0)
2016-06-21 05:52:44 +00:00
--- @function mousemoved
2016-08-21 07:49:16 +00:00
--- @tparam integer x The x coordinate of the mouse.
--- @tparam integer y The y coordinate of the mouse.
--- @tparam number dx The distance on the x axis the mouse was moved.
--- @tparam number dy The distance on the y axis the mouse was moved.
--- @treturn boolean Was the event handled?
2016-06-21 05:52:44 +00:00
2017-04-09 00:10:44 +00:00
pop.mousemoved = (x, y, dx, dy, element=pop.screen) ->
2017-08-28 08:49:12 +00:00
local previously_hovered
if element == pop.screen
previously_hovered = pop.hovered -- we save it because the loop below will change it
-- first we find out if we're hovering over anything and set pop.hovered
if element.data.draw and element.data.hoverable and (x >= element.data.x) and (x <= element.data.x + element.data.w) and (y >= element.data.y) and (y <= element.data.y + element.data.h)
-- okay, we're over this element for sure, but let's check its children
pop.hovered = element
-- check in reverse order, it will set pop.hovered to any that match
for i = 1, #element.child
pop.mousemoved x, y, dx, dy, element.child[i]
2017-04-09 00:10:44 +00:00
2017-08-28 08:49:12 +00:00
-- check element == pop.screen so this is only called once at the end
if element == pop.screen
-- if we're hovering over something different, log it, and call handlers if relevant
if pop.hovered != previously_hovered
log " pop.hovered: #{pop.hovered} (#{pop.hovered.data.type})"
if previously_hovered and previously_hovered.hovered -- previously_hovered can be a false boolean
previously_hovered\hovered false
if pop.hovered.hovered
pop.hovered\hovered true
2017-08-28 08:49:12 +00:00
if pop.focused and pop.focused.mousemoved
return pop.focused\mousemoved x - pop.focused.data.x, y - pop.focused.data.y, dx, dy
2017-08-28 08:49:12 +00:00
return false
2016-06-21 05:52:44 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.mousepressed()`.
2016-06-21 05:52:44 +00:00
--- @function mousepressed
2016-08-21 07:49:16 +00:00
--- @tparam integer x The x coordinate of the mouse press.
--- @tparam integer y The y coordinate of the mouse press.
--- @tparam ?string|integer button The mouse button pressed. (Type varies by
--- LÖVE version.)
--- @tparam Element element[opt] The element to check for event handling (will
--- check its children as well). Defaults to `pop.screen`.
--- @treturn boolean Was the event handled?
--- @see Element
2016-06-21 05:52:44 +00:00
pop.mousepressed = (x, y, button, element) ->
2017-08-28 08:49:12 +00:00
-- start at the screen, print that we received an event
unless element
-- take pre 0.10.0 wheel movement and pass it along
if button == pop.constants.mouse_wheel_down
pop.wheelmoved 0, -1
return true
elseif button == pop.constants.mouse_wheel_up
pop.wheelmoved 0, 1
return true
log "mousepressed", x, y, button
element = pop.screen
-- have we handled the event?
handled = false
-- if it is inside the current element..
if element.data.draw and (x >= element.data.x) and (x <= element.data.x + element.data.w) and (y >= element.data.y) and (y <= element.data.y + element.data.h)
-- check its child elements in reverse order, returning if something handles it
for i = #element.child, 1, -1
handled = pop.mousepressed x, y, button, element.child[i]
if handled != false
return handled
-- if a child hasn't handled it yet, try to handle it, and set pop.focused
if element.mousepressed
handled = element\mousepressed x - element.data.x, y - element.data.y, button
if handled != false
log " #{handled} (handled)", "#{element} (#{element.data.type})"
if handled -- you have to explicitly handle a mousepressed event to become focused
log " ^ focused"
pop.focused = element
-- return whether or not we have handled the event
return handled
2016-06-21 05:52:44 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.mousereleased()`.
2016-06-21 05:52:44 +00:00
--- @function mousereleased
2016-08-21 07:49:16 +00:00
--- @tparam integer x The x coordinate of the mouse release.
--- @tparam integer y The y coordinate of the mouse release.
--- @tparam ?string|integer button The mouse button released. (Type varies by
--- LÖVE version.)
--- @tparam Element element[opt] The element to check for event handling (will
--- check its children as well). Defaults to `pop.screen`.
--- @treturn boolean Was a click handled?
--- @treturn boolean Was a mouse release handled?
--- @see Element
2016-06-21 05:52:44 +00:00
pop.mousereleased = (x, y, button, element) ->
2017-08-28 08:49:12 +00:00
-- we are trying to handle a clicked or mousereleased event
clickedHandled = false
mousereleasedHandled = false
2017-04-30 23:40:29 +00:00
2017-08-28 08:49:12 +00:00
-- if we have an element, and are within its bounds
if element
if element.data.draw and (x >= element.data.x) and (x <= element.data.x + element.data.w) and (y >= element.data.y) and (y <= element.data.y + element.data.h)
-- check its children in reverse for handling a clicked or mousereleased event
for i = #element.child, 1, -1
clickedHandled, mousereleasedHandled = pop.mousereleased x, y, button, element.child[i]
if clickedHandled != false or mousereleasedHandled != false
return clickedHandled, mousereleasedHandled
-- if that doesn't work, we try to handle it ourselves
if element.clicked
clickedHandled = element\clicked x - element.data.x, y - element.data.y, button
if element.mousereleased
mousereleasedHandled = element\mousereleased x - element.data.x, y - element.data.y, button
-- if we clicked (AND returned true), we're focused!
if clickedHandled != false
log " #{clickedHandled} (click handled)", "#{element} (#{element.data.type})"
if clickedHandled
log " ^ focused"
pop.focused = element
--- @todo Figure out how to bring a focused element to the front of view (aka the first element in its parent's children).
--- (If I do it right here, the for loop above may break! I need to test/figure this out.)
--NOTE this might cause an error in the above for loop!
-- basically, move focused element to front of its parent's child
--element.parent\focusChild element
--table.insert element.parent, element.parent\removeChild(element),
if mousereleasedHandled != false
log " #{mousereleasedHandled} (release handled)", "#{element} (#{element.data.type})"
-- else, check for focused element, and then default to pop.screen to begin! (and print that we received an event)
else
log "mousereleased", x, y, button
if element = pop.focused
if element.data.draw and (x >= element.data.x) and (x <= element.data.x + element.data.w) and (y >= element.data.y) and (y <= element.data.y + element.data.h)
if element.clicked
clickedHandled = element\clicked x - element.data.x, y - element.data.y, button
if clickedHandled != false
log " #{clickedHandled} (click handled)", "#{element} (#{element.data.type})"
-- a focused element needs to know when it has been released no matter what!
if element.mousereleased
mousereleasedHandled = element\mousereleased x - element.data.x, y - element.data.y, button
if mousereleasedHandled != false
log " #{mousereleasedHandled} (release handled)", "#{element} (#{element.data.type})"
if clickedHandled != false or mousereleasedHandled != false
return clickedHandled, mousereleasedHandled
pop.mousereleased x, y, button, pop.screen
-- print "#{clickedHandled}, #{mousereleasedHandled}, #{element}"
return clickedHandled, mousereleasedHandled
2016-02-25 01:02:56 +00:00
2016-06-21 07:58:08 +00:00
2017-04-12 10:37:29 +00:00
--- Event handler for `love.wheelmoved()`
--- @function wheelmoved
--- @tparam number x The distance the wheel moved on the x-axis.
--- @tparam number y The distance the wheel moved on the y-axis.
--- @treturn boolean Was the event handled?
pop.wheelmoved = (x, y) ->
2017-08-28 08:49:12 +00:00
log "wheelmoved", x, y
2017-04-12 10:37:29 +00:00
2017-08-28 08:49:12 +00:00
if pop.hovered and pop.hovered.wheelmoved
return pop.hovered\wheelmoved x, y
2017-04-12 10:37:29 +00:00
2017-08-28 08:49:12 +00:00
return false
2017-04-12 10:37:29 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.keypressed()`.
--- @function keypressed
2016-08-21 07:49:16 +00:00
--- @tparam string key The key that was pressed.
--- @treturn boolean Was the event handled?
2016-06-21 07:58:08 +00:00
2016-02-25 01:02:56 +00:00
pop.keypressed = (key) ->
2017-08-28 08:49:12 +00:00
log "keypressed", key
2016-04-17 07:29:27 +00:00
2017-08-28 08:49:12 +00:00
-- keypressed events must be on visible elements
element = pop.focused
if element and element.keypressed and element.data.draw
return element.keypressed key
2016-04-17 07:29:27 +00:00
2017-08-28 08:49:12 +00:00
return false
2016-02-25 01:02:56 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.keyreleased()`.
--- @function keyreleased
2016-08-21 07:49:16 +00:00
--- @tparam string key The key that was released.
--- @treturn boolean Was the event handled?
2016-06-21 07:58:08 +00:00
2016-02-25 01:02:56 +00:00
pop.keyreleased = (key) ->
2017-08-28 08:49:12 +00:00
log "keyreleased", key
2016-04-17 07:29:27 +00:00
2017-08-28 08:49:12 +00:00
-- keyreleased events are always called
element = pop.focused
if element and element.keyreleased
return element.keyreleased key
2016-04-17 07:29:27 +00:00
2017-08-28 08:49:12 +00:00
return false
2016-02-25 01:02:56 +00:00
2016-06-21 07:58:08 +00:00
--- Event handler for `love.textinput()`.
--- @function textinput
2016-08-21 07:49:16 +00:00
--- @tparam string text The text that was typed.
--- @treturn boolean Was the text input handled?
2016-06-21 07:58:08 +00:00
2016-02-25 01:02:56 +00:00
pop.textinput = (text) ->
2017-08-28 08:49:12 +00:00
log "textinput", text
2016-04-17 07:29:27 +00:00
2017-08-28 08:49:12 +00:00
-- textinput events must be on visible elements
element = pop.focused
if element and element.textinput and element.data.draw
return element.textinput text
2016-04-17 07:29:27 +00:00
2017-08-28 08:49:12 +00:00
return false
2016-06-21 07:58:08 +00:00
--- @todo document pop.import
pop.import = (data, parent=pop.screen) ->
2017-08-28 08:49:12 +00:00
local element
if type(data) == "string"
data = loads(data)
element = pop.create(data.type, parent, data)
else
element = pop.elements[data.type](parent, data) --why is it not the same as the other way?
insert parent.child, element
2017-08-28 08:49:12 +00:00
for i = 1, #data.child
pop.import data.child[i], element
--- @todo document pop.export
pop.export = (element=pop.screen) ->
2017-08-28 08:49:12 +00:00
return dumps(element.data)
2016-06-21 19:31:42 +00:00
--- Draws simple rectangle outlines to debug placement of elements.
--- @function debugDraw
2016-08-21 07:49:16 +00:00
--- @tparam Element element[opt] The element to draw (will draw its children as
--- well). Defaults to `pop.screen`.
--- @see Element
2016-06-21 19:31:42 +00:00
pop.debugDraw = (element=pop.screen) ->
2017-08-28 08:49:12 +00:00
if element.debugDraw
element\debugDraw!
2016-02-25 01:02:56 +00:00
2017-08-28 08:49:12 +00:00
graphics.setLineWidth 1
graphics.setColor 0, 0, 0, 100
graphics.rectangle "fill", element.data.x, element.data.y, element.data.w, element.data.h
graphics.setColor 150, 150, 150, 150
graphics.rectangle "line", element.data.x, element.data.y, element.data.w, element.data.h
graphics.setColor 200, 200, 200, 255
if element.debugInfo
graphics.print "#{element.__class.__name\sub 1, 1} (#{element\debugInfo!})", element.data.x, element.data.y
else
graphics.print "#{element.__class.__name\sub 1, 1}", element.data.x, element.data.y
for i = 1, #element.child
pop.debugDraw element.child[i]
2016-02-25 01:02:56 +00:00
2016-06-21 19:31:42 +00:00
--- Prints a basic structure of GUI elements with minimal info.
--- @function printElementTree
2016-08-21 07:49:16 +00:00
--- @tparam Element element[opt] The element to start at. Defaults to
--- `pop.screen`.
--- @see Element
2016-06-21 19:31:42 +00:00
pop.printElementTree = (element=pop.screen, fn, depth=0) ->
2017-08-28 08:49:12 +00:00
if "table" != type element
depth = fn
fn = element
element = pop.screen
if "number" == type fn
depth = fn
fn = nil
unless depth
depth=0
--- @todo Write debugInfo things for elements.
cls = element.__class.__name
if element.debugInfo
cls ..= " (#{element\debugInfo!})"
if fn
cls ..= " #{fn element}"
if depth > 0
log string.rep("-", depth) .. " #{cls}"
else
log cls
for i = 1, #element.child
pop.printElementTree element.child[i], fn, depth + 1
2016-02-25 01:02:56 +00:00
2016-06-21 19:31:42 +00:00
-- finally, load is called and pop returned
pop.load!
2016-02-25 01:02:56 +00:00
return pop