113 lines
2.8 KiB
Lua
113 lines
2.8 KiB
Lua
|
local self = {}
|
||
|
|
||
|
local sliders = {}
|
||
|
|
||
|
function self.get(index)
|
||
|
return sliders[index]
|
||
|
end
|
||
|
|
||
|
function self.value(index)
|
||
|
return sliders[index].value
|
||
|
end
|
||
|
|
||
|
function self.kget(key)
|
||
|
for _, v in ipairs(sliders) do
|
||
|
if v.name == key then
|
||
|
return v
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function self.kvalue(key)
|
||
|
return self.kget(key).oldvalue
|
||
|
end
|
||
|
|
||
|
local sliderId
|
||
|
local function insertSlider(tab, f)
|
||
|
sliderId = sliderId + 1
|
||
|
f.value = (self.kget(f.name) or {value = f.default}).value
|
||
|
f.oldvalue = (self.kget(f.name) or {oldvalue = f.value}).oldvalue
|
||
|
f.spintimer = (self.kget(f.name) or {spintimer = 0}).spintimer
|
||
|
f.spin = (self.kget(f.name) or {spin = 0}).spin
|
||
|
return table.insert(tab, f)
|
||
|
end
|
||
|
function self.createSliders()
|
||
|
local s = {}
|
||
|
sliderId = 0
|
||
|
|
||
|
if mode == 2 then -- mix eases
|
||
|
insertSlider(s, {
|
||
|
x = outerpadding,
|
||
|
y = outerpadding + fontHeight + padding,
|
||
|
width = dropdownWidth,
|
||
|
min = 0,
|
||
|
max = 1,
|
||
|
default = 0.5,
|
||
|
name = 'mix',
|
||
|
displayname = 'Mix'
|
||
|
})
|
||
|
end
|
||
|
|
||
|
sliders = s
|
||
|
end
|
||
|
|
||
|
function self.update(dt)
|
||
|
for i, v in ipairs(sliders) do
|
||
|
v.spintimer = mix(v.spintimer + math.abs(v.value - v.oldvalue), 0, math.min(dt * 8))
|
||
|
v.oldvalue = mix(v.oldvalue, v.value, math.min(dt * 20, 1))
|
||
|
|
||
|
if v.spintimer > 2 then
|
||
|
v.spintimer = v.spintimer - 2
|
||
|
v.spin = v.spin + 4
|
||
|
end
|
||
|
|
||
|
v.spin = mix(v.spin, 0, dt * 3)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function self.render()
|
||
|
local mx, my = love.mouse.getPosition()
|
||
|
|
||
|
for i, v in ipairs(sliders) do
|
||
|
local x, y, w, h = v.x, v.y, v.width, 32
|
||
|
|
||
|
love.graphics.setColor(0.7, 0.7, 0.7, 0.4)
|
||
|
love.graphics.line(x, y + h/2, x + w, y + h/2)
|
||
|
|
||
|
local sx, sy = x + w * v.oldvalue, y + h/2
|
||
|
local ssize = h * 0.5
|
||
|
|
||
|
love.graphics.push()
|
||
|
|
||
|
love.graphics.translate(sx, sy)
|
||
|
love.graphics.rotate((v.value - v.oldvalue) * 4 + v.spin * math.pi * 2)
|
||
|
|
||
|
local hovering = mx > sx - ssize/2 and mx < sx + ssize/2 and my > sy - ssize/2 and my < sy + ssize/2 and dropdown.openDropdown == 0
|
||
|
local dragging = mx > x and mx < x + w and my > y and my < y + h and love.mouse.isDown(1) and dropdown.openDropdown == 0
|
||
|
|
||
|
love.graphics.setColor(0, 0, 0, 1)
|
||
|
if hovering or dragging then
|
||
|
love.graphics.setColor(0.2, 0.2, 0.3, 1)
|
||
|
end
|
||
|
love.graphics.rectangle('fill', -ssize/2, -ssize/2, ssize, ssize)
|
||
|
love.graphics.setColor(1, 1, 1, 1)
|
||
|
love.graphics.rectangle('line', -ssize/2, -ssize/2, ssize, ssize)
|
||
|
|
||
|
love.graphics.rotate((v.value - v.oldvalue) * -2)
|
||
|
|
||
|
love.graphics.setColor(1, 1, 1, 1)
|
||
|
love.graphics.printf(math.floor(v.value * 100)/100, -ssize * 6, ssize - 2, ssize * 12, 'center')
|
||
|
|
||
|
love.graphics.pop()
|
||
|
|
||
|
love.graphics.printf(v.displayname, v.x + margin * 2 - ssize * 6, v.y - 5, ssize * 12, 'center')
|
||
|
|
||
|
if dragging then
|
||
|
v.value = (mx - x) / w
|
||
|
graph.touchtimer = 1
|
||
|
createUI()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return self
|