local ui = {} ui.theme = { bg = {0.13, 0.13, 0.14}, panel = {0.17, 0.17, 0.19}, border = {0.28, 0.28, 0.30}, -- also known as outline borderwidth = 3, text = {0.90, 0.90, 0.90}, text_dim = {0.50, 0.50, 0.55}, -- low-key forgot accent = {0.27, 0.52, 0.90}, -- low-key also forgot hover = {0.22, 0.25, 0.35}, active = {0.20, 0.40, 0.75}, -- i low-key forgot again, probably made for when a toggle or something is turned on } ui.events = {} ui._wasDown = false ui._focused = nil ui._inputs = {} ui._claimedFocus = false ui._clickConsumed = false function ui.emit(event) ui.events[event] = true -- should change to a custom ID soon to prevent conflicts. end function ui.on(event) return ui.events[event] == true end function ui.flush() -- all issues is because of this btw (joke, kinda. bunch of bugs from it) local isDown = love.mouse.isDown(1) if isDown and not ui._wasDown and not ui._claimedFocus then ui._focused = nil end ui._wasDown = isDown -- update AFTER using it ui._claimedFocus = false ui.events = {} ui._clickConsumed = false end function ui.panel(x, y, w, h) -- this thingy magic panel creator makes a ui with outline. (x pos, y pos, width, height) love.graphics.setColor(ui.theme.panel) love.graphics.rectangle("fill", x, y, w, h) love.graphics.setColor(ui.theme.border) love.graphics.setLineWidth(ui.theme.borderwidth) love.graphics.rectangle("line", x, y, w, h) end function ui.button(x, y, w, h, text) local mousex, mousey = love.mouse.getPosition() local hovered = mousex > x and mousex < x + w and mousey > y and mousey < y + h -- calculaters if its touching the box if hovered then -- makes dimed panel then text ontop love.graphics.setColor(ui.theme.hover) love.graphics.rectangle("fill", x, y, w, h) love.graphics.setColor(ui.theme.border) love.graphics.setLineWidth(ui.theme.borderwidth) love.graphics.rectangle("line", x, y, w, h) ui.text(x, y, w, h, text) else ui.textPanel(x, y, w, h, text) -- just normal text with a background end if hovered and love.mouse.isDown(1) and not ui._wasDown and not ui._clickConsumed then ui.emit(text) ui._clickConsumed = true end return hovered -- returns hovered, this means hovered is returned. and hovered being returned means it returns what hovered is end function ui.textPanel(x, y, w, h, text) -- expand on this, havent fully read the text documentation so i dont know if i should have more ui.panel(x, y, w, h) ui.text(x, y, w, h, text) end function ui.text(x, y, w, h, text) local font = love.graphics.getFont() local _, lines = font:getWrap(text, w) local lineCount = #lines local lineHeight = font:getHeight() local totalHeight = lineCount * lineHeight local startY = y + (h - totalHeight) / 2 love.graphics.setScissor(x, y, w, h) love.graphics.setColor(ui.theme.text) love.graphics.printf(text, x, startY, w, "center") love.graphics.setScissor() -- limits drawing space. end function ui.textInput(x, y, w, h, placeholder) -- two days for this to work... local text = ui._inputs[placeholder] or "" local focused = ui._focused == placeholder local mousex, mousey = love.mouse.getPosition() local clickedInside = mousex > x and mousex < x + w and mousey > y and mousey < y + h if love.mouse.isDown(1) and not ui._wasDown and clickedInside then ui._focused = placeholder ui._claimedFocus = true end if focused then ui.panel(x, y, w, h) if text == "" then local font = love.graphics.getFont() local lineHeight = font:getHeight() local startY = y + (h - lineHeight) / 2 love.graphics.setColor(ui.theme.text_dim) love.graphics.printf(placeholder, x + 4, startY, w - 8, "left") else ui.text(x, y, w, h, text) end else ui.button(x, y, w, h, text == "" and placeholder or text) end end function ui.textinput_char(t) if ui._focused then ui._inputs[ui._focused] = (ui._inputs[ui._focused] or "") .. t end end function ui.textinput_backspace() if ui._focused then local str = ui._inputs[ui._focused] or "" ui._inputs[ui._focused] = str:sub(1, -2) end end return ui