From b46bfc32d6c991400b5d851b681710fbb7adeb35 Mon Sep 17 00:00:00 2001 From: JayK Date: Tue, 26 May 2026 17:05:56 -0700 Subject: [PATCH] yoo, really fucking big update. its uhh, TEXT. really difficult --- editor/ui.lua | 92 +++++++++++++++++++++++++++++++++++++-------------- main.lua | 10 ++++++ 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/editor/ui.lua b/editor/ui.lua index a0d8070..4e9cb0a 100644 --- a/editor/ui.lua +++ b/editor/ui.lua @@ -8,15 +8,16 @@ ui.theme = { 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.22, 0.25}, + 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.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. @@ -26,9 +27,15 @@ function ui.on(event) return ui.events[event] == true end -function ui.flush() - ui._wasDown = love.mouse.isDown(1) +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) @@ -44,44 +51,81 @@ function ui.button(x, y, w, h, text) 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.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.text(x, y, w, h, text) -- just normal text + 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 then + 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 + return hovered -- returns hovered, this means hovered is returned. and hovered being returned means it returns what hovered is end -function ui.text(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) +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, y + h/2-7, w, "center") + love.graphics.printf(text, x, startY, w, "center") + love.graphics.setScissor() -- limits drawing space. end -function ui.textInput(x,y,w,h,placeholder) - if ui.on(placeholder) then - ui.button(x,y,w,h,tostring(ui._inputs[ui._focused])) +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,placeholder) + ui.button(x, y, w, h, text == "" and placeholder or text) end end -function love.textinput(t) - ui._inputs[ui._focused] = (tostring(ui._inputs[ui._focused] or "")) .. t + +function ui.textinput_char(t) + if ui._focused then + ui._inputs[ui._focused] = (ui._inputs[ui._focused] or "") .. t + end end -function love.keypressed(key) - if key == "backspace" then - ui._inputs[ui._focused] = ui._inputs[ui._focused]:sub(tostring(ui._inputs[ui._focused]):len()) +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 diff --git a/main.lua b/main.lua index dbeb86c..ad08f40 100644 --- a/main.lua +++ b/main.lua @@ -4,6 +4,16 @@ function love.load() end +function love.textinput(t) + ui.textinput_char(t) +end + +function love.keypressed(key) + if key == "backspace" then + ui.textinput_backspace() + end +end + function love.update(dt) end