require 'point' require 'text' -- Clickable UI button ---@class Button ---@field position Point ---@field size Point ---@field prevPressed boolean ---@field lastPressed boolean ---@field text Text Button = { position = Point:new( 1, 1 ), size = Point:new( 1, 1 ), prevPressed = false, lastPressed = false, text = Text:new() } -- Factory function ---@param position Point | nil ---@param size Point | nil ---@param text string | nil ---@param pressed function | nil ---@param held function | nil ---@param released function | nil ---@return Button function Button:new( position, size, text, pressed, held, released ) local pos = position or Button.position local siz = size or Button.size local button = { position = pos, size = siz, prevPressed = false, lastPressed = false, pressed = pressed or Button.pressed, held = held or Button.held, released = released or Button.released, text = Text:new( pos, siz, text) } setmetatable( button, { __index = self } ) return button end -- Called when button just clicked function Button:pressed() end -- Called when button is held ---@param dt number function Button:held( dt ) dt = dt end -- Called when button is just unclicked function Button:released() end -- Drawing function function Button:draw() local x, y = self.position:coords() local w, h = self.size:coords() love.graphics.rectangle( 'line', x, y, w, h ) self.text:draw() end -- Check if given point is in bounds of button ---@param point Point ---@return boolean function Button:checkPoint( point ) local px, py = point:coords() local sx, sy = self.position:coords() local ex, ey = self.size:coords() ex = ex + sx ey = ey + sy return px >= sx and px <= ex and py >= sy and py <= ey end -- Changing states and calls appropriate functions ---@param dt number ---@param point Point function Button:update( dt, point, pressed ) self.prevPressed = self.lastPressed self.lastPressed = pressed local inBounds = self:checkPoint( point ) if inBounds then if self.lastPressed and not self.prevPressed then self:pressed() elseif self.lastPressed and self.prevPressed then self:held( dt ) elseif not self.lastPressed and self.prevPressed then self:released() end end end