mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 08:21:02 +02:00
85 lines
2.4 KiB
Lua
85 lines
2.4 KiB
Lua
-- Minimal immediate-mode, mouse-based UI kit for the save editor.
|
|
-- Call Kit.beginFrame(mx, my, clicked) once per love.draw() before using
|
|
-- any widget below; widgets read the frame's mouse state to decide hover
|
|
-- / click.
|
|
|
|
local Kit = {}
|
|
Kit.mouseX, Kit.mouseY = 0, 0
|
|
Kit.mouseClicked = false -- left button pressed this frame
|
|
Kit.hotField = nil
|
|
Kit.font = nil
|
|
|
|
function Kit.beginFrame(mx, my, clicked)
|
|
Kit.mouseX, Kit.mouseY = mx, my
|
|
Kit.mouseClicked = clicked
|
|
end
|
|
|
|
local function hit(x, y, w, h)
|
|
return Kit.mouseX >= x and Kit.mouseX <= x + w
|
|
and Kit.mouseY >= y and Kit.mouseY <= y + h
|
|
end
|
|
|
|
function Kit.label(x, y, text)
|
|
love.graphics.setColor(0.9, 0.9, 0.9)
|
|
love.graphics.print(text, x, y)
|
|
end
|
|
|
|
function Kit.button(x, y, w, h, label)
|
|
local hover = hit(x, y, w, h)
|
|
if hover then love.graphics.setColor(0.25, 0.35, 0.5)
|
|
else love.graphics.setColor(0.15, 0.15, 0.18) end
|
|
love.graphics.rectangle("fill", x, y, w, h, 4, 4)
|
|
love.graphics.setColor(1, 1, 1)
|
|
love.graphics.print(label, x + 8, y + h / 2 - 6)
|
|
return hover and Kit.mouseClicked
|
|
end
|
|
|
|
function Kit.checkbox(x, y, checked, label)
|
|
local on = Kit.button(x, y, 22, 22, checked and "X" or "")
|
|
Kit.label(x + 28, y + 4, label)
|
|
if on then return not checked, true end
|
|
return checked, false
|
|
end
|
|
|
|
function Kit.list(x, y, w, h, items, selected, rowH)
|
|
rowH = rowH or 22
|
|
love.graphics.setColor(0.1, 0.1, 0.12)
|
|
love.graphics.rectangle("fill", x, y, w, h)
|
|
local clickedIndex = nil
|
|
local maxRows = math.floor(h / rowH)
|
|
for i = 1, math.min(#items, maxRows) do
|
|
local ry = y + (i - 1) * rowH
|
|
if i == selected then
|
|
love.graphics.setColor(0.2, 0.4, 0.7)
|
|
love.graphics.rectangle("fill", x, ry, w, rowH)
|
|
end
|
|
love.graphics.setColor(1, 1, 1)
|
|
love.graphics.print(items[i], x + 6, ry + 4)
|
|
if Kit.mouseClicked and hit(x, ry, w, rowH) then
|
|
clickedIndex = i
|
|
end
|
|
end
|
|
return clickedIndex
|
|
end
|
|
|
|
-- Tabs: returns new tab id if clicked
|
|
function Kit.tabs(x, y, tabs, current)
|
|
local tx = x
|
|
for _, t in ipairs(tabs) do
|
|
local label = t.label
|
|
local w = 8 * #label + 24
|
|
local active = current == t.id
|
|
love.graphics.setColor(active and 0.3 or 0.15, active and 0.45 or 0.15, active and 0.7 or 0.18)
|
|
love.graphics.rectangle("fill", tx, y, w, 28, 4, 4)
|
|
love.graphics.setColor(1, 1, 1)
|
|
love.graphics.print(label, tx + 12, y + 7)
|
|
if Kit.mouseClicked and hit(tx, y, w, 28) then
|
|
return t.id
|
|
end
|
|
tx = tx + w + 4
|
|
end
|
|
return nil
|
|
end
|
|
|
|
return Kit
|