stuff
This commit is contained in:
180
LIB/slab.lua
Normal file
180
LIB/slab.lua
Normal file
@@ -0,0 +1,180 @@
|
||||
local path = (...):sub(1, -(("slab"):len() + 2))
|
||||
local graphics
|
||||
graphics = love.graphics
|
||||
local slab = {
|
||||
_VERSION = "0.1.0",
|
||||
_DESCRIPTION = "GUI library for LÖVE.",
|
||||
_URL = nil,
|
||||
_LICENSE = "The MIT License (MIT)",
|
||||
_AUTHOR = "Paul Liverman III"
|
||||
}
|
||||
slab.ui = {
|
||||
x = 0,
|
||||
y = 0,
|
||||
w = graphics.getWidth(),
|
||||
h = graphics.getHeight()
|
||||
}
|
||||
slab.hovered = false
|
||||
slab.focused = false
|
||||
slab.types = {
|
||||
"menu",
|
||||
"spinner",
|
||||
"text"
|
||||
}
|
||||
slab.generic = require(tostring(path) .. "/types/generic")
|
||||
local _list_0 = slab.types
|
||||
for _index_0 = 1, #_list_0 do
|
||||
local t = _list_0[_index_0]
|
||||
slab[t] = require(tostring(path) .. "/types/" .. tostring(t))
|
||||
end
|
||||
slab.make = function(element, parent)
|
||||
if element == nil then
|
||||
element = { }
|
||||
end
|
||||
if parent == nil then
|
||||
parent = slab.ui
|
||||
end
|
||||
local _list_1 = slab.types
|
||||
for _index_0 = 1, #_list_1 do
|
||||
local t = _list_1[_index_0]
|
||||
if element[t] then
|
||||
return slab[t](element, parent)
|
||||
end
|
||||
end
|
||||
return slab.generic(element, parent)
|
||||
end
|
||||
slab.update = function(dt, element)
|
||||
if element == nil then
|
||||
element = slab.ui
|
||||
end
|
||||
if element.update then
|
||||
element:update(dt)
|
||||
end
|
||||
for _index_0 = 1, #element do
|
||||
local child = element[_index_0]
|
||||
slab.update(dt, child)
|
||||
end
|
||||
end
|
||||
slab.draw = function(element)
|
||||
if element == nil then
|
||||
element = slab.ui
|
||||
end
|
||||
if element == slab.ui then
|
||||
graphics.push("all")
|
||||
graphics.origin()
|
||||
end
|
||||
local drawChildren
|
||||
if element.visible and element.draw then
|
||||
drawChildren = element:draw()
|
||||
end
|
||||
if drawChildren ~= false then
|
||||
for _index_0 = 1, #element do
|
||||
local child = element[_index_0]
|
||||
slab.draw(child)
|
||||
end
|
||||
end
|
||||
if element == slab.ui then
|
||||
return graphics.pop()
|
||||
end
|
||||
end
|
||||
slab.mousemoved = function(x, y, dx, dy, element)
|
||||
if element == nil then
|
||||
element = slab.ui
|
||||
end
|
||||
local previous
|
||||
if element == slab.ui then
|
||||
previous = slab.hovered
|
||||
end
|
||||
if element.visible and element.hoverable and x >= element.x and x <= element.x + element.w and y >= element.y and y <= element.y + element.h then
|
||||
slab.hovered = element
|
||||
for _index_0 = 1, #element do
|
||||
local child = element[_index_0]
|
||||
slab.mousemoved(x, y, dx, dy, child)
|
||||
end
|
||||
end
|
||||
if element == slab.ui then
|
||||
if slab.hovered ~= previous then
|
||||
if previous and previous.hovered then
|
||||
previous:hovered(false)
|
||||
end
|
||||
if slab.hovered.hovered then
|
||||
slab.hovered:hovered(true)
|
||||
end
|
||||
end
|
||||
if slab.focused and slab.focused.mousemoved then
|
||||
return slab.focused:mousemoved(x - slab.focused.x, y - slab.focused.y, dx, dy)
|
||||
end
|
||||
end
|
||||
end
|
||||
slab.mousepressed = function(x, y, btn, element)
|
||||
if element == nil then
|
||||
element = screen.ui
|
||||
end
|
||||
if element == screen.ui then
|
||||
if btn == "wd" then
|
||||
return slab.wheelmoved(0, -1)
|
||||
elseif btn == "wu" then
|
||||
return slab.wheelmoved(0, 1)
|
||||
end
|
||||
end
|
||||
local handled = false
|
||||
if element.visible and x >= element.x and x <= element.x + element.w and y >= element.y and y <= element.y + element.h then
|
||||
for i = #element, 1, -1 do
|
||||
handled = slab.mousepressed(x, y, btn, element[i])
|
||||
if handled ~= false then
|
||||
return handled
|
||||
end
|
||||
end
|
||||
if element.mousepressed then
|
||||
handled = element:mousepressed(btn, x, y)
|
||||
end
|
||||
end
|
||||
return handled
|
||||
end
|
||||
slab.mousereleased = function(x, y, btn, element)
|
||||
local clickHandled, mousereleaseHandled = false, false
|
||||
if element then
|
||||
if element.visible and x >= element.x and x <= element.x + element.w and y >= element.y and y <= element.y + element.h then
|
||||
for i = #element, 1, -1 do
|
||||
clickHandled, mousereleaseHandled = slab.mousereleased(x, y, btn, element[i])
|
||||
if clickHandled ~= false or mousereleaseHandled ~= false then
|
||||
return clickHandled, mousereleaseHandled
|
||||
end
|
||||
end
|
||||
if element.clicked then
|
||||
clickHandled = element:clicked(btn, x - element.x, y - element.y)
|
||||
end
|
||||
if element.mousereleased then
|
||||
mousereleaseHandled = element:mousereleased(btn, x - element.x, y - element.y)
|
||||
end
|
||||
if clickHandled then
|
||||
slab.focused = element
|
||||
end
|
||||
end
|
||||
else
|
||||
do
|
||||
element = slab.focused
|
||||
if element then
|
||||
if element.mousereleased then
|
||||
mousereleaseHandled = element:mousereleased(btn, x - element.x, y - element.y)
|
||||
end
|
||||
if element.visible and x >= element.x and x <= element.x + element.w and y >= element.y and y <= element.y + element.h then
|
||||
if element.clicked then
|
||||
clickHandled = element:clicked(btn, x - element.x, y - element.y)
|
||||
end
|
||||
end
|
||||
if clickHandled ~= false or mousereleaseHandled ~= false then
|
||||
return clickHandled, mousereleaseHandled
|
||||
end
|
||||
return slab.mousereleased(x, y, btn, slab.ui)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
slab.wheelmoved = function(x, y)
|
||||
if slab.hovered and slab.hovered.wheelmoved then
|
||||
return slab.hovered:wheelmoved(x, y)
|
||||
end
|
||||
return false
|
||||
end
|
||||
return slab
|
Reference in New Issue
Block a user