--- Implements a checkbox widget with a binary tick selection
--
-- @classmod yui.Checkbox
-- @copyright 2022, The DoubleFourteen Code Forge
-- @author Lorenzo Cogotti, Andrea Pasquini
--
-- Checkbox widget receives the following callbacks: @{yui.Widget.WidgetCallbacks|onEnter}(), @{yui.Widget.WidgetCallbacks|onChange}(), @{yui.Widget.WidgetCallbacks|onLeave}().
local BASE = ( ... ) : gsub ( ' checkbox$ ' , ' ' )
local Widget = require ( BASE .. ' widget ' )
local core = require ( BASE .. ' core ' )
local shadowtext = require ' lib.gear.shadowtext '
local T = require ( ' lib.moonspeak ' ) . translate
local Checkbox = setmetatable ( {
__call = function ( cls , args ) return cls : new ( args ) end
} , Widget )
Checkbox.__index = Checkbox
--- Attributes accepted by the @{Checkbox} widget beyond the standard @{yui.Widget.WidgetAttributes|attributes}
-- and @{yui.Widget.WidgetCallbacks|callbacks}.
--
-- @field checked (boolean) to set it checked by default
-- @field text (string) text displayed inside the Checkbox
-- @field[opt='center'] valign (string) vertical alignment 'top', 'bottom', 'center'
-- @field[opt='center'] align (string) horizontal alignment, 'left', 'center', 'right'
-- @field notranslate (boolean) don't translate text
-- @table CheckboxAttributes
--- Checkbox constructor
-- @param args (@{CheckboxAttributes}) widget attributes
function Checkbox : new ( args )
self = setmetatable ( args , self )
self.text = self.text or " "
self.text = self.notranslate and self.text or T ( self.text )
self.align = self.align or ' left '
self.valign = self.valign or ' center '
self.checked = self.checked or false
return self
end
function Checkbox : onPointerInput ( _ , _ , clicked )
self : grabFocus ( )
if clicked then
self.checked = not self.checked
self : onChange ( self.checked )
end
end
function Checkbox : onActionInput ( action )
if action.confirm then
self.checked = not self.checked
self : onChange ( self.checked )
end
end
function Checkbox : draw ( )
local x , y , w , h = self.x , self.y , self.w , self.h
local color , font , cornerRadius = core.themeForWidget ( self )
local c = core.colorForWidgetState ( self , color )
-- Draw checkbox
core.drawBox ( x + h / 10 , y + h / 10 , h * .8 , h * .8 , c , cornerRadius )
love.graphics . setColor ( c.fg )
if self.checked then
love.graphics . setLineStyle ( ' smooth ' )
love.graphics . setLineWidth ( 5 )
love.graphics . setLineJoin ( ' bevel ' )
love.graphics . line ( x + h * .2 , y + h * .55 , x + h * .45 , y + h * .75 , x + h * .8 , y + h * .2 )
end
-- Most checkboxes have no text, so test for performance
if self.text ~= " " then
love.graphics . setFont ( font )
y = y + core.verticalOffsetForAlign ( self.valign , font , self.h )
shadowtext.printf ( self.text , x + h , y , w - h , self.align )
end
end
return Checkbox