2022-09-12 09:34:46 +02:00
--- Implements a clickable button widget
--
-- @classmod yui.Button
-- @copyright 2022, The DoubleFourteen Code Forge
-- @author Lorenzo Cogotti, Andrea Pasquini
--
--
--- Button widget receives the following callbacks: @{yui.Widget.WidgetCallbacks|onEnter}(), @{yui.Widget.WidgetCallbacks|onHit}(), @{yui.Widget.WidgetCallbacks|onLeave}().
2022-08-24 11:18:48 +02:00
local BASE = ( ... ) : gsub ( ' button$ ' , ' ' )
2022-08-15 23:41:17 +02:00
2022-08-16 00:23:52 +02:00
local Widget = require ( BASE .. ' widget ' )
local core = require ( BASE .. ' core ' )
2022-08-15 23:41:17 +02:00
local shadowtext = require ' lib.gear.shadowtext '
local T = require ( ' lib.moonspeak ' ) . translate
local Button = setmetatable ( { } , Widget )
Button.__index = Button
2022-09-12 09:34:46 +02:00
--- Attributes accepted by the @{Button} widget beyond the standard @{yui.Widget.WidgetAttributes|attributes}
-- and @{yui.Widget.WidgetCallbacks|callbacks}.
--
-- and @{yui.Widget.WidgetCallbacks|callbacks}.
-- @field text (string) text displayed inside the button
-- @field[opt='center'] valign (string) vertical alignment 'top', 'bottom', 'center'
-- @field[opt='center'] align (string) horizontal alignment, 'left', 'center', 'right'
-- @field cornerRadius (number) radius for rounded corners
-- @field notranslate (boolean) don't translate text
-- @table ButtonAttributes
2022-08-15 23:41:17 +02:00
2022-09-12 09:34:46 +02:00
--- Button constructor
-- @param args (@{ButtonAttributes}) widget attributes
2022-08-15 23:41:17 +02:00
function Button . new ( args )
local self = setmetatable ( args , Button )
self.text = self.text or " "
self.align = self.align or ' center '
self.valign = self.valign or ' center '
self.color = self.color or core.theme . color
self.cornerRadius = self.cornerRadius or core.theme . cornerRadius
self.active = false
if not self.notranslate then
self.text = T ( self.text )
end
return self
end
local function hit ( button )
if not button.active then
button.active = true
button : onHit ( )
button.ui . timer : after ( 0.15 , function ( ) button.active = false end )
end
end
function Button : onPointerInput ( px , py , clicked )
self : grabFocus ( )
if clicked then hit ( self ) end
end
function Button : onActionInput ( action )
if action.confirm then hit ( self ) end
end
function Button : draw ( )
local x , y , w , h = self.x , self.y , self.w , self.h
local font = self.font or love.graphics . getFont ( )
local c = self : colorForState ( )
core.drawBox ( x , y , w , h , c , self.cornerRadius )
love.graphics . setColor ( c.fg )
love.graphics . setFont ( font )
y = y + core.verticalOffsetForAlign ( self.valign , font , h )
shadowtext.printf ( self.text , x + 2 , y , w - 4 , self.align )
end
return Button