box-of-eases/src/button.lua

213 lines
6.6 KiB
Lua
Raw Normal View History

2021-09-19 10:32:12 +00:00
local self = {}
2021-09-19 19:11:33 +00:00
local icon = {
clipboard = love.graphics.newImage('assets/textures/clipboard.png'),
screenshot = love.graphics.newImage('assets/textures/screenshot.png'),
swap = love.graphics.newImage('assets/textures/swap.png'),
}
2021-09-19 10:32:12 +00:00
local buttons = {}
function self.get(index)
return buttons[index]
end
function self.kget(key)
for _, v in ipairs(buttons) do
if v.name == key then
return v
end
end
end
local function nillify(tab) -- dumb hack. turns `false` into `nil`
local t = {}
for i,v in ipairs(tab) do
if v then table.insert(t, v) end
end
return t
end
2021-09-19 10:32:12 +00:00
local buttonId
local function insertButton(tab, f)
buttonId = buttonId + 1
f.press = (self.kget(f.name) or {press = 1}).press
return table.insert(tab, f)
end
function self.createButtons()
local s = {}
buttonId = 0
2021-09-19 12:04:31 +00:00
if mode == modes.mix or mode == modes.preview or mode == modes.multiply then
insertButton(s, {
x = outerpadding,
y = love.graphics.getHeight() - outerpadding - fontHeight * 4 - padding * 2 - 32,
size = 32,
name = 'clipboard',
displayname = 'Copy to Clipboard',
tooltip = 'Copy to Clipboard',
2021-09-19 19:11:33 +00:00
icon = 'clipboard',
2021-09-19 12:04:31 +00:00
func = function()
local s = ''
local param1 = {}
local param2 = {}
if mode == modes.preview then
local e = ease.eases[dropdown.kselected('ease1')]
param1[1] = slider.kvalue(e.name .. 'param11')
param1[2] = slider.kvalue(e.name .. 'param12')
2021-09-19 12:04:31 +00:00
local p1 = ''
if param1[1] ~= (e.params[1] and e.params[1].default) or param1[2] ~= (e.params[2] and e.params[2].default) then
for i,v in ipairs(param1) do
v = math.floor(v * 100) / 100
p1 = p1 .. (i > 1 and (', ' .. v) or v)
end
2021-09-19 12:04:31 +00:00
end
s = e.name .. (p1 ~= '' and ('.params(' .. p1 .. ')') or '')
elseif mode == modes.mix then
local e1 = ease.eases[dropdown.kselected('ease1')]
local e2 = ease.eases[dropdown.kselected('ease2')]
param1[1] = slider.kvalue(e1.name .. 'param11')
param1[2] = slider.kvalue(e1.name .. 'param12')
param2[1] = slider.kvalue(e2.name .. 'param11')
param2[2] = slider.kvalue(e2.name .. 'param12')
2021-09-19 12:04:31 +00:00
local p1 = ''
if param1[1] ~= (e1.params[1] and e1.params[1].default) or param1[2] ~= (e1.params[2] and e1.params[2].default) then
for i,v in ipairs(param1) do
v = math.floor(v * 100) / 100
p1 = p1 .. (i > 1 and (', ' .. v) or v)
end
2021-09-19 12:04:31 +00:00
end
local p2 = ''
if param2[1] ~= (e2.params[1] and e2.params[1].default) or param2[2] ~= (e2.params[2] and e2.params[2].default) then
for i,v in ipairs(param2) do
v = math.floor(v * 100) / 100
p2 = p2 .. (i > 1 and (', ' .. v) or v)
end
2021-09-19 12:04:31 +00:00
end
s = 'mixEase(' .. e1.name .. (p1 ~= '' and ('.params(' .. p1 .. ')') or '') .. ', ' .. e2.name .. (p2 ~= '' and ('.params(' .. p2 .. ')') or '') .. ', ' .. (math.floor(slider.kvalue('mix') * 100) / 100) .. ')'
2021-09-19 12:04:31 +00:00
elseif mode == modes.multiply then
local e1 = ease.eases[dropdown.kselected('ease1')]
local e2 = ease.eases[dropdown.kselected('ease2')]
param1[1] = slider.kvalue(e1.name .. 'param11')
param1[2] = slider.kvalue(e1.name .. 'param12')
param2[1] = slider.kvalue(e2.name .. 'param11')
param2[2] = slider.kvalue(e2.name .. 'param12')
2021-09-19 12:04:31 +00:00
local p1 = ''
if param1[1] ~= (e1.params[1] and e1.params[1].default) or param1[2] ~= (e1.params[2] and e1.params[2].default) then
for i,v in ipairs(param1) do
v = math.floor(v * 100) / 100
p1 = p1 .. (i > 1 and (', ' .. v) or v)
end
2021-09-19 12:04:31 +00:00
end
local p2 = ''
if param2[1] ~= (e2.params[1] and e2.params[1].default) or param2[2] ~= (e2.params[2] and e2.params[2].default) then
for i,v in ipairs(param2) do
v = math.floor(v * 100) / 100
p2 = p2 .. (i > 1 and (', ' .. v) or v)
end
2021-09-19 12:04:31 +00:00
end
s = 'function(x) ' .. e2.name .. (p2 ~= '' and ('.params(' .. p2 .. ')') or '') .. '(' .. e1.name .. (p1 ~= '' and ('.params(' .. p1 .. ')') or '') .. '(x)) end'
end
love.system.setClipboardText(s)
end
})
2021-09-19 18:20:22 +00:00
insertButton(s, {
x = outerpadding + padding + 32,
y = love.graphics.getHeight() - outerpadding - fontHeight * 4 - padding * 2 - 32,
size = 32,
name = 'screenshot',
displayname = 'Screenshot',
tooltip = 'Take a screenshot',
2021-09-19 19:11:33 +00:00
icon = 'screenshot',
2021-09-19 18:20:22 +00:00
func = function()
screenshot = true
screenshotCanvas = love.graphics.newCanvas()
end
})
2021-09-19 12:04:31 +00:00
end
2021-09-19 10:32:12 +00:00
2021-09-19 19:11:33 +00:00
if mode == modes.mix or mode == modes.multiply then
insertButton(s, {
x = outerpadding + dropdownWidth * 2 + padding,
y = outerpadding + fontHeight/2 - padding/2,
size = padding,
name = 'swap',
displayname = 'Swap',
icon = 'swap',
func = function()
dropdown.swap('ease1', 'ease2')
createUI()
end
})
end
2021-09-19 10:32:12 +00:00
buttons = s
end
function self.update(dt)
for i, v in ipairs(buttons) do
local mx, my = getMousePosition()
2021-09-19 10:32:12 +00:00
local targetsize = 1
if mx > v.x and mx < v.x + v.size and my > v.y and my < v.y + v.size and dropdown.openDropdown == 0 then
2021-09-19 10:32:12 +00:00
if love.mouse.isDown(1) then
targetsize = 0.8
else
targetsize = 0.95
end
end
v.press = mix(v.press, targetsize, dt * 12)
end
end
function self.render()
local mx, my = getMousePosition()
2021-09-19 10:32:12 +00:00
for i, v in ipairs(buttons) do
local x, y, w, h = v.x, v.y, v.size, v.size
w = w * v.press
h = h * v.press
x = x + (v.size - w) / 2
y = y + (v.size - h) / 2
local hovering = mx > x and mx < x + w and my > y and my < y + h and dropdown.openDropdown == 0
local clicking = hovering and love.mouse.isDown(1)
love.graphics.setColor(0, 0, 0, 1)
if hovering or dragging then
2021-09-19 19:13:41 +00:00
love.graphics.setColor(0.4, 0.4, 1, 1)
2021-09-19 11:14:38 +00:00
if v.tooltip then tooltips.show(v.tooltip) end
2021-09-19 10:32:12 +00:00
end
love.graphics.rectangle('fill', x, y, w, h)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.rectangle('line', x, y, w, h)
2021-09-19 19:11:33 +00:00
if v.icon and icon[v.icon] then
local icon = icon[v.icon]
love.graphics.draw(icon, x, y, 0, w / icon:getWidth(), h / icon:getHeight())
end
2021-09-19 10:32:12 +00:00
end
end
2021-09-19 11:37:46 +00:00
function self.mousepressed(x, y, m)
for i, v in ipairs(buttons) do
if x > v.x and x < v.x + v.size and y > v.y and y < v.y + v.size and m == 1 then
if v.func then v.func() end
end
end
end
2021-09-19 10:32:12 +00:00
return self