love-loader/skins/select.lua

131 lines
2.3 KiB
Lua

return function(ll)
local skins = {
require 'skins.psp',
require 'skins.gui',
require 'skins.base',
require 'skins.select',
}
local sel = 1
local sk, ssel
local cx, cw, ch
local scx, scy = 1, 1
local tscx, tscy
local canv
local resz, l
function load(nunl)
l = true
resize = nil
assert(skins[sel], 'Skin does not exists')
sk = skins[sel](ll)
love.resize(love.graphics.getDimensions())
sk.update()
if not nunl then
if sk.lovecb then
for _, v in pairs(sk.lovecb)
do love[v] = nil
end
end
resize = resz
love.resize(love.graphics.getDimensions())
love.graphics.setCanvas(canv)
love.graphics.setColor(0, 0, 0)
love.graphics.rectangle('fill', 0, 0, W, H)
love.graphics.setColor(255, 255, 255)
sk.draw()
love.graphics.setCanvas()
else ll.skin = sk
end
l = false
end
function resize()
cx = math.min(W, H) / 8
cw, ch =
W - cx * 2.5,
H - cx * 1.5
tscx, tscy =
cw / W,
ch / H
canv = love.graphics.newCanvas(W, H)
if not l then load() end
ll.kbInit('h', cx, W - cx)
end
resz = resize
local d
local function update()
if not sk then load() end
scx = scx + (tscx - scx) * 0.1
scy = scy + (tscy - scy) * 0.1
if ssel
and scx > 0.99
and scy > 0.99
then load(true) end
local nd = ll.kbGet()
if nd ~= d then
d = nd
local ns = sel
if d == '<'
then ns = sel - 1
elseif d == '>'
then ns = sel + 1
elseif d == 'o'
then ssel = true
tscx, tscy = 1, 1
end
if ns < 1 then ns = #skins end
if ns > #skins then ns = 1 end
if sel ~= ns then
sel = ns
load()
end
end
end
local function draw()
local w, h = W * scx, H * scy
local x, y, r =
(W - w) / 2,
(H - h) / 2,
math.min(W - w, H - h) / 8
love.graphics.setColor(100 / COLDIV, 100 / COLDIV, 100 / COLDIV)
love.graphics.rectangle('fill', 0, 0, W, H)
love.graphics.setColor(255, 255, 255)
love.graphics.stencil(function()
love.graphics.rectangle('fill', x, y, w, h, r)
end)
love.graphics.setStencilTest('greater', 0)
love.graphics.draw(canv, x, y, 0, scx, scy)
love.graphics.setStencilTest()
love.graphics.rectangle('line', x, y, w, h, r)
end
-- execute if loaded from other skin
if ll.skin then
load()
resize()
update()
end
return {
draw = draw,
update = update,
}
end